Object Detection — 是一项计算机视觉任务,同时确定对象的类别(猫、汽车、人)及其在图像上的位置,以矩形框(bounding box)的形式呈现。与Image Labeling不同,Object Detection可以在一个帧中找到多个不同类别的对象并指出它们的坐标。在移动开发中,Object Detection应用于视频监控系统、AR应用程序、自主无人机、医学成像和零售分析。根据Google ML Kit, 2025的数据,设备端Object Detection在旗舰设备上可达30 FPS,精度为87% mAP。
要点
Object Detection同时解决两个问题:图像中有什么(分类)和在哪里(坐标回归)。模型将图像分割成网格,为每个单元预测bounding box(x, y, width, height)和类别概率。Non-Maximum Suppression(NMS)删除一个对象的重复框,保留最确定的预测。现代架构分为两阶段(Faster R-CNN — 先region proposals,再分类)和单阶段(YOLO, SSD — 一次性完成)。
评估指标:mAP(mean Average Precision)——Object Detection的主要质量指标。mAP@0.5 — 在IoU阈值0.5时的精度,mAP@0.5:0.95 — 在0.5到0.95阈值上的平均值。FPS — 每秒帧数(推理速度)。对于移动应用,mAP/FPS的平衡至关重要:YOLOv8-Nano在50+ FPS时提供42% mAP@0.5:0.95,SSD MobileNet在60+ FPS时提供22% mAP。实时应用需要> 20 FPS,交互式使用需要5–15 FPS。
IoU(Intersection over Union) — 预测bounding box与ground truth之间的重叠度量。IoU = 交集面积 / 并集面积。NMS的IoU阈值通常为0.5–0.7。对于帧间对象跟踪(re-identification),使用Deep SORT或ByteTrack配合IoU匹配。对于视频中对象计数,BoT-SORT提供85% MOTA(Multiple Object Tracking Accuracy)。
| 架构 | mAP@0.5:0.95 | 延迟 | 参数 | 大小 |
|---|---|---|---|---|
| YOLOv8-Nano | 42% | 10–30毫秒 | 2.6M | 5.9 MB |
| YOLOv8-Small | 50% | 25–60毫秒 | 11.2M | 22 MB |
| SSD MobileNetV2 | 22% | 15–40毫秒 | 5.2M | 21 MB |
| EfficientDet-Lite0 | 35% | 20–50毫秒 | 3.9M | 15 MB |
Anchor Boxes — 模型校正的预定义bounding box形状。YOLOv8使用无锚检测(anchor-free),这简化了学习并加速了推理。SSD和旧版YOLO需要为数据集选择锚点。对于移动开发,anchor-free架构(YOLOv8, FCOS)更优——它们不依赖于对象大小,且更易于定制。
ML Kit Object Detection and Tracking — Google用于在设备上检测和跟踪对象的库。支持两种模式:single-image detector(用于照片)和streaming detector(用于视频)。流模式使用光流自动跟踪帧间对象,将初始检测后的帧间延迟降低到5–10毫秒。类别:fashion, food, home, places — 每类10–20个类别。
ML Kit API:ObjectDetector(选项:detectorMode, enableClassification, enableMultipleObjects)→ InputImage → DetectedObject(trackingId, boundingBox, classificationCategory, classificationConfidence)。TrackingId允许在帧间跟踪同一对象。MultipleObjects = true — 每帧检测最多5个对象。Classification — 启用对象类别识别(默认为false以保持速度)。流模式推荐用于实时应用:Pixel 6上20–30 FPS。
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)
}
}
Object Tracking:在第一个帧上检测对象后,ML Kit通过视频流跟踪它而无需重新检测(基于optical flow + feature tracking)。这减少了CPU/GPU负载:第一次检测30–60毫秒,后续跟踪帧2–5毫秒。如果对象离开帧或旋转超过30°,跟踪器将重置并需要重新检测。TrackingId在对象位于帧内时保持不变。要计算唯一对象,请使用trackingId作为标识符。
YOLOv8-Nano — 适用于边缘设备的最小YOLOv8(Ultralytics)版本。2.6M参数,5.9 MB(FP16),在COCO上42% mAP@0.5:0.95。YOLOv8使用无锚检测 + C2f backbone + TaskAlignedAssigner进行预测匹配。对于移动开发,可导出为TFLite(INT8 — 2.0 MB,延迟8–20毫秒)和Core ML(4.5 MB,iPhone 15 Pro上延迟5–15毫秒)。YOLOv8-Nano — 设备端实时Object Detection的最佳选择。
将YOLOv8导出到TFLite:Ultralytics提供CLI:yolo export model=yolov8n.pt format=tflite int8。输出是通过NNAPI针对GPU Delegate优化的TFLite INT8模型。对于自定义数据集(自定义类别,非COCO)——通过Ultralytics HUB在每类50–500张图像上进行训练。RT-DETR(Real-Time Detection Transformer)——基于Transformer架构的替代方案,在NVIDIA Jetson上60 FPS时48% mAP,但对于移动设备,速度仍不及YOLOv8-Nano。
# 将YOLOv8导出到TFLite
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
model.export(format="tflite", int8=True, imgsz=320)
# 在Android上使用TFLite进行推理
val interpreter = Interpreter(loadFile("yolov8n_int8.tflite"))
val output = Array(1) { Array(8400) { FloatArray(6) } }
interpreter.run(inputBuffer, output)
移动设备上的YOLO vs ML Kit:ML Kit Object Detection集成更简单(10行代码),不需要ML专业知识,但限于标准类别(fashion, food, home, places)。YOLOv8-Nano需要自定义导出,但提供完全控制:任意类别、输入大小、架构。快速原型制作 — ML Kit。具有非标准对象的生产环境 — YOLOv8-Nano。对于iOS:通过Ultralytics + VNCoreMLRequest导出YOLOv8-Core ML模型。
SSD(Single Shot Multibox Detector) — 适用于移动设备的经典单阶段架构。SSD MobileNetV2 — 2020–2023年的事实标准:在COCO上22% mAP@0.5:0.95,Pixel 6上15–40毫秒。SSD使用特征金字塔(MobileNet的不同层用于检测不同大小的对象)和每个特征图单元的默认框(anchor boxes)。优点:当时的最大速度。缺点:小对象(10–30像素)精度低。
EfficientDet-Lite — Google(2020+)的系列,针对TFLite优化。EfficientDet-Lite0:3.9M参数,35% mAP,20–50毫秒。EfficientDet-Lite2:8.1M,42% mAP,40–80毫秒。EfficientDet使用BiFPN(Bidirectional Feature Pyramid Network)进行多尺度特征融合——在不增加延迟的情况下提供2–4%的mAP提升。对于移动开发,Google推荐EfficientDet-Lite作为TFLite Task Vision的主要检测器。
MediaPipe Object Detector — 在MediaPipe Tasks Vision中基于EfficientDet-Lite的现成实现。为Android、iOS、Python、Web提供统一API。MediaPipe Object Detector支持COCO类别(80类)、自定义模型、流模式和CPU/GPU委托。对于跨平台项目中快速集成Object Detection,MediaPipe是最优选择:所有平台一套代码。
// 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()
}
移动应用的架构选择:中端设备上> 30 FPS — YOLOv8-Nano(INT8)或SSD MobileNetV2。精度> 40% mAP — YOLOv8-Small(11.2M)或EfficientDet-Lite2(8.1M)。跨平台 — MediaPipe Object Detector。简单性 — ML Kit。iOS优先 — Core ML + YOLOv8 .mlpackage。Android优先 — TFLite Task Vision(ObjectDetector API)。训练:Roboflow(数据集)+ Ultralytics YOLOv8(训练)+ 导出到TFLite/Core ML。
TFLite Task Vision ObjectDetector — Google提供的用于在Android和iOS上运行Object Detection模型的统一API。Task API自动处理图像预处理(缩放、归一化、色彩空间转换)和后处理(NMS、阈值处理)。开发者需要传递.tflite模型并接收带有bounding box + category + score的Detections列表。Task API支持与COCO兼容的模型(80类)。
将自定义模型转换为Task API:TFLite模型必须具有输入[1, height, width, 3](float32/uint8)和输出:detection_boxes[1,N,4]、detection_classes[1,N]、detection_scores[1,N]、num_detections[1]。从TensorFlow Object Detection API导出,包含后处理操作(SSD Postprocess)。对于YOLOv8 — 通过ops-compat导出带NMS的TFLite。iOS上的Task API使用Core ML Delegate在ANE上加速。
// 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
)
}
Task API性能:Android上的GPU Delegate相比CPU(XNNPACK)提供3–5倍加速。NNAPI Delegate — 在具有NPU的设备上(Pixel 8, Snapdragon 8 Gen 3, Dimensity 9300)额外1.5–2倍。Hexagon、DSP — 在DSP加速器上高达10倍。iOS的Core ML Delegate — 相比CPU 4–6倍。Task API自动选择可用的硬件加速器,但可以通过DetectorOptions强制指定委托。
人员和对象计数 — 零售分析:检测商店中的访客、排队计数、确定货架商品填充度。帧中的Object Detection计数器可以评估客流和转化率。ML Kit Object Detector提供高达30 FPS — 足以进行实时计数。对于跨线计数(zone crossing)—— Object Detection + ByteTrack跟踪组合。计数精度:良好光照下92–95%。
生产中的缺陷检测 — Object Detection确定生产线上的缺陷:划痕、碎屑、裂纹、错误组装。自定义YOLOv8-Nano(INT8)模型在连接到USB摄像头的Android平板上运行。延迟:每帧20–40毫秒(25–50 FPS)。对于复杂缺陷(微裂纹)——将输入分辨率提高到640x640(延迟40–80毫秒)。训练:Roboflow — 200–1000张缺陷图像数据集 + Ultralytics YOLOv8。
实时AR对象标记 — ARCore(Android)和ARKit(iOS)使用Object Detection识别平面、垂直平面和3D对象。ML Kit Object Detection + ARCore Scene Semantics提供对象分割:墙壁、地板、天花板、家具。对于自定义AR标记(例如识别特定沙发型号并叠加AR信息)—— YOLOv8-Nano + SceneKit/SceneForm。实时要求:> 20 FPS。
// 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))
}
}
医学成像 — Object Detection用于分析X光、MRI、CT扫描。在医生移动设备上检测肿瘤、骨折、病理。Android平板上的YOLOv8-Nano在15–30毫秒内检测肺结节,灵敏度89%,特异性93%(NIH ChestX-ray14数据)。要求:INT8量化(数据隐私)、高召回率(漏诊比误报更危险)、使用置信度阈值< 0.4。设备端处理保证医疗数据的隐私。
常见问题
Object Detection为每个对象返回bounding box — 包围对象的矩形框。Image Segmentation(语义或实例)返回对象的精确轮廓 — 像素级掩码。分割更精确但更慢(50–300毫秒 vs 检测的10–30毫秒)。对于对象形状重要的任务(医学、AR),使用分割。对于位置和存在重要的任务(计数、审核),使用检测。MobileViT — 解决这两类任务的架构。
YOLOv8-Nano在COCO上训练(80类)。ML Kit Object Detection — 40+类(fashion, food, home, places)。自定义模型可以在移动设备上检测多达100个类别而不会损失性能。超过100类 — 延迟增加,mAP下降。对于1000+类的应用,使用分层分类:先粗类别(10类),再精确(100个子类)。EfficientNet + YOLO — 延迟< 50毫秒的1000+类分层方法。
是的,ML Kit Object Detection包含内置跟踪:在第一个帧上检测后,对象通过视频流被跟踪而无需重新检测。对于更复杂的跟踪(对象交叉、离开画面),使用ByteTrack或BoT-SORT。ByteTrack基于相邻帧bounding box之间的IoU(intersection over union)工作 — 在MOT17上85% MOTA。BoT-SORT额外使用re-identification(ReID)来恢复丢失的对象 — 90% MOTA。
将YOLOv8导出到Core ML:yolo export model=yolov8n.pt format=coreml int8。生成的.mlpackage通过VNCoreMLRequest(Vision Framework)集成。替代方案:YOLOv8 → TFLite → Core ML Delegate(iOS TFLite API)。Ultralytics YOLOv8 Core ML导出支持iOS 16+、ANE加速、FP16和INT8量化。对于流媒体,使用AVFoundation + Vision配合重复的VNImageRequestHandler请求。实时:iPhone 14 Pro上20–30 FPS。
增加数据集的多样性(角度、光照、背景)— 每类500+张图像。使用数据增强:mosaic、mixup、random perspective(Ultralytics YOLOv8增强 — mAP提升2–5%)。将输入尺寸提高到640x640(而非320x320)— +4–8% mAP,但延迟×2。训练后使用FP16或INT8量化(post-training)— +0–1% mAP损失,4倍压缩。对于iOS,通过Core ML Delegate使用ANE(Neural Engine)— 相比CPU加速3–5倍。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。