YOLOv3

在这里插入图片描述
本文介绍一下J Redmon老哥YOLO系列的第三版——YOLOv3!额…最开始,我想说,这篇论文…它读起来与众不同。它,不那么像一篇中规中矩的论文,内容写的很随性,言语里也暴露出作者逗比的属性哈哈哈。反正今天我是一边看一遍笑的哈哈哈,程序员的幽默你挡不住~(大家可以去看看这位老哥的主页,其中的resume萌死哦)
ps:本文会时不时地吐槽J Redmon的风趣幽默哈哈哈
在这里插入图片描述
PS:为了更好地分析论文,我会参照一部分源码,主要参考了github上两个高星工程,这里给出链接:YOLOv3-KerasYOLOv3-PyTorch,不过有些地方两者的实现是有差别的,我更多参照后者PyTorch版本。当然你也可以去看官方的版本(DarkNet

废话不多说,展开论文介绍吧!

1. 简介

YOLOv3相比YOLOv2做了一些策略上的改进,并且将backbone从DarkNet-19改为DarkNet-53,这使得网络准确度提升,速度也足够快。

不如先展示一下网络的性能图:
在这里插入图片描述
在这里插入图片描述

这张图是老哥从人家RetinaNet(Focal Loss)的paper上扒下来,再加上自己的运行结果的(瞅瞅懒得你)。

我们可以看到,YOLOv3的最大特点还是速度够快!而且性能也不差。
不过,我们可以明显地感觉到,YOLOv3在COCOmAP上效果不够优秀(在AP-50上效果还不错)。这一点作者自己也有提到,而且在文末的Rebuttal部分也着重说了这件事(准确地说是在指出COCOmAP的问题)

细心的朋友可以看到,作者坐标系的原点不是(0,0),而是巧妙地把自己的YOLOv3放在了第二象限,突出其速度优势哈哈哈~(这一点被人吐槽了,文末Rebuttal部分有提及)

大家看到Figure3下方的小字了嘛?“Can you cite your own paper?Guess who’s going to try, this guy→[16]《YOLOv3》” 看到这里,我的内心:???(你好骚啊.jpg)

另外小字部分也指出了YOLOv2的一个bug(为了不破坏文章结构,就藏在这里了哈哈哈)

PS:论文中,作者在Introduction部分,一直在扯皮:呀我这一年一直在敷衍了事啊,成天逛twitter,玩儿GANs…不过我还是做了点工作的,这篇paper你们就当技术报告看吧!反正TECH Report也不用好好写introduction哈哈哈哈~

emmmmm,想了想,这里呈现一下网络的结构吧,从网上找了两张别人画的结构图,网址分别为:图片1图片2
我们可以看到,网络最终有三组输出,这是因为文章借鉴了FPN的思想,提取三个尺度的特征图(13×13,26×26,52×52);另外,网络还借鉴ResNet思想使用了残差结构。更多内容后文再说~
在这里插入图片描述
在这里插入图片描述
文章写得实在是有点随性,对网络结构介绍的不多,希望这两张图片能够便于大家更好地理解文章内容~

2. YOLOv3干了啥

J Redmon老哥在文章第二部分“详细”地给我们介绍了YOLOv3系统。这里主要涉及四个部分:BBox的预测方法、Class的预测方法、多尺度预测、Backbone结构

美其名曰“take you through the whole system from scratch so you can understand it all”,可是写的还挺随性简单的…

(1)BBox 预测
在这里插入图片描述

老哥在上图小字部分又顽皮了,“我公然剽窃我自己!”哈哈哈哈

YOLOv3继续沿用v2中的框预测思路,即每个框都需要预测 (tx, ty, tw, th, to) 五个变量(当然这是针对框预测的,后面还需要类别预测)。

这里提几个点:

  • 这里对(tx, ty, tw, th)损失函数用的平方差损失(sum of squared error loss);
  • 目标分数to损失函数用的二元交叉熵损失(binary cross-entropy loss)
  • YOLO中每个ground truth只分配一个anchor(与gt的重叠最大的那个anchor)
  • 对于那些非最优但重叠也够大的anchor(超过阈值ignore_thres),我们忽略这些预测(这和Faster R-CNN的双阈值思想类似),即不做正样本也不做负样本

PS: 想了解“忽略预测”操作的读者(其实是我自己想了解哈哈哈),可以参考YOLOv3-PyTorch中,model.py的180~189行,这里调用了自己写的build_targets函数,其中的ignore_thres参数就是这里所说的阈值

if targets is None:
            return output, 0
else:
            iou_scores, class_mask, obj_mask, noobj_mask, tx, ty, tw, th, tcls, tconf = build_targets(
            pred_boxes=pred_boxes,
            pred_cls=pred_cls,
            target=targets,
            anchors=self.scaled_anchors,
            ignore_thres=self.ignore_thres,
            )

这个build_targets函数在uitl.util中定义,核心在于305~306行:

# Set noobj mask to zero where iou exceeds ignore threshold
    for i, anchor_ious in enumerate(ious.t()):
        noobj_mask[b[i], anchor_ious > ignore_thres, gj[i], gi[i]] = 0

想详细了解的同学请自行到源码中查看,pytorch版本中就是用两个mask来区分正负样本的。

另外,这个阈值是个超参数,官方源码中在613行等三处将其默认设置为0.7,PyTorch版本中则默认值为0.5。

好了,这里扯得有点多了,继续写正文…

(2)Class预测

# Get outputs(取自PyTorch版本的实现)
        x = torch.sigmoid(prediction[..., 0])  # Center x
        y = torch.sigmoid(prediction[..., 1])  # Center y
        w = prediction[..., 2]  # Width
        h = prediction[..., 3]  # Height
        pred_conf = torch.sigmoid(prediction[..., 4])  # Conf
        pred_cls = torch.sigmoid(prediction[..., 5:])  # Class pred.

这里对Class预测的部分,我们可以看到,用的是sigmoid函数,取代了之前的使用的softmax方法。

            # Loss : Mask outputs to ignore non-existing objects (except with conf. loss)
            loss_x = self.mse_loss(x[obj_mask], tx[obj_mask])
            loss_y = self.mse_loss(y[obj_mask], ty[obj_mask])
            loss_w = self.mse_loss(w[obj_mask], tw[obj_mask])
            loss_h = self.mse_loss(h[obj_mask], th[obj_mask])
            loss_conf_obj = self.bce_loss(pred_conf[obj_mask], tconf[obj_mask])
            loss_conf_noobj = self.bce_loss(pred_conf[noobj_mask], tconf[noobj_mask])
            loss_conf = self.obj_scale * loss_conf_obj + self.noobj_scale * loss_conf_noobj
            loss_cls = self.bce_loss(pred_cls[obj_mask], tcls[obj_mask])
            total_loss = loss_x + loss_y + loss_w + loss_h + loss_conf + loss_cls

而对于Loss部分,相应的,对Class预测的部分使用了二元交叉熵损失(BCE,Binary Cross-Entropy)。

原文中是这样解释的:实验发现softmax对性能没有什么帮助,而且这种改动可以使模型应用到更复杂的场景中(比如,Open Images Dataset,其中标签之间可能有重叠),因为这种二元损失可以对同一个box预测多个类别(比如Person和Woman)

这里再多说两句损失函数吧,有些文章中认为,loss_x和loss_y也是用的交叉熵损失,因为博主参考的是Keras版本的YOLOv3;但这和原论文是不相符的,所以这里按照原文和PyTorch版本的为准。

(3)多尺度预测
在这里插入图片描述
(上图以及下图链接:X-猪的知乎

文章开头我们也看到了,YOLOv3吸纳了FPN的思想,输出3种尺度的特征:13×13,26×26,52×52。而对应每个尺度,又预测了三种尺寸的box。
在这里插入图片描述

这里,先验框尺寸的选取延续了YOLOv2中的方法,即利用了尺度聚类

从而,对每种尺度N×N的输出,都对应一个**N×N×[3×(4+1+80)]**的tensor

  • N×N即对应每一个cell
  • 3是指每个尺度对应3个尺寸的anchor
  • 4+1即预测框的五个指标(tx, ty, tw, th, to)
  • 80指COCO中的80类

(4)特征提取器
在这里插入图片描述
好了,终于是时候搬出DarkNet-53了,它是YOLOv2中DarkNet-19的强化版本,更高的准确率(Accuracy),更高的GPU利用率(FLOP/s),不过FPS有所下降~ 可以说,它带来了一种性能与速度之间的新的均衡。

从结构上来看,DarkNet-53是DarkNet-19与ResNet思想的结合,层数的增多带来的问题依靠Residual来解决。另外,与DarkNet-19类似的是,DarkNet-53也将输入通过5次下采样,最终达到2^5=32的下采样步长。

文章也没有详细介绍这个结构,只是这里老哥又卖了个萌:

It has 53 convolutional layers so we call it … wait for it … Darknet-53!(能不能好好说话哈哈哈,wait你个大头鬼)

3. 实验

在这里插入图片描述

小字部分…作者太皮了!疯狂盗图男孩

我们可以从上面的结果总结出来YOLOv3的性能特点:

  • 在COCOmAP下,比肩SSD,劣于RetinaNet
  • 在AP50下,效果更乐观些(擅长产生得体的框框)
  • 在AP75下,效果下降严重(不擅长产生精确的框)
  • APS/M/L下,发现在小物体检测方面说得过去,不过中、大物体没那么乐观

PS:想了解上述AP指标具体定义的同学请参考COCO官网…好吧我还是直接给你们粘出来吧:
在这里插入图片描述

另外,作者还列出了几个他尝试过但是没效果的方法(things we tried that didn’t work):

  • Anchor box x, y offset predictions
  • Linear x, y predictions instead of logistic
  • Focal loss(这个方法最初是RetinaNet那篇论文提出的,也就是作者一直盗图的那篇paper…合着您不仅盗图还想用人家的方法啊喂!)
  • Dual IOU thresholds and truth assignment(这个是Faster R-CNN中的方法,就像前文中所说,YOLOv3中没有用双阈值来划分正负样本,而是每个gt只分配一个anchor,另外用低阈值做了负样本剔除)
4. 总结

emmm,这个部分,还是交给作者自己吧,我只简单说一下,作者在文末这个部分说了些啥子(5. What This All Means)

  • 第一段:正常总结YOLOv3
     YOLOv3 is a good detector. It’s fast, it’s accurate. It’s not as great on the COCO average AP between .5 and .95 IOU metric. But it’s very good on the old detection metric of .5 IOU.
  • 第二段:吐槽COCOmAP的不合理
     Why did we switch metrics anyway? The original COCO paper just has this cryptic sentence: “A full discussion of evaluation metrics will be added once the evaluation server is complete”. Russakovsky et al report that that humans have a hard time distinguishing an IOU of .3 from .5! “Training humans to visually inspect a bounding box with IOU of 0.3 and distinguish it from one with IOU 0.5 is surprisingly difficult.” [18] If humans have a hard time telling the difference, how much does it matter?
  • 剩下部分:我们使用detectors去做什么(掺杂逗比+帅气抒情)
     But maybe a better question is: “What are we going to do with these detectors now that we have them?” A lot of the people doing this research are at Google and Facebook.
    I guess at least we know the technology is in good hands and definitely won’t be used to harvest your personal information and sell it to… wait, you’re saying that’s exactly what it will be used for?? Oh.
     Well the other people heavily funding vision research are the military and they’ve never done anything horrible like killing lots of people with new technology oh wait…
     I have a lot of hope that most of the people using computer vision are just doing happy, good stuff with it, like counting the number of zebras in a national park [13], or
    tracking their cat as it wanders around their house [19]. But computer vision is already being put to questionable use and as researchers we have a responsibility to at least consider the harm our work might be doing and think of ways to mitigate it. We owe the world that much.
  • 最后:哈哈哈哈哈
      In closing, do not @ me. (Because I finally quit Twitter).

一般到这里就结束了,不过原paper中最后专门用了一页来Rebuttal…其首先回应了关于效果图的问题,将原点设为了(0,0)
在这里插入图片描述
然后重点回应了对于COCOmAP质疑的问题,指出其评价标准的不合理性(尤其是对分类问题没有严谨的考量)
在这里插入图片描述
最后呼吁设计新的指标准则使其更合理,并顺便表示,自己其实更喜欢masks,只是YOLO做不到这一点…

Boxes are stupid anyway though, I’m probably a true believerin masks except I can’t get YOLO to learn them.

好了,关于YOLOv3论文就介绍这么多了,欢迎交流指正~

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值