一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD
模块:
- 提取物体区域 Region Proposal
- 对区域进行分类识别 Classification
R-CNN
论文翻译
R → Region (2014 AlexNet)
区域建议:Selective Search 也用的是DNN方法
Bounding Box Regression:细化SS给出的外接矩形
- ss获取区域
- bounding box 膨胀 16像素 并且scale到 227 x 227
- AlexNet Fc7 (即第二个全连接层) 作为特征输出 (4096D) (需要fine tune)
- 每个分类都是一个线性SVM二分类器
- BBR 基于Conv5的输出特征, 一个分类一个回归模型
训练第一阶段:训练CNN
一般拿ImageNet上训练好的CNN模型参数作为pre-train(尤其是conv层,特征提取基本成型)
然后用SS生成的区域做 fine tune
AlexNet最后一个Softmax层是1000D,要改成实际数据集物体分类数量 + 1 (一个是背景类)
正样本 : IoU>0.5 BB与ground truth的重合度
负样本:IoU<0.5
训练第二阶段:训练分类器
在FC7的基础上训练SVM分类器 (之后会用其他分类器,所以不用详细展开了)
Hinge loss
正样本: 所有 ground truth区域
负样本 IoU < 0.3
训练第三阶段: Bounding Box Regression
conv5的输出作为输入
对框进行微调,来提升bounding-box的IoU
bbr
其中P是原始proposal,G是Ground Truth,G拔是找到映射之后矫正得到的窗口。因此更加直接地说,我们就是要找到一种映射关系,来出一个G拔。
测试阶段
- SS
- 227 x 227
- fc7 → 分类器 → 输出类别
- 每个分类下的区域做非极大值抑制 (所有区域分值从大到小排列,提出与最大分值区域IoU>0.5的区域)
- conv5 → bbr → bbr偏差
- 修正区域
性能评价
每个分类计算AP,然后取均值
AP是准确-召回曲线下的面积
速度很慢,测试时间几十秒,训练时间84小时
问题:卷积特征重复计算量太大,每张图片的2000+区域都会计算CNN特征
SPP-Net
SPPNet详解
共享卷积计算,直接输入整图
conv5之后引入空间金字塔池化 Spatial Pyramid Pooling ,为不同尺寸的区域隐射到尺寸固定的FC层上。
总结而言,当网络输入的是一张任意大小的图片,这个时候我们可以一直进行卷积、池化,直到网络的倒数几层的时候,也就是我们即将与全连接层连接的时候,就要使用金字塔池化,使得任意大小的特征图都能够转换成固定大小的特征向量,这就是空间金字塔池化的意义(多尺度特征提取出固定大小的特征向量)。
image → conv → spp → fc → output
训练阶段
conv不参与fine-tune, 只fine tune FC层
新问题
卷积层不参与fine-tune
Fast R-CNN
- end-to-end 单阶段训练 多任务损失函数
- 所有参数都能fine tune
- RoI 池化层: 其实就是一个单层4x4的金字塔(VGG版用的7x7)、单层的SPP。ROI梯度回传的时候,重叠区域的偏导等于多个区域偏导之和。
-
区域建议还是单独的模块
FAST R-CNN
Faster R-CNN
推荐博文
RPN解析
集成区域建议网络 RPN region proposal network
anchors
一些预设大小的框,三种尺寸,三种比例,一共9种anchor
假设CNN得到的feature map大小为w∗h,那总的anchors个数为9∗w∗h
faster RCNN Faster RCNN
RPN其实是个attention机制
- 训练RPN
- 训练 Fast R-CNN
- 优化RPN
- 调优 Fast R-CNN
R-FCN
Fully Convolutional Network
推荐博文
全卷积趋势,只留下一个全连接层 2048 → 1000
之前检测网络的局限性:卷积层越深,不变性越强,也就是说对变换不敏感
- 提出全卷积化
- 位置敏感分值图 (其实就是个卷积层,只是通道数量进行了特殊的设计)
- 位置敏感池化
网友评论