4、深度学习目标检测基础:目标检测任务定义、主流算法对比(YOLO/SSD/Faster R-CNN)、Anchor与NMS原理、mAP评估指标
4.1 目标检测到底在干什么?
先聊聊目标检测这个任务本身。说白了,就是让计算机在图像里找到「什么东西在哪儿」。
分类任务只回答「这是什么」,检测任务要回答「这是什么 + 它在哪」。我刚开始接触这个领域时,觉得不就是分类加个框嘛,后来才发现,这里面的门道深着呢。
一个完整的目标检测输出包含两部分:
- 类别标签:比如人、车、猫、狗
- 边界框(Bounding Box):通常用 (x, y, w, h) 或 (x1, y1, x2, y2) 表示
你想想看,一张图里可能有几十个物体,大小不一、相互遮挡、角度各异。这就是检测比分类难的地方。
核心挑战:既要定位准,又要分类对,还要跑得快。这三者往往互相制约。
4.2 主流算法对比:YOLO vs SSD vs Faster R-CNN
做项目这么多年,我基本把这三种算法都摸透了。它们代表了目标检测发展的三条技术路线。
| 算法 | 核心思想 | 速度 | 精度 | 适用场景 |
|---|---|---|---|---|
| Faster R-CNN | 两阶段:先提候选框,再分类回归 | 慢(5-10 FPS) | 高 | 精度优先、实时性要求低 |
| SSD | 单阶段:多尺度特征图直接预测 | 快(30-60 FPS) | 中等 | 平衡场景 |
| YOLO | 单阶段:端到端回归,网格划分 | 极快(60-240 FPS) | 高(最新版) | 实时检测、边缘部署 |
Faster R-CNN:精度之王
我记得第一次跑Faster R-CNN时,被它的精度惊艳到了。它分两步走:先用RPN(区域提议网络)生成候选框,再对这些框做分类和精修。好处是精度高,坏处是——慢。在Jetson Nano上跑,基本就是个幻灯片。
避坑指南:我曾经在Jetson上部署Faster R-CNN做实时检测,结果帧率只有2-3 FPS。后来果断换成了YOLOv5,帧率直接飙到30+。所以,选算法前一定要想清楚你的硬件平台。
SSD:多尺度特征图的妙用
SSD的思路很有意思——它从不同尺寸的特征图上做预测。大特征图检测小物体,小特征图检测大物体。这个设计在当时是很聪明的做法。不过说实话,SSD对小物体的检测效果一直不太理想,我在项目中吃过这个亏。
YOLO:实时检测的标杆
YOLO把检测当成一个回归问题来解决。它将图像分成S×S的网格,每个网格负责预测中心点落在该网格内的物体。从v1到v8,YOLO家族一直在进化。我个人习惯在Jetson上用YOLOv5或YOLOv8,部署起来最顺手。
我的建议:如果你刚开始做Jetson部署,直接从YOLOv5s或YOLOv8n入手。模型小、速度快、精度够用。等熟悉了流程,再尝试更复杂的模型。
4.3 Anchor与NMS原理
Anchor:预设的「模板框」
Anchor是什么?说白了就是一组预设好的框。比如你提前定义好「宽高比1:1、1:2、2:1」三种形状,每种形状再配几个不同尺寸。模型要做的,就是在这个基础上微调。
为什么会需要Anchor?因为直接预测任意形状的框太难了。给模型一个「模板」,让它只预测偏移量,学习难度就大大降低了。
我在项目中遇到过一个问题:Anchor的尺寸设置不合理,导致小物体一直检测不到。后来我统计了训练集中所有物体的尺寸分布,重新聚类了Anchor,效果立竿见影。
关键点:Anchor不是死的。你可以用K-means聚类算法,从你的数据集中自动学习出最合适的Anchor尺寸。YOLOv5就内置了这个功能。
NMS:去掉重复的框
模型预测完后,同一个物体周围会冒出很多框。NMS(非极大值抑制)就是用来「去重」的。
算法流程很简单:
- 按置信度排序,选最高的框
- 计算其他框与它的IoU(交并比)
- IoU大于阈值(通常0.5)的框直接扔掉
- 重复直到所有框都被处理
嗯,这里要注意:NMS的阈值很关键。设得太低,会漏掉重叠的物体;设得太高,又会有很多重复框。我曾经在一个密集人群检测项目中,把阈值从0.5调到0.3,召回率提升了8%。
避坑指南:在Jetson上做推理时,NMS这一步可能会成为瓶颈。建议使用TensorRT的NMS插件,或者用Fast NMS等优化版本。我曾经因为没优化NMS,导致推理速度慢了30%。
4.4 mAP评估指标
mAP(mean Average Precision)是目标检测最常用的评估指标。很多人觉得它复杂,其实拆开来看就清楚了。
先理解几个基础概念
- IoU(交并比):预测框和真实框的重叠程度。IoU > 0.5 就算检测成功
- Precision(精确率):你预测的所有框中,有多少是对的
- Recall(召回率):所有真实物体中,你找出了多少
AP和mAP的计算
AP是针对单个类别的。比如「人」这个类别,你改变置信度阈值,会得到一组Precision-Recall曲线。曲线下的面积就是AP。
mAP就是所有类别AP的平均值。在COCO数据集上,通常用mAP@0.5(IoU阈值0.5)和mAP@0.5:0.95(IoU从0.5到0.95,步长0.05的平均值)两个指标。
实战经验:我一般这样看指标——mAP@0.5高说明模型「大致能检测到」,mAP@0.5:0.95高说明模型「框得很准」。如果你的应用对定位精度要求高(比如机械臂抓取),就要重点关注后者。
在Jetson上评估模型
在Jetson上做评估时,我建议用验证集跑一遍完整的mAP计算。但要注意:
- Jetson的算力有限,全量评估可能很慢
- 可以先用500-1000张图片做快速验证
- TensorRT的INT8量化可能会降低mAP,需要权衡速度和精度
小技巧:我习惯在PC上先调好模型,mAP达标后再部署到Jetson上。在Jetson上只做推理速度测试和最终验证,这样效率最高。
好了,这一章的内容就到这里。目标检测的基础概念比较多,但都是后面实战的基石。下一章我们会真正动手,在Jetson上跑起第一个检测模型。