One-stage:速度快,效果差,做实时任务。YOLO。
Two-stage:速度慢,效果好,做离线任务。MaskRcnn。
YOLOv1
网络架构
网络结构简单,可理解为:卷积层+连接层。
值得注意的是:
1. v1版本时,卷积层的输入维度固定。
2. 第二个全连接层为1470x1,该数字的确定来自于YOLO将每张图像分为7x7个方格,而每个方格又有30个特征(7x7x30=1470),这30个特征在“网络输出”小结详细介绍。
网络输出
YOLOv1根据先验知识,给出每个检测物体2个候选框,每个候选框由5个参数确定(x,y,w,h,c),(左上角横坐标,左上角纵坐标,宽度,高度,置信度)。由此就确定了“7x7x30”中“30”的前10个参数,还有20个参数代表当前数据集中有20个类别(如狗、自行车、树等等)。
故可由(S*S)*(B*5+N)来确定网络的输出。(网格数*网格数)*(候选框数*5+数据集中标签类别数)
损失函数
位置误差:
1
i
j
o
b
j
1^{obj}_{ij}
1ijobj为控制函数,包含object的格点处,该函数为1;不包含object的格点处,该函数为0。
需要预测(x,y,w,h)。值得注意的是:采取了对w和h开根号的操作,使得更加注重了小物体的检测(对小物体的偏移量比不加根号要更敏感一点)。(但这个操作还有待改进)
置信度误差:
计算每个方格(S*S)中,每个候选框(B)的置信度(
C
i
C_i
Ci)与真实值(
C
i
^
\hat{C_i}
Ci^)之间的差距。
正样本(包含object且IOU最大)置信度真值
C
i
^
\hat{C_i}
Ci^为1,负样本置信度真值
C
i
^
\hat{C_i}
Ci^为0。
对不含object的置信度误差加了一个权重值
λ
n
o
o
b
j
λ_{noobj}
λnoobj(<1),使得网络在学习时更注重含有object的置信度误差(因为图像中,所需检测的object没有背景多,如果不加权重项,则背景对损失函数影响过大)。
1
i
j
n
o
o
b
j
1^{noobj}_{ij}
1ijnoobj为控制函数,包含object的格点处,该函数为0;不包含object的格点处,该函数为1。
分类误差:
预测是狗的概率与真实是狗的概率之间的交叉熵。
存在的问题
- 每个cell只预测一个类别,如果重叠则无法解决;
- 小物体难以检测;
- 候选框较为单(就只有两种)。
YOLOv2
可参考YOLOv2详细介绍
网络架构
DarkNet(19)
实际输入为
416
∗
416
416*416
416∗416:
(因为416这个里的值一定是要被32整除的,并且希望除得的结果为奇数,因为奇数会有一个实际的中心点,故取了
416
∗
416
416*416
416∗416);
没有全连接层(FC):
全连接层容易过拟合;全连接层参数多,训练慢。
做了5次降采样(Maxpool):
每次降采样,output除2,5次降采样后除
2
5
=
32
2^5=32
25=32,即outpput变成原始输入的
1
/
32
1/32
1/32,由原始输入为(
416
∗
416
416*416
416∗416),则输出为(
13
∗
13
13*13
13∗13)(上图的
224
∗
224
224*224
224∗224只是举个例子)。这里的(
13
∗
13
13*13
13∗13)就是网格数,对比v1中的(
7
∗
7
7*7
7∗7)。
卷积核的设置:
有两种,分别为3x3和1x1的。
3x3参考了VGG中所说,卷积核较小时,可以节省参数,并且获得较大的感受野,训练出的模型也较好。
1x1只改变网络特征图个数是起到了传递作用,并节省参数。
Filter、Size和Output:
kernel(卷积核):是一个2维矩阵,长 × 宽。
filter(滤波器):是一个三维立方体,长× 宽 × 深度, 其中深度便是由多少张内核构成。
可以说kernel 是filter 的基本元素, 多张kernel 组成一个filter。
其实本质上kernel和filter都是卷积核而已,只不过一个对应单通道,一个对应多通道。in_channels决定了filter的通道数(即一个filter里有多少张kernel),out_channels的设置决定了filter的数量(同时也决定了输出结果的通道数),这一层卷积得到的结果的out_channels就是下一层的in_channels。
有关filter、kernel,in_channels和out_channnels的知识,可参考神经网络基础知识
这里maxpool后,filter个数翻倍,是因为设置了out_channels=2*in_channels。
1x1的卷积层
卷积核的高和宽都等于1,意味着它不会识别空间信息,每次只看一个空间像素所以不会去识别通道中的空间信息,但是常用它来合并通道。它输出的值等价于将对应的输入位置上的不同通道上的值做加权和。
1x1卷积核的作用就是去融合不同通道的信息可以认为是不做空间的匹配,只是在输入层直接做输入通道和输出通道的融合,等价于将整个输入拉成一个向量,通道数等于feature的数量
理解上可以认为等价于一个全连接层,不做任何的控制信息,因为全连接层不考虑空间信息它只考虑在特征维度(也就是输入通道维数)的融合。
Batch Normalization(批归一化)
舍弃了Dropout。因为Dropout经常在全连接层用到,为了防止过拟合。在这里也就表示去掉了全连接层。不知道的复习一下神经网络基础算法。
那么既然没有了全连接层,对图像输入的大小还有要求吗?当然是没有了,因为只有全连接层的参数限制了输入图像的大小,卷积层又不影响。
每一个卷积层后都加入Batch Normalization,也就是网络的每一层都做归一化,收敛起来相对简单。
可以这样理解,加上BN之后就相当于月考,有利于下一步的发展。不加BN相当于年考,中间学的怎么样不清楚。
从第一张图可以看到,经过Batch Normalization之后的网络会提升2%的mAP。
目前Batch Normalization已经成为网络模型必备处理方法了。也就是一个学校发现月考挺好,然后其他学校纷纷效仿,最终全国统一了。
聚类提取先验框(anchor )
利用K-means聚类方法,通过对数据集中的ground truth box的框做聚类,找到ground truth box的统计规律。以聚类个数k为anchor boxes个数,以k个聚类中心box的宽高为anchor box的宽高。
值得注意的是,为了排除大box产生的误差比小box产生的误差影响大,不适用标准k-means所使用的欧氏距离,重新设计了距离的度量方式:
d
(
b
o
x
,
c
e
n
t
r
o
i
d
s
)
=
1
−
I
O
U
(
b
o
x
,
c
e
n
t
r
o
i
d
s
)
d(box,centroids)=1-IOU(box,centroids)
d(box,centroids)=1−IOU(box,centroids)
平衡复杂度和IoU之后,最终得到k值为5。
检测框偏移量计算方法
采用相对位置来计算偏移量,且计算公式的定义可以使得检测框移动步长较小(相对于v1版本时的定义),使得模型训练时更为稳定,尤其是刚开始训练的时候。
YOLOv1和YOLOv2网格输出维度对比
由anchor box同时预测类别和坐标。因为YOLO-V1是由每个cell来负责预测类别的,每个cell对应的两个bounding box负责预测坐标。YOLO-V2中不再让类别的预测与每个cell绑定一起,而是全部都放到anchor box中去预测。(预测是这样预测的,但是输出还是要通过每个网格中的数据进行,故看到上图描述v2每网格的数据个数)
我们知道YOLO-V1输出7x7x30的检测结果,如上图,其中每个网格输出的30个数据包括两个候选框的位置,有无包含物体的置信度,以及网格中包含物体类别的20个概率值。
YOLO-V2对此做了些改进,将物体类别的预测任务交给了候选框,而不再是网格担任了。由上述聚类提取5类先验框,那么就会有5x25=125个数据的输出维度,其中25为每个候选框的位置+有无物体的置信度+20个物体类别的概率值。这样的话,最后网络输出的检测结果就应该是13x13x125。
感受野
感受野:特征图上的点追溯回去能看到原始图像多大的区域。
上述3个3*3卷积得优点:
节省参数;
每一次卷积之后都要进行BN,相当于月考,而一个7X7的卷积核就相当于期末考。
特征融合
YOLO-V2则采用了另一种思路:通过添加一个passthrough layer,来获取之前的26x26x512的特征图特征,也就是前面框架图中的第25步。对于26x26x512的特征图,经过重组之后变成了4个13x13x512个的特征图(特征图大小降低4倍,而channels增加4倍),这样就可以与后面的13x13x1024特征图连接在一起形成13x13x3072大小的特征图,然后再在此特征图的基础上卷积做预测。如上图。
(YOLO-V2算法使用经过扩展后的特征图,利用了之前层的特征,使得模型的性能获得了1%的提升。)
多尺度训练
原始的YOLO网络使用固定的448x448的图片作为输入,加入anchor boxes后输入变成了416x416,由于网络只用到了卷积层和池化层,就可以进行动态调整,检测任意大小的图片。为了让YOLO-V2对不同尺寸图片具有鲁棒性,在训练的时候也考虑到了这一点。
不同于固定网络输入图片尺寸的方法,每经过10批训练(10 batches)就会随机选择新的图片尺寸(通过多个尺度进行训练)。网络使用的降采样参数为32,于是使用32的倍数{320,352,…,608},最小尺寸为320x320,最大尺寸为608x608。调整网络到相应维度然后继续训练。这样只需要调整最后一个卷积层的大小即可,如下图:
这种机制使得网络可以更好地预测不同尺寸的图片,同一个网格可以进行不同分辨率的检测任务,在小尺寸图片上YOLO-V2运行更快,在速度和精度上达到了平衡。