YOLO9000个人笔记
首先介绍YOLOv2:
作者引用或者提出的一些优化方法:
- Batch Normalization
该方法将每一层的输出做一次归一化(均值为0,方差为1),然后再偏移一下,尽量保证落在原点周围,可以提升训练的速度,避免梯度消失和爆炸的问题,还避免了过拟合,可以直接移除dropout方法,使得算法对初始值和下降速度不再异常敏感.
- High Resolution Classifier
先将分类网络在高分辨率的图像上面训练,一共10个周期,使得算法适应高分辨率后再去调整他的定位能力.
- Convolutional With Anchor Boxes
Anchor Boxes 是预先规定目标可能的形状和大小等,导致很多运用该技术的算法过度依赖于Anchor Boxes的好坏. YOLO算法加入这个方法后,mAP稍微下降,但是recall提高了,作者最后去掉了这一部分.
- Dimension Clusters
作者也采用了预先规定目标可能的大小和方向,但是使用的聚类的方法,通过K-means聚类方法找到5类最有可能出现的boxes,其中聚类算法的距离定义为:,之所以不选择欧几里得距离,因为这会导致大的boxes产生更多的误差. 最后作者权衡复杂度和效果选择的类别为5.
- Direct location prediction
作者每个boxes预测了五个信息:tx,ty,tw,th,to. 直接通过中心cell预测出目标可能的位置.
- Fine-Grained Features
将前面高分辨率的层直接连接到后面的层,有点像ResNet的方法,使得对小的物体有了更好的效果,主要是服务于detection.
- Multi-Scale Training
作者在多尺度上面验证了一下YOLOv2算法,分辨率越高,mAP越高,但是PFS越低.
- Darknet-19
作者使用了新的网络,新的网络一共19层卷积层,5层池化层,大大减少了计算量,只有55亿8千万个神经元.
- Training for classification
这里是作者一个大的创新,由于检测的数据集比较小且昂贵,作者使用了分类的数据集来提高了自己模型的分类能力.
- Training for detection
之后继续用检测的数据来训练自己检测的能力,并将第二层和最后一层做了连接用来提高检测能力.
再介绍一下YOLO9000:
作者使用的提高训练集的方法:
- Hierarchical classification
ImageNet中的语义是一种拓扑图的结果,作者首先把这种结构变成了树形的结构,创造了WordTree,有点像家族树一样的东西. 然后修改了softmax层,这里变成了多个softmax对最终的结果进行预测,每一个softmax层预测的东西对应于WordTree的一层,比如一个softmax预测这个目标是物体、生命还是现象,这在WordTree中显然属于比较靠近根的层,另一个softmax层可以预测这个是狗还是猫等等,创造了一种独特的树形预测方式.
这意味着YOLO9000有了一种独特的能力,预测没有见过的东西,比如德牧是他见过的,他能预测这是德牧,假设贵宾没有见过,但是他至少可以预测出这是一条狗,只是不知道具体是什么狗,使得预测的鲁棒性大大提高.
- Dataset combination with WordTree
作者将ImageNet和COCO的数据用这个WordTree的概念结合在了一起.
- Joint classification and detection
结合了两个数据,一共9418个类别,作者在这个上面训练了YOLO9000,不过为了平衡,作者过采样了COCO的数据,使得ImageNet的数据仅仅比COCO的数据多4倍.
最终该模型可以检测那些从来没有见过检测信息的物体,但是仅仅是对动物之类的,这是因为虽然某些动物没有见过,但是动物这个类别的检测信息见过比较多,但是对比如太阳镜之类的没有见过的东西,检测效果为0. 这说明一件事,这个WordTree确实是奏效的,只要在大的类别中给出一些信息,就可以预测这个大类别的其他物体,这是非常有价值的.