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(非极大值抑制)就是用来「去重」的。

算法流程很简单:

  1. 按置信度排序,选最高的框
  2. 计算其他框与它的IoU(交并比)
  3. IoU大于阈值(通常0.5)的框直接扔掉
  4. 重复直到所有框都被处理

嗯,这里要注意: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上跑起第一个检测模型。