一、YOLO 1的特点
1、与当时最先进的技术相比还欠缺一些定位准确度,但在识别精度上较高
2、base模型处理图片可以达到45 fps, fast YOLO更小的模型达到155 fps,且仍然有两倍的map相较于其他的实时检测器。因此可应用于实时系统检测。
3、传统的几种检测器是通过滑动窗口或基于区域检测物体的,而YOLO检测与识别物体时是观测整张图片的,所以其可以学习类之间(论文中说还有外观之间)的上下文信息,如(桌子和杯子),因此其对背景物体检测准确率较高。
4、由于YOLO训练和检测时是看到全局图片的,有较好的概括性,所以其能够有很好的迁移性,如在自然场景图片中训练出来的模型可以在艺术画中的检测有很好的效果,而DPM和R-CNN不行。
5、YOLO是同时地、使用全局特征地检测所有的bounding box。
二、YOLOV1的全局检测的方式
1、将图片分为S*S个grid
2、每个grid预测B个bounding box,预测出参数x,y,w,h,confidence,其中 x,y是bounding box的中心相对于grid边界的坐标,w,h是其宽和高与输入图片的宽高比值~[0, 1],confidence由两部分组成,分别是IOU(真实box与预测box的交并比)和Pr(Object)(box中有物体的概率)confidence = IOU* Pr(Object)
其中x,y也是属于[0, 1],其计算方式为box中心坐标除以横纵方向的grid的宽和高,再减去grid的index,如S=7,则index~[0, 6]
3、对每一个grid计算出C个class的条件概率Pr(Classi |Object),i为第i个class的概率,这个条件概率是在box中有物体的条件下的。(注:每一个grid只有一个C,而不是每一个grid中预测的B个box都预测C个class的概率)
4、这样最终预测出一个S * S * (5*B+C)的Tensor
5、每一个grid的B个box fit物体且识别出物体的概率为
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
(
C
l
a
s
s
i
)
∗
I
O
U
Pr(Classi|Object) ∗ Pr(Object) ∗ IOU = Pr(Classi) ∗ IOU
Pr(Classi∣Object)∗Pr(Object)∗IOU=Pr(Classi)∗IOU
即confidence*Pr(Classi |Object)
6、作者在PASCAL VOC的数据集上进行检测识别时,B设为2,S设为7,C为数据集标签种类20
三、神经网络和LOSS的设计
1、网络结构
网络结构如下:
1、网络含有24个convolutional layers 和 2个fully connected layers
2、用1*1的卷积层来减少特征空间
3、除了最后一层使用线性激活函数,其它层均使用LeakyReLU(0.1)
2、模型训练
1、作者将模型的前20个卷积层放在ImageNet的分类数据集(224*224)上进行预训练,之后借鉴Ren et al. 的做法添加了4个卷积层和全连接层(随机初始化)提升了性能,同时又增大了输入图像的尺寸以便于给模型 fine-grained visual information。
2、在作者使用平方差Loss时遇到localization error 与 classification error有相同的权重,这过于理想化实际上是不可能这样的,这会使模型训练时偏离最优方向,最终使模型精度降低。
由于大部分grid中是没有物体的,其Pr(object)=0,confidence=0,如果用平方差Loss,confidence=0和1的loss值是一个数量级的,这会使训练中模型偏向于confidence=0的方向优化。(一个batch中的grad时平均后再用来更新参数的)
因此作者在对loss设置时增大了对box定位的误差的权重,减小了grid中confidence=0的误差的权重。具体操作是通过设置了两个参数完成的。
在测试时,我们对big box 和small box的精度要求一般是不一样的,big box偏差允许大一些,而small box 的偏差要求要小一些,于是作者对w和h进行了平方根的操作使模型预测的是box w和h平方根之后的值(个人认为对box width和height平方根之后计算得到w和h也行),这样使big box和small box的w和h在平方之后big box 的误差要大于small box的误差(假设对big box 和small box的w,h预测误差相同),达到了增大big box定位误差和减小small box定位误差的目的。
注:可能有同学有疑问,预测开方后的数据后,还要进行平方处理,这样不就加大了模型误差了么? 但其实模型总体误差是没有减小的,只是误差的分布变了,big box的大一些,small box小一些。这是因为数据在开方之后,其数值分布会变得集中一些,画一个(0,1)区间上的x的0.5次方的曲线即可看出,这会减小模型预测的难度,模型预测的精度就会相应的提高。
3、Loss
可以说Loss的设置才是体现模型细节的地方,之前说的那一大堆也就是在说怎么设置Loss。
(1)λc和λn就是先前说的两个参数,前者增大localization误差权重,后者减小没有object的confidence=0的误差权重。
(2)class的概率一个grid只计算一次,其他都要计算B次,B为每个grid预测的box的数量。
(3)localization误差只计算含有object的grid中的box
(4)confidence误差的计算是每个grid都要计算的,但加入了一个权值,使confidence=0的即不含object的grid的误差权值降低。
即当grid中没有object时loss只由加了权值的confidence误差决定,反之只需要普通的平方差加入权值即可计算。
由于检测的全局性,训练时会将图像中物体的隐藏关系也会训练进去。
4、训练细节、超参数设置和数据增强
优化器:SGD(momentum = 0.9, weight_decay = 0.0005)
Batchsize: 64
Epoch: 135
Learning rate: 第1个epoch(0.001, 0.01),之后0.01持续75个epoch,0.001持续30个epoch,0.0001持续30个epoch
Dropout:0.5,在第一个全连接后加
数据增强:1、随机缩放和平移,范围高达原始图像的20%
2、在HSV彩色空间调整曝光度和亮度,调节范围1.5倍
3、模型测试,使用非极大值抑制
1、首先选出confidence最大的N个box放入集合H,然后取最大的一个box放入集合M,再分别H中计算剩下box与其的IOU,将IOU大于一定值(设置一个阈值一般取0~0.5)的box去除。然后再从H中取最大confidence的一个box重复上面的操作知道H中没有box。这样M中取得的box便是最终定位物体的box。
2、但使用非极大值抑制会导致检测相近的物体有缺失,如鸟群等