Object Detection là gì và hoạt động như thế nào?
Từ ảnh đến bounding box, class và score; hiểu IoU, NMS và đánh giá detector.
Object detection trả lời đồng thời “có gì?” và “ở đâu?”. Một detector thường trả về một tập bounding box kèm lớp và score; score đó không tự động là xác suất đã được hiệu chỉnh.
Mục tiêu học tập
- Phân biệt classification, detection và segmentation.
- Tính IoU và giải thích tác dụng của NMS.
- Đọc precision/recall theo threshold thay vì chỉ nhìn ảnh đẹp.
Một tập dự đoán có vị trí
Với ảnh có hai chiếc xe, classification có thể chỉ nói “có xe”. Detection vẽ hai hộp và gắn nhãn cho từng hộp. Hộp chỉ bao đối tượng theo hình chữ nhật, không mô tả chính xác từng pixel của vật thể.
Detector có thể bỏ sót xe nhỏ hoặc vẽ hai hộp cho cùng xe. Vì vậy cần kiểm tra cả phát hiện đúng, phát hiện thừa và bỏ sót, không chỉ số lượng hộp trên màn hình.
Một prediction gồm tọa độ box, class ID và confidence score theo quy ước của mô hình. Chuẩn hóa kích thước ảnh phải đi cùng phép đổi tọa độ ngược về ảnh gốc. One-stage detector dự đoán từ feature map; two-stage detector thường đề xuất vùng rồi phân loại và tinh chỉnh.
YOLO và Faster R-CNN là hai ví dụ nền tảng, không đại diện cho mọi detector hiện nay. Chi tiết head, cách gán target và postprocessing cần đọc theo kiến trúc cụ thể.
Training kết hợp bài toán phân loại với định vị; cách ghép prediction với ground truth khác nhau theo phương pháp. Background, imbalance và các đối tượng gần nhau ảnh hưởng gradient. Mất mát localization thấp trên train không chứng minh detector tổng quát hóa sang camera mới.
Kiểm tra convention xyxy/xywh, pixel/normalized và thứ tự resize–pad. Một lỗi scale hoặc offset nhỏ có thể làm đánh giá box sai dù phần nhận dạng vẫn hoạt động.
IoU và hộp dự đoán trùng
IoU đo phần giao của hai hộp so với phần hợp của chúng. Hai hộp giống nhau có IoU bằng 1; không giao nhau thì bằng 0. NMS thường giữ hộp điểm cao rồi loại các hộp quá trùng với nó.
. NMS theo lớp thường lặp: chọn score cao nhất, bỏ box cùng lớp có IoU vượt ngưỡng, rồi tiếp tục. Score threshold và IoU threshold có chức năng khác nhau.
Khi hai người đứng sát nhau, loại box quá mạnh có thể làm mất một người thật. Các kiến trúc dự đoán theo tập có thể tránh NMS truyền thống; không thêm bước này mà không kiểm tra output contract.
IoU không phân biệt trực tiếp lỗi tâm, kích thước và tỷ lệ cạnh; nhiều localization loss bổ sung tín hiệu hình học khác. Ngưỡng NMS là hyperparameter của cả pipeline và cần chọn bằng validation.
Trong cảnh đông, so false suppression với duplicate detections. Class-agnostic NMS có thể loại box khác lớp; lựa chọn này phải phù hợp mục tiêu và cách huấn luyện, không mặc định hoán đổi được.
Đánh giá theo protocol cố định
Nếu có 10 xe thật nhưng chỉ thấy 6 hộp đúng, ảnh trông gọn vẫn bỏ sót nhiều xe. Nếu có rất nhiều hộp giả, người dùng phải kiểm tra thừa. Cần nhìn cả hai loại lỗi.
Precision là tỷ lệ prediction được ghép đúng; recall là tỷ lệ ground truth được tìm thấy. AP tổng hợp đường precision–recall theo protocol, lớp và tiêu chí IoU cụ thể. Một prediction trùng một object đã ghép không được tính thêm một true positive.
Báo AP@0.5 khác với AP trung bình trên nhiều IoU threshold. Ghi rõ dataset version, class mapping, object size và thiết bị khi báo latency.
Xem lỗi theo kích thước, mức che khuất và domain. Không chỉnh threshold trên test. Tách latency model khỏi decode, resize, NMS và truyền dữ liệu; với video, tổng latency và độ mới prediction mới liên quan trực tiếp đến hành vi hệ thống.
Workflow & kiến trúc
Ứng dụng & giới hạn
- Đếm vật thể tách biệt trong ảnh.
- Phát hiện vị trí đối tượng trước tracking.
Điểm mạnh
Đầu ra dễ nối với counting, crop hoặc tracking khi box phù hợp tác vụ.
Giới hạn cần nhớ
Hộp không mô tả biên chính xác; vật thể nhỏ, trùng nhau hoặc domain mới dễ gây lỗi.
Thử trong một project nhỏ
Tính IoU hai hộp (0,0,2,2) và (1,1,3,3) bằng tay. Mô tả tình huống threshold NMS thấp loại nhầm hai đối tượng khác nhau.
def iou(a, b):
left, top = max(a[0], b[0]), max(a[1], b[1])
right, bottom = min(a[2], b[2]), min(a[3], b[3])
inter = max(0, right-left) * max(0, bottom-top)
area = lambda r: max(0, r[2]-r[0]) * max(0, r[3]-r[1])
union = area(a) + area(b) - inter
return inter / union if union > 0 else 0.0
assert iou((0, 0, 2, 2), (0, 0, 2, 2)) == 1.0
assert iou((0, 0, 1, 1), (2, 2, 3, 3)) == 0.0
print(iou((0, 0, 2, 2), (1, 1, 3, 3)))IoU cho box liên tục xyxy hợp lệ, không có quy ước cộng 1 pixel; không phải detector hay evaluator AP.
