从YOLOv1谈到YOLOv2(2)训练与损失函数

之前简单介绍了YOLO的主要思想,这里再简单介绍一下训练的过程。都知道训练的过程中需要修改神经网络的权重的,怎么修改要基于一个损失函数来判断。从最简单的图片分类来说,分错了,损失函数为1,对了为0,然后反向传播。损失函数的设计对于训练神经网络是很重要的,那么YOLO是怎么设计的呢。

以下内容转自知乎“图解YOLO”

从YOLOv1谈到YOLOv2(2)训练与损失函数_第1张图片

损失函数的设计目标就是让坐标(x,y,w,h),confidence,classification 这个三个方面达到很好的平衡。简单的全部采用了sum-squared error loss来做这件事会有以下不足: a) 8维的localization error和20维的classification error同等重要显然是不合理的; b) 如果一个网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的box的confidence push到0,相比于较少的有object的网格,这种做法是overpowering的,这会导致网络不稳定甚至发散。 解决方案如下:

· 更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为 \lambda_{coord} ,在pascal VOC训练中取5。(上图蓝色框)
· 对没有object的bbox的confidence loss,赋予小的loss weight,记为 \lambda_{noobj} ,在pascal VOC训练中取0.5。(上图橙色框)
· 有object的bbox的confidence loss (上图红色框) 和类别的loss (上图紫色框)的loss weight正常取1。

对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏一点更不能忍受。而sum-square error loss中对同样的偏移loss是一样。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。 如下图:small bbox的横轴值较小,发生偏移时,反应到y轴上的loss(下图绿色)比big box(下图红色)要大。
从YOLOv1谈到YOLOv2(2)训练与损失函数_第2张图片

一个网格预测多个bounding box,在训练时我们希望每个object(ground true box)只有一个bounding box专门负责(一个object 一个bbox)。具体做法是与ground true box(object)的IOU最大的bounding box 负责该ground true box(object)的预测。这种做法称作bounding box predictor的specialization(专职化)。每个预测器会对特定(sizes,aspect ratio or classed of object)的ground true box预测的越来越好。(个人理解:IOU最大者偏移会更少一些,可以更快速的学习到正确位置)

训练:

预训练分类网络: 在 ImageNet 1000-class competition dataset上预训练一个分类网络,这个网络是Figure3中的前20个卷机网络+average-pooling layer+ fully connected layer (此时网络输入是224*224)。

训练检测网络:转换模型去执行检测任务,《Object detection networks on convolutional feature maps》提到说在预训练网络中增加卷积和全链接层可以改善性能。在他们例子基础上添加4个卷积层和2个全链接层,随机初始化权重。检测要求细粒度的视觉信息,所以把网络输入也又224*224变成448*448。

你可能感兴趣的:(计算机视觉)