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é.
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é.
- 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.
- 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
- 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 - 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).
- 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.cfg
Code 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:
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
Mình làm giống bác, mà kết quả không thấy gì cả bác ạ!
Bạn vướng ở chỗ nào có thể liên hệ facebook mình cùng trao đổi nhé. http://facebook.com/thangnch!
Bạn có thể viết bài về SSD cho mình tham khỏa với ạ
Thanks bạn. Mình sẽ có bài về SSD sau nhé!
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 ạ !
Next nhé em .Thanks em nhiều!
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.
Ah uh.Mình gõ nhầm. Để mình sửa lại. Thanks bạn nhé!
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
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?
Okie ko sao đâu em!
Nếu cần trao đổi thêm gì em cứ up lên group nhé: Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup
#MìAI
Fanpage: http://facebook.com/miaiblog
Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup
Website: https://miai.vn
Youtube: http://bit.ly/miaiyoutube
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 ??
Hầu hết các bài trên Mì AI đều ở dạng dễ học, dễ hiểu và làm ngay được. Em có thể bắt đầu luôn vào bài này nhé. Không vấn đề gì đâu!
a ơi em chạy trên ubuntu 19.04 bị lỗi như này ạ:
File “YOLO.py”, line 69
SyntaxError: Non-ASCII character ‘\xe1’ in file YOLO.py on line 69, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
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
Thử với python3
Em post lên group cho tiện nhé!
Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup
thêm dòng:
#coding=utf-8
vào đầu file YOLO.py nha
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 ?
Bạn up lên group của Mì AI để tiện việc theo dõi và up ảnh nhé.
Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup
Cảm ơn bạn!
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
Đúng rồi. Phải chú ý tên file để sửa lại lệnh. Thanks bạn Tui Tran nhé!
#MìAI
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
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.
Em kiểm tra xem đã đứng đúng folder chứa file YOLO.py chưa nhé.
Em có thể join và post lên Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup
Trên đó chụp được hình tiện trao đổi hơn!
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ị ạ
Em dùng lệnh pip install opencv-python nhé!
Nếu vẫn lỗi em up lên group để cùng trao đổi nhé.
Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup
ngon lành cành đào
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
Cho em hoi loi nay a
import error: DLL loaded failed: the specified module could not be found
Em post lên group nhé. Ở đây không có hình nên khó nhìn quá.
Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup
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
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ự ạ
Yeah. Cần thêm gì em có thể đọc các bài tiếp theo hoặc post lên Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup nhé!
Chia sẽ Các Anh/Chị link để tải yolo3.weights trên google driver
(Tải theo link kêu 6 tiếng chán luôn 😀 – chắc ai đó sẽ cần)
https://drive.google.com/file/d/1I92QB0ifKoEOZcUq6gAfay-o4Tjw1xTU/edit
Bài viết hay, chị tiết , cám ơn anh
Cảm ơn em nhiều nhé!
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é.
Yeah. Cảm ơn bạn ủng hộ nhé. Bạn gia nhập cộng đồng Mì AI cho vui!
#MìAI
Fanpage: http://facebook.com/miaiblog
Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup
Blog: https://miai.vn
Youtube: https://www.youtube.com/c/MiAIblog
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 đỡ
Bạn post lên Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup trao đổi cho tiện nha!
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 ạ
Em post lên Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup cho tiện trao đổi nhé!
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.
Em post lên https://facebook.com/groups/miaigroup thảo luận cho tiện nha!
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
Thanks bạn nhiều!
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 ạ
Êm post lên Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup xem thử nhé! Trao đổi cho tiện!
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 ạ
Em post lên Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup nhé trao đổi cho tiện!
có thể sử dụng yolo để nhận dạng món ăn k ạ
Có chứ bạn. Bạn cần thêm info cứ hỏi trên Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup nhé!