YOLOv3论文思想与算法原理

一、领域现状

目标检测长期发展以来two-stage算法(RCNN系列)占据地位,直至YOLO和SSD等one-stage算法的出现。

从R-CNN到Faster R-CNN一直采用的思路是proposal+分类 (proposal 提供位置信息, 分类提供类别信息)精度已经很高,但由于two-stage(proposal耗费时间过多)处理速度不行达不到real-time效果。
YOLOv1和YOLOv2给目标检测带来了曙光,但也存在很多问题:
(1)定位不准确
(2)和基于region proposal的方法相比召回率较低

二、YOLOv3: An Incremental Improvemet

一、YOLOv3基本思想

YOLOv3除了网络结构,其余变动不多,大部分思想延续前两代YOLO的思想:

YOLOv1论文思想与算法原理

YOLOv2论文思想与算法原理

yolov3上保留的东西:

1.“分而治之”,从yolov1开始,yolo算法就是通过划分单元格来做检测,只是划分的数量不一样。
2.采用"leaky ReLU"作为激活函数。
端到端进行训练。一个loss function搞定训练,只需关注输入端和输出端。
3.从yolov2开始,yolo就用batch normalization作为正则化、加速收敛和避免过拟合的方法,把BN层和leaky relu层接到每一层卷积层之后。
4.多尺度训练。在速度和准确率之间trade-off。想速度快点,可以牺牲准确率;想准确率高点儿,可以牺牲一点速度。

基于v2的改进

1、类别预测:单标签分类改进为多标签分类

因此网络结构上就将原来用于单标签多分类的softmax层换成用于多标签多分类的逻辑回归层。 因为原来分类网络中的softmax层都是假设一张图像或一个object只属于一个类别,但是在一些复杂场景下,一个object可能属于多个类,比如你的类别中有woman和person这两个类,那么如果一张图像中有一个woman,那么你检测的结果中类别标签就要同时有woman和person两个类,这就是多标签分类,需要用逻辑回归层来对每个类别做二分类。

2、采用多个scale融合的方式做预测

原来的YOLO v2有一个层叫:passthrough layer,假设最后提取的feature map的size是1313,那么这个层的作用就是将前面一层的2626的feature map和本层的1313的feature map进行连接,有点像ResNet。当时这么操作也是为了加强YOLO算法对小目标检测的精确度。这个思想在YOLO v3中得到了进一步加强,在YOLO v3中采用类似FPN的upsample和融合做法(最后融合了3个scale,其他两个scale的大小分别是2626和5252),在多个scale的feature map上做检测,对于小目标的检测效果提升还是比较明显的。虽然在YOLO v3中每个grid cell预测3个bounding box,看起来比YOLO v2中每个grid cell预测5个bounding box要少,其实不是!因为YOLO v3采用了多个scale的特征融合,所以boundign box的数量要比之前多很多,以输入图像为416416为例:(1313+2626+5252)3和13135相比哪个更多应该很清晰了。

二、网络结构改进

1、backbone:Darknet-53

网络包含了除全连接层以外的52层卷积层,backbone部分由Yolov2时期的Darknet-19进化至Darknet-53,加深了网络层数,引入了Resnet中的跨层加和操作。
在这里插入图片描述

2、Darknet-53与其他网络性能对比

Darknet-53处理速度每秒78张图,比Darknet-19慢不少,但是比同精度的ResNet快很多。Yolov3依然保持了高性能。
在这里插入图片描述

3、网络细节

整个v3结构里面,是没有池化层和全连接层的。前向传播过程中,张量的尺寸变换是通过改变卷积核的步长来实现的,比如stride=(2, 2),这就等于将图像边长缩小了一半(即面积缩小到原来的1/4)。在yolo_v2中,要经历5次缩小,会将特征图缩小到原输入尺寸的(1/2)^5即1/32。输入为416x416,则输出为13x13(416/32=13)。
yolo_v3也和v2一样,backbone都会将输出特征图缩小到输入的1/32。所以,通常都要求输入图片是32的倍数。可以对比v2和v3的backbone看看:(DarkNet-19 与 DarkNet-53)
在这里插入图片描述

yolo_v2中对于前向过程中张量尺寸变换,都是通过 最大池化来进行,一共有5次。而v3是通过卷积核 增大步长来进行,也是5次。(darknet-53最后面有一个全局平均池化,在yolo-v3里面没有这一层,所以张量维度变化只考虑前面那5次)。
这也是416x416输入得到13x13输出的原因。

4、网络输出

yolov3输出的输出是至关重要的。

第一点, 9个anchor会被三个输出张量平分的。根据大中小三种size各自取自己的anchor。

第二点,每个输出y在每个自己的网格都会输出3个预测框,这3个框是9除以3得到的,这是作者设置的,我们可以从输出张量的维度来看,13x13x255。255是怎么来的呢,3*(5+80)。80表示80个种类,5表
示位置信息和置信度,3表示要输出3个prediction。在代码上来看,3*(5+80)中的3是直接由num_anchors//3得到的。

第三点,作者使用了logistic回归来对每个anchor包围的内容进行了一个目标性评分(objectness score)。
根据目标性评分来选择anchor prior进行predict,而不是所有anchor prior都会有输出。

三.损失函数

xy_loss = object_mask * box_loss_scale * K.binary_crossentropy(raw_true_xy, raw_pred[..., 0:2],
                                                                       from_logits=True)
wh_loss = object_mask * box_loss_scale * 0.5 * K.square(raw_true_wh - raw_pred[..., 2:4])
confidence_loss = object_mask * K.binary_crossentropy(object_mask, raw_pred[..., 4:5], from_logits=True) + \
                          (1 - object_mask) * K.binary_crossentropy(object_mask, raw_pred[..., 4:5],
                                                                    from_logits=True) * ignore_mask
class_loss = object_mask * K.binary_crossentropy(true_class_probs, raw_pred[..., 5:], from_logits=True)

xy_loss = K.sum(xy_loss) / mf
wh_loss = K.sum(wh_loss) / mf
confidence_loss = K.sum(confidence_loss) / mf
class_loss = K.sum(class_loss) / mf
loss += xy_loss + wh_loss + confidence_loss + class_loss

上面是一段keras框架描述的yolo v3 的loss_function代码。
忽略恒定系数不看,可以从上述代码看出:除了w, h的损失函数依然采用总方误差之外,其他部分的损失函数用的是二值交叉熵。最后加到一起。那么这个binary_crossentropy又是个什么玩意儿呢?就是一个最简单的交叉熵而已,一般用于二分类,这里的两种二分类类别可以理解为"对和不对"这两种。

四、训练策略

1、Bounding Box Prediction

b-box预测手段是v3论文中提到的又一个亮点。先回忆一下v2的b-box预测:想借鉴faster R-CNN RPN中的anchor机制,但不屑于手动设定anchor prior(模板框),于是用维度聚类的方法来确定anchor box prior(模板框),最后发现聚类之后确定的prior在k=5也能够又不错的表现,于是就选用k=5。后来呢,v2又嫌弃anchor机制线性回归的不稳定性(因为回归的offset可以使box偏移到图片的任何地方),所以v2最后选用了自己的方法:直接预测相对位置。预测出b-box中心点相对于网格单元左上角的相对坐标。

五.实验结果

在这里插入图片描述

六.论文总结

1、YOLO(v3)的优点

几乎优化了单步检测所有可以优化的点,精度上干掉F-RCN,速度上干掉SSD,别人哪里强我就比它更强。

2、YOLO(v3)的缺陷

可能是在大物体定位精度上稍微差一些,这个对比SSD的网络结构应该也不难看出,相信作者在下一代YOLO V4里会做出优化。

七.参考文献

You Only Look Once: Unified, Real-Time Object Detection

【论文解读】Yolo三部曲解读——Yolov3

YOLOv3: An Incremental Improvement

https://blog.csdn.net/leviopku/article/details/82660381

https://blog.csdn.net/leviopku/article/details/82660381

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值