机器人小学期(3):YOLOv3

原文链接:YOLOv3: An Incremental Improvement

YOLOv3是YOLO系列的最新版本,总体来讲变化不算特别大。(I didn’t do a whole lot of research this year. Spent a lot of time on Twitter. Played around with GANs a little. ——作者如是说)但是为了完成这个项目,我还是读了一遍paper。事实上,参考文献中列出了一个非常详细YOLOv3的教程,教程中包括了一些关于YOLOv3的细节说明,并手把手教读者如何从cfg文件开始构建网络,加载模型参数并完成预测。这个教程使用PyTorch实现的,非常有参考意义。美中不足的是,这个教程只包含了detection部分,而没有告诉你如何使用PyTorch从头开始训练网络。

在这篇博客中,我依旧按照paper中的逻辑讲解YOLOv3,更多的细节可以在后面的文章中看到。

YOLOv3

预测Bounding Box

在YOLOv3中,我们依旧使用类似于YOLOv2的方法预测bounding box,对于每个bounding box,给出四个参数\(t_x,t_y,t_w,t_h\),然后通过变换

$$\begin{align}
b_x&=\sigma(t_x)+c_x \\
b_y&=\sigma(t_y)+c_y \\
b_w&=p_we^{t_w} \\
b_h&=p_he^{t_h} \\
\end{align}$$

就可以得到bounding box的真实值。关于参数的解释,详见上一篇文章,这里不再解释。

在训练中,我们使用误差的平方和作为loss。如果真实值是\(\hat{t_{*}}\)而预测值是\(t_{*}\),那么误差就是\((\hat{t_{*}} -t_{*}\)。需要额外说明的是和bounding box有关的第五个参数\(t_o\),在YOLOv3中这个参数依旧表示置信值\(Pr(\text{Object})*\text{IOU}(b, \text{Object}))\)。\(t_o\)的真实值\(\hat{t}_o\)是这样定义的:如果这个\(t_o\)对应的bounding box prior和某个物体的真实的bounding box重叠的比例高于其他bounding box prior,那么\(\hat{t}_o=1\),我们称之为这个bounding box prior分配给某个物体的真实值。(注:按照我的理解,bounding box prior和真实的bounding box的重叠比例是这么得到的。和YOLOv2相同,YOLOv3中的每个prediction都对应于一个anchor,这个anchor将用于计算bounding box的宽度和高度。bounding box prior以anchor作为宽度和高度,以真实bounding box的中心作为中心,然后就可以求bounding box prior和真实bounding box的重叠比例了。)

在计算loss的时候,如果一个预测和某个真实物体的bounding box重叠超过某个threshold(0.5),那么我们忽略掉这个预测的loss。如果一个预测和某个真实物体的bounding box prior没有被分配给某个物体的真实值,那么我们只将置信值\(t_o\)的误差加入loss,而忽略掉分类误差和定位误差。

预测分类

考虑到使用softmax作为分类器时,我们假设了每个bounding box只包含一个类别的物体,而实际上每个bounding box可能包含多个类别的物体,因此我们对每个类别使用独立的逻辑分类器。我们使用binary cross-entropy loss作为预测分类的loss。

基于不同尺度的预测

YOLOv3依旧使用一组anchor来辅助不同尺度的预测,不同之处在于,YOLOv3使用了9个anchor,将这9个anchor分成3组看作3个不同的尺度。在每个预测层中,我们只使用其中一组3个anchor,相应的每个格子给出3个预测bounding box。

我们按照如下方法使用这3个不同的尺度。首先在基础特征提取器上,我们连接几个卷积层,然后接第一个尺度的预测层。然后,取出之前两层的特征图升采样两倍,再和之前某一层的特征图接起来,再通过几个卷积层,接入下一个尺度的预测层。以此类推。

特征提取

YOLOv3融合了YOLOv2中Darknet-19和ResNet的想法,提出了新的特征提取器,如图。


Darknet-53

效果


不同model比较

无效的尝试

作者在文中还提到了一些尝试过但效果不好的做法:

  • 使用anchor box预测机制来预测anchor box的x和y偏移。
  • 使用linear activation作为x和y预测的激励而不是使用logistic activation。
  • 使用focal loss。
  • 使用双IOU threshold。当一个预测和某个真实值的threshold大于0.7或小于0.3时,考虑这个预测中\(t_o\)的误差。这个操作会使得mAP降低。
机器人小学期(4):将YOLO应用到自己的数据集上 机器人小学期(2):YOLOv2

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×