3、目标检测基础:目标检测任务定义、常用模型(YOLO、SSD、Faster R-CNN)简介、模型输出格式(边界框、类别、置信度)
在将目标检测模型部署到手机端之前,我们必须先建立对目标检测任务本身的清晰认知。目标检测(Object Detection)是计算机视觉中最核心的任务之一,它不仅要回答“图像中有什么物体”,还要回答“物体在哪里”。与图像分类(Image Classification)只输出整张图片的类别标签不同,目标检测需要同时输出多个物体的位置信息与类别信息。本章将系统梳理目标检测的任务定义、三类主流模型(YOLO、SSD、Faster R-CNN)的核心设计思想,以及模型输出的标准格式——边界框、类别与置信度。这些知识是后续进行ONNX模型转换、量化压缩和端侧推理优化的基础,理解不透彻将直接影响部署方案的选型与调优。
3.1 目标检测任务定义与问题建模
目标检测的任务定义可以形式化描述为:给定一张输入图像 \( I \),模型需要输出一组检测结果 \( D = \{d_1, d_2, ..., d_n\} \),其中每个检测结果 \( d_i \) 包含三个核心要素:边界框(Bounding Box)、类别标签(Class Label)和置信度(Confidence Score)。边界框通常用矩形框表示,常见表示方式有两种:一种是中心点坐标加宽高 \( (c_x, c_y, w, h) \),另一种是左上角与右下角坐标 \( (x_1, y_1, x_2, y_2) \)。类别标签来自预先定义的类别集合 \( C = \{c_1, c_2, ..., c_m\} \),例如COCO数据集的80类或VOC数据集的20类。置信度则是一个0到1之间的浮点数,表示模型对该检测结果可靠程度的估计。
从数学建模的角度看,目标检测是一个多任务学习问题:模型需要同时优化分类损失(判断框内物体属于哪个类别)和回归损失(精确调整边界框的位置与尺寸)。这种多任务特性使得目标检测比纯分类任务复杂得多,也直接影响了模型在手机端的计算开销和内存占用。在部署时,我们需要特别关注模型输出的张量形状——它通常是 \( [1, N, 5 + C] \) 或 \( [1, N, C+4] \) 的格式,其中 \( N \) 是预设的候选框数量(如YOLO的8400或SSD的8732),\( C \) 是类别数,4代表边界框坐标,1代表置信度(或与类别概率合并)。
3.2 三大主流模型架构对比
目标检测模型的发展经历了从两阶段到单阶段的演进,不同架构在精度、速度和计算量上各有取舍。理解这些差异对于选择适合手机端部署的模型至关重要。
3.2.1 Faster R-CNN:两阶段检测的开山之作
Faster R-CNN由Ren等人在2015年提出,其核心思想是“先粗后精”。第一阶段使用区域提议网络(RPN, Region Proposal Network)从特征图中生成约2000个可能包含物体的候选区域(Region Proposals);第二阶段对每个候选区域进行ROI Pooling,提取固定尺寸的特征,然后通过全连接层进行分类和边界框回归。这种两阶段设计使得Faster R-CNN在精度上表现出色,尤其是在小物体检测场景下优势明显。但其计算量巨大——单张图片需要处理数千个候选区域,在手机端CPU上推理一张640×480的图片通常需要数秒,即使经过优化也难以达到实时要求。
3.2.2 SSD:单阶段多尺度检测
SSD(Single Shot MultiBox Detector)由Liu等人在2016年提出,它摒弃了候选区域生成阶段,直接在多个不同尺度的特征图上进行密集采样和预测。SSD的关键创新在于多尺度特征图检测:浅层特征图(分辨率高、语义信息弱)负责检测小物体,深层特征图(分辨率低、语义信息强)负责检测大物体。SSD在VOC2007测试集上达到了72.1%的mAP,同时速度比Faster R-CNN快一个数量级。在手机端部署时,SSD的模型结构相对规整,卷积层和归一化层易于被ONNX Runtime的CPU算子优化,但需要处理8732个默认框(Default Boxes)的后处理,NMS耗时较长。
3.2.3 YOLO系列:实时检测的标杆
YOLO(You Only Look Once)由Redmon等人在2016年首次提出,其核心思想是将目标检测视为一个端到端的回归问题。YOLO将输入图像划分为S×S的网格,每个网格负责预测固定数量的边界框、置信度和类别概率。经过多次迭代,YOLOv5、YOLOv8等版本在保持高速的同时大幅提升了精度。以YOLOv8n为例,其参数量仅约3.2M,在手机端CPU上使用ONNX Runtime推理,640×640输入的单帧延迟可控制在100ms以内,是当前端侧部署的主流选择。YOLO系列模型的输出格式通常为 \( [1, 84, 8400] \)(COCO 80类),其中84 = 4(坐标)+ 80(类别概率),8400是不同尺度特征图上的锚点总数。
| 模型 | 阶段数 | 典型mAP (COCO) | 参数量 | 手机端推理延迟 (CPU) | 部署友好度 |
|---|---|---|---|---|---|
| Faster R-CNN | 两阶段 | 37.4 (ResNet50) | ~41M | 3-10秒/帧 | 低(结构复杂,后处理重) |
| SSD | 单阶段 | 28.8 (VGG16) | ~26M | 300-800ms/帧 | 中(需处理8732个框) |
| YOLOv8n | 单阶段 | 37.3 | ~3.2M | 50-150ms/帧 | 高(输出规整,易优化) |
3.3 模型输出格式深度解析
无论使用哪种模型,最终导出为ONNX格式后,其输出张量的语义是部署工程师必须精确掌握的。以YOLOv8为例,其ONNX输出形状为 \( [1, 84, 8400] \),这里的维度顺序是通道在前(Channel First)。84维向量中,前4维是边界框坐标(中心点x、中心点y、宽度w、高度h),后80维是每个类别的概率。8400个候选框来自三个不同尺度特征图的展平:80×80(6400个)、40×40(1600个)、20×20(400个)。
在端侧解码时,我们需要执行以下步骤:
- 转置与重塑:将 \( [1, 84, 8400] \) 转置为 \( [1, 8400, 84] \),便于按行处理。
- 置信度计算:对于每个候选框,取80个类别概率的最大值作为该框的类别置信度,并记录对应的类别索引。
- 阈值过滤:将置信度低于预设阈值(如0.25)的候选框直接丢弃,通常可过滤掉90%以上的冗余框。
- 坐标转换:将中心点坐标格式转换为 \( (x_1, y_1, x_2, y_2) \) 格式,便于后续NMS和绘制。
- NMS:对同一类别的候选框按置信度降序排列,依次抑制与当前框IoU大于阈值的其他框。
// 伪代码:YOLOv8输出解码核心逻辑
// 输入: output [1, 84, 8400], 置信度阈值 conf_thres=0.25, NMS阈值 iou_thres=0.45
for each of 8400 anchors:
scores = output[0, 4:84, anchor] // 80个类别概率
conf, class_id = max(scores)
if conf < conf_thres: continue
cx, cy, w, h = output[0, 0:4, anchor]
x1 = cx - w/2; y1 = cy - h/2
x2 = cx + w/2; y2 = cy + h/2
detections.append({x1, y1, x2, y2, conf, class_id})
// 按类别分组后执行NMS
for each class c:
sort detections by conf descending
while detections not empty:
keep = detections[0]
remove all detections with IoU(keep, d) > iou_thres
3.4 案例拆解:从COCO模型到手机端检测的完整链路
为了将上述概念串联起来,我们以一个实际场景为例:假设我们需要在Android手机上实现一个实时行人检测应用,选用YOLOv8n模型(COCO预训练,80类中包含person类)。
背景与约束:目标设备为搭载骁龙8 Gen 2芯片的Android手机,要求推理延迟低于80ms,内存占用低于500MB,检测精度mAP@0.5不低于0.45。
初始现象与关键指标:直接使用PyTorch导出的YOLOv8n ONNX模型(FP32精度),在手机CPU上使用ONNX Runtime实测延迟为180ms,远超80ms的目标。通过性能分析工具(如Perfetto)发现,耗时分布为:卷积层计算占65%,后处理(NMS)占25%,数据预处理占10%。
分析判断过程:首先,FP32模型在CPU上计算量过大,需要量化到INT8。其次,NMS在Java层实现效率低下,需要改用C++实现或集成到ONNX模型中。最后,输入分辨率从640×640降至480×480,可减少约44%的计算量,但需验证精度损失。
实际操作步骤:
- 使用ONNX Runtime的量化工具将模型转换为INT8动态量化版本,实测延迟降至95ms。
- 将NMS逻辑用C++重写,并通过JNI调用,延迟进一步降至70ms。
- 将输入分辨率调整为512×512,mAP下降约2%,但延迟降至55ms,满足要求。
- 最终方案:INT8量化 + 512×512输入 + C++后处理,总延迟52ms,内存占用380MB。
结果对比与复盘:量化带来的精度损失在可接受范围内(mAP从0.52降至0.49),而分辨率降低对行人这类中等尺寸物体影响较小。复盘发现,后处理优化往往比模型压缩更容易被忽视,但收益显著。此外,不同手机芯片的NPU加速能力差异巨大,后续章节将介绍如何通过ONNX Runtime的EP(Execution Provider)接口调用NPU。
3.5 总结与部署要点复盘
本章我们系统梳理了目标检测的基础知识,核心要点可以归纳为以下四条:
- 任务本质:目标检测是分类与回归的联合任务,输出必须包含边界框、类别和置信度三要素。
- 模型选型:手机端部署优先选择单阶段模型(YOLO、SSD),两阶段模型(Faster R-CNN)仅在离线高精度场景下考虑。
- 输出格式:必须精确理解ONNX输出的张量形状和维度顺序,YOLO系列为 \( [1, C+4, N] \),SSD为 \( [1, N, C+4] \),解码逻辑完全不同。
- 后处理不可忽视:置信度过滤和NMS是端侧推理的必要环节,其实现效率直接影响整体延迟。