yolov2目标检测原理探究
本篇主要记录学习yolov2的原理,主要是对yolov2论文的精读。参考:同济子豪兄
一、Better
1. Batch Normalization
如图,BN层会把输入进行一个减去均值,除以方差的操作。得到的结果就是把输入集中在0附近,这么做的好处是之后的一些激活函数,比如sigmoid函数,他在0附近是非饱和区。在更大的地方是饱和区,会出现梯度消失,难以训练的情况。
在训练阶段,比如batch size是32,某层的神经元会输出32个相应值,对这32个响应值求均值,标准差,再作归一化,把归一化后的响应值乘γ再加上β(对归一化结果作一个线性输出,尽可能减少归一化带来的信息损失),每个神经元都训练一组γ,β。
测试阶段的均值,方差用训练阶段所得结果处理得到,此时的BN层是相当于作了一个线性变换。
2. High Resolution Classifier
aka:高分辨率分类器。先在224x224的ImageNet上训练,再在448x448上训练。
3. Anchor
在yolov1中每个grid所生成的两个bbox都是随机的,然后根据哪个和目标的IOU更大,谁就去作拟合。显然是不合适的。
在yolov2中对此作了改进,对初始的bbox会有明确的定位,高瘦的,矮胖的,各自负责相对应的特征的目标。
实际上,在yolov2中会把一张图片划分成13x13个grid cell。每个grid cell预测5个anchor。这五个anchor都有各自的初始特征。这么做的好处是可以更快的调整到目标状态,同时,所作的调整也是微调,会比之前小很多。
与此相对的,相应的网络输出也和yolov1不一样了,需要注意的是原来yolov1中类别是归grid cell管的,但是在yolov2中类别是归anchor管的。因此,在yolov2中13x13个grid cell,每个grid cell产生5个anchor,每个anchor的参数有4个定位参数,1个置信度参数,以及20个类别概率参数。
yolov2的输入是416x416x3的图像,经过骨干网络darknet-19后产生13x13x125(=5x(4+1+20))的输出。
为防止和yolov1中一样的预测框野蛮生长,在yolov2中对预测框的偏移量作了限制,加了一个sigmoid函数,使得偏移量被限制在一定范围内。
yolov2损失函数
4. Fine-Grained Features
aka——细粒度特征
先提取底层的细粒度特征,然后再和高层的语义特征结合、
5. Multi-Scale Training
在训练的时候,每十步输入不同尺度的图像来训练,强迫网络对不同尺度的图像都能去适应。
二、faster
主要是骨干网络的更换