文章目录
- 1. R-FCN
- 1.1 动机
- 1.2. R-FCN 网络结构
- 1.3. R-FCN 的损失函数
- 1.4. R-FCN的训练及性能
- 2. YoLO-v1
- 2.1 简介
- 2.2 YOLO-v1网络结构
- 2.3 目标函数
- 2.4 YOLO-v1的优缺点
- 3. YOLO-v2
- 3.1 YOLO-v2相比v1的优化
- 4. YOLO-v3
- 参考
1. R-FCN
论文链接:R-FCN:Object Detection via Region-based Fully Convolutional Networks
论文出处:NIPS 2016
1.1 动机
Faster R-CNN包含两部分
- Fully Convolutional subnetwork before RoI Layer
- RoI-wise subnetwork
第1部分直接用普通分类网络的卷积层,用其来提取共享特征,然后使用RoI Pooling Layer在第1部分的最后一张特征图上进行提取针对各个RoIs的特征向量,然后将所有RoIs的特征向量都交由第2部分来处理(分类和回归),分别用来对每一个RoI进行分类和回归,这样就可以得到每个RoI的真实类别和较为精确的坐标和长宽
第一部分网络计算都是所有RoIs共享的,在一张图片测试的时候只需要进行一次前向计算。对于第2部分的RoI-wise subnetwork,不是所有RoIs共享,这一部分的作用是给每个RoI进行分类和回归,所以不能共享计算。
第1部分的网络具有“位置不敏感性”,如果将一个分类网络比如ResNet的所有卷积层都放置在第1部分用来提取特征,而第2部分则只剩下全连接层,目标检测网络是“位置不敏感的translation-invariance”,所以其检测精度会较低,并且也白白浪费了分类网络强大的分类能力。
ResNet论文中为了解决这样的位置不敏感的缺点,做出了一点让步,即将RoI Pooling Layer不再放置在ResNet-101网络的最后一层卷积层之后而是放置在了“卷积层之间”,这样RoI Pooling Layer之前和之后都有卷积层,并且RoI Pooling Layer之后的卷积层不是共享计算的,它们是针对每个RoI进行特征提取的,所以这种网络设计,其RoI Pooling Layer之后就具有了“位置敏感性translation-variance”,但是这样做牺牲了测试速度,因为所有RoIs都要经过若干层卷积计算,测试速度会很慢
注意:卷积网络是位置敏感的,能识别出目标在原图的相对位置;全连接网络是位置不敏感的
1.2. R-FCN 网络结构
如下图展示了F-RCN 与其他网络的区别
具体网络结构如下图所示,注意下图只展示了2部分,实际有三部分,还有一个BBOX 回归问题未画出来,后面会展示
使用
k
2
(
C
+
1
)
k^2(C+1)
k2(C+1)个通道对位置、类别进行编码
- 类别:C个物体类+1个背景类
- 相对位置: k × k k\times k k×k个grid(将ROI区域划分成 k × k k \times k k×k个区域,一般 k = 3 k=3 k=3)
- 如上图红框里的卷积层为位置敏感分值图(position sensitive score maps)
- 每个分类都有 k 2 k^2 k2个score map
- score map尺寸等于图片尺寸
将红框部分放大,得到如下图, 位置敏感分值图的形状为 k 2 ( c + 1 ) × w × h k^2(c+1) \times w \times h k2(c+1)×w×h,表示一共有 C + 1 C+1 C+1个类,每个类有 k 2 k^2 k2个 score map,每个score map 代表了对ROI中 k 2 k^2 k2个区域里每个区域的打分,每个score map 的大小为 w × h w \times h w×h
经过池化后,形状变为
(
c
+
1
)
×
k
×
k
(c+1) \times k \times k
(c+1)×k×k,代表一共有
c
+
1
c+1
c+1个类,每个类对应区域的得分情况,最后通过投票得到C+1个得分
具体做法如下所示,以人这个目标为例,此处共有
3
×
3
=
9
3 \times 3 = 9
3×3=9个 score map,第一张图计算左上Grid的得分,将该grid中所有像素进行均值池化,其他同样计算。特征图在人的位置会高亮,如果框歪了,均值池化后相关得分会变低
以上是对类别进行预测,同理对BBOX回归一样计算,在ResNet的共享卷积层的最后一层上,接上一个与position-sensitive score map并行的(sibling)score maps,该score maps用于regression,暂且命名为“regression score map”,而该regression score map的维度应当是
4
k
2
4k^2
4k2 ,那么在经过Position-sensitive RoI pooling操作后,每一个RoI就会得到 4个数作为该RoI的坐标和长宽的偏移量
1.3. R-FCN 的损失函数
-
总损失: L ( s , t x , y , w , h ) = L c l s ( s c ∗ ) + λ [ c ∗ > 0 ] L r e g ( t , t ∗ ) L\left(s, t_{x, y, w, h}\right)=L_{c l s}\left(s_{c^*}\right)+\lambda\left[c^*>0\right] L_{r e g}\left(t, t^*\right) L(s,tx,y,w,h)=Lcls(sc∗)+λ[c∗>0]Lreg(t,t∗)
-
分类损失: L c l s ( s c ∗ ) = − l o g ( s c ∗ ) L_{cls}(s_{c^*}) = -log(s_{c^*}) Lcls(sc∗)=−log(sc∗)
- 对池化输出计算 k 2 k^2 k2区域上的均值投票
- softmax归一化
-
Bounding Box回归损失函数
- 4 k 2 4k^2 4k2通道的位置敏感卷积层
- 使用位置敏感ROI池化获取 4 × k × k 4 \times k \times k 4×k×k 的输出
- 在 k × k k \times k k×k区域上均值投票
- 损失函数与Faster CNN 类似,拟合偏差,如下图所示
-
每一个分类一个回归模型
1.4. R-FCN的训练及性能
(1)训练技巧
- OHEM(online hard example mining)
- 首先对RPN获得的候选ROI进行排序(正负样本分别排序)
- 含有目标(正样本)的ROI 中选择前N 个ROI ,再将正负样本的比例维持1:3的范围内,保证每次抽取的样本中都会含有一定的正样本,这样训练可以提高网络的分类能力
(2)性能比较
又快又好
2. YoLO-v1
2.1 简介
- YOLO将物体检测任务当作一个回归问题来处理,通过YOLO,每张图像只需看一眼就能得出图像中都有哪些物体和这些物体的位置。
- 将图像resize到448*448作为神经网络的输入,使用神经网络直接来预测BBOX的坐标、BOX中包含物体的置信度和物体的可能性,然后进行非极大值一直筛选BOXES
- YOLO最多可以检测9000个类别
其基本结构如下所示
2.2 YOLO-v1网络结构
基本过程
(1)使用Image Net 1000-class 的分类任务数据集预训练google net:使用前20个卷积层,加上平均池化层,最后加上全连接层,作为预训练网络
(2)将预训练结果的前20个卷积层引用到检测器中,并加入剩下的4个卷积层及2个全连接
(3)为了获取更精细化的结果,将输入图像的分辨率由
224
×
224
224 \times 224
224×224 提升到
448
×
448
448 \times 448
448×448
(4)将所有的预测结果都归一化到
[
0
,
1
]
[0,1]
[0,1],使用Leaky RELU作为激活函数
(5)防止过拟合,在第一个全连接层后面接一个
p
=
0.5
p=0.5
p=0.5的Droupout层
输入输出
如上图所示,YOLO网络结构由24个卷积层构成与2个全连接层构成,网络输入图片大小为
448
×
448
448 \times 448
448×448,图片进入网络先经过resize,网络输出结果为一个张量。输出维度为
S
×
S
×
(
B
∗
5
+
C
)
S \times S \times (B*5+C)
S×S×(B∗5+C);在Pascal voc上,预测结果维度为
7
×
7
×
(
2
∗
5
+
20
)
7 \times 7 \times (2*5+20)
7×7×(2∗5+20)
其中S为划分网格数,B为每个网格负责目标数量,C为类被个数
YOLO-v1详解
- 将一幅图像分成 S × S S \times S S×S个网格(grid cell)
- 每个cell负责预测B(B=2)个BBox,以及这些BBox的confidence scores,这个得分反应了模型对于这个cell的预测:该cell是否包含物体,以及整个box的坐标预测的有多准,定义如下
c o n f i d e n c e = P r ( O b j e c t ) ∗ I O U p r e d t r u t h \text confidence = Pr(Object)*IOU^{truth}_{pred} confidence=Pr(Object)∗IOUpredtruth
前半部分表示包含物体的概率,后半部分表示坐标预测是否准确,如果整个cell中不存在物体,confidence=0,否则confidence为predicted bounding box与ground truth box之间的IOU。具体如下所示:
- 每个BBOX 有5个预测值:x, y, w, h, confidence;由于每个cell会预测两个BBOX因此占据了结果向量中前10个元素,如下图所示
- 每个栅格还要预测C类别条件概率:
P
r
(
calss
i
∣
Object
)
Pr(\text {calss}_i|\text {Object})
Pr(calssi∣Object)。即在一个栅格包含一个物体的前提下,整个物体属于某个类别的概率,这里有20个类别,因此占据20位元素
- 在测试阶段,将每个栅格的条件类别概率与每个bbox的confidence相乘
P r ( c l a s s i ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I O U p r e d t r u t h = P r ( c l a s s i ) ∗ I O U p r e d t r u t h Pr(class_i|Object)*Pr(Object)*IOU^{truth}_{pred}=Pr(class_i)*IOU^{truth}_{pred} Pr(classi∣Object)∗Pr(Object)∗IOUpredtruth=Pr(classi)∗IOUpredtruth
2.3 目标函数
如下图所示:
- 第一个式子表示:定位是否准确,开根号是为了减小数值,方便训练
- 中间两个式子(红框和黄框)是置信度预测是否准确C表示confidence;两个式子分别表示包含物体和不包含物体两种情形
- 最后一个式子是看类别预测是否准确:在包含物体的情况下,预测类别和真实类别的差异
- 最后通过非极大值抑制去除无效框
- 从所有检测框中找到confidence最大的框
- 计算confidence最大的框与其他框的IOU,如果其值大于某个阈值(重合度过高),则剔除
- 剩余框重复上述步骤,直到处理完所有的检测框
注意上述NMS(非极大值抑制只针对是否包括目标,而不管具体是哪一类目标),使用完NMS后再来确定各个box的类别
- 对于98(7*7*2)个box,首先将小于置信度阈值的值归零
- NMS处理不是直接剔除,而是将其置信度设置为零
- 最后确定各个box的类别,但其置信度不为0时才做检测输出结果
2.4 YOLO-v1的优缺点
优点
- 检测物体速度快,一共才98个框
- 假阳性率低(找不到的情况会存在,但是误判的概率很低)
- 能够学习到更加抽象的物体特征
缺点
- 检测精度低于其他的SOTA检测模型
- 容易产生物体的定位错误
- 对小物体的检测效果不好,尤其时密集小物体,因为一个栅格只能预测2个物体,且NMS过程容易误剔除(这是最严重的问题)
3. YOLO-v2
3.1 YOLO-v2相比v1的优化
- Batch Normalization可以提高模型收敛速度,减少过拟合,在所有卷积层都应用了BN,结果提升2%
- 高精度分类器(High Resolution Classifier)
- 基于Image Net数据集预训练模型,大部分分类器输入图像尺寸小于 256 × 256 256 \times 256 256×256
- YOLO v2中,首先采用 448 × 448 448 \times 448 448×448分辨率的ImageNet数据fine tune使得网络适应高分辨率的输入
- 然后将该网络用于目标检测任务fine tune。高分辨率输入使得结果提升了4% mAP
- Covolutional With Anchor Boxes:借鉴了Faster R-CNN 中的anchor思想,用anchor box来预测bounding boxes。准确率只有小幅下降,但召回率提升了7%(注意faster rcnn中anchor box是9个,这里用了5个)
- Dimension Clusters:使用Kmeans聚类方法训练bounding boxes,可以自动找到更好的boxes宽高维度
- Direct location prediction
- 在YOLO模型上采用anchor boxes 使得模型不稳定,大部分不稳定因素来源于boxes 位置(x, y)
- 将预测偏移量改变为YOLO的预测grid cell的位置匹配性,将预测值限定在0-1范围内,增强稳定性
TODO
4. YOLO-v3
v3较v2的改进点:
- Loss不同:v3替换v2中的softmax loss变成logistic loss
- v2用了5个anchor,v3用了3*3个anchor,提高了IOU
- v2只有一个detection,v3有3个
- backbone 不同:v2采用darknet-19,v3采用darknet-53
TODO
参考
[1]. 详解R-FCN-知乎
[2]. 物体检测之R-FCN-知乎
[3]. 计算机视觉零基础入门-B站