YOLOv3论文解析: An Incremental Improvement

                                    YOLOv3论文解析: An Incremental Improvement_第1张图片

先说一些题外话:作者真的6,骨骼清奇的写了一个随笔式的论文,比如开头就写:   

    有时,你一整年全在敷衍了事而不自知。比如今年我就没做太多研究,在推特上挥霍光阴,置 GANs 于不顾。凭着上年余留的一点动力,我成功对 YOLO 做了一些升级。但实话讲,没什么超有趣的东西,只不过是些小修小补。同时我对其他人的研究也尽了少许绵薄之力。

   于是就有了今天的这篇论文。我们有一个最终截稿日期,需要随机引用 YOLO 的一些更新,但是没有资源。因此请留意技术报告。

 然后他在这个论文的一个插图下面这样写到:

                            

意思是:你能引用自己的论文吗,猜猜谁会这样做?这个家伙会!然后转到了参考文献14,结果点击超链接蹦到第14个参考文献,发现正是本论文的:(在本论文中引用本论文(笑cry!))

然后下面一段:

“还有一个更好地问题:‘我们如何使用检测器?’Facebook和Google的很多研究员也在做相关研究啊。我认为,我们至少能知道技术被应用在了有利的方面,并且不会被恶意利用并将它们卖给…等一下,你说这就是它的用途??Oh!”

还有最后写了一句,最后,不要@我(因为我终于退出了Twitte), 等等.........,真的是

                YOLOv3论文解析: An Incremental Improvement_第2张图片             YOLOv3论文解析: An Incremental Improvement_第3张图片

Joseph Redmon 是一作,Ali Farhadi是他导师,另外,看一下Joseph Redmon自己做的简历

            YOLOv3论文解析: An Incremental Improvement_第4张图片

然后再看一下Joseph Redmon的真面目,没错,这就是他本人。

正文: 

      论文地址:https://pjreddie.com/media/files/papers/YOLOv3.pdf,

        相关代码:https://github.com/pjreddie/darknet ,

          实验代码:https://github.com/AlexeyAB/darknet#how-to-use

由于本论文不是太长,而且写的一些术语也比较好理解,所以先贴出来原文翻译,才进行解析:

Abstract

 

          我们对YOLO进行了一些更新!我们做了一些小设计,使它的表现更好。我们还对这个新网络进行了训练。更新版的YOLO网络比上一版本稍大,但更准确。它的速度也还是很快,这点不用担心。在320 × 320下,YOLOv3以22.2 mAP在22 ms运行完成,达到与SSD一样的精确度,但速度提高了3倍。与上个版本的 0.5 IOU mAP检测指标相比,YOLOv3的性能是相当不错的。在Titan X上,它在51 ms内达到57.9 AP50,而RetinaNet达到57.5 AP50需要198 ms,性能相似,但速度提升3.8倍

所有代码都在以下网址提供:https://pjreddie.com/yolo/ ,

 

1. Introduction 

 

 

      有时,你一整年全在敷衍了事而不自知。比如今年我就没做太多研究,在推特上挥霍光阴,置 GANs 于不顾。凭着上年余留的一点动力,我成功对 YOLO 做了一些升级。但实话讲,没什么超有趣的东西,只不过是些小修小补。同时我对其他人的研究也尽了少许绵薄之力。

     于是就有了今天的这篇论文。我们有一个最终截稿日期,需要随机引用 YOLO 的一些更新,但是没有资源。因此请留意技术报告。

     这篇文章接下来将介绍YOLOv3,然后我会告诉你我们是怎么做的。我还会写一下我们尝试过但失败了的操作。最后,我们将思考这一切意味着什么。

 

YOLOv3

       关于YOLOv3:我们主要是从其他人那里获得好点子。我们还训练了一个更好的新的分类网络。本文将从头开始介绍整个系统,以便大家理解。

                          YOLOv3论文解析: An Incremental Improvement_第5张图片

 

           图1:这张图是从Focal Loss论文[7]拿来并修改的。 YOLOv3的运行速度明显快于其他性能相似的检测方法。运行时间来自M40或Titan X,基本上用的是相同的GPU。

 

边界框预测

          在YOLO9000之后,我们的系统使用维度聚类(dimension cluster)作为anchor box来预测边界框[13]。网络为每个边界框预测4个坐标,tx,ty,tw,th。如果单元格从图像的左上角偏移了(cx,cy)并且先验边界框具有宽度和高度pw,ph,则预测对应以下等式:

                                                                     YOLOv3论文解析: An Incremental Improvement_第6张图片

 

       在训练期间,我们使用平方误差损失的和。如果一些坐标预测的ground truth是,梯度就是ground truth值(从ground truth box计算出来)减去预测,即: 。 通过翻转上面的方程可以很容易地计算出这个ground truth值。

YOLOv3使用逻辑回归来预测每个边界框的 objectness score。如果边界框比之前的任何其他边界框都要与ground truth的对象重叠,则该值应该为1。如果先前的边界框不是最好的,但确实与ground truth对象重叠超过某个阈值,我们会忽略该预测,如Faster R-CNN一样[15]。我们使用.5作为阈值。 但与[15]不同的是,我们的系统只为每个ground truth对象分配一个边界框。如果先前的边界框未分配给一个ground truth对象,则不会对坐标或类别预测造成损失,只会导致objectness。

                                    YOLOv3论文解析: An Incremental Improvement_第7张图片

 

             图2: 具有dimension priors和location prediction的边界框。我们预测了框的宽度和高度,作为cluster centroids的偏移量。我们使用sigmoid函数预测相对于滤波器应用位置的边界框的中心坐标。这个图是从YOLO9000论文[13]拿来的。

类别预测

        每个框使用多标签分类来预测边界框可能包含的类。我们不使用softmax,因为我们发现它对于性能没有影响,而是只是使用独立的逻辑分类器。在训练过程中,我们使用二元交叉熵损失来进行类别预测。

      这个公式有助于我们转向更复杂的领域,如Open Images数据集[5]。在这个数据集中有许多重叠的标签(例如,Woman和Person)。使用softmax强加了一个假设,即每个box只包含一个类别,但通常情况并非如此。多标签方法可以更好地模拟数据。

不同尺度的预测

       YOLOv3可以预测3种不同尺度的box。我们的系统使用一个特征金字塔网络[6]来提取这些尺度的特征。在基本特征提取器中,我们添加了几个卷积层。其中最后一层预测三维tensor编码的边界框,objectness 和类别预测。我们在COCO[8]数据集的实验中,每个尺度预测3个box,因此tensor为N×N×[3 *(4 + 1 + 80)],4个边界框offset,1 objectness预测,以及80个类别预测。

        接下来,我们从之前的2个层中取得特征图,并对其进行2倍上采样。我们还从网络获取特征图,并使用 element-wise 添加将其与我们的上采样特征进行合并。这种方法使我们能够从上采样的特征和早期特征映射的细粒度信息中获得更有意义的语义信息。然后,我们再添加几个卷积层来处理这个组合的特征图,并最终预测出一个相似的Tensor,虽然现在它的大小已经增大两倍。

        我们再次执行相同的设计来对最终的scale预测box。因此,我们对第3个scale的预测将从所有之前的计算中获益,并从早期的网络中获得精细的特征。

        我们仍然使用k-means聚类来确定bounding box priors。我们只是选择了9个clusters和3个scales,然后在整个scales上均匀分割clusters。在COCO数据集上,9个cluster分别为(10×13),(16×30),(33×23),(30×61),(62×45),(59×119),(116×90) ,(156×198),(373×326)。

特征提取器

        我们使用一个新的网络来执行特征提取。该新网络是用于YOLOv2,Darknet-19的网络和更新的残差网络的混合方法。我们的网络使用连续的3×3和1×1卷积层,但现在也有一些shortcut连接,并且网络的大小显著更大。它有53个卷积层,所以我们称之为...... Darknet-53

                                            YOLOv3论文解析: An Incremental Improvement_第8张图片

这个新网络比Darknet19强大得多,而且比ResNet-101或ResNet-152更高效。以下是在ImageNet上的结果:

                       YOLOv3论文解析: An Incremental Improvement_第9张图片

                         表2:网络的比较。各网络的准确性、Bn Ops、每秒浮点运算次数,以及FPS。

 

        每个网络都使用相同的设置进行训练,并在256×256的单精度进行测试。Runtime是在Titan X上以256×256进行测量的。可以看到,Darknet-53可与最先进的分类器相媲美,但浮点运算更少,速度更快。Darknet-53比ResNet-101性能更好,而且速度快1.5倍。Darknet-53与ResNet-152具有相似的性能,速度提高2倍。

       Darknet-53也可以实现每秒最高的测量浮点运算。这意味着网络结构可以更好地利用GPU,从而使其评估效率更高,速度更快。这主要是因为ResNets的层数太多,效率不高。

训练

       我们仍然用完整的图像进行训练。我们使用不同scale进行训练,使用大量的数据增强,批规范化,等等。我们使用Darknet神经网络框架进行训练和测试[12]。

具体做法和结果

        YOLOv3的表现非常好!请参见表3。就COCO奇怪的平均mean AP指标而言,它与SSD的变体性能相当,但速度提高了3倍。不过,它仍比RetinaNet模型差一些。

       当时,以mAP的“旧”检测指标比较时,当IOU = 0.5(或表中的AP50)时,YOLOv3非常强大。它的性能几乎与RetinaNet相当,并且远高于SSD的变体。这表明YOLOv3是一个非常强大的对象检测网络。不过,随着IOU阈值增大,YOLOv3的性能下降,使边界框与物体完美对齐的效果不那么好。

        过去,YOLO不擅长检测较小的物体。但是,现在我们看到了这种情况已经改变。由于新的多尺度预测方法,我们看到YOLOv3具有相对较高的APs性能。但是,它在中等尺寸和更大尺寸的物体上的表现相对较差。

        当用AP50指标表示精确度和速度时(见下图),可以看到YOLOv3与其他检测系统相比具有显着的优势。也就是说,YOLOv3更快、而且更好。

                         YOLOv3论文解析: An Incremental Improvement_第10张图片

       图3.再次根据[7]进行调整,这次显示的速度/准确度在mAP上以0.5 IOU度量进行折衷。 你可以看到YOLOv3是好的,因为它非常高,而且离左边很远。 你能引用你自己的论文吗? 猜猜谁会这样做,这个家伙→[14]。

 

一些试了没用的方法

       我们在研究YOLOv3时尝试了很多方法。很多都不起作用。这些可以了解一下。

       Anchor box x,y 偏移量预测。我们尝试使用常规的anchor box预测机制,可以使用线性激活将x,y的偏移预测为box的宽度或高度的倍数。我们发现这种方法降低了模型的稳定性,并且效果不佳。

      线性x,y预测,而不是逻辑预测。我们尝试使用线性激活来直接预测x,y的偏移,而不是用逻辑激活。这导致了MAP的下降。

       Focal loss。我们尝试使用Focal loss。这一方法使mAP降低了2点左右。YOLOv3对Focal loss解决的问题可能已经很强健,因为它具有单独的对象预测和条件类别预测。因此,对于大多数例子来说,类别预测没有损失?或者其他原因?这点还不完全确定。

                    YOLOv3论文解析: An Incremental Improvement_第11张图片

 

         表3.我认真地从[7]中窃取了所有这些表,他们花了很长时间才从头开始制作。 好的,YOLOv3没问题。 请记住,RetinaNet处理图像的时间要长3.8倍。 YOLOv3比SSD变种好得多,而且在AP 50指标上可以与最高水平的模型相媲美。

        双IOU阈值和truth分配。 Faster RCNN在训练期间使用两个IOU阈值。如果一个预测与.7的 ground truth 重叠,它就是一个正面的例子,[.3-.7]它被忽略。如果对于所有ground truth对象,它都小于.3,这就是一个负面的例子。我们尝试了类似的策略,但无法取得好的结果。

这一切意味着什么

       YOLOv3是一个很好的检测器。速度很快,而且很准确。在COCO上,平均AP介于0.5和0.95 IOU时,准确度不是很好。但是,对于0.5 IOU这个指标来说,YOLOv3非常好。

        为什么我们要改变指标?原始的COCO论文上只有这样一句含糊不清的句子:“一旦评估服务器完成,我们会添加不同评估指标的完整讨论”。Russakovsky等人在论文中说,人类很难区分0.3与0.5的IOU。“人们目测检查一个IOU值为0.3的边界框,并将它与IOU 0.5的区分开来,这是非常困难的事情。”[16]如果人类都很难区分这种差异,那么它就没有那么重要。

        也许更值得思考的问题是:“现在我们有了这些检测器,我们拿它们来做什么?”很多做这类研究的人都在Google或Facebook工作。我想至少我们已经知道这项技术已经被掌握得很好了,绝对不会用来收集你的个人信息并将其出售给....等等,你说这正是它的目的用途?Oh.

         放心,大多数研究计算机视觉的人都只是做点令人愉快的、好的事情,比如计算国家公园里斑马的数量[11],或者追踪溜进他们院子时的猫[17]。但是计算机视觉已经被用于被质疑的使用,作为研究人员,我们有责任至少思考一下我们的工作可能造成的损害,并思考如何减轻这种损害。我们非常珍惜这个世界。

最后,不要@我。(因为我终于退出了Twitter)。

分析:

    YOLOv3 确实提高了不少,看图3 可以知道,速度/准确度在mAP上以0.5 IOU度量进行折衷时可以比RetinaNet还高一点,而速度快了3.8倍。网络修改的地方也是蛮大的,先从特征提取网络说起。

 1.YOLOv2时用的是Darknet-19网络来提取特征,这次修改成了Darknet-53,网络又加深了不少,看一下Darknet-53的结构与性能:

                         YOLOv3论文解析: An Incremental Improvement_第12张图片

性能:

            YOLOv3论文解析: An Incremental Improvement_第13张图片

虽然运算复杂度提升了一点,但是它的浮点运算能力以及top-1,top-5表现有很大提高.速度降了一点,但是还是很高。

看一下YOLOv3网络整体:

Demo
layer     filters    size              input                output
    0 conv     32  3 x 3 / 1   416 x 416 x   3   ->   416 x 416 x  32  0.299 BFLOPs
    1 conv     64  3 x 3 / 2   416 x 416 x  32   ->   208 x 208 x  64  1.595 BFLOPs
    2 conv     32  1 x 1 / 1   208 x 208 x  64   ->   208 x 208 x  32  0.177 BFLOPs
    3 conv     64  3 x 3 / 1   208 x 208 x  32   ->   208 x 208 x  64  1.595 BFLOPs
    4 res    1                 208 x 208 x  64   ->   208 x 208 x  64
    5 conv    128  3 x 3 / 2   208 x 208 x  64   ->   104 x 104 x 128  1.595 BFLOPs
    6 conv     64  1 x 1 / 1   104 x 104 x 128   ->   104 x 104 x  64  0.177 BFLOPs
    7 conv    128  3 x 3 / 1   104 x 104 x  64   ->   104 x 104 x 128  1.595 BFLOPs
    8 res    5                 104 x 104 x 128   ->   104 x 104 x 128
    9 conv     64  1 x 1 / 1   104 x 104 x 128   ->   104 x 104 x  64  0.177 BFLOPs
   10 conv    128  3 x 3 / 1   104 x 104 x  64   ->   104 x 104 x 128  1.595 BFLOPs
   11 res    8                 104 x 104 x 128   ->   104 x 104 x 128
   12 conv    256  3 x 3 / 2   104 x 104 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   13 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   14 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   15 res   12                  52 x  52 x 256   ->    52 x  52 x 256
   16 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   17 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   18 res   15                  52 x  52 x 256   ->    52 x  52 x 256
   19 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   20 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   21 res   18                  52 x  52 x 256   ->    52 x  52 x 256
   22 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   23 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   24 res   21                  52 x  52 x 256   ->    52 x  52 x 256
   25 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   26 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   27 res   24                  52 x  52 x 256   ->    52 x  52 x 256
   28 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   29 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   30 res   27                  52 x  52 x 256   ->    52 x  52 x 256
   31 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   32 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   33 res   30                  52 x  52 x 256   ->    52 x  52 x 256
   34 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   35 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   36 res   33                  52 x  52 x 256   ->    52 x  52 x 256
   37 conv    512  3 x 3 / 2    52 x  52 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   38 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   39 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   40 res   37                  26 x  26 x 512   ->    26 x  26 x 512
   41 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   42 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   43 res   40                  26 x  26 x 512   ->    26 x  26 x 512
   44 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   45 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   46 res   43                  26 x  26 x 512   ->    26 x  26 x 512
   47 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   48 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   49 res   46                  26 x  26 x 512   ->    26 x  26 x 512
   50 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   51 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   52 res   49                  26 x  26 x 512   ->    26 x  26 x 512
   53 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   54 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   55 res   52                  26 x  26 x 512   ->    26 x  26 x 512
   56 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   57 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   58 res   55                  26 x  26 x 512   ->    26 x  26 x 512
   59 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   60 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   61 res   58                  26 x  26 x 512   ->    26 x  26 x 512
   62 conv   1024  3 x 3 / 2    26 x  26 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   63 conv    512  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 512  0.177 BFLOPs
   64 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   65 res   62                  13 x  13 x1024   ->    13 x  13 x1024
   66 conv    512  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 512  0.177 BFLOPs
   67 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   68 res   65                  13 x  13 x1024   ->    13 x  13 x1024
   69 conv    512  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 512  0.177 BFLOPs
   70 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   71 res   68                  13 x  13 x1024   ->    13 x  13 x1024
   72 conv    512  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 512  0.177 BFLOPs
   73 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   74 res   71                  13 x  13 x1024   ->    13 x  13 x1024
   75 conv    512  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 512  0.177 BFLOPs
   76 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   77 conv    512  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 512  0.177 BFLOPs
   78 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   79 conv    512  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 512  0.177 BFLOPs
   80 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   81 conv    255  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 255  0.088 BFLOPs
   82 detection
   83 route  79
   84 conv    256  1 x 1 / 1    13 x  13 x 512   ->    13 x  13 x 256  0.044 BFLOPs
   85 upsample            2x    13 x  13 x 256   ->    26 x  26 x 256
   86 route  85 61
   87 conv    256  1 x 1 / 1    26 x  26 x 768   ->    26 x  26 x 256  0.266 BFLOPs
   88 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   89 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   90 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   91 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   92 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   93 conv    255  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 255  0.177 BFLOPs
   94 detection
   95 route  91
   96 conv    128  1 x 1 / 1    26 x  26 x 256   ->    26 x  26 x 128  0.044 BFLOPs
   97 upsample            2x    26 x  26 x 128   ->    52 x  52 x 128
   98 route  97 36
   99 conv    128  1 x 1 / 1    52 x  52 x 384   ->    52 x  52 x 128  0.266 BFLOPs
  100 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
  101 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
  102 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
  103 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
  104 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
  105 conv    255  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 255  0.353 BFLOPs
  106 detection
Loading weights from yolov3.weights...Done!

 

2.跨尺度的预测(Predictions Across Scales)

 

之前的预测bounding boxes的时候只是在特征网络的最顶层预测出5个bounding boxes,而这次完全不同,采用了类似于FPN( feature pyramid networks)的结构,我叫它特征金字塔网络,这个是什么东西呢?

YOLOv3论文解析: An Incremental Improvement_第14张图片

简单来说就像上面这样,FPN论文中是这样解释的:

原来多数的object detection算法都是只采用顶层特征做预测,但我们知道低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。另外虽然也有些算法采用多尺度特征融合的方式,但是一般是采用融合后的特征做预测,而本文不一样的地方在于预测是在不同特征层独立进行的。 

如果你还不明白,那我就解释一下上面的图,你看看上面的图,自低向上很好理解,我解释一下自顶向下的过程,这个过程采用上采样(upsampling,会使特征图变大)进行,而横向连接则是将上采样的结果和自底向上生成的相同大小的feature map进行融合(merge)。融合之前,那个自低向上的图会用1*1去conv,目的是减少该特征图的卷积核个数(如下图),在融合之后还会再采用3*3的卷积核对每个融合结果进行卷积,目的是消除上采样的混叠效应(aliasing effect)。并假设生成的feature map结果是P2,P3,P4,P5,和原来自底向上的卷积结果C2,C3,C4,C5一一对应。预测是在每一融合层后独立进行,看看上面的小方框就明白了。可以对照YOLOv3的网络结构去理解。

YOLOv3论文解析: An Incremental Improvement_第15张图片

YOLOv3网络在三个不同尺寸特征图下每个特征图预测出3个boxes,而此时anchor box依然用聚类的方法得到了9个anchor box(这一段不明白的可以看我的上一篇文章),分别将9个anchor box平分给3个不同尺度的boxes。这样就得到了N ×N ×[3∗(4+1+80)] ,N为格子大小,3为每个格子得到的边界框数量, 4是边界框坐标数量,1是目标预测值,80是类别数量。

这种方法使我们能够从上采样的特征和早期特征映射的细粒度信息中获得更有意义的语义信息。换句话说,就是对小目标提取的更精准了。

 

3.类别预测

为了实现多标签分类,模型不再使用softmax函数作为最终的分类器,而是使用logistic作为分类器,使用 binary cross-entropy作为损失函数。

yolov3对每个bounding box通过逻辑回归预测一个物体的得分,如果预测的这个bounding box与真实的边框值大部分重合且比其他所有预测的要好,那么这个值就为1.如果overlap没有达到一个阈值(yolov3中这里设定的阈值是0.5),那么这个预测的bounding box将会被忽略,也就是会显示成没有损失值。

YOLOv3在[email protected]@0.5及小目标APSAPS上具有不错的结果,但随着IOU的增大,性能下降,说明YOLOv3不能很好地与ground truth切合. 

用YOLOv3训练数据的时候打印出的参数的意思:

 

  • Region 82 - index of current [yolo]-layer (in the default yolov3.cfg there are 3 yolo layers: 82, 94, 106)
  • Avg IOU - is average intersect of union between Detected objects and Ground truth from label-txt-file
  • Class: - is average of the probabilities of correctly classified objects
  • Obj: - is average of the objectness T0 (probabilities that there is an object in this cell)
  • .5R: - is average true positives with (IoU > 0.5)
  • .75R: - is average true positives with (IoU > 0.75)

Conclusion: So if the best anchor isn't suitable for this [yolo]-layer, then count of Ground truth labels which suitable for this [yolo]-layer is equal to zero (count=0), then will be divide by zero

  • Avg IOU = /count = /0 = nan
  • Class = /class_count = /0 = nan
  • Obj = /count = /0 = nan

But this indicator calculated in any cases:

  • No Obj: - is average of the probabilities of all objects (both correctly and not correctly classified)

具体请参考https://timebutt.github.io/static/understanding-yolov2-training-output/

谢谢大家,我的表演结束

参考文献:

1.https://zhuanlan.zhihu.com/p/35074244 ,

2.http://www.sohu.com/a/226481716_473283,

3,https://blog.csdn.net/u014380165/article/details/72890275,

4,https://www.cnblogs.com/makefile/p/YOLOv3.html

你可能感兴趣的:(深度学习)