YOLOV2解读
建议看代码理解细节!
YOLOv2代码pytorch实现链接
简介
YOLOv2是在YOLOv1基础上改进而来的,它使用了一种新颖的多尺度的训练方法,与YOLOv1相比,相同的YOLOv2模型可以运行在不同大小的图片上,提供精度与速度之间的轻松权衡。最后提出了一种联合训练目标检测和分类的方法,使用这种方法可以同时在COCO检测数据集和ImageNet分类数据集上同时训练YOLO9000,并且此联合训练方法允许YOLO9000预测没有标记检测数据的目标类。这个YOLO9000训练此处不讲。
Better
这部分是作者针对YOLO的缺陷而进行的一些改进,那么YOLO有哪些缺陷呢?YOLO存在两个缺点,与faster-rcnn相比,第一:定位不明确,产生了大量定位错误;第二:与基于region proposal的方法相比,YOLO的召回率相对较低。 因此,YOLO主要朝着这两方面去提升。而在现在的计算机视觉领域,通常朝着更大更深的网络去提升性能,更好的性能通常取决于训练更大的网络或者将多个模型整合在一起。然而对于YOLOv2,反而是简化网络,大概看一下YOLOv2的表现:YOLOv2算法在VOC 2007数据集上的表现为67 FPS时,MAP为76.8,在40FPS时,MAP为78.6.
1、Batch Normalization
现在神经网络对图片训练前,都要对图片进行预处理,将图片数据分布归一化0和1之间,这样做的目的是可以加快训练收敛速度,防止梯度消失。问题在于对图像数据进行归一化只在神经网络第一层进行,那么随着网络深度加深或者在训练过程中,其数据分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近,所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
而在论文中,BN(Batch Normalization)层简单讲就是对网络的每一层的输入都做了归一化,这样网络就不需要每层都去学数据的分布,收敛会快点。原来的YOLO算法(采用的是GoogleNet网络提取特征)是没有BN层的,因此在YOLOv2中作者为每个卷积层都添加了BN层。另外由于BN可以规范模型,所以本文加入BN后就把dropout去掉了。实验证明添加了BN层可以提高2%的mAP。
在上图的代码中可以看到,在每层的卷积层后都加上了一个BN层!
2、High Resolution Classifier
在原始YOLO中,用224×224分辨率的图片尺寸训练分类网络,接着又用448×448分辨率的图片尺寸训练检测网络。这种训练方法意味着从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变 。而YOLOv2将训练分成两步,