Atlas Robotics
Computer Vision / AICơ bản

Object Detection cơ bản: bounding box, class, confidence là gì

Atlasbot · 18/8/2026 · 11 phút đọc

Object Detection cơ bản: bounding box, class, confidence là gì
Object Detection trả về vị trí, nhãn, và độ tin cậy cho từng vật thể

Object Detection (phát hiện vật thể) là bài toán thị giác máy tính trả lời đồng thời hai câu hỏi: có vật gì trong ảnh, và vật đó nằm ở đâu — khác với bài toán đơn giản hơn là Image Classification (chỉ trả lời "ảnh này thuộc loại gì" mà không cần biết vị trí). Bài YOLO là gì? đã giới thiệu một mô hình cụ thể giải bài toán này — bài này đi vào ba khái niệm nền tảng mà mọi mô hình object detection đều dùng chung.

Khái niệm chính

Ba khái niệm cốt lõi: Bounding box — khung chữ nhật nhỏ nhất bao quanh vật thể, thường biểu diễn bằng toạ độ góc trên-trái và kích thước (x, y, width, height), hoặc toạ độ 2 góc chéo nhau (x1, y1, x2, y2). Class (nhãn/lớp) — tên loại vật thể được phát hiện, giới hạn trong tập các lớp mà mô hình được huấn luyện để nhận diện (VD: mô hình huấn luyện trên bộ dữ liệu COCO nhận diện được 80 lớp phổ biến như người, xe, ghế...). Confidence score — một số từ 0 đến 1 thể hiện mô hình "tự tin" thế nào với dự đoán đó.

Nguyên lý hoạt động

Ứng dụng thực tế luôn đặt một ngưỡng (threshold), ví dụ chỉ giữ lại kết quả có confidence ≥ 0.5, để loại bỏ các dự đoán không chắc chắn. Mô hình detection thường tạo ra nhiều đề xuất bounding box cho cùng một vật thể trước khi lọc — kỹ thuật Non-Maximum Suppression (NMS) được dùng để loại bỏ các box trùng lặp, chỉ giữ lại box có confidence cao nhất trong nhóm các box chồng lấn nhiều lên nhau. Hầu hết framework (như YOLO) đã tích hợp sẵn NMS, không cần tự viết.

Kiến thức kỹ thuật

Công thức

NMS dùng chỉ số IoU (Intersection over Union) để đo mức độ chồng lấn giữa 2 bounding box, quyết định box nào bị loại:

IoU = Diện_tích_giao_nhau / Diện_tích_hợp_nhất

VD: Box A (100,100,200,200), Box B (120,110,220,210)
Diện_tích_giao_nhau = (200-120) × (200-110) = 80 × 90 = 7200
Diện_tích_A = 100×100 = 10000, Diện_tích_B = 100×100 = 10000
Diện_tích_hợp_nhất = 10000 + 10000 - 7200 = 12800
IoU = 7200/12800 = 0.5625

Nếu IoU giữa 2 box vượt ngưỡng (thường 0.45-0.5), coi là cùng 1 vật thể
→ chỉ giữ box có confidence cao hơn, loại box còn lại

Thông số

NgưỡngẢnh hưởng
Confidence threshold thấp (VD: 0.25)Giữ nhiều kết quả hơn, tăng false positive
Confidence threshold cao (VD: 0.7)Lọc chặt hơn, có thể bỏ sót vật thể thật (false negative)
IoU threshold (NMS) thấpLoại bỏ box trùng lặp mạnh tay hơn
IoU threshold (NMS) caoGiữ lại nhiều box gần nhau hơn (có thể là 2 vật thể sát nhau)

Ứng dụng thực tế

Với AMR, object detection thường dùng để phát hiện người/vật cản động (bổ sung cho LiDAR — camera nhận diện được loại vật thể mà LiDAR không biết, đúng nguyên tắc kết hợp cảm biến đã học ở bài Camera trong AMR), hoặc để nhận diện mã kiện hàng/vị trí đỗ trong kho. Việc chọn đúng ngưỡng confidence và IoU cần cân nhắc theo ứng dụng cụ thể — an toàn (né người) nên ưu tiên ngưỡng confidence thấp hơn (thà phát hiện nhầm còn hơn bỏ sót), trong khi phân loại kiện hàng có thể chấp nhận ngưỡng cao hơn để giảm nhầm lẫn.

Ví dụ thực tế

def tinh_iou(box_a, box_b):
    x1 = max(box_a[0], box_b[0])
    y1 = max(box_a[1], box_b[1])
    x2 = min(box_a[2], box_b[2])
    y2 = min(box_a[3], box_b[3])

    giao_nhau = max(0, x2-x1) * max(0, y2-y1)
    dien_tich_a = (box_a[2]-box_a[0]) * (box_a[3]-box_a[1])
    dien_tich_b = (box_b[2]-box_b[0]) * (box_b[3]-box_b[1])
    hop_nhat = dien_tich_a + dien_tich_b - giao_nhau

    return giao_nhau / hop_nhat if hop_nhat > 0 else 0

detections = [
    {"class": "person", "confidence": 0.91, "box": [140, 130, 250, 280]},
    {"class": "person", "confidence": 0.65, "box": [150, 135, 255, 285]},  # trùng lặp
    {"class": "box",    "confidence": 0.87, "box": [320, 180, 480, 270]},
]

iou = tinh_iou(detections[0]["box"], detections[1]["box"])
print(f"IoU giữa 2 box 'person': {iou:.3f}")
if iou > 0.45:
    print("-> Đây là cùng 1 vật thể, NMS sẽ loại box confidence thấp hơn (0.65)")
Output:
IoU giữa 2 box 'person': 0.712
-> Đây là cùng 1 vật thể, NMS sẽ loại box confidence thấp hơn (0.65)

Lỗi thường gặp

  • Đặt confidence threshold quá thấp cho ứng dụng cần độ tin cậy cao — như bảng Thông số, tăng false positive (nhận diện nhầm vật không tồn tại), gây phản ứng sai không cần thiết.
  • Đặt confidence threshold quá cao cho ứng dụng an toàn (né người/vật cản) — có thể bỏ sót vật thể thật (false negative), nguy hiểm hơn nhiều so với false positive trong ngữ cảnh an toàn.
  • Không hiểu IoU khi debug hiện tượng "1 vật thể bị nhận nhiều box" — như ví dụ trên, đây là hành vi bình thường trước NMS, cần kiểm tra ngưỡng IoU của NMS thay vì nghi ngờ mô hình detection sai.
  • Dùng chung 1 ngưỡng confidence cho mọi loại vật thể — một số lớp vật thể (VD: người, cần an toàn cao) nên có ngưỡng khác với lớp khác (VD: kệ hàng tĩnh, ít quan trọng hơn về tốc độ phản ứng).

Kết luận

Nắm vững ba khái niệm bounding box, class, và confidence — cùng cơ chế NMS dựa trên IoU để loại box trùng lặp — là đủ để đọc hiểu và sử dụng bất kỳ mô hình object detection nào (YOLO hay các họ mô hình khác). Chọn đúng ngưỡng confidence/IoU theo đặc thù ứng dụng (an toàn hay phân loại) quan trọng hơn việc chọn mô hình "chính xác nhất". Bài tiếp theo mở rộng sang Object Tracking, khi cần theo dõi cùng một vật thể qua nhiều khung hình liên tiếp.

Object Detection cơ bản: bounding box, class, confidence là gì — Atlasbot