|
### 什么是目标检测
目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标,并确定它们的**类别**和**位置**。
与图像分类不同,目标检测不仅需要识别图像中有什么物体,还需要定位物体的位置。
### 常用数据集
**PASCAL VOC 数据集**
- 经典目标检测数据集,约 10,000 张带边界框图片
- 常用版本:VOC2007 和 VOC2012
- 类别数量:**20 个类别**
**MS COCO 数据集**
- 微软 2014 年标注的大型数据集
- 类别数量:**80 个类别**
- 图像数量:超过 33 万张
- 特点:以场景理解为目标,从复杂日常场景中截取
|
|
### 检测框的表示方法
目标检测的位置信息一般由两种格式表示(以图片左上角为原点 (0,0)):
**1. 极坐标表示(左上角+右下角)**
$$BBox = (x_{min}, y_{min}, x_{max}, y_{max})$$
- $x_{min}, y_{min}$:x, y 坐标的最小值(左上角)
- $x_{max}, y_{max}$:x, y 坐标的最大值(右下角)
**2. 中心点坐标表示**
$$BBox = (x_{center}, y_{center}, w, h)$$
- $x_{center}, y_{center}$:目标检测框的中心点坐标
- $w, h$:目标检测框的宽、高
**转换关系**:
$$x_{center} = \\frac{x_{min} + x_{max}}{2}, \\quad y_{center} = \\frac{y_{min} + y_{max}}{2}$$
$$w = x_{max} - x_{min}, \\quad h = y_{max} - y_{min}$$
|
|
### 常用数据集详情
**PASCAL VOC 数据集**
PASCAL VOC 是目标检测领域的经典数据集,包含约 10,000 张带有边界框的图片用于训练和验证,是很多模型的基准数据集。
- 下载地址:https://pjreddie.com/projects/pascal-voc-dataset-mirror/
- 20个类别包括:人、鸟、猫、狗、马、羊、牛、大象、熊、斑马、长颈鹿、背包、雨伞、手提包、领带、行李箱、飞盘、滑雪板、运动球、风筝、棒球棒、棒球手套、滑板、冲浪板、网球拍、瓶子、酒杯、杯子、叉子、刀、勺子、碗、香蕉、苹果、三明治、橙子、西兰花、胡萝卜、热狗、披萨、甜甜圈、蛋糕、椅子、沙发、盆栽、床、餐桌、马桶、电视、笔记本电脑、鼠标、遥控器、键盘、手机、微波炉、烤箱、烤面包机、水槽、冰箱、书、时钟、花瓶、剪刀、泰迪熊、吹风机、牙刷
**MS COCO 数据集**
MS COCO(Microsoft Common Objects in Context),与 ImageNet 竞赛一样,被视为计算机视觉领域最受关注和最权威的比赛之一。
- 类别数量:**80 个类别**
- 图像数量:超过 33 万张图片,其中 20 万张有标注
- 标注个体数目:超过 150 万个
> **注意**:COCO 数据集比 VOC 预训练效果更好,但更费时。
|
|
### IOU(交并比)
IoU(Intersection Over Union)是目标检测算法中用来评价两个矩形框之间相似度的指标:
$$IoU = \\frac{A \\cap B}{A \\cup B}$$
**判定规则**:
- 当 IoU 的值 **大于 0.5** 时,可认为检测到目标物体
- IoU 阈值可根据任务需求调整,如 0.5、0.75 等
### 检测精度与召回率
**精确率(Precision)**:
$$Precision = \\frac{TP}{TP + FP}$$
**召回率(Recall)**:
$$Recall = \\frac{TP}{TP + FN}$$
其中:
- **TP(True Positive)**:正确检测到目标(IoU > 阈值)
- **FP(False Positive)**:虚检,将背景误检为目标
- **FN(False Negative)**:漏检,未检测到实际存在的目标
**mAP(mean Average Precision)**:
$$mAP = \\frac{1}{N} \\sum_{i=1}^{N} AP_i$$
### NMS(非极大值抑制)
NMS 用于去除冗余的检测框:
1. 将所有检测框按置信度分数排序
2. 选择置信度最高的框,将其加入结果列表
3. 计算该框与其余所有框的 IoU,移除 IoU 大于阈值的框
4. 重复步骤 2-3,直到所有框处理完毕
|
|
### Overfeat 模型
Overfeat 方法使用**滑动窗口**进行目标检测:
- 使用固定宽度和高度的矩形区域,在图像上"滑动"
- 将扫描结果送入神经网络中进行分类和回归
- **缺点**:暴力穷举方式,消耗大量计算力;窗口大小问题可能造成效果不准确
### 二阶段检测器特点
**先产生候选区域,再对候选区域进行分类和回归**。
|
|
### R-CNN(2014)
R-CNN(Regions with CNN features)使用**候选区域方法**(Region Proposal Method)创建目标检测的区域。
#### 流程
1. **候选区域生成**:使用选择性搜索(Selective Search)找出约 2000 个候选区域
2. **CNN 网络提取特征**:选取预训练 CNN(AlexNet 或 VGG)进行特征提取
3. **目标分类**:训练 SVM 辨别目标物体和背景
4. **目标定位**:训练线性回归模型生成更精确的边界框
#### Selective Search 算法
- 将颜色、边界、纹理等信息作为合并条件
- 采用多尺度的综合方法,在像素级上划分区域
- 提取的候选区域远少于滑动窗口穷举法
#### 缺点
1. **训练阶段多,训练耗时**:微调 CNN + 训练 SVM + 训练边框回归器
2. **预测速度慢**:VGG16 处理一张图像需要 47s
3. **占用磁盘空间大**:5000 张图像产生几百 G 的特征文件
4. **数据形状变化**:候选区域要缩放固定大小,无法保证目标不变形
|
|
### Fast R-CNN(2015)
针对 R-CNN 做了三个方面的改进:
**1. 提高训练和预测的速度**
R-CNN 将 2000 个候选区域分别输入 CNN,有大量重叠区域的重复计算。Fast R-CNN 将**整张图输入 CNN** 提取特征,将候选区域映射到特征图上,避免重复处理。
**2. 不需要额外的空间保存特征向量**
将类别判断和边框回归统一使用 CNN 实现。
**3. 使用 ROI Pooling**
不再直接对候选区域进行缩放,使用 **ROI Pooling** 进行尺寸调整。
#### ROI Pooling 详解
ROI Pooling 将不同大小的特征图转换为固定大小:
1. 网络后面是全连接层(FC 层),要求输入有固定的维度
2. 各个候选区域的特征大小一致,可以组成 batch 进行处理
**量化问题**:候选区域从原图映射到特征图时,需要进行量化(将实数约束为整数),会导致信息丢失。
|
|
### Faster R-CNN(2015)
**Faster R-CNN = RPN + Fast R-CNN**
#### 核心改进:RPN(Region Proposal Network)
使用 **RPN 结构**替代 Selective Search 生成候选框,实现端到端训练。
#### Anchor Boxes
对于特征图上的每个 3×3 滑动窗口:
- 计算滑动窗口中心点对应原始图像上的中心点
- 计算出 k 个 anchor boxes(预设的参考框)
**示例**:
- 每个位置在原图上对应 3×3=9 个 anchor
- 对于 1000×600×3 的图像:约 60×40×9 = 20k 个 anchor
- 忽略跨越边界的 anchor,剩约 6k 个
- 采用 NMS(IoU 设为 0.7),每张图片剩 2k 个候选框
#### 流程
**RPN 步骤**:
1. 整张图传入 VGG16 或 ResNet 提取特征
2. 选择下采样倍数为 16 的特征层作为检测层
3. 根据检测层预设一系列大小和比例的锚框(9 个)
4. 对锚框进行二分类和回归得到若干候选区域
**Fast R-CNN 步骤**:
1. 利用 RoIPooling 在检测层特征上提取每个候选区域对应的特征
2. 输入 CNN/FC 子网络增强候选区域特征
3. 对候选区域进行多分类和回归得到检测结果
|
|
### 二阶段算法总结
| 算法 | 年份 | 核心思想 | 主要缺点 |
|------|------|----------|----------|
| Overfeat | 2013 | 滑动窗口 | 计算量大,效果不佳 |
| R-CNN | 2014 | Selective Search + CNN + SVM | 训练慢、预测慢、占空间 |
| Fast R-CNN | 2015 | 整图特征提取 + ROI Pooling | 仍依赖 Selective Search |
| Faster R-CNN | 2015 | RPN + Fast R-CNN | 速度仍有提升空间 |
|
|
### YOLO v1(2016)
YOLO(You Only Look Once)采用一个单独的 CNN 模型实现 **end-to-end** 的目标检测。
#### 核心思想
- 利用整张图作为网络的输入
- 直接在输出层回归 bounding box 的位置及其所属类别
- 将目标检测作为单一任务处理
#### 网络结构
1. 输入图片 resize 到 **448×448**
2. 送入 CNN 网络(卷积 + 池化 + 两层全连接)
3. 输出层使用**线性函数**做激活函数(需要预测位置数值)
#### 输出表示
将原始图像划分为 **7×7 = 49** 个网格(grid),每个网格预测 **2 个 bounding box**,总共 98 个 bounding box。
网络输出是一个 **7×7×30** 的张量:
$$30 = 2 \\times 4 + 2 + 20$$
每个 30 维向量包含:
- **2 个 bounding box 的位置**(每个 4 个值)→ 共 8 个值
- **2 个 bounding box 的置信度** → 共 2 个值
- **20 个对象分类的概率** → 共 20 个值
#### 优点与缺点
**优点**:
- 速度非常快,处理速度可达 **45 fps**
- 快速版本可达 **155 fps**
- 端到端训练和预测,非常简便
**缺点**:
- 准确率会打折扣
- 对于小目标和靠得很近的目标检测效果不好
|
|
### YOLO v2(2017)
YOLOv2 从三个方面改进:**预测更准确(Better)、速度更快(Faster)、识别对象更多(Stronger)**。
#### 主要改进
**1. Batch Normalization**
- 解决梯度消失和梯度爆炸问题
- **mAP 提升 2%**
**2. 高分辨率图像微调**
- 先用 224×224 训练分类模型
- 再用 448×448 微调(10 个 epoch)
- **mAP 提升约 4%**
**3. 采用 Anchor Boxes**
- YOLOv1:每个 grid 预测 2 个 box,共 98 个
- YOLOv2:每个 grid 采用 5 个先验框,共 13×13×5 = 845 个
**4. 聚类提取 Anchor 尺度**
- 对训练集边框进行 K-means 聚类分析
- 最终选择 **5 种尺寸**的聚类 anchor box
**5. 细粒度特征融合(Passthrough)**
- 在最后一个 pooling 之前,特征图大小为 26×26×512
- 将其 1 拆 4,直接传递到 pooling 后的特征图
- 两者叠加作为输出特征图,保留细节信息
**6. 多尺度训练**
- 没有全连接层,可以输入任何尺寸图像
- 采用 {320, 352, ..., 608} 等 10 种输入尺寸
- 每 10 个 batch 随机更换一种尺寸
**7. Darknet-19 特征提取网络**
- 19 个卷积层 + 5 个 MaxPooling 层
- 比 VGG-16 小,精度不弱于 VGG-16
- 浮点运算量减少到约 1/5
|
|
### YOLO v3(2018)
YOLOv3 针对小目标检测精度有显著提升,核心特点是**多尺度检测**。
#### 多尺度检测思想
网络越深,特征图越小,小物体越难检测。
- **浅层 feature map**:包含低级信息(边缘、颜色、初级位置)
- **深层 feature map**:包含高级信息(语义信息:狗、猫、汽车等)
YOLOv3 采用 **Feature Pyramid Network(FPN)** 结构:
- 当前层的 feature map 对未来层的 feature map 进行上采样
- 低阶特征与高阶特征有机融合
- 提升检测精度
#### 网络结构
- **没有池化层和全连接层**
- 下采样通过设置卷积 stride 为 2 实现
- 基本组件 **CBL**:Conv + Bn + Leaky_relu
- **Res unit**:借鉴 ResNet 残差结构
经过 5 次 Res 模块后,特征图尺寸变化:416 → 208 → 104 → 52 → 26 → 13
#### 先验框(Anchor)设置
采用 K-means 聚类得到 9 种尺寸的先验框,为每种尺度设定 3 种:
COCO 数据集 9 个先验框:
- (10×13), (16×30), (33×23)
- (30×61), (62×45), (59×119)
- (116×90), (156×198), (373×326)
**分配策略**:
- **13×13 特征图**(最大感受野):大先验框 → 检测大对象
- **26×26 特征图**(中等感受野):中等先验框 → 检测中等对象
- **52×52 特征图**(较小感受野):小先验框 → 检测小对象
#### 输入输出
输入 416×416×3 的图像,得到三种不同尺度的预测结果:
总预测数:$13 \\times 13 \\times 3 + 26 \\times 26 \\times 3 + 52 \\times 52 \\times 3$
每个预测对应 85 维(COCO 数据集):
- 4(坐标值)+ 1(置信度分数)+ 80(类别概率)
|
|
### YOLO v4(2020)
YOLOv4 在 COCO 数据集上 AP 提高 10%,FPS 提高 12%。
#### 特点
- 总结并筛选大量检测技巧
- 通过消融实验验证方法有效性
- 没有创造新的改进,而是使用了大量已有的目标检测技巧
#### 网络结构组件
- **CBM**:Conv + Bn + Mish 激活函数
- **CBL**:Conv + Bn + Leaky_relu 激活函数
- **Res unit**:残差结构
- **CSPX**:三个卷积层 + X 个 Res unit 模块 Concat
- **SPP**:1×1, 5×5, 9×9, 13×13 最大池化多尺度融合
#### 输入尺寸
- 默认输入 608×608(YOLOv3 默认 416×416)
- 可根据需要修改,如 320×320,一般是 32 的倍数
|
|
### SSD(Single Shot MultiBox Detector)
SSD 是另一种经典的单阶段检测器:
- 在不同深度的 feature map 上分别进行目标检测
- 小物体在浅层检测,大物体在深层检测
- 每个 feature map 位置预设多个不同尺度和长宽比的 anchor
- 使用卷积层直接预测类别和位置偏移
**SSD vs YOLO**:
- SSD 使用多尺度特征图检测,YOLOv1 只用最后一层
- SSD 速度略慢于 YOLO,但精度更高
- YOLOv3 也采用多尺度检测,与 SSD 思想类似
|
|
### 基于 Anchor 检测方法的弊端
**1. 正负样本不均衡**
在特征图所有点上均匀采样 Anchor,大部分地方是背景区域,简单负样本数量众多。
**2. 超参难调**
Anchor 需要数量、大小、宽高等多个超参数,对检测召回率和速度影响极大。
**3. 匹配耗时严重**
训练阶段需要将每个 Anchor 与所有标签计算 IoU,占据大量内存和计算时间。
|
|
### 关键点法(Keypoint-based)
代表算法:**CornerNet**
- 将目标检测问题转化为关键点检测问题
- 检测目标的左上角和右下角两个关键点
- 通过嵌入向量匹配属于同一目标的角点
|
|
### 中心域法(Center-based)
代表算法:**CenterNet**
- 直接预测目标的中心点
- 同时回归目标的宽度和高度
- 不需要预设 anchor,简化了检测流程
|
|
### Anchor Free 方法总结
| 方法类型 | 代表算法 | 核心思想 |
|----------|----------|----------|
| 关键点法 | CornerNet | 检测目标角点,匹配角点对 |
| 中心域法 | CenterNet | 预测中心点,回归宽高 |
|
|
### 目标检测算法演进
```
Overfeat (2013) → R-CNN (2014) → Fast R-CNN (2015) → Faster R-CNN (2015)
↓
YOLO v1 (2016) → YOLO v2 (2017) → YOLO v3 (2018) → YOLO v4 (2020)
↓
SSD (2016)
↓
Anchor Free (2018+)
```
|
|
### 二阶段 vs 单阶段
| 特性 | 二阶段(Faster R-CNN) | 单阶段(YOLO/SSD) |
|------|------------------------|--------------------|
| 检测流程 | 先生成候选区域,再分类回归 | 直接预测类别和位置 |
| 精度 | 较高 | 略低(但不断提升) |
| 速度 | 较慢 | 快(实时检测) |
| 适用场景 | 精度要求高的场景 | 实时性要求高的场景 |
|
|
### YOLO 系列对比
| 版本 | 年份 | 核心改进 | 输入尺寸 | 特点 |
|------|------|----------|----------|------|
| YOLOv1 | 2016 | 端到端检测 | 448×448 | 速度快,精度一般 |
| YOLOv2 | 2017 | Anchor、Batch Norm、多尺度 | 416×416 | 更快更准 |
| YOLOv3 | 2018 | 多尺度检测、Darknet-53 | 416×416 | 小目标检测好 |
| YOLOv4 | 2020 | 大量技巧组合、CSP、Mish | 608×608 | 精度速度兼顾 |
|
|
### 关键概念总结
- **IOU**:评价两个检测框重叠程度的指标
- **NMS**:去除冗余检测框的算法
- **mAP**:目标检测的主要评价指标
- **Anchor/先验框**:预设的参考框,用于辅助目标定位
- **ROI Pooling**:将不同大小特征转换为固定大小
- **RPN**:区域提议网络,用于生成候选区域
- **多尺度检测**:在不同分辨率特征图上检测不同大小目标
### IOU 优化演进
| 指标 | 公式特点 | 优势 |
|------|----------|------|
| IoU | 交并比 | 基础指标 |
| GIoU | 加入最小闭包区域 | 不相交时仍有梯度 |
| DIoU | 加入中心点距离 | 收敛更快 |
| CIoU | 加入长宽比 | 最精确的边界框回归 |
|