Object Detection: nó là gì, thuật toán và cách hoạt động

Tác giả: IT Sectr Đã đăng: 2026-07-19 Thời gian đọc: 9 phút

Object Detection là một tác vụ thị giác máy tính đồng thời xác định lớp của đối tượng (mèo, ô tô, người) và vị trí của nó trong hình ảnh dưới dạng khung bao hình chữ nhật (bounding box). Không giống như Image Labeling, Object Detection tìm nhiều đối tượng thuộc các lớp khác nhau trong một khung hình và chỉ ra tọa độ của chúng. Trong phát triển di động, Object Detection được sử dụng trong hệ thống giám sát video, ứng dụng AR, máy bay không người lái tự động, hình ảnh y tế và phân tích bán lẻ. Theo Google ML Kit, 2025, Object Detection trên thiết bị đạt 30 FPS trên các thiết bị cao cấp với độ chính xác 87% mAP.

Những điểm chính

  • Object Detection — phân loại + định vị đối tượng (bounding box)
  • ML Kit Object Detection — lên đến 30 FPS, 87% mAP, danh mục: fashion, food, home, places
  • YOLOv8-Nano — 2.6M tham số, 42% mAP COCO, độ trễ 10–30 ms
  • SSD MobileNetV2 — 22% mAP COCO, 15–40 ms, tốc độ tối đa
  • On-device real-time — tất cả tính toán cục bộ, không gửi video lên máy chủ

Object Detection là gì: nguyên lý hoạt động

Object Detection giải quyết đồng thời hai tác vụ: có gì trong ảnh (phân loại) và ở đâu (hồi quy tọa độ). Mô hình chia ảnh thành lưới, dự đoán bounding box (x, y, chiều rộng, chiều cao) và xác suất lớp cho mỗi ô. Non-Maximum Suppression (NMS) loại bỏ các khung trùng lặp cho một đối tượng, giữ lại dự đoán tự tin nhất. Các kiến trúc hiện đại được chia thành hai giai đoạn (Faster R-CNN — đầu tiên là đề xuất vùng, sau đó phân loại) và một giai đoạn (YOLO, SSD — mọi thứ cùng lúc).

Các chỉ số đánh giá: mAP (mean Average Precision) — chỉ số chất lượng chính của Object Detection. mAP@0.5 — độ chính xác tại ngưỡng IoU 0.5, mAP@0.5:0.95 — trung bình qua các ngưỡng từ 0.5 đến 0.95. FPS — khung hình trên giây (tốc độ suy luận). Đối với ứng dụng di động, cân bằng mAP/FPS rất quan trọng: YOLOv8-Nano cung cấp 42% mAP@0.5:0.95 ở 50+ FPS, SSD MobileNet — 22% mAP ở 60+ FPS. Cho thời gian thực > 20 FPS, cho sử dụng tương tác 5–15 FPS.

IoU (Intersection over Union) — chỉ số đo độ chồng lấn giữa bounding box dự đoán và thực tế. IoU = diện tích giao / diện tích hợp. Ngưỡng IoU cho NMS thường là 0.5–0.7. Để theo dõi đối tượng giữa các khung hình (tái nhận dạng), hãy sử dụng Deep SORT hoặc ByteTrack với so khớp IoU. Để đếm đối tượng trong video, BoT-SORT cung cấp 85% MOTA (Multiple Object Tracking Accuracy).

Kiến trúcmAP@0.5:0.95Độ trễTham sốKích thước
YOLOv8-Nano42%10–30 ms2.6M5.9 MB
YOLOv8-Small50%25–60 ms11.2M22 MB
SSD MobileNetV222%15–40 ms5.2M21 MB
EfficientDet-Lite035%20–50 ms3.9M15 MB

Anchor Boxes — các hình dạng bounding box được xác định trước mà mô hình điều chỉnh. YOLOv8 sử dụng phát hiện không neo (anchor-free), giúp đơn giản hóa việc huấn luyện và tăng tốc suy luận. SSD và YOLO cũ yêu cầu điều chỉnh neo cho mỗi tập dữ liệu. Đối với phát triển di động, kiến trúc không neo (YOLOv8, FCOS) được ưa chuộng hơn — chúng không phụ thuộc vào kích thước đối tượng và dễ tùy chỉnh hơn.

ML Kit Object Detection và Theo dõi

ML Kit Object Detection and Tracking — thư viện của Google để phát hiện và theo dõi đối tượng trên thiết bị. Hỗ trợ hai chế độ: bộ phát hiện ảnh đơn (cho ảnh) và bộ phát hiện luồng (cho video). Chế độ luồng tự động theo dõi đối tượng giữa các khung hình bằng luồng quang học, giảm độ trễ giữa các khung hình xuống 5–10 ms sau khi phát hiện ban đầu. Danh mục: fashion, food, home, places — mỗi danh mục 10–20 lớp.

API ML Kit: ObjectDetector (tùy chọn: detectorMode, enableClassification, enableMultipleObjects) → InputImage → DetectedObject (trackingId, boundingBox, classificationCategory, classificationConfidence). TrackingId cho phép theo dõi cùng một đối tượng qua các khung hình. MultipleObjects = true — phát hiện tối đa 5 đối tượng mỗi khung hình. Classification — bật nhận dạng danh mục đối tượng (mặc định false để tăng tốc). Chế độ luồng được khuyến nghị cho thời gian thực: 20–30 FPS trên Pixel 6.

kotlin
val options = ObjectDetectorOptions.Builder()
    .setDetectorMode(ObjectDetectorOptions.STREAM_MODE)
    .enableClassification()
    .enableMultipleObjects()
    .build()

val detector = ObjectDetection.getClient(options)

detector.process(inputImage)
    .addOnSuccessListener { objects ->
        objects.forEach { obj ->
            val box = obj.boundingBox
            val trackingId = obj.trackingId
            val category = obj.classificationCategory()
            drawBoundingBox(box, trackingId, category)
        }
    }

Theo dõi đối tượng: sau khi phát hiện đối tượng trong khung hình đầu tiên, ML Kit theo dõi nó qua luồng video mà không cần phát hiện lại (dựa trên luồng quang học + theo dõi đặc trưng). Điều này giảm tải CPU/GPU: phát hiện ban đầu 30–60 ms, các khung hình theo dõi tiếp theo 2–5 ms. Nếu đối tượng rời khỏi khung hình hoặc xoay > 30°, trình theo dõi được đặt lại và yêu cầu phát hiện lại. TrackingId tồn tại khi đối tượng còn trong khung hình. Để đếm các đối tượng duy nhất, hãy sử dụng trackingId làm định danh.

YOLO: You Only Look Once trên thiết bị di động

YOLOv8-Nano — phiên bản nhỏ nhất của YOLOv8 (Ultralytics) cho các thiết bị biên. 2.6M tham số, 5.9 MB (FP16), 42% mAP@0.5:0.95 trên COCO. YOLOv8 sử dụng phát hiện không neo + backbone C2f + TaskAlignedAssigner để so khớp dự đoán. Đối với phát triển di động, có thể xuất sang TFLite (INT8 — 2.0 MB, độ trễ 8–20 ms) và Core ML (4.5 MB, độ trễ 5–15 ms trên iPhone 15 Pro). YOLOv8-Nano là lựa chọn tốt nhất cho Object Detection thời gian thực trên thiết bị.

Xuất YOLOv8 sang TFLite: Ultralytics cung cấp CLI: yolo export model=yolov8n.pt format=tflite int8. Đầu ra là mô hình TFLite INT8 được tối ưu hóa cho GPU Delegate qua NNAPI. Cho tập dữ liệu tùy chỉnh (lớp riêng, không phải COCO) — huấn luyện qua Ultralytics HUB trên 50–500 ảnh mỗi lớp. RT-DETR (Real-Time Detection Transformer) — một giải pháp thay thế dựa trên kiến trúc Transformer, 48% mAP ở 60 FPS trên NVIDIA Jetson, nhưng trên thiết bị di động vẫn chậm hơn YOLOv8-Nano về tốc độ.

python
# YOLOv8 export to TFLite
from ultralytics import YOLO

model = YOLO("yolov8n.pt")
model.export(format="tflite", int8=True, imgsz=320)

# Inference with TFLite on Android
val interpreter = Interpreter(loadFile("yolov8n_int8.tflite"))
val output = Array(1) { Array(8400) { FloatArray(6) } }
interpreter.run(inputBuffer, output)

YOLO vs ML Kit trên thiết bị di động: ML Kit Object Detection dễ tích hợp hơn (10 dòng mã), không yêu cầu chuyên môn ML, nhưng bị giới hạn ở các lớp tiêu chuẩn (fashion, food, home, places). YOLOv8-Nano yêu cầu xuất tùy chỉnh nhưng cung cấp toàn quyền kiểm soát: mọi lớp, kích thước đầu vào, kiến trúc. Để tạo mẫu nhanh — ML Kit. Cho sản xuất với đối tượng không tiêu chuẩn — YOLOv8-Nano. Cho iOS: YOLOv8-Core ML qua xuất mô hình từ Ultralytics + VNCoreMLRequest.

SSD và các kiến trúc trên thiết bị khác

SSD (Single Shot Multibox Detector) — một kiến trúc một giai đoạn cổ điển cho thiết bị di động. SSD MobileNetV2 — tiêu chuẩn thực tế trong 2020–2023: 22% mAP@0.5:0.95 trên COCO, 15–40 ms trên Pixel 6. SSD sử dụng kim tự tháp đặc trưng (các lớp MobileNet khác nhau để phát hiện đối tượng với kích thước khác nhau) và các hộp mặc định (anchor boxes) cho mỗi ô bản đồ đặc trưng. Ưu điểm: tốc độ tối đa cho thời đại của nó. Nhược điểm: độ chính xác thấp trên đối tượng nhỏ (10–30 px).

EfficientDet-Lite — một dòng sản phẩm từ Google (2020+), được tối ưu hóa cho TFLite. EfficientDet-Lite0: 3.9M tham số, 35% mAP, 20–50 ms. EfficientDet-Lite2: 8.1M, 42% mAP, 40–80 ms. EfficientDet sử dụng BiFPN (Bidirectional Feature Pyramid Network) để hợp nhất đặc trưng đa tỷ lệ — điều này mang lại mức tăng 2–4% mAP mà không tăng độ trễ. Đối với phát triển di động, Google khuyến nghị EfficientDet-Lite làm bộ phát hiện chính cho TFLite Task Vision.

MediaPipe Object Detector — một triển khai sẵn sàng dựa trên EfficientDet-Lite trong khuôn khổ MediaPipe Tasks Vision. Cung cấp API thống nhất cho Android, iOS, Python, Web. MediaPipe Object Detector hỗ trợ các lớp COCO (80 lớp), mô hình tùy chỉnh, chế độ luồng và bộ ủy quyền CPU/GPU. Để tích hợp Object Detection nhanh chóng vào dự án đa nền tảng, MediaPipe là lựa chọn tối ưu: một mã cho tất cả nền tảng.

kotlin
// MediaPipe Object Detection
val options = ObjectDetectorOptions.Builder()
    .setBaseOptions(BaseOptions.builder()
        .setDelegate(BaseOptions.Delegate.GPU)
        .build())
    .setMaxResults(5)
    .setScoreThreshold(0.5f)
    .build()

val detector = ObjectDetector.createFromOptions(context, options)

val image = MPImage.fromBitmap(bitmap)
val result = detector.detect(image)
result.detections.forEach { detection ->
    val box = detection.boundingBox
    val category = detection.categories.first()
}

Chọn kiến trúc cho ứng dụng di động: cho > 30 FPS trên thiết bị tầm trung — YOLOv8-Nano (INT8) hoặc SSD MobileNetV2. Cho độ chính xác > 40% mAP — YOLOv8-Small (11.2M) hoặc EfficientDet-Lite2 (8.1M). Cho đa nền tảng — MediaPipe Object Detector. Cho đơn giản — ML Kit. Cho iOS trước — Core ML + YOLOv8 .mlpackage. Cho Android trước — TFLite Task Vision (ObjectDetector API). Huấn luyện: Roboflow (tập dữ liệu) + Ultralytics YOLOv8 (huấn luyện) + xuất sang TFLite/Core ML.

TensorFlow Lite Task Vision API

TFLite Task Vision ObjectDetector — API thống nhất từ Google để chạy các mô hình Object Detection trên Android và iOS. Task API tự động xử lý tiền xử lý ảnh (co giãn, chuẩn hóa, chuyển đổi không gian màu) và hậu xử lý (NMS, ngưỡng). Nhà phát triển chỉ cần truyền mô hình .tflite và nhận danh sách Detections với bounding box + danh mục + điểm. Task API hỗ trợ các mô hình tương thích COCO (80 lớp).

Chuyển đổi mô hình tùy chỉnh sang Task API: mô hình TFLite phải có đầu vào [1, height, width, 3] (float32/uint8) và đầu ra: detection_boxes[1,N,4], detection_classes[1,N], detection_scores[1,N], num_detections[1]. Xuất từ TensorFlow Object Detection API với các op hậu xử lý (SSD Postprocess). Cho YOLOv8 — xuất TFLite với NMS qua ops-compat. Task API trên iOS sử dụng Core ML Delegate để tăng tốc trên ANE.

kotlin
// TFLite Task Vision Object Detector
val options = ObjectDetectorOptions.Builder()
    .setScoreThreshold(0.5f)
    .setMaxResults(10)
    .setDelegate(Delegate.GPU)
    .build()

val detector = ObjectDetector.createFromFileAndOptions(
    context, "custom_model.tflite", options
)

val image = TensorImage.fromBitmap(bitmap)
val results = detector.detect(image)
results.forEach { detection ->
    onObjectDetected(
        detection.boundingBox,
        detection.categories.first().label,
        detection.categories.first().score
    )
}

Hiệu suất Task API: GPU Delegate trên Android cung cấp tăng tốc 3–5x so với CPU (XNNPACK). NNAPI Delegate — thêm 1.5–2x trên thiết bị có NPU (Pixel 8, Snapdragon 8 Gen 3, Dimensity 9300). Hexagon, DSP — lên đến 10x trên bộ tăng tốc DSP. Cho iOS, Core ML Delegate — 4–6x so với CPU. Task API tự động chọn bộ tăng tốc phần cứng khả dụng, nhưng có thể buộc chỉ định bộ ủy quyền qua DetectorOptions.

Ứng dụng của Object Detection trong ứng dụng di động

Đếm người và đối tượng — phân tích bán lẻ: phát hiện khách hàng trong cửa hàng, đếm hàng đợi, xác định mức tồn kho trên kệ. Bộ đếm người Object Detection trong khung hình giúp ước tính lưu lượng khách và tỷ lệ chuyển đổi. ML Kit Object Detector cung cấp lên đến 30 FPS — đủ cho đếm thời gian thực. Cho vượt qua vùng — kết hợp Object Detection + theo dõi ByteTrack. Độ chính xác đếm: 92–95% trong điều kiện ánh sáng tốt.

Phát hiện lỗi trong sản xuất — Object Detection xác định lỗi trên băng chuyền: vết xước, vỡ, nứt, lắp ráp sai. Mô hình YOLOv8-Nano (INT8) tùy chỉnh chạy trên máy tính bảng Android kết nối với camera USB. Độ trễ: 20–40 ms mỗi khung hình (25–50 FPS). Cho lỗi phức tạp (vết nứt siêu nhỏ) — tăng độ phân giải đầu vào lên 640x640 (độ trễ 40–80 ms). Huấn luyện: Roboflow — tập dữ liệu 200–1000 ảnh lỗi + Ultralytics YOLOv8.

Đánh dấu đối tượng AR thời gian thực — ARCore (Android) và ARKit (iOS) sử dụng Object Detection để nhận dạng bề mặt phẳng, mặt phẳng dọc và đối tượng 3D. ML Kit Object Detection + ARCore Scene Semantics cung cấp phân đoạn đối tượng: tường, sàn, trần, đồ nội thất. Cho đánh dấu AR tùy chỉnh (ví dụ: nhận dạng mô hình ghế sofa cụ thể và phủ thông tin AR) — YOLOv8-Nano + SceneKit/SceneForm. Yêu cầu thời gian thực: > 20 FPS.

swift
// ARKit + Object Detection
let request = VNCoreMLRequest(model: objectDetector) { req, _ in
    guard let results = req.results as? [VNDetectedObjectObservation] else { return }
    for result in results where result.confidence > 0.6 {
        let rect = result.boundingBox
        let worldPos = arView.hitTest(rect.center)
        arView.addAnchor(ARAnchor(name: label, transform: worldPos))
    }
}

Hình ảnh y tế — Object Detection để phân tích X-quang, MRI, CT scan. Phát hiện khối u, gãy xương, bệnh lý trên thiết bị di động của bác sĩ. YOLOv8-Nano trên máy tính bảng Android phát hiện nốt phổi trong 15–30 ms với độ nhạy 89% và độ đặc hiệu 93% (dữ liệu NIH ChestX-ray14). Yêu cầu: lượng tử hóa INT8 (quyền riêng tư dữ liệu), độ thu hồi cao (bỏ sót bệnh lý nguy hiểm hơn cảnh báo sai), ngưỡng tin cậy < 0.4. Xử lý trên thiết bị đảm bảo quyền riêng tư dữ liệu y tế.

Câu hỏi thường gặp

Sự khác biệt giữa Object Detection và Image Segmentation là gì?

Object Detection trả về bounding box cho mỗi đối tượng — một khung hình chữ nhật bao quanh đối tượng. Image Segmentation (ngữ nghĩa hoặc thể hiện) trả về đường viền chính xác của đối tượng — mặt nạ cấp pixel. Phân đoạn chính xác hơn nhưng chậm hơn (50–300 ms so với 10–30 ms cho phát hiện). Cho các tác vụ mà hình dạng đối tượng quan trọng (y tế, AR), hãy sử dụng phân đoạn. Cho các tác vụ mà vị trí và sự hiện diện quan trọng (đếm, kiểm duyệt), hãy sử dụng phát hiện. MobileViT là kiến trúc giải quyết cả hai tác vụ.

Object Detection trên thiết bị di động có thể nhận dạng bao nhiêu lớp?

YOLOv8-Nano được huấn luyện trên COCO (80 lớp). ML Kit Object Detection — 40+ lớp (fashion, food, home, places). Mô hình tùy chỉnh có thể phát hiện lên đến 100 lớp trên thiết bị di động mà không giảm hiệu suất. Trên 100 lớp, độ trễ tăng và mAP giảm. Cho ứng dụng với 1000+ lớp, hãy sử dụng phân loại phân cấp: đầu tiên là danh mục rộng (10 lớp), sau đó là danh mục chính xác (100 lớp con). EfficientNet + YOLO — phương pháp phân cấp cho 1000+ lớp với độ trễ < 50 ms.

Có thể sử dụng Object Detection để theo dõi đối tượng giữa các khung hình không?

Có, ML Kit Object Detection bao gồm theo dõi tích hợp: sau khi phát hiện trong khung hình đầu tiên, đối tượng được theo dõi qua luồng video mà không cần phát hiện lại. Để theo dõi phức tạp hơn (đối tượng chéo nhau, rời khỏi khung hình), hãy sử dụng ByteTrack hoặc BoT-SORT. ByteTrack hoạt động dựa trên IoU (intersection over union) giữa bounding box của các khung hình liền kề — 85% MOTA trên MOT17. BoT-SORT bổ sung sử dụng tái nhận dạng (ReID) để phục hồi đối tượng bị mất — 90% MOTA.

Làm thế nào để triển khai YOLOv8 trên iOS?

Xuất YOLOv8 sang Core ML: yolo export model=yolov8n.pt format=coreml int8. .mlpackage kết quả được tích hợp qua VNCoreMLRequest (Vision Framework). Thay thế: YOLOv8 → TFLite → Core ML Delegate (iOS TFLite API). Xuất Ultralytics YOLOv8 Core ML hỗ trợ iOS 16+, tăng tốc ANE, lượng tử hóa FP16 và INT8. Để phát luồng, hãy sử dụng AVFoundation + Vision với các yêu cầu hiệu suất VNImageRequestHandler lặp lại. Thời gian thực: 20–30 FPS trên iPhone 14 Pro.

Làm thế nào để cải thiện độ chính xác của Object Detection trên thiết bị di động?

Tăng đa dạng tập dữ liệu (góc, ánh sáng, nền) — 500+ ảnh mỗi lớp. Sử dụng tăng cường dữ liệu: mosaic, mixup, random perspective (tăng cường Ultralytics YOLOv8 — tăng 2–5% mAP). Tăng kích thước đầu vào lên 640x640 (thay vì 320x320) — +4–8% mAP, nhưng độ trễ ×2. Sử dụng lượng tử hóa FP16 hoặc INT8 sau huấn luyện — mất +0–1% mAP, nén 4x. Cho iOS, sử dụng ANE (Neural Engine) qua Core ML Delegate — tăng tốc 3–5x so với CPU.

Tổng kết

  • Object Detection — phân loại + định vị đối tượng với bounding boxes
  • ML Kit — lên đến 30 FPS, 40+ lớp, theo dõi đối tượng tích hợp
  • YOLOv8-Nano — 2.6M tham số, 42% mAP, 10–30 ms, tốt nhất cho trên thiết bị
  • SSD / EfficientDet — giải pháp thay thế cổ điển và hiện đại cho TFLite
  • Task Vision API — API TFLite thống nhất với tăng tốc GPU/ANE
  • On-device — quyền riêng tư dữ liệu, độ trễ bằng không, không cần internet
  • Ứng dụng — phân tích bán lẻ, AR, y tế, phát hiện lỗi, đếm đối tượng

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm