[YOLO Series] #1 – Sử dụng Yolo để nhận dạng đối tượng trong ảnh

Xin chào các bạn, thi thoảng xem phim nước ngoài, các bạn hay thấy cái hình ảnh kiểu object detection, nhìn qua một cái kính là có thể biết được kia là cái gì, đây là cái gì kèm theo thông số như: level, cân nặng, sức khỏe, màu còn lại…. Bây giờ thì AI, Computer Vision cũng có thể làm được việc đó rồi. Hôm nay chúng ta sẽ cùng thử sử dụng YOLO để nhận dạng đối tượng trong 1 ảnh nhé. Khác với các bài viết trên mạng, viết qua loa nên khi triển khai các bạn sẽ rất vất vả, mình sẽ viết thật chi tiết cho các bạn tiện triển khai (vì ngày xưa mình cũng khá vất vả khi mày mò với mấy cái bài trên mạng).

Chuẩn bị ảnh để nhận dạng

Để cho nó có tính thời sự, mình sẽ lấy một ảnh thật, chụp từ camera hành trình tại Việt Nam nhé.

sử dụng YOLO

Chuẩn bị công cụ nhận dạng – Yolo

Đoạn này mình nói qua về cái Yolo nhé. Tìm hiểu về cái này một cách học thuật thì lằng nhằng lắm, nhưng blog này là Mì AI nên mình sẽ tìm hiểu theo cách Mì Ăn Liền nhé. Nói chung thì YOLO là một cái model để phát hiển các đối tượng trong ảnh với cách cực nhanh và gọn và chạy được trên nhiều môi trường khác nhau với cấu hình khác nhau (nó viết tắt của You Only Look Once, chỉ áp model lên ảnh 1 lần nên nó nhanh là vì thế).

YOLO hiện đã đến version 3 rồi, anh em Mì AI thì cứ lấy phiên bản cao nhất mà chơi, tội dzè. Thôi, nói vậy đủ rồi, bây giờ bắt tay từng bước nhé.

  1. Tạo một thư mục trên ổ cứng và đặt tên là MiAI_Yolo_1 nhé. Vì mình còn nhiều bài nên đặt tên thế cho đỡ nhầm.
  2. Cài đặt Python trên máy tính nhé. Cái này thì tùy các bạn dùng Window hay MacOS thì cách cài sẽ khác nhau. Các bạn tham khảo cách cài tại đây: https://quantrimang.com/cach-cai-dat-python-tren-windows-macos-linux-140625
  3. Cài đặt các thư viện cần thiết nhé. Các bạn cứ mở Command prompt hoặc Terminal ra chạy lần lượt các lệnh sau để cài:
    pip install opencv-python
    pip install numpy
  4. Rồi, bây giờ chúng ta sẽ tải về các file cần thiết nhé. Mình có publish một git tại đây https://github.com/thangnch/yolo_beginner . Các bạn tải toàn bộ các file về thư mục MiAI_Yolo_1 nhé (các file quan trọng là: yolov3.cfg, yolov3.txt và file mã nguồn YOLO.py).
  5. YOLO dã được train với rất nhiều ảnh thuộc nhiều class khác nhau, ta tải về và sử dụng nhé. Cách train thêm dữ liệu riêng se nói đến trong các bài sau. Ta tải weight của pretrain model tại đây https://pjreddie.com/media/files/yolov3.weights và để vào thư mục MiAI_Yolo_1 nhé.

Tận hưởng thành quả

Xong rồi, bây giờ các bạn mở Command Prompt hoặc Terminal lên và chuyển vào thư mục MiAI_Yolo_1 bằng lệnh cd nhé. Sau đó chạy tiếp lệnh:

python YOLO.py -i cam2.jpg -cl yolov3.txt -w yolov3.weights -c yolov3.cfgCode language: CSS (css)

Trong dó :

  • cam2.jpg: là tên file ảnh bạn muốn nhận dạng, bạn có thể thay bằng ảnh nào tùy thích.
  • yolov3.txt: Là file chứa tên của các đối tượng phát hiện được.
  • yolov3.weights: Là file pretrain weights nhé.
  • yolov3.cfg: Là file config của YOLO.

Nếu mọi thứ okie, bạn sẽ nhận được một cái ảnh detect và đầy đủ các box như sau:

yolo detection

Nhận dạng khá chuẩn với các phương tiện ở Việt Nam. Bạn có thể thử với nhiều ảnh khác nữa như đồ vật, con vật,… nhé.

Như vậy, đến đây chúng ta đã có thể dạy cho máy tính nhận dạng các vật thể trong ảnh. Trong các bài tiếp thuộc YOLO series này, các bạn sẽ biết cách train và nhận dạng các đối tượng đặc thù phục vụ bài toán riêng nhé.

Thân ái chào các bạn!

Chiến Thắng

Fanpage: http://facebook.com/miaiblog
Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup
Website: https://miai.vn
Youtube: http://bit.ly/miaiyoutube

Related Post

59 Replies to “[YOLO Series] #1 – Sử dụng Yolo để nhận dạng đối tượng trong ảnh”

          1. a Thắng ơi, em đang tìm hiểu về ssd-mobilenet nhưng em vẫn chưa hiểu nó , anh có thể làm 1 bài nói về nó theo kiểu mì được không ạ ! Chúc anh nhiều sức khỏe và cảm ơn anh ạ !

  1. python YOLO.py -i cam2.png -cl yolov3.txt -w yolov3.weights -c yolov3.cfg
    đoạn này anh bị nhầm, trong thư mục không có file cam2.png (chỉ có cam1.png, cam2.jpg, cam3.jpeg, dog.jpg, object-detection.jpg). :v

    Cảm ơn anh về bài viết.

    1. em đã tải đầy đủ các file và cho hết vào 1 thư mục nhưng khi chạy YOLY.py thì nó ra lỗi thế này ạ:
      Traceback (most recent call last):
      File “YOLO.py”, line 96, in
      draw_prediction(image, class_ids[i], confidences[i], round(x), round(y), round(x + w), round(y + h))
      File “YOLO.py”, line 37, in draw_prediction
      cv2.rectangle(img, (x, y), (x_plus_w, y_plus_h), color, 2)
      TypeError: integer argument expected, got float
      Hiện tại em đang sử dụng Opencv 3.4.2

      1. sau khi em chuyển tất cả các tham số x y thành int(x) int (y) lại chạy đc rồi. Cơ mà thay đổi như vậy thì có ảnh hưởng gì không?

  2. anh ơi loạt bài này có theo thứ tự từ dễ tới khó không ạ. em chưa biết gì liệu có học dc ngay bài này ko ??

    1. sau khi em sửa lại cái comment thì nó lại lỗi thành thế này ạ

      Traceback (most recent call last):
      File “YOLO.py”, line 97, in
      draw_prediction(image, class_ids[i], confidences[i], round(x), round(y), round(x + w), round(y + h))
      File “YOLO.py”, line 37, in draw_prediction
      cv2.rectangle(img, (x, y), (x_plus_w, y_plus_h), color, 2)
      TypeError: only size-1 arrays can be converted to Python scalars

  3. Anh ơi, em thử ảnh camp2 chạy được, nhưng ảnh camp1 với camp3 thì không được, báo lỗi như này:
    File “YOLO.py”, line 44, in
    Width = image.shape[1]
    AttributeError: ‘NoneType’ object has no attribute ‘shape’

    Khăc phục như thế nào anh ?

    1. cam1 là bạn phải sửa thành cam1.png, cam3 thì cam3.jpeg nha, vì nó khác định dạng ảnh với cam2

  4. Anh ơi sao em làm như trên mà không được ạ.
    Nó hiện lỗi python: can’t open file ‘YOLO.py’: [Errno 2] No such file or directory. Trong khi e đã cài thư viện opencv,numpy,argparse.

  5. Anh ơi em mới đổi qua MacOS dùng mà tự dưng bị lỗi
    “No module named cv2”
    Tại ở Windows em k bị ạ

    1. Thanks bạn ủng hộ. Join cùng anh em Mì Ai bạn nhé.

      #MiAI
      Fanpage: http://facebook.com/miaiblog
      Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup
      Website: https://miai.vn
      Youtube: http://bit.ly/miaiyoutube

  6. Cho em hoi loi nay a
    import error: DLL loaded failed: the specified module could not be found

  7. em đã tải đầy đủ các file và cho hết vào 1 thư mục nhưng khi chạy YOLY.py thì nó ra lỗi thế này ạ:
    Traceback (most recent call last):
    File “YOLO.py”, line 96, in
    draw_prediction(image, class_ids[i], confidences[i], round(x), round(y), round(x + w), round(y + h))
    File “YOLO.py”, line 37, in draw_prediction
    cv2.rectangle(img, (x, y), (x_plus_w, y_plus_h), color, 2)
    TypeError: integer argument expected, got float
    Hiện tại em đang sử dụng Opencv 3.4.2

  8. Cảm ơn anh, bài viết tuyệt quá ạ
    Tuy nhiên mong anh có thể giải thích rõ ràng hơn, vì em làm theo nhưng lại không đủ hiểu để làm một cái khác tương tự ạ

  9. Bài viết rất hữu ích cho newbie.
    Mình học lý thuyết nhiều nhưng phần thực hành hơi yếu, nhờ bài viết này mà mình thực hành được ngay.
    Xin cảm ơn tác giả nhé.

  10. Mình Làm Theo hướng dẫn khi chạy ra lỗi này :
    Traceback (most recent call last):
    File “YOLO.py”, line 57, in
    outs = net.forward(get_output_layers(net))
    File “YOLO.py”, line 23, in get_output_layers
    output_layers = [layer_names[i[0] – 1] for i in net.getUnconnectedOutLayers()]
    File “YOLO.py”, line 23, in
    output_layers = [layer_names[i[0] – 1] for i in net.getUnconnectedOutLayers()]
    IndexError: invalid index to scalar variable.
    Mong tác giả giúp đỡ

  11. Traceback (most recent call last):
    File “C:\Users\HH\File\8-Python\Yolo3\MiAI_Yolo_1\YOLO.py”, line 57, in
    outs = net.forward(get_output_layers(net))
    File “C:\Users\HH\File\8-Python\Yolo3\MiAI_Yolo_1\YOLO.py”, line 23, in get_output_layers
    output_layers = [layer_names[i[0] – 1] for i in net.getUnconnectedOutLayers()]
    File “C:\Users\HH\File\8-Python\Yolo3\MiAI_Yolo_1\YOLO.py”, line 23, in
    output_layers = [layer_names[i[0] – 1] for i in net.getUnconnectedOutLayers()]
    IndexError: invalid index to scalar variable.
    E chạy thì bị lỗi như này ạ

  12. a ơi khi em chạy lệnh python YOLO.py –config ./yolov3.cfg –weights yolov3.weights –classes yolov3.txt –image cam3.jpeg
    ( em copy trên github ạ) thì bị lỗi này ạ
    Traceback (most recent call last):
    File “C:\Users\pc\Desktop\AI\yolo_test\YOLO.py”, line 57, in
    outs = net.forward(get_output_layers(net))
    File “C:\Users\pc\Desktop\AI\yolo_test\YOLO.py”, line 23, in get_output_layers
    output_layers = [layer_names[i[0] – 1] for i in net.getUnconnectedOutLayers()]
    File “C:\Users\pc\Desktop\AI\yolo_test\YOLO.py”, line 23, in
    output_layers = [layer_names[i[0] – 1] for i in net.getUnconnectedOutLayers()]
    IndexError: invalid index to scalar variable.

  13. ai bị lỗi output_layers = [layer_names[i[0] – 1] for i in net.getUnconnectedOutLayers()]
    IndexError: invalid index to scalar variable.
    thì fix bỏ [0] ở
    hàng 25 output_layers = [layer_names[i[0] – 1] for i in net.getUnconnectedOutLayers()]
    với hàng 87 i = i[0];
    mình test được nha

  14. Em làm theo hD nhưng chạy file không được ạ.
    Em mới học món này, mong các anh chỉ giáo thêm ạ

  15. ANh cho em hỏi sự khác biệt của Yolov và Yolo – Nas là gì thế anh? Cái nào tối ưu phân tích ảnh chính xác hơn ạ

Leave a Reply

Your email address will not be published. Required fields are marked *