目标检测算法
一、目标检测基础概念
1. 核心定义与任务边界
目标检测是计算机视觉的核心任务之一,区别于 “图像分类(仅判断类别)” 和 “图像分割(像素级类别标注)”,其核心目标是 “识别 + 定位” 双任务协同 :
- 识别任务:判断图像中存在哪些预设类别的物体(如 “人”“车”“狗”);
- 定位任务:用边界框精确标记每个物体在图像中的位置,确保后续应用(如自动驾驶避障、安防监控追踪)可精准定位目标。
2. 核心挑战深度解析
目标检测需应对真实场景的复杂干扰,各挑战的本质与影响如下:
- 目标种类与数量繁多:真实场景中目标类别可能达数十甚至上百种(如 COCO 数据集 80 类),且同一图像中目标数量不固定(从 1 个到数十个),导致模型需同时处理 “多类别分类” 和 “多目标定位”,计算复杂度陡增;
- 目标尺度不均:同一类别目标在图像中尺寸差异极大(如 “车” 可能是远处的小像素点,也可能是近处的大区域),传统固定尺寸检测方法易漏检小目标或误检大目标区域;
- 外部环境干扰:
- 遮挡:目标可能被其他物体部分或完全遮挡(如 “人” 被树木遮挡),导致边界框标注不完整,特征提取不充分;
- 噪声:图像可能存在模糊、光照过强 / 过弱、阴影等噪声,干扰目标特征,降低分类与定位精度。
二、目标检测数据集
1. 主流数据集核心参数对比
数据集是模型训练与评估的基础,不同数据集的标注规则、规模和适用场景差异显著:
数据集 | 发起方 / 起源 | 图像规模 | 目标标注规模 | 类别划分 | 标注特点 | 适用场景 |
---|---|---|---|---|---|---|
PASCAL VOC | 欧盟 PASCAL 组织(2005-2012) | VOC 2007:9963 张;VOC 2012:23080 张 | VOC 2007:24640 个;VOC 2012:54900 个 | 4 大类(人、动物、交通工具、室内物品)+20 小类 | 标注简洁,仅包含目标边界框和类别,无细分属性 | 算法入门实验、基础性能验证 |
MS COCO | 微软(2014 年发布) | 20 万张(含训练 / 验证 / 测试集) | 超 50 万个目标标注 | 80 个类别(涵盖日常场景常见物体) | 标注精细:含边界框、类别、目标分割掩码、关键点(如人体关节) | 复杂场景模型训练、工业级性能评估 |
2. 数据集标注格式差异
不同数据集的标注文件格式(存储目标类别与边界框信息)不同,直接影响数据预处理流程:
- VOC 数据集:采用 XML 格式存储,每个图像对应一个 XML 文件,核心字段包括:
<object>
:每个目标的标注信息;<name>
:目标类别(如 “person”“car”);<bndbox>
:边界框坐标,包含<xmin>
(左上角 x)、<ymin>
(左上角 y)、<xmax>
(右下角 x)、<ymax>
(右下角 y),坐标值为图像像素实际值(非归一化)。
- COCO 数据集:采用 JSON 格式存储,整体分为 “图像信息(images)”“标注信息(annotations)”“类别信息(categories)” 三大模块,核心标注字段:
category_id
:目标类别 ID(对应 categories 中的类别);bbox
:边界框坐标,格式为[xmin, ymin, width, height]
,坐标值为像素实际值(非归一化,xmin/ymin 为左上角坐标,width/height 为目标宽高);segmentation
:目标分割掩码(可选,用于分割任务)。
- YOLO 自定义数据集:采用 TXT 格式存储,每个图像对应一个 TXT 文件,每行代表一个目标,格式为
class_id x y w h
,其中:class_id
:目标类别索引(整数,如 0 代表 “person”);x y w h
:均为归一化后的值(范围 0-1),x/y 是目标中心点的横 / 纵坐标,w/h 是目标的宽 / 高,归一化依据为图像的宽和高(如 x = 目标中心点 x 像素值 / 图像宽度)。
三、Ground Truth(真值标注)详解
Ground Truth(GT)是人工标注的 “真实目标信息”,是模型训练时计算损失、评估时判断检测正确性的唯一标准,核心包含 “类别” 和 “边界框坐标” 两部分。
1. 边界框坐标表示方法
不同格式的本质是 “坐标原点”“坐标类型”“是否归一化” 的差异,需在数据预处理时统一格式:
标注格式 | 坐标形式 | 坐标定义细节 | 归一化情况 | 转换逻辑(以图像宽 W、高 H 为例) |
---|---|---|---|---|
YOLO(TXT) | (x_center, y_center, w, h) | x_center:目标中心点 x 坐标(相对于图像宽度);y_center:目标中心点 y 坐标(相对于图像高度);w:目标宽度(相对于图像宽度);h:目标高度(相对于图像高度) | 是(0-1) | 像素坐标 → 归一化:x_center = x_pixel / W,y_center = y_pixel / H,w = w_pixel / W,h = h_pixel / H;反之则乘以 W/H |
VOC(XML) | (xmin, ymin, xmax, ymax) | xmin/ymin:目标边界框左上角像素坐标;xmax/ymax:目标边界框右下角像素坐标 | 否(像素值) | 若需归一化,需分别除以 W(xmin/xmax)和 H(ymin/ymax) |
COCO(JSON) | (xmin, ymin, width, height) | xmin/ymin:目标边界框左上角像素坐标;width/height:目标边界框的像素宽 / 高 | 否(像素值) | 转换为 VOC 格式:xmax = xmin + width,ymax = ymin + height;归一化需除以 W/H |
2. 标注示例
假设图像尺寸为 1000px(宽 W)× 800px(高 H),存在一个 “Dog” 目标,其边界框左上角像素坐标为 (100, 600),右下角为 (250, 700)(即宽 150px、高 100px,中心点 (175, 650)),不同格式的标注结果如下:
- YOLO(TXT):
0 0.175 0.8125 0.15 0.125
(假设 “Dog” 的 class_id 为 0,x_center=175/1000=0.175,y_center=650/800=0.8125,w=150/1000=0.15,h=100/800=0.125); - VOC(XML):
<name>Dog</name><bndbox><xmin>100</xmin><ymin>600</ymin><xmax>250</xmax><ymax>700</ymax></bndbox>
; - COCO(JSON):
{"category_id":1,"bbox":[100,600,150,100]}
(假设 “Dog” 的 category_id 为 1)。
四、目标检测评估指标深度解析
评估指标是衡量模型性能的核心标准,需从 “边界框正确性”“分类准确性”“整体综合性能” 三个维度逐层递进评估。
1. 基础指标:IoU(交并比)
IoU 是判断 “预测框(Predicted Box)” 与 “真值框(GT Box)” 是否匹配的核心标准,是所有后续指标的基础。
- 定义:预测框与真值框的重叠区域面积与合并区域面积的比值
- 取值范围:0-1,IoU=1 表示完全重叠(检测完美),IoU=0 表示无重叠(检测错误);
- 实际应用阈值:工业界常用 IoU≥0.5 作为 “有效检测” 的标准(即认为预测框与真值框匹配),部分场景(如高精度医疗检测)会提高阈值至 0.7-0.9;
- 示例:若预测框面积为 100,真值框面积为 80,重叠区域面积为 50,则 IoU=50/(100+80-50)=50/130≈0.38(低于 0.5,判定为无效检测)。
2. 分类指标:TP/FP/TN/FN
基于 IoU 阈值,将所有检测结果划分为四类,是计算 Precision 和 Recall 的前提:
指标 | 定义(真值与预测的关系) | 目标检测场景具体含义 | 对模型性能的影响 |
---|---|---|---|
TP(真阳性) | 真值为 “有目标(正样本)”,预测为 “有目标(正样本)” | 预测框与某一真值框的 IoU≥阈值,且类别预测正确,即 “正确检测到目标” | TP 越多,模型漏检越少,Recall 越高 |
FP(假阳性) | 真值为 “无目标(负样本)”,预测为 “有目标(正样本)” | 预测框与所有真值框的 IoU <阈值,或类别预测错误,即 “误检(把背景当成目标)” | FP 越多,模型误检越多,Precision 越低 |
TN(真阴性) | 真值为 “无目标(负样本)”,预测为 “无目标(负样本)” | 图像中无目标的区域,模型未预测出目标,即 “正确忽略背景” | 无实际评估意义(背景区域无限大) |
FN(假阴性) | 真值为 “有目标(正样本)”,预测为 “无目标(负样本)” | 某一真值框没有对应的预测框(IoU≥阈值),即 “漏检(没检测到真实目标)” | FN 越多,模型漏检越多,Recall 越低 |
示例:图像中有 2 个真值目标(“人” 和 “车”),模型预测出 3 个框:
- 预测框 1 与 “人” 的 IoU=0.8(≥0.5),类别为 “人”→ TP;
- 预测框 2 与 “车” 的 IoU=0.3(<0.5),类别为 “车”→ FP;
- 预测框 3 无对应真值框,类别为 “狗”→ FP;
- “车” 无匹配预测框→ FN;
- 最终统计:TP=1,FP=2,FN=1,TN 无意义。
3. 核心性能指标:Precision、Recall 与 P-R 曲线
(1)Precision(精确率 / 查准率)
- 定义:所有预测为 “正样本” 的结果中,实际为 “真阳性(TP)” 的比例
- 含义:衡量模型 “预测的目标中,正确的比例”,反映模型 “抗误检” 能力;
- 极端情况:若模型只预测 1 个框且为 TP,则 Precision=1(无 FP);若模型预测大量框且多为 FP,则 Precision 趋近于 0;
(2)Recall(召回率 / 查全率)
- 定义:所有真值 “正样本” 中,被模型预测为 “真阳性(TP)” 的比例
- 含义:衡量模型 “所有真实目标中,被检测到的比例”,反映模型 “抗漏检” 能力;
- 极端情况:若模型检测到所有真值目标(FN=0),则 Recall=1;若模型未检测到任何目标(TP=0),则 Recall=0;
- 示例:上述示例中,Recall=1/(1+1)=0.5(即 50% 的真实目标被检测到)。
(3)Precision 与 Recall 的权衡关系
Precision 和 Recall 通常呈 “负相关”:
- 若提高置信度阈值(如只保留置信度≥0.8 的预测框),会过滤掉低置信度的 FP,但可能同时过滤掉部分低置信度的 TP,导致 Precision 升高、Recall 降低;
- 若降低置信度阈值(如保留置信度≥0.2 的预测框),会保留更多可能的 TP,但同时引入更多 FP,导致 Recall 升高、Precision 降低;
- 需根据场景需求选择阈值:如安防监控需 “不漏检”(优先保证高 Recall),自动驾驶需 “不误检”(优先保证高 Precision)。
(4)P-R 曲线
- 绘制方法:从高到低调整预测框的置信度阈值,每个阈值对应一组(Precision, Recall),将所有点连成曲线;
- 曲线解读:
- 曲线越 “靠近右上角”,模型综合性能越好(同时具备高 Precision 和高 Recall);
- 若曲线 A 完全在曲线 B 上方,说明 A 模型性能优于 B 模型(在所有 Recall 下,A 的 Precision 均高于 B);
- 示例:优秀模型的 P-R 曲线可能在 Recall=0.8 时,Precision 仍保持 0.9;而差模型可能在 Recall=0.5 时,Precision 已降至 0.3。
4. 综合指标:AP 与 mAP
(1)AP(平均精度)
AP 是单个类别的性能指标,基于 P-R 曲线计算,反映该类别在 “不同 Recall 水平下的平均 Precision”。
(2)mAP(mean AP,平均精度均值)
- 定义:所有类别的 AP 的算术平均值
- 含义:模型在所有类别上的综合性能指标,是目标检测领域最核心的评估标准;
- 示例:若数据集有 3 个类别,AP 分别为 0.8、0.7、0.6,则 mAP=(0.8+0.7+0.6)/3=0.7(70%);
- 注意:mAP 计算时需确保 “每个类别独立计算 AP”,再求平均,避免样本量多的类别主导结果。
五、目标检测算法分类与流程
1. 传统方法:滑动窗口法
滑动窗口法是深度学习普及前的主流方法,本质是 “暴力搜索 + 分类”:
- 核心流程:
- 设计固定尺寸的 “窗口”(如 100×100px、200×200px);
- 让窗口在图像上按固定步长(如 10px)滑动,每次滑动后截取窗口内的图像区域;
- 用传统分类器(如 SVM、AdaBoost)判断窗口区域是否为目标;
- 对检测到的目标窗口进行 “非极大值抑制(NMS)”,去除重叠冗余窗口;
- 致命缺点:
- 窗口尺寸固定:无法适配不同尺度的目标(如小目标需小窗口,大目标需大窗口),需设计多组窗口尺寸,计算量剧增;
- 冗余计算多:大部分窗口区域为背景,分类器需重复处理,效率极低;
- 定位精度低:窗口滑动步长固定,无法精确对齐目标边界,导致边界框误差大。
2. 深度学习方法
深度学习方法通过 “端到端训练”(从图像直接输出类别和边界框)解决传统方法的痛点,按流程分为 “Two Stage(两阶段)” 和 “One Stage(单阶段)”,核心区别在于 “是否单独生成候选框”。
(1)核心概念:Anchor(锚框)
Anchor 是深度学习方法中 “生成目标候选框” 的关键技术,解决 “目标尺度和形状多样性” 问题:
- 定义:预设在特征图上的 “参考边界框”,每个 Anchor 有固定的 “尺度(scale)” 和 “长宽比(aspect ratio)”;
- 生成逻辑:
- 特征图与原始图像存在 “缩放比例”(如 CNN backbone 输出的特征图尺寸是原始图像的 1/16),特征图上的每个像素点对应原始图像的一个 “感受野区域”;
- 在每个像素点上,生成 K 个不同 scale 和 aspect ratio 的 Anchor(如常用 K=9:3 个 scale(128²、256²、512² 像素)×3 个 aspect ratio(1:1、1:2、2:1));
- 所有 Anchor 覆盖原始图像的不同区域和尺寸,作为 “候选目标框” 的初始模板;
- Anchor-based vs Anchor-free:
类型 核心思想 优点 缺点 代表算法 Anchor-based 自顶向下,预设 Anchor,筛选并修正 候选框覆盖全面,定位精度高 需手动设计 Anchor 参数(scale/ratio),计算量大 Faster R-CNN、SSD、Faster R-CNN Anchor-free 自底向上,直接预测目标关键点或中心 无需预设 Anchor,计算量小,适配灵活 小目标检测精度可能低于 Anchor-based YOLOv1、CenterNet、FCOS
(2)Two Stage(两阶段)算法
两阶段算法分 “候选框生成(第一阶段)” 和 “分类与回归(第二阶段)” 两步,精度高,是学术研究的主流方向。
- 核心流程(以 Faster R-CNN 为例):
- 第一阶段:生成候选框(Region Proposal Network, RPN):
- 输入:原始图像 → 经 CNN backbone(如 VGG16、ResNet)提取 “共享特征图”;
- RPN 处理:在特征图上每个像素点生成 K 个 Anchor,通过 2 个分支(分类分支 + 回归分支)处理:
- 分类分支:判断每个 Anchor 是 “前景(有目标)” 还是 “背景(无目标)”;
- 回归分支:修正 Anchor 的坐标,使其更接近真值框,生成 “候选框(Proposal)”;
- 筛选:通过 NMS 去除重叠的 Proposal,保留约 2000 个高质量候选框;
- 第二阶段:分类与精确回归:
- ROI Pooling:将大小不一的 Proposal 映射到共享特征图上,裁剪为固定尺寸的特征(如 7×7),确保后续全连接层输入尺寸统一;
- 全连接层:对固定尺寸特征进行分类(预测目标类别,如 “人”“车”)和边界框回归(进一步修正 Proposal 坐标,得到精确预测框);
- 最终筛选:再次通过 NMS 去除重叠预测框,输出最终检测结果;
- 第一阶段:生成候选框(Region Proposal Network, RPN):
- 代表算法演进:R-CNN(第一阶段用 Selective Search 生成 Proposal,速度慢)→ SPP-Net(引入 SPP 层解决 Proposal 尺寸不统一问题)→ Fast R-CNN(共享特征图,速度提升)→ Faster R-CNN(用 RPN 替代 Selective Search,实现端到端训练)→ Cascade R-CNN(多阶段回归,进一步提升精度);
- 核心优势:分阶段优化,候选框质量高,分类与回归更精准,尤其在小目标、遮挡目标检测上表现优异;
- 核心劣势:流程复杂,计算量大,推理速度慢(难以满足实时场景需求,如帧率 < 10 FPS)。
(3)One Stage(单阶段)算法
单阶段算法跳过 “候选框生成” 步骤,直接从特征图预测目标类别和边界框,速度快,适合实时场景。
- 核心流程(以 YOLOv3 为例):
- 输入:原始图像 → 经 CNN backbone(如 DarkNet)提取多尺度特征图(适应不同尺寸目标);
- 特征图预测:在每个特征图像素点上生成 K 个 Anchor,直接预测每个 Anchor 的:
- 类别概率:预测目标属于每个类别的概率(如 80 类);
- 边界框坐标:修正 Anchor 坐标,得到预测框;
- 置信度:预测框包含目标的概率(结合类别概率和 IoU);
- 筛选:通过置信度阈值(如 0.5)过滤低置信度预测框,再通过 NMS 去除重叠框,输出最终结果;
- 代表算法:
- YOLO 系列:YOLOv1(首次提出单阶段思想,速度快但小目标检测差)→ YOLOv2(引入 Anchor,提升精度)→ YOLOv3(多尺度特征,提升小目标检测能力)→ YOLOv4/v5(优化 backbone 和 neck,平衡速度与精度);
- SSD 系列:SSD(引入多尺度特征图,提升小目标检测能力)→ DSSD(用反卷积提升特征分辨率)→ FSSD(优化特征融合,提升精度);
- 核心优势:端到端流程简单,计算量小,推理速度快(实时场景可达到 30-60 FPS);
- 核心劣势:直接预测目标,候选框质量不如两阶段算法,精度通常略低(尤其在复杂场景中)。
3. 关键后处理步骤:NMS(非极大值抑制)
NMS 是所有目标检测算法的最后一步,用于去除重叠的冗余预测框,保留最优结果,核心思想是 “保留置信度最高的框,删除与其重叠度高的框”。
- 标准 NMS 流程:
- 设定两个阈值:置信度阈值(如 0.5,过滤低置信度框)、IoU 阈值(如 0.5,判断重叠度);
- 过滤:去除置信度 < 置信度阈值的预测框,得到候选框列表;
- 排序:将候选框列表按置信度从高到低排序;
- 迭代筛选:
- 取列表中置信度最高的框 A,加入最终输出列表,从候选框列表中删除 A;
- 计算候选框列表中剩余所有框与 A 的 IoU,删除 IoU>IoU 阈值的框(认为与 A 重叠,属于冗余);
- 重复上述步骤,直到候选框列表为空;
- 改进 NMS:
- Soft NMS:不直接删除 IoU > 阈值的框,而是降低其置信度(如按 IoU 大小线性降低),避免误删重叠的不同目标(如密集人群);
- DIoU NMS:在计算 IoU 时引入 “中心点距离”,更精准判断重叠框是否为同一目标,提升复杂场景性能;
- 示例:图像中有 3 个重叠的 “车” 预测框,置信度分别为 0.9、0.7、0.6,IoU 阈值设为 0.5:
- 排序后顺序:0.9 → 0.7 → 0.6;
- 取 0.9 的框加入输出列表,计算 0.7 的框与它的 IoU=0.6(>0.5),删除 0.7 的框;
- 计算 0.6 的框与 0.9 的框的 IoU=0.4(<0.5),保留 0.6 的框;
- 最终输出 2 个框(0.9 和 0.6),避免冗余。