YOLO V2
basic idea:
yolo最大的问题有两个:一个是recall较低,另外一个是localization不准确。与一般的增加网络复杂度和深度的思路不同,yolo v2 希望能保持yolo网络处理速度快的优势。因此,v2在不扩大网络的基础上,使用了一些技巧来使模型更容易学到有用的features。
接下来从模型的最终效果,处理速度和训练方法三方面来总结一下yolo v2使用到的算法和技巧。
Performance(better):
Batch Normalization
BN 可以使每层layer的输入在训练过程中保持分布一致,避免了随着batch不同,输入分布随之改变,而加大神经元的学习难度。在yolo v2上,这体现于加了BN之后,模型收敛更快。并且BN 也可以看作是在神经元之间引入了额外的依赖性或者说限制,迫使模型更简单,也可能部分代替正则化和drop out的工作。
High resolution detection
和很多其他的CV模型一样,yolo也使用了开源数据集做transfer learning。和之前不同的是,v2使用了和后续detection数据集相同的高分辨率的图片做预训练,使模型不用调整参数以适应新的分辨率,略微减轻了task的难度。
Anchor box with prior: k-means for box dims
yolo之前是不限制预测的bounding box的比例和大小的,唯一的先验信息是bounding box的中心落在对应的grid cell中。这使得预测的自由度太高,而所获的信息又太少。对于训练集中较少出现的大小和比例的bounding box,预测起来便更加困难。
因此v2借鉴了Region CNN的思想,引入了先验知识,为每个grid cell规定了k个(文献中k=5)比例和尺寸固定的anchor box。预测时并不直接预测box的起始位置和宽高,而是预测起始位置相对于grid cell位置的偏移和宽高的缩放系数。这一操作引入了先验知识,减小了task的难度。在使用了这个方法之后,模型的recall有明显的提升。
当然,要正真发挥Anchor box的作用,每个Anchor box的尺寸和比例需要仔细设计。文中使用了k-means聚类算法来产生5个cluster,把每个cluster的平均比例尺寸作为一个Anchor box。值得一提的是,为了和之后的detection配合,聚类使用的距离metric是。
Predict offset to each grid cell(5 d)
具体来说,模型在每个grid cell上会预测5个bounding box,并且与之前不同,每个bounding box都有自己的objectness和conditional class probability,这样一来同一cell的bounding box之间便不会相互影响。
每个bounding box会对应5个输出:。
最后需要的bounding box的中心位置,宽高,以及它包含每类物体的概率可以由如下公式算得:
:此cell相对于feature map左上角的offset。
:此anchor box的先验宽高。
注意:
- grid cell的尺寸做过归一化,每个cell的大小为1*1。因此每个属于此grid cell的bounding box的中心位置与grid cell起始位置之间的偏差一定小于1。
- 代表了此bounding box包含物体的概率,对应于yolo中的。公式中的是指中心落在此grid cell中的任意ground truth。只关心是否包含物体,因此ground truth的类别不限。
- :在bounding box包含物体的情况下,此物体属于某一类的概率。
Passthrough layers for fine features
为了能得到分辨率更高的信息,v2设置了Passthrough layers把模型前部分layer的高分辨率输出()连接到后部分,与之后的低分辨率输出()融合/重叠起来。融合方法是把高分辨率feature map上临近的4个feature重叠起来,成为一个拥有4倍channels数目的新feature,从而减小map的二维尺寸使其可以叠加。
例如:高分辨率的feature map从 后,即可与低分辨率的feature map重叠。
Train on image with different size
Speed(faster):
- vgg16:
- googlenet: Inception module with dimension reductions
- darknet:Global average pooling, 1x1 conv for channel reduction, batch normalization
training methods (stronger):
- joint training:
- classification data:
只反向传播loss中条件类概率的部分 - detection data:
反向传播整个loss的error
- classification data:
- multi-label dataset: structual label / multi-label / word tree
-很有趣实用的话题,怎么使用多个数据集来训练同一个模型。主要要解决数据集之间的标签不一致的问题。 比如同样是‘狗’这一类别,在一个数据集里可能是‘柴犬’,另外一个数据集里可能是‘动物’,他们之间有层级关系。使用最小的effort来统一这些标签,使数据集间有一致性。 - loss function && classification part: ???
具体的loss公式文中没有提到,而且关于分类的部分,论文原话是“The network predicts 5 coordinates for each bounding box”。根据我对这句话的理解,每个bounding box应该是只输出一个值来表示包含某类物体的概率,而不是我之前以为的一个维度为类数目的vector。这一点让我费解,之后研究清楚了补上。
Results:
Reference:
v2: https://arxiv.org/abs/1612.08242