目标检测基础
### 什么是目标检测 目标检测(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 Free 目标检测方法
### 基于 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 | 加入长宽比 | 最精确的边界框回归 |
参考