Rất vui được gặp lại anh em Mì AI. Hôm nay chúng ta sẽ cùng nhau tìm hiểu kỹ thuật tracking/theo vết các đối tượng trong ảnh nhé.
Câu hỏi đặt ra là tại sao lại cần đến tracking/theo vết nhỉ? Chúng ta có thể sử dụng Object Detection (OD) (YOLO/SSD hay gì gì đó) để phát hiện vật thể trong ảnh sau đó vẽ hình chữ nhật quanh nó, có mà chạy đằng trời! Nhưng, chúng ta vẫn cần đến Object Tracking (OT) bởi vì :
- OD chỉ cho phép chúng ta nhận diện các đối tượng trong ảnh ví dụ 10 chiếc oto, 5 chiếc xe máy nhưng không định danh cái nào là cái nào. OT thì có thể định danh được, gán ID được cho từng đối tượng để tracking/theo vết.
- Việc nhận diện vật thể trong ảnh tốn nhiều công sức xử lý của máy tính hơn rất nhiều so với OT. Do vậy, OT sẽ cho ta tốc độ nhanh hơn OD.
- Thế nhưng nói đi cũng phải nói lại, không phải bỏ rơi hẳn anh OD được mà phải phối kết hợp cả 2 để ra kết quả tốt nhất.
Okei, go go go!
Phần 1 – Tìm hiểu về Object Tracking (OT)
Như đã nói ở trên, giả sử giờ chúng ta làm việc với một video đi, và chúng ta cần phát hiện một chiếc oto trong ảnh và theo vết nó (vẽ hình chữ nhật xanh quanh nó đi). Nếu như frame nào cũng detect thì sẽ rất cực, tốn time, chậm chương trình. Do vậy, chúng ta sẽ dùng OD để phát hiện cái xe đó, sau đó dùng OT để theo vết chiếc xe.
Trong OpenCV có đến 8 phương pháp OT khác nhau (đó là OOSTING Tracker, MIL Tracker, KCF Tracker, CSRT Tracker, MedianFlow Tracker, TLD Tracker, MOSSE Tracker và GOTURN Tracker). Các bạn đọc tại đây để biết thêm chi tiết. Tuy nhiên, theo như thông thường mình sử dụng thì chỉ dùng 3 cái:
- MOSSE Tracker: Tốc độ cao nhất, chính xác thấp nhất. Sử dụng trong các bài toán cần ưu tiên tốc độ.
- KCF Tracker: Tốc độ chậm hơn MOSSE và chính xác cao hơn MOSSE.
- CSRT Tracker: Tốc độ chậm nhất trong 3 món nhưng độ chính xác lại cao nhất trong 3 món.
Bài này mình code và test với Open CV 4.1.1 nhé. Các bạn cũng cứ nâng lên hết cỡ mà xài cho sướng. Tội gì!
Phần 2 – Thử nghiệm thuật toán
Nói dông dài lý thuyết rồi, bây giờ chúng ta tiến hành code cái cho nó đỡ ngứa tay nhé.
Trong bài này, chúng ta sẽ làm đơn giản như sau: có 1 đoàn đua ngựa, chúng ta sẽ tạm thời chọn ra một con ngựa cần theo dõi và máy tính sẽ tracking con ngựa đó cho chúng ta nhé (phức tạp hơn thì để bài sau nha:D).
Các bạn tạo một project mới, tạo một file python và copy đoạn code sau vào nhé.
import cv2
import sys
# Tao doi tuong tracking
my_track_method = cv2.TrackerMOSSE_create()
# Doc file video
cap = cv2.VideoCapture("race.mp4")
# Doc frame dau tien de nguoi dung chon doi truong can track
ret , frame = cap.read()
if not ret:
print('Khong tim thay file video')
sys.exit()
# Chon doi tuong va init tracking
select_box = cv2.selectROI(frame, showCrosshair=True)
my_track_method.init(frame, select_box)
while True:
# Read a new frame
ok, frame = cap.read()
if not ok:
# Neu khong doc duoc tiep thi out
break
# Update tracker
ret, select_box = my_track_method.update(frame)
if ret:
# Neu nhu tracking duoc thanh cong
tl, br = (int(select_box[0]), int(select_box[1])), (int(select_box[0] + select_box[2]), int(select_box[1] + select_box[3]))
cv2.rectangle(frame, tl, br, (0, 255, 0), 2, 2)
else:
# Neu nhu khong tim thay doi tuong
cv2.putText(frame, "Object can not be tracked!", (80, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
# Hien thi thong tin va video
cv2.putText(frame, "MiAI Demo Object Tracking", (80, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2);
cv2.imshow("Video", frame)
# Nhan dien thao tac nhan phim
key = cv2.waitKey(1) & 0xff
# Neu nhan q thi thoat
if key == ord('q'):
break
if key == ord('s'):
# Select lai ROI moi
select_box = cv2.selectROI(frame, showCrosshair=True)
my_track_method.clear()
my_track_method = cv2.TrackerMOSSE_create()
my_track_method.init(frame, select_box)
Các bạn đọc source sẽ thấy mình đang lập trình như sau:
- Chúng ta sẽ khởi tạo một đối tượng tracker bằng phương pháp MOSSE.
- Sau đó hiển thị frame đầu tiên và cho người dùng chọn 1 đối tượng cần tracking bằng chuột, sau khi chọn xong nhấn ENTER hoặc SPACE để confirm.
- Tiếp theo, chúng ta sẽ thực hiện đọc các frame tiếp theo và sử dụng đối tượng tracker nói trên để track đối tượng được chọn và hiển thị lên màn hình.
- Người dùng có thể bấm q để thoát hoặc s để chọn lại đối tượng khác.
Nếu bạn chạy thành công thì sẽ thấy kết quả như sau:
Như vậy chúng ta đã biết cách sử dụng Object Tracking để track/theo vết đối tượng mà chúng ta đã chọn. Trong bài tới mình sẽ thử nghiệm kết hợp YOLO với OT để xem cái kết sẽ như nào nhé, hẹn gặp lại cả nhà 😀
Hãy join cùng cộng đồng Mì AI nhé!
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
Tài liệu tham khảo: Video của www.sportneed.net và bài tham khảo cực hay của tác giả Adrian Rosebrock tại đây.
2 Replies to “Tracking/theo vết đối tượng trong ảnh – Chương 1. Thử thuật toán tracking bằng Open CV”