Tìm hiểu về phát hiện đối tượng
Đọc đầu ra của detector — lớp, box, độ tin cậy — và đặt ngưỡng độ tin cậy cùng IoU dựa trên chi phí của từng loại sai sót.
Hầu hết hệ thống thị giác máy tính trong môi trường production đều là hệ thống phát hiện có thêm logic: bộ đếm, bộ tracking, cảnh báo vùng và làm mờ để bảo vệ quyền riêng tư. Khi một hệ thống như vậy hoạt động sai, nguyên nhân thường không phải do model mà là ngưỡng chưa từng được chủ động lựa chọn. Hãy nắm rõ chính xác detector trả về gì và hai tham số nào định hình danh sách đó; như vậy, bạn có thể gỡ lỗi gần như mọi thứ được xây dựng dựa trên detector.
Thực hành
Detector trả về gì#

Mỗi nhãn trong ảnh đó tương ứng với một hàng đầu ra: tên lớp, độ tin cậy và box bao quanh đối tượng. Model phát hiện trả về chính xác danh sách đó:
- Lớp — một chỉ số nguyên được ánh xạ sang tên thông qua
result.names(0làperson,5làbus). - Box — bốn số xác định vị trí đối tượng;
xyxycung cấp tọa độ góc trên bên trái và góc dưới bên phải theo pixel. - Độ tin cậy — điểm số từ 0 đến 1 dùng để xếp hạng và lọc kết quả phát hiện.
Đếm, cảnh báo, tracking và làm mờ là những phần code bạn viết dựa trên các hàng này.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
result = model("https://ultralytics.com/images/bus.jpg", verbose=False)[0]
for box in result.boxes:
name = result.names[int(box.cls)]
x1, y1, x2, y2 = box.xyxy[0].tolist()
print(f"{name:8} conf={float(box.conf):.2f} box=({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})")bus conf=0.88 box=(0, 230, 803, 751)
person conf=0.87 box=(49, 398, 240, 902)
person conf=0.86 box=(223, 405, 345, 861)
person conf=0.85 box=(670, 395, 810, 880)
person conf=0.65 box=(0, 553, 60, 871)Diễn giải từng dòng: box xe buýt bắt đầu tại x=0 vì xe buýt khuất khỏi mép trái; ba người có điểm số 0.85–0.87; người thứ tư, bị cắt ở viền trái, chỉ đạt 0.65 — model chỉ nhìn thấy nửa thân người. Độ tin cậy thấp ở các đối tượng bị cắt là bình thường, và đây là trường hợp đầu tiên mà ngưỡng phát huy tác dụng.
Mỗi box có bốn định dạng; hãy dùng định dạng mà code phía sau yêu cầu:
| Thuộc tính | Định dạng | Ứng dụng thường gặp |
|---|---|---|
boxes.xyxy | Tọa độ góc theo pixel (x1, y1, x2, y2) | Cắt ảnh, vẽ, quy tắc chồng lấn |
boxes.xywh | Tâm theo pixel cùng chiều rộng và chiều cao | Lọc theo kích thước, chuyển động |
boxes.xyxyn | Tọa độ góc chuẩn hóa về 0–1 | Các quy tắc vẫn hoạt động khi độ phân giải thay đổi |
boxes.xywhn | Tâm và kích thước chuẩn hóa về 0–1 | File nhãn YOLO |
Từ các ứng viên đến danh sách cuối cùng#
Bên trong, model chấm điểm nhiều box ứng viên cho mỗi đối tượng. Hai bộ lọc chuyển chúng thành danh sách bạn nhìn thấy:
Bộ lọc độ tin cậy. conf loại bỏ các box thấp hơn ngưỡng; mặc định của dự đoán là 0.25. Trên ảnh xe buýt, số lượng thay đổi nhanh chóng:
conf | Các box trên bus.jpg |
|---|---|
| 0.10 | 7 |
| 0.25 | 5 |
| 0.50 | 5 |
| 0.75 | 4 |
Bộ lọc trùng lặp. Loại bỏ cực đại không cần thiết (NMS) giữ lại box có độ tin cậy cao nhất và loại bỏ các box khác cùng lớp có mức chồng lấn với box đó vượt quá iou (mặc định 0.7). Mức chồng lấn được đo bằng giao trên hợp: diện tích giao nhau chia cho diện tích hợp.

iou | Các box trên bus.jpg | Tác động |
|---|---|---|
| 0.3 | 5 | Nghiêm ngặt: các hộp chồng lấn được gộp lại |
| 0.7 | 5 | Mặc định |
| 0.95 | 8 | Linh hoạt: các kết quả gần trùng lặp vẫn được giữ lại |
Chọn ngưỡng dựa trên chi phí của các lỗi#
| Nếu… | Thì… |
|---|---|
| Bỏ sót gây tốn kém (cảnh báo an toàn, lỗi sản phẩm) | Giảm conf và chấp nhận một số cảnh báo giả |
| Người dùng nhìn thấy cảnh báo giả (tìm kiếm, gắn thẻ) | Tăng conf |
| Bạn báo cáo số lượng | Thử các giá trị conf trên ảnh validation và chọn giá trị có sai số đếm nhỏ nhất |
| Các vật thể gần nhau thực sự biến mất trong đám đông | Tăng iou, ví dụ 0.7 → 0.8 |
| Cùng một vật thể nhận hai hộp | Giảm iou |
| Độ khó khác nhau giữa các lớp | Dự đoán với conf thấp nhất mà bạn cần, rồi lọc theo từng lớp trong code |
Giám sát an toàn kho hàng là trường hợp điển hình cần ngưỡng thấp; Chế độ Predict liệt kê mọi tham số inference.
Các lỗi thường gặp#
Triệu chứng: "model chắc chắn 88% đây là xe buýt", cùng các ngưỡng được chọn theo trực giác. Cách khắc phục: xem confidence là điểm xếp hạng. Trong YOLO26, một điểm số bao quát cả "có đối tượng" và "đối tượng thuộc lớp này", nhưng điểm số đó chưa được hiệu chuẩn — hãy chọn ngưỡng từ dữ liệu validation, không dựa vào ý nghĩa của con số.
Khi hai người đứng sát vai nhau, các hộp của họ chồng lấn nhiều và NMS có thể xóa nhầm một người thật vì cho là "bản sao". Tăng iou thì hộp thứ hai sẽ xuất hiện trở lại. YOLO26 cũng có head end-to-end không cần NMS; truyền nms=False để sử dụng head này.
Triệu chứng: một ngưỡng có vẻ hoàn hảo trên ảnh demo nhưng lại thất bại với camera thực tế. Cách khắc phục: quét các ngưỡng trên tập validation lấy từ camera triển khai; chỉ một ảnh chỉ cho bạn thấy các nút điều chỉnh hoạt động ra sao.
Bốn kiểu dự đoán sai#
| Lỗi | Vấn đề nằm ở đâu | Cách khắc phục thường dùng |
|---|---|---|
| Đúng lớp, hộp lỏng | Định vị | Quy tắc hộp chặt hơn và nhất quán hơn; tăng imgsz đối với vật thể nhỏ |
| Hộp đúng, sai lớp | Phân loại | Bổ sung ví dụ cho cặp lớp dễ nhầm lẫn hoặc gộp các lớp |
| Hoàn toàn không có hộp | Recall | Bổ sung ví dụ về điều kiện đó: ánh sáng, kích thước, che khuất |
| Hộp nằm trên nền | Precision | Ảnh hard negative về bất kỳ thứ gì đã đánh lừa model |
Hai danh sách giúp chẩn đoán nhanh: true positive có confidence thấp (model không chắc chắn về vật thể có thật) và false positive có confidence cao (model chắc chắn về thứ bị nhận diện sai). Mỗi danh sách gợi ý cách khắc phục khác nhau.
Hiển thị lời giải
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
result = model("https://ultralytics.com/images/bus.jpg", conf=0.05, save=True, verbose=False)[0]
for box in sorted(result.boxes, key=lambda b: -float(b.conf)):
name, conf = result.names[int(box.cls)], float(box.conf)
x1, y1, x2, y2 = box.xyxy[0].tolist()
print(f"{conf:.2f} {name:10} ({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f})")0.88 bus (0, 230, 803, 751)
0.87 person (49, 398, 240, 902)
0.86 person (223, 405, 345, 861)
0.85 person (670, 395, 810, 880)
0.65 person (0, 553, 60, 871)
0.18 person (0, 600, 40, 871)
0.12 stop sign (0, 252, 35, 326)
0.08 handbag (43, 732, 78, 812)
0.07 skateboard (669, 822, 808, 881)
0.06 handbag (225, 634, 291, 705)Mọi hộp dưới 0.5 đều là false positive. person ở mức 0.18 tạo hộp trùng với người có confidence 0.65 bị cắt ở mép trái. stop sign ở mức 0.12 là một biển báo giao thông thật nhưng bị gán sai lớp. Túi xách và ván trượt nằm trên bàn tay và giày. Mọi vật thể có thật đều đạt confidence trên 0.6, vì vậy conf=0.5 giữ lại cả bốn người và loại bỏ mọi nhiễu cho bộ đếm người đi bộ — giá trị này giúp tránh đếm trùng. Trước khi triển khai, hãy xác nhận trên tập validation từ camera thực tế: người bị cắt ở mức 0.65 cho thấy vật thể thật có thể nằm gần ngưỡng đến mức nào.