引言
目标检测是计算机视觉的核心任务之一,需要在图像中定位并识别多个目标。从早期的滑动窗口到现代的端到端深度学习方法,目标检测技术经历了巨大的发展。本文将系统介绍主流的目标检测算法。
一、目标检测基础
1.1 任务定义
目标检测需要解决两个子问题:
- 分类(Classification): 目标是什么类别
- 定位(Localization): 目标在图像中的位置(边界框)
1.2 评价指标
IoU (Intersection over Union):
- 预测框和真实框的交并比
- IoU = 交集面积 / 并集面积
- 通常IoU > 0.5视为检测成功
精确率(Precision)和召回率(Recall):
- Precision = TP / (TP + FP)
- Recall = TP / (TP + FN)
mAP (mean Average Precision):
- 多个类别AP的平均值
- 目标检测的主要评价指标
二、两阶段检测器
2.1 R-CNN系列
R-CNN (2014):
- 流程:
- 1. Selective Search生成候选区域(~2k)
- 2. CNN提取特征
- 3. SVM分类
- 4. 边界框回归
- 缺点: 速度慢,每个候选区域都要过CNN
Fast R-CNN (2015):
- 改进:
- 整张图过一次CNN,生成特征图
- RoI Pooling提取候选区域特征
- 端到端训练
- 速度提升10倍
Faster R-CNN (2015):
- 核心创新: Region Proposal Network (RPN)
- RPN用CNN生成候选区域,替代Selective Search
- 实现完全端到端训练
- 成为两阶段检测器的标准范式
2.2 RPN原理
Anchor机制:
- 在特征图每个位置设置多个预设框(Anchors)
- 不同尺度和长宽比(如3×3=9个)
- 预测每个Anchor是否包含目标
输出:
- 分类: 目标/背景的概率
- 回归: 边界框偏移量
2.3 后续改进
- Mask R-CNN: 添加分割分支,支持实例分割
- Cascade R-CNN: 级联多个检测器,逐步提升IoU阈值
- FPN: 特征金字塔网络,多尺度特征融合
三、单阶段检测器
3.1 YOLO系列
YOLOv1 (2016):
- 核心思想: 将检测视为回归问题
- 将图像分成S×S网格
- 每个网格预测B个边界框和C个类别概率
- 速度快(45 FPS),但精度较低
YOLOv2 / YOLO9000 (2017):
- 改进:
- Batch Normalization
- 高分辨率分类器
- Anchor Boxes
- 多尺度训练
- mAP提升,速度保持
YOLOv3 (2018):
- Darknet-53骨干网络
- 多尺度预测(3个尺度)
- 更好的小目标检测能力
YOLOv4/v5/v7/v8:
- 各种tricks集成: CSPNet, PANet, Mosaic增强等
- 持续提升精度和速度
- 工程化优化,易于部署
3.2 SSD (Single Shot Detector)
核心思想:
- 在多个特征图上进行预测
- 不同层负责不同尺度的目标
- 浅层检测大目标,深层检测小目标
优势:
- 速度快,多尺度检测能力强
- 平衡了速度和精度
3.3 RetinaNet
核心贡献: Focal Loss:
- 问题: 单阶段检测器的类别不平衡
- 解决: 降低易分类样本的权重
- 使模型专注于困难样本
效果:
- 单阶段检测器达到两阶段精度
- 保持速度优势
四、Anchor-Free检测器
4.1 CenterNet
- 将目标表示为中心点
- 预测中心点的热力图
- 回归目标的宽高和偏移
- 无需NMS后处理
4.2 FCOS
- 全卷积单阶段检测
- 逐像素预测
- 引入中心度(centerness)提升质量
4.3 优势
- 无需设计Anchor,减少超参数
- 更简洁的架构
- 更好地处理不同尺度和长宽比
五、Transformer检测器
5.1 DETR
核心思想:
- 将检测视为集合预测问题
- 使用Transformer编码器-解码器
- 二分图匹配损失
- 无需NMS和Anchor
特点:
- 端到端,架构简洁
- 训练收敛慢
- 小目标检测效果一般
5.2 改进版本
- Deformable DETR: 可变形注意力,加速收敛
- Conditional DETR: 条件查询,提升性能
- DAB-DETR: 动态Anchor框
- DINO: 对比去噪训练
六、实践技巧
6.1 数据增强
- 基础增强: 翻转、旋转、缩放、裁剪
- 颜色增强: 亮度、对比度、饱和度
- Mosaic: 拼接4张图像
- MixUp: 图像混合
- CutOut/CutMix: 随机遮挡
6.2 模型选择
场景考虑:
- 高精度需求: Cascade R-CNN, DINO
- 实时检测: YOLOv8, YOLOv7
- 嵌入式设备: YOLOv5s, MobileNet-SSD
- 小目标检测: Faster R-CNN + FPN
6.3 训练技巧
- 预训练权重: 使用ImageNet或COCO预训练
- 学习率策略: Warmup + Cosine Annealing
- 多尺度训练: 提升鲁棒性
- 标签平滑: 防止过拟合
- 测试时增强(TTA): 提升精度
6.4 后处理
NMS (Non-Maximum Suppression):
- 去除重复检测框
- 保留置信度最高的框
- IoU阈值通常设为0.5
改进版本:
- Soft-NMS: 降低而非删除重叠框
- Weighted Boxes Fusion: 融合多个检测结果
七、部署优化
7.1 模型加速
- 剪枝: 移除冗余参数
- 量化: FP16或INT8精度
- 知识蒸馏: 大模型指导小模型
- 神经架构搜索: 自动寻找高效架构
7.2 推理框架
- ONNX Runtime: 跨平台,易用
- TensorRT: NVIDIA GPU优化
- OpenVINO: Intel硬件优化
- ncnn/MNN: 移动端推理
总结
目标检测技术从两阶段到单阶段,从Anchor-based到Anchor-free,不断演进。选择合适的算法需要权衡精度、速度和部署成本。理解各类算法的原理,结合实际需求,才能构建高效的检测系统。