YOLO1至YOLOV3方法讲解

YOLO方法总结

compute visual 计算机视觉总结Github: 
https://github.com/Codermay/Test-1 **重点 
https://github.com/jiajunhua/SnailTyan-deep-learning-papers-translation 
目标检测方法总结网址: 
https://handong1587.github.io/deep_learning/2015/10/09/object-detection.html#fast-r-cnn 
anchors 解释:https://blog.csdn.net/m_buddy/article/details/82926024

 

  • YOLO方法总结
    • YOLOv1
      • motivation
      • background
      • methods
      • experiments
      • conclusion
    • YOLOV2
      • motivation
      • background
      • methods
        • Better
          • 1. Batch Normalization(BN, 批标准化)
          • 2. High Resolution Classifier
          • 3. Convolutionlal With Anchor Boxes
          • 4. Dimension Clusters
          • 5. Direct location prediction
          • 6. Fine-Grained Features(passthrough)
          • 7. Multi-Scale Training(多尺度训练)
          • 8. Further Experiments
        • Faster
          • New Network:Darknet-19
          • Training for classification and Training for detection
        • Stronger
          • Dataset combination with WordTree
          • Joint classification and detection
      • conclusion
    • YOLOV3
      • motivation
      • background
      • methods
        • Bounding Box Prediction
        • Class Prediction
        • Predictions Across Scales
        • Feature Extractor
        • Training
      • experiments
      • conclusion

 

YOLOv1

题目: You Only Look Once 
出自:CVPR 2016 ; 时间:2016 ; 引用:2596 
Redmon J, Divvala S, Girshick R, et al. You only look once: Unified, real-time object detection[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 779-788. 
源码网站: http://pjreddie.com/yolo/ 
arxiv: http://arxiv.org/abs/1506.02640 
code: http://pjreddie.com/darknet/yolo/ 
github: https://github.com/pjreddie/darknet 
blog: https://blog.csdn.net/hrsstudy/article/details/70305791 **重点 
blog: https://www.cnblogs.com/cvtoEyes/p/8608205.html 
blog: https://pjreddie.com/publications/yolo/ 
slides: https://docs.google.com/presentation/d/1aeRvtKG21KHdD5lg6Hgyhx5rPq_ZOsGjG5rJ1HP7BbA/pub?start=false&loop=false&delayms=3000&slide=id.p **重点 
reddit: https://www.reddit.com/r/MachineLearning/comments/3a3m0o/realtime_object_detection_with_yolo/ 
github: https://github.com/gliese581gg/YOLO_tensorflow 
github: https://github.com/xingwangsfu/caffe-yolo 
github: https://github.com/frankzhangrui/Darknet-Yolo 
github: https://github.com/BriSkyHekun/py-darknet-yolo 
github: https://github.com/tommy-qichang/yolo.torch 
github: https://github.com/frischzenger/yolo-windows 
github: https://github.com/AlexeyAB/yolo-windows 
github: https://github.com/nilboy/tensorflow-yolo

motivation

  • 目前的目标检测算法主要是分为两个分支,分别为two-stage 和 one-stage。其中,two-stage的目标检测方法是根据classifier分类器演化而来的,主要是通过不同的region proposals方法进行ROI的提取,然后在利用不同的网络对提取出的BBoxes进行回归定位和分类,然后经过后处理例如NMS非极大值抑制方法进行BBox的去重。由于Two-stage方法步骤复杂,而且方法中的每个独立的部分都要被单独的训练,导致这类方法速度上慢以及很难进行优化。(但是,我个人的理解,虽然这个方法中涉及到很多独立的部分,但是对每一个独立的部分进行优化都可以,可以入手的点比较多)

  • 本文主要是提出了一个单一的、整体的神经网络,将目标检测问题重新构造成一个回归问题,直接对整张图像的每一个像素进行BBoxes的坐标及它所属类别的预测。这个one-stage的方法主要的特点就是速度快,基本上能够达到实时的标准,而且YOLO是对整张图像进行分析推理,它不容易检测出错误的背景,产生有关背景的错误。此外YOLO学到的是对象的高度概括的特征表示,所以它更容易推广到其他的数据集或者领域的目标检测任务中去。而且YOLO将two-stage方法中分开的部分用一个单独的卷积神经网络进行代替,这个卷积神经网路同时进行特征提取、bounding boxes的预测,NMS以及语义推理,

background

  • 目前,人类具有看一下图像就知道图像中有哪些物体,这些物体的位置大概在哪些位置的能力,这种能力是我们天生就有的,潜意识就执行的能力,这种能力使得我们可以对自己看到的景象进行实时的判断,使得我们可以行走,驾驶等等。但是,这种能力计算机不具备,如果想要计算机具有与人类似的能力就要借助目标检测方法来实现。用于物体检测的快速精确算法将允许计算机在没有专用传感器的情况下驾驶汽车,使辅助设备能够向人类用户传达实时场景信息,并释放通用响应机器人系统的潜力。此外,目标检测也是计算机视觉领域中的重要部分。

  • 目前的目标检测方法主要是由classifier演化而来的,为了检测对象,这些方法在测试图片中在不同的位置以及不同大小的框来预测,并且对这些框用分类器进行类别的预测,这种方法的其中一个代表方法就是DMP(deformable parts models ),它使用滑动窗口方法sliding window approach来对整张图片以均匀间隔排列的位置运行分类器。DPM方法的各个部分是分离的,比如提取静态特征static features、分类区域、对于高分语气预测bounding boxes等等。YOLO不同与静态特征提取,他的网络在线训练特征,并且根据检测任务进行特征的优化,这样会使得检测更加迅速、精准。对于DPM方法的加速通过对HOG计算、use cascades以及应用GPU,它目前也只能够达到30Hz速度。

  • R-CNN方法使用region proposal methods来生成图片中可能存在的bounding boxes,然后在这些proposed boxes的位置运行classifier。在对这些框进行分类之后,通过post-processiong后处理来进行检测框的去重以及重新在场景中基于其他对象对boxes进行打分。这个复杂的流程速度慢,而且也很难优化。这种方法由于是针对于局部的区域进行分析,所以它产生的背景错误检测比YOLO产生的要多,但是YOLO产生的定位错误比这种方法要多,相对于two-stage的方法,YOLO的精确度还是要差一点的。R-CNN使用 selective searches(SS)的region proposal方法来进行图像中目标的查找。SS方法生成图像中可能存在的bounding boxes,然后一个卷积神经网络进行特征的提取,SVM进行boxes的打分,a lnear model adjusts the bounding boxes线性模型进行bounding boxes的调整,然后non-max suppression(NMS,非极大值抑制)进行检测的去重,这个复杂检测步骤的每一个阶段都要被精准的的独立调试,并且导致系统很慢,花费大约40s来预测一张图像。主要算法架构参照图1.

 

图1

 

  • Fast R-CNN是在R-CNN的基础之上进行改进的,主要是去除了在region proposals后的warped region,warped region主要是使提取到的区域进行变形成相同大小的图像区域,在后来加上了ROI pooling层来将提取到的区域特征变形或者说重构成相同的特征大小,而且后来对每个ROI regions通过参数共享的两个网络,来进行softmax分类和bbox的回归。这个算法架构将特征变性替代图像变形,来使得能够一起处理不同大小规模的ROI区域,Fast R-CNN是通过特征提取的卷积神经网络之后的Roi pooling层来解决这个问题的。此外,这个方法的另一个亮点是,它将R-CNN中对于每个ROI进行单独的分类和进行后处理改成了能够共享参数的两个Softmax分类以及bbox回归分支,共享计算资源,这样大大减少了网络的参数,加快了网络的处理速度。具体的算法流程参照图2.

 

图2

 

  • Faster R-CNN是在Fast R-CNN的基础之上进行改进的算法,同样是R-CNN的变种之一。它主要是利用Region Proposal Network(RPN)网络来替代之前的SS方法,通过RPN网络来注意到图像中的对象从而进行区域的提取。主要发的流程是,输入一张图像,然后对这张图像进行特征提取产生feature maps,然后将feature maps输入到RPN网络中去产生多个ROIs,然后将提取出的Rois与特征图进行整合,通过Roi pooling 之后进行分类及bboxes的回归。

 

图3

 

  • 但是R-CNN及其变体,虽然速度和精度两方面都在不停的改进,但是速度方面还是不能够达到实时效果的标准。

  • Depp MultiBox,它也是训练一个网络来记性ROIs的预测,但是貌似他只能进行单个(单类)目标的检测,它仍然是一个复杂目标检测方法的一部分而已。(有待补充)

  • OverFeat 方法主要是训练一个卷积神经网络来进行目标定位以及使localizer适用于执行检测任务。它能够高效地进行滑动窗口检测,但是任然是一个互斥(不想交)的系统,OverFeat优化了定位,没有优化检测的性能,如DPM一样它也只是看到了局部的信息,不能够向YOLO一样进行全局的语义推理,因此需要重要的后处理过程来减少重复检测。(待补充)

  • MutiGrasp是YOLO网格grid划分方法的基础,但是MultiGrasp方法比目标检测任务简单的多,它只需要预测只包含一个目标的图像的图像位置。它不需要预测目标的大小,位置、边界或者类别,它只需找到一个合适的区域即可。然而YOLO需要对于多种类别预测在一张图像中的多个目标的类别概率和bounding boxes。

methods

  • YOLO致力于实现一个端到端的网络,来达到实时标准的同时保持较高的准确度。

  • 首先,YOLO将输入先划分成S*S的网格,如果某一个对象的中心落入到一个网格单元中,那么这个网格单元grid cell就负责这个对象的检测。每个grid cell都需要预测B个bounding boxes以及这些bounding boxes的confidence score置信度。这些 confidence scores是model认为这些box中包含object的可能性以及预测的box的准确度。

 即
其中,如果bbox中不包含对象,那么confidence score为0,反之,confidence score就等于the predicted box与the ground truth之间的IOU值。

  • 对每个bounding boxes都要预测五个参数值:x,y,w,h,confidence score。其中(x,y)坐标表示box的中心相对于网格单元边界的坐标。w,h为相对于整张图像的box的宽度与高度。最后the confidence在box中包含对象的时候表示预测的box与真实box之间的IOU。

  • 同时,也要对图像中S*S个网格单元中的每个grid cell预测一个集合大小为C(数据中对象的类数)的类概率集合,不管bboxes的个数。这个class probabilities 是一个条件概率,即,表示在包含对象时目标属于某类的概率。在测试阶段将类概率与confidence score相乘,这样就得到了对于每个bbox的目标类概率以及box预测位置的精准度的描述。 

     

     

  • 对于Pascal VOC数据集(20类)来说,YOLO设S = 7,B = 2,C = 20,此时YOLO网络到最后要预测一个,即要预测一个7*7*30的tensor。

 

 

 

  • 网络的设计,主要是通过卷积层来提取图像特征,同时使用全连接层来预测bbox的类与坐标。YOLO网络主要借鉴了GoogleNet的思想,但是与GoogleNet的Inception modules不懂,网络中使用1*1降维层(进行跨通道信息整合)加上3*3的卷积层来代替。YOLO网络中有24个卷积层,两个全连接层。Fast YOLO有9个卷积层,并且filters的数目更少,用来做快速检测。具体的网络结构如下图所示。最后网络输出7*7*30大小的tensor。

 

网络结构

 

  • 将YOLO网络的前20个卷积层在ImageNet 1000-class dataset上进行预训练, 这个预训练网络出了20个卷积层还有一个average-pooling 层以及 a fully connected层。预训练大概一周,top-5 accuracy在ImageNet 2012验证集上达到88%。原文中的YOLO的实现是在Darknet框架下实现的。

  • 在预训练的20个卷积层后面加上随机初始化参数的四个卷积层和两个全连接层用于目标检测任务。由于检测任务需要比较细粒度的图像信息,所以将网络的分辨率从224*224调整到448*448.

  • 将预测的w,h相对于图像的宽度和高度进行标准化,使其介于0和1之间。将bounding box的x,y坐标参数化成相对于网格单元位置的偏离,所以他们也介于0和1之间。

  • 对于网络的最后一层使用linear activation function线性激活函数,对于网络中的其它层使用leaky rectified linear activation function:.

  • 对于损失函数,定位误差和分类误差的权重不应该相同。同样,图像中有很多网格单元不包含对象,他们的confidence score为0,这样那些包含对象的梯度占据压倒性的优势,导致模型不稳定,并且在很早就开始偏离训练目的。为了解决上面的那个问题,YOLO增加了bounding box坐标预测误差的权重,并且减少了不包含对象的confidence预测的权重,并且设定了两个参数。而且平方和误差将大box和小box的权重等同的对待。在big box中的误差可能是微小的,但是相对于small box可能致命的误差损失。所以,我们的loss应该能够体现出相同的误差对于big box及small box的重要性不同。为了解决这个问题,YOLO使用w,h的平方根误差来减少这种差异性。在训练阶段,优化一下的损失函数,如下图所示。

 

loss function

 

 

 

 

  • YOLO这样划分网格的设计,使得每个网格产生固定数量的bounding box,例如7*7网格,B=2时,共产生98个bounding boxes,这相对与SS方法产生2000多个这是非常少的,这也大大加快了网络的处理速度。同时由于是对图像进行网格划分,这样就对bounding box 的位置进行了空间约束,能够很清楚的指导一个对象中心落入哪个网格单元中,并且为那个对象预测唯一的一box。但是一些小目标或者目标相邻很近或者目标离多个网格边界很近,这样就会被多个网格单元进行定位,产生多个bounding box,这就需要使用Non-maximal suppression(NMS)来进行这些重复检测的去重,NMS对于R-CNN或者DPM层架了大概2-3%的mAP。

experiments

  •  

    在Pascal VOC不同算法对比

     

 

 

 

 

 

 

 

误差分析

 

 

模型集成分析

 

 

具体类AP分析

 

 

推广到风格艺术数据集分析

 

 

效果


而且还有对于摄像头实时监测的实验,将YOLO与webcam相连,能够达到实时的性能效果,包括从相机中提取图像与将图像显示出来的时间在内,这样的系统就有些像追踪系统,随着摄像头中目标的运动,监测结果也随之变化。

 

conclusion

  • YOLO是一个统一的unified(标准的)实时目标检测方法,它是一个单一的网络(one-stage),所以它可以根据检测性能进行端到端的优化。

  • 之前的方法都是重新调整分类器来进行检测,然而YOLO不同于之前的方法,它是将目标检测作为一个回归问题来构造空间上分离的BBoxes和相关类概率

  • YOLO作为一个实时算法非常快,基础模型能达到实时45帧每秒,fast YOLO可以达到155帧每秒,同时能够达到其他实时算法mAP的两倍。

  • 相较于现有的目标检测算法,YOLO会产生更多的定位误差(localization errors),但是不太可能产生对于背景的误报(圈出错误的背景)。

  • 所以YOLO学习了非常一般的表示。但是当从自然图像推广到其他领域(艺术品、风格化图像)时,YOLO方法优于其他方法,灵活性比较强。

  • 由于YOLO是对图像进行网格划分,对于每个网格单元产生固定数量的bounding box,并且之预测一个类概率集合,这就样的空间约束就限制了model能够够预测的相邻目标的数目。而且YOLO目前目标检测的难题是如何预测成群出现的小目标的问题(相邻很近的多个小目标),比如一群鸟。

  • 由于model从数据中预测bounding box,它面临对于新的、特殊的长宽比或者配置的目标的bounding box大小的概括。

  • 而且,对于loss function, YOLO的损失误差主要来自于定位误差,应该解决对于不同大小bounding box的定位误差的重要性的不同。(big box 与 small bo) 
    缺点:

  • 1、YOLO的物体检测精度低于其他state-of-the-art的物体检测系统。

  • 2、YOLO容易产生物体的定位错误。

  • 3、YOLO对小物体的检测效果不好(尤其是密集的小物体,因为一个栅格只能预测2个物体)。

YOLOV2

题目: YOLO9000: Better, Faster, Stronger 
出自:CVPR 2017 CVPR 2017 Best Paper Honorable Mention ; 时间:2017 ; 引用:1280 
Redmon J, Farhadi A. YOLO9000: better, faster, stronger[J]. arXiv preprint, 2017. 
源码网站: http://pjreddie.com/yolo9000/ 
arxiv: https://arxiv.org/abs/1612.08242 
code: http://pjreddie.com/darknet/yolo/ 
github(Chainer): https://github.com/leetenki/YOLOv2 
blog:https://blog.csdn.net/l7H9JA4/article/details/79955903 
blog: https://blog.csdn.net/u014380165/article/details/77961414 
blog: https://blog.csdn.net/Jesse_Mx/article/details/53925356 
blog: https://cloud.tencent.com/developer/article/1156245 
blog:https://blog.csdn.net/zijin0802034/article/details/77097894 ** 
github(Keras): https://github.com/allanzelener/YAD2K 
github(PyTorch): https://github.com/longcw/yolo2-pytorch 
github(Tensorflow): https://github.com/hizhangp/yolo_tensorflow 
github(Windows): https://github.com/AlexeyAB/darknet 
github: https://github.com/choasUp/caffe-yolo9000 
github: https://github.com/philipperemy/yolo-9000

motivation

  • 虽然YOLOV1的检测速度很快,但是在检测精度上却不如R-CNN系列检测方法,YOLOV1在物体定位方面(localization)不够准确,并且召回率(recall,查全率)较低。YOLOV2提出了8种改进侧率来提升YOLO模型的定位准确率和召回率,从而提高mAP,并且保持检测速度。(这是YOLO模型的一大优势)。这篇文章主要是在YOLOV1的基础上在精准度以及速度这两个方面进行改进,从而提出了YOLOV2,在精准度方面提出8个tricks方法来进行改进,这些tricks方法主要是来源于之前工作中的一些方法,在速度方面主要提出了一个更精简的网络架构Darknet-19来减少网络中的参数,提升速度,并且对YOLOV1的训练分类器进行特征提取的过程进行了改善,这样也提升了网络的精确度,然后在Darknet-19的基础上构建了检测网络。

  • 在YOLOV2的基础上提出了一种将检测数据集与分类数据集进行联合训练(jointly train)的方法,使用这种联合训练方法在COCO检测数据集和ImageNet分类数据集上联合训练出了YOLO9000模型,这个模型能够检测超过9000类的物体。(弱监督检测有关???)

  • 所以这篇文章包括两个模型YOLOV2和YOLO9000,两个模型的主题结构是一致的,只不过YOLO9000是在YOLOV2的基础上提出来的。

  • YOLOV2相比于YOLOV1做了很多方面的改进,这也使得YOLOV2的mAP显著提升,并且保持YOLOV2的速度依然很快,保持了作为One-Stage方法的优势,YOLOV2和Fatser R-CNN,SSD等模型的对比如图1所示。

 

 

 

  • 除了修改网络的tricks,YOLOV2的两个亮点如下:

    • YOLOV2致力于进行精度和速度之间的平衡(tradeoff between speed and accuracy),它提出了一个新的multi-scale training method (多尺度训练模型),这样使得相同的YOLOv2模型能够在不同大小的图像(不同尺度的)上运行。(可以输入不同分辨率的图像)

    • YOLOV2 提出了一个新的方法来在 目标检测和分类任务上进行jointly train(联合训练),从而使得YOLO9000能够同时在COCO检测数据集与ImageNet分类数据集上训练,因此可以对那些没有标注的目标分类进行检测。(弱监督检测?)

background

  • 由于目标检测中神经网络的引入,two-stage方法与One-stage方法中都使用了神经网络来进行目标检测,特别是One-stage方法(YOLO、SSD)致力于使用单个独立的神经网络就能够完成目标检测端到端的任务,从而目标检测在速度以及准确度上有大了显著提升,能够在保证精准度的同时达到实时的标准。

  • 但是,目前目标检测任务的一个限制就是数据集太小,相比于其他任务,例如分类、打标签,目标检测的数据集是有限的,分类是数百万的数据集,然而目标检测最多才数十万的数据集。这是因为,相比于分类任务的标注工作,目标检测的标注工作很复杂、很昂贵耗时的,导致目标检测数据与分类任务的数据大小之间整整差了几个数量级。

  • YOLOv2提出了一个新的方法来解决现有的大量的分类数据集,并且利用分类数据集来扩展目前检测系统的范围。主要通过目标分类的层级视图(hierarchical view)来将不同的数据集整合到一起。

  • 提出了一个joint training algorithm(联合训练算法),来共同地在检测和分类数据集上进行目标检测器(object detector)的训练。在检测数据集上学习精准的定位,同时在分类数据集上增加他的词汇量和鲁棒性。 本文,首先对基础的YOLOv1方法进行改进,产生YOLOv2方法,一个精准并实时的检测器。之后,在YOLOV2的基础上,利用数据集整合方法以及联合训练算法在超过9000类的ImageNet分类数据以及COCO检测数据上进行训练,训练出YOLO9000模型。

methods

YOLO2这篇论文主要是从Better、Faster、Stronger这个三个方面的改善来进行论述的,提出了YOLOV2,并在YOLOV2训练的基础上联合训练得到了YOLO9000模型。下面分别就Better、Faster与Stronger这三个方面来讲述在这篇文章中的改进。

Better

首先,利用8个tricks来改善YOLO的精度,即提高YOLO的mAP与recall,其中大部分方法都能够显著提升模型的精度,具体的改进侧率如图2所示。

 

 

 

1. Batch Normalization(BN, 批标准化)

Batch Normalization可以提升模型收敛速度,而且可以起到一定正则化效果,降低模型的过拟合。在YOLOv2中,每个卷积层后面都添加了Batch Normalization层,并且不再使用droput。使用Batch Normalization后,YOLOv2的mAP提升了2.4%。

2. High Resolution Classifier

目前大部分检测模型都会先在ImageNet分类数据集上训练模型的主体部分(CNN特征提取器),由于之前ImageNet分类模型基本采用大小为224x224的图片作为输入,分辨率相对较低,不利于检测模型。原来的YOLO网络在预训练的时候采用的是224*224的输入(这是因为一般预训练的分类模型都是在ImageNet数据集上进行的),然后在detection的时候采用448*448的输入,这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变。而YOLOv2则将预训练分成两步:先用224*224的输入从头开始训练网络,大概160个epoch(表示将所有训练数据循环跑160次),然后再将输入调整到448*448,再训练10个epoch。注意这两步都是在ImageNet数据集上操作。最后再在检测的数据集上fine-tuning,也就是detection的时候用448*448的图像作为输入就可以顺利过渡了。作者的实验表明这样可以提高几乎4%的MAP。

3. Convolutionlal With Anchor Boxes

在YOLOv1中,输入图片最终被划分为7x7网格,每个网格单元预测两个bounding box。YOLOV1最后采用的是全连接层直接对bounding box进行预测,其中边界框的宽与高是相对整张图片大小的,而由于各个图片中存在不同尺度和长宽比(scales and ratios)的物体,YOLOV1在训练过程中学习适应不同物体的形状是比较困难的,这也导致YOLOV1在精确定位方面表现较差。 
YOLOV2借鉴了Faster R-CNN中的RPN网络的先验框(anchor boxes, prior boxes, SSD也采用了先验框)策略。anchor是RNP网络中的一个关键步骤,说的是在卷积特征图上进行滑窗操作,每一个中心可以预测9种不同大小的建议框。RPN对CNN特征提取器得到的特征图(feature map)进行卷积来预测每个位置的边界框以及置信度(是否含有物体),并且各个位置设置不同尺度和比例的先验框,所以RPN预测的是边界框相对于先验框的offsets值(其实是transform值,详细见Faster R_CNN论文),采用先验框使得模型更容易学习。见下图

 

 

 

所以YOLOv2移除了YOLOv1中的全连接层而采用了卷积和anchor boxes来预测边界框。为了使检测所用的特征图分辨率更高,移除最后的一个pool层。在检测模型中,通过缩减网络,YOLOv2不是采481*418图片作为输入,而是采用416*416大小。因为YOLOv2模型下采样的总步长为32,对于416*416大小的图片,最终得到的特征图大小为13*13,维度是奇数,这样特征图恰好只有一个中心位置。对于一些大物体,它们中心点往往落入图片中心位置,此时使用特征图的一个中心点去预测这些物体的边界框相对容易些。所以在YOLOv2设计中要保证最终的特征图有奇数个位置。 
相对于YOLOV1,每个grid cell之预测2个bounding boxes,每个bounding box包含5个值:(x, y, w, h, c),前4个值是边界框位置与大小,最后一个值是置信度(confidence scores,包含两部分:含有物体的概率以及预测框与ground truth的IOU)。但是每个cell只预测一套分类概率值(class predictions,其实是置信度下的条件概率值),供2个boxes共享。 
YOLOv2使用了anchor boxes之后,每个位置的各个anchor box都单独预测一套分类概率值,这和SSD比较类似(但SSD没有预测置信度,而是把background作为一个类别来处理)。使用anchor boxes之后,YOLOv2的mAP有稍微下降(这里下降的原因,我猜想是YOLOv2虽然使用了anchor boxes,但是依然采用YOLOv1的训练方法)。YOLOv1只能预测98个(7x7x2)边界框,而YOLOv2使用anchor boxes之后可以预测上千个(13x13x num_anchors)边界框。所以使用anchor boxes之后,YOLOv2的召回率大大提升,由原来的81%升至88%。

 

预测tensor图

 

4. Dimension Clusters

在Faster R-CNN和SSD中,先验框的维度(长和宽)都是手动设定的,带有一定的主观性。如果一开始选取的先验框维度比较合适,那么模型更容易学习,从而做出更好的预测。因此,YOLOv2采用k-means聚类方法对训练集中的边界框做了聚类分析。因为设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,另外作者发现如果采用标准的k-means(即用欧式距离来衡量差异),在box的尺寸比较大的时候其误差也更大,而我们希望的是误差和box的尺寸没有太大关系。所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标:

 

 


以下为,为在VOC和COCO数据集上的聚类分析结果,随着聚类中心数目的增加,平均IOU值(各个边界框与聚类中心的IOU的平均值)是增加的,但是综合考虑模型复杂度和召回率,作者最终选取5个聚类中心作为先验框,其相对于图片的大小如右边图所示。对于两个数据集,5个先验框的width和height如下所示(来源:YOLO源码的cfg文件):

 

COCO: (0.57273, 0.677385), (1.87446, 2.06253), (3.33843, 5.47434), (7.88282, 3.52778), (9.77052, 9.16828)
VOC: (1.3221, 1.73145), (3.19275, 4.00944), (5.05587, 8.09892), (9.47112, 4.84053), (11.2364, 10.0071)

但是这里先验框的大小具体指什么作者并没有说明,但肯定不是像素点,从代码实现上看,应该是相对于预测的特征图大小(13*13)。对比两个数据集,也可以看到COCO数据集上的物体相对小点。这个策略作者并没有单独做实验,但是作者对比了采用聚类分析得到的先验框与手动设置的先验框在平均IOU上的差异,发现前者的平均IOU值更高,因此模型更容易训练学习。如图所示:

 

 

5. Direct location prediction

前面讲到,YOLOV2借鉴Faster R-CNN中的RPN网络使用anchor boxes来预测边界框相对于先验框的offsets,边界框的实际中心位置(x,y),需要根据预测的坐标偏移值,先验框的尺度 
以及中心坐标(特征图每个位置的中心点)来计算:

 

 


但是,上面的公式是无约束的,预测的边界框很容易向任何方向偏移,如当 时边界框将享有偏移先验框的一个宽度大小,但是当 时,边界框将向做偏移先验框的一个宽度大小,因此每个位置预测的边界框可以落在图片的任何位置,这导致了模型的不稳定性,在训练时需要很长时间来预测出正确的offsets。  
(但是我觉得的上面的那个公式有点问题,应该把减号改成加号),因为这个公式是从Faster R-CNN中推导出来的,可见下图所示。

 

 

Fatser -R-CNN中的公式


在这里作者并没有采用直接预测offset的方法,还是沿用了YOLO算法中直接预测相对于grid cell的坐标位置的方式。  
前面提到网络在最后一个卷积层输出13*13大小的feature map,然后每个cell预测5个bounding box,然后每个bounding box预测5个值:tx,ty,tw,th和to(这里的to类似YOLOv1中的confidence)。看下图,tx和ty经过sigmoid函数处理后范围在0到1之间,这样的归一化处理也使得模型训练更加稳定;cx和cy表示一个cell和图像左上角的横纵距离;pw和ph表示bounding box的宽高,这样bx和by就是cx和cy这个cell附近的anchor来预测tx和ty得到的结果。具体的计算公式,如下图所示:

 

 

YOLOV2边界框预测公式

 

其中,为cell的左上角坐标,如图5所示,在计算时每个cell的尺度为1,所以当前cell的左上角坐标为(1, 1)。由于sigmoid函数的处理,边界框的中心位置会约束在当前cell内部,防止偏移过多。而和是先验框的宽度与长度,前面说过它们的值也是相对于特征图大小的,在特征图中每个cell的长和宽均为1。这里及特征图的大小为(在文中是(13,13)),这样我们可以将边界框相对于整张图片的位置和大小计算出来(4个值均在0和1之间):

 

 

 

如果再将上面的4个值分别乘以图片的宽度和长度(像素点值)就可以得到边界框的最终位置和大小了。这就是YOLOv2边界框的整个解码过程。约束了边界框的位置预测值使得模型更容易稳定训练,结合聚类分析得到先验框与这种预测方法,YOLOv2的mAP值提升了约5%。 
如果对上面的公式不理解,可以看下图,首先是cx和cy,表示grid cell与图像左上角的横纵坐标距离,黑色虚线框是bounding box,蓝色矩形框就是预测的结果。

 

 

 

6. Fine-Grained Features(passthrough)

YOLOv2的输入图片大小为416*416,经过5次maxpooling之后得到13*13大小的特征图,并以此特征图采用卷积做预测。13*13大小的特征图对检测大物体是足够了,但是对于小物体还需要更精细的特征图(Fine-Grained Features)。因此SSD使用了多尺度的特征图来分别检测不同大小的物体,前面更精细的特征图可以用来预测小物体。YOLOv2提出了一种passthrough层来利用更精细的特征图。YOLOv2所利用的Fine-Grained Features是26*26大小的特征图(最后一个maxpooling层的输入),对于Darknet-19模型来说就是大小为26*26*512的特征图。passthrough层与ResNet网络的shortcut类似,以前面更高分辨率的特征图为输入,然后将其连接到后面的低分辨率特征图上。前面的特征图维度是后面的特征图的2倍,passthrough层抽取前面层的每个2*2的局部区域,然后将其转化为channel维度,对于26*26*512的特征图,经passthrough层处理之后就变成了13*13*2048的新特征图(特征图大小降低4倍,而channles增加4倍,图6为一个实例),这样就可以与后面的13*13*1024特征图连接在一起形成13*13*3072的特征图,然后在此特征图基础上卷积做预测。在YOLO的C源码中,passthrough层称为reorg layer。在TensorFlow中,可以使用tf.extract_image_patches或者tf.space_to_depth来实现passthrough层:

out = tf.extract_image_patches(in, [ 1, stride, stride, 1], [1, stride, stride, 1], [1,1,1,1], padding="VALID")
// or use tf.space_to_depth
out = tf.space_to_depth(in, 2)

 

 

 

另外,作者在后期的实现中借鉴了ResNet网络,不是直接对高分辨特征图处理,而是增加了一个中间卷积层,先采用64个1*1卷积核进行卷积,然后再进行passthrough处理,这样26*26*512的特征图得到13*13*256的特征图。这算是实现上的一个小细节。使用Fine-Grained Features之后YOLOv2的性能有1%的提升。 

7. Multi-Scale Training(多尺度训练)

由于YOLOv2模型中只有卷积层和池化层,所以YOLOv2的输入可以不限于416*416大小的图片。为了增强模型的鲁棒性,YOLOv2采用了多尺度输入训练策略,具体来说就是在训练过程中每间隔一定的iterations之后改变模型的输入图片大小。由于YOLOv2的下采样总步长为32,输入图片大小选择一系列为32倍数的值:输入图片最小为320*320,此时对应的特征图大小为10*10(不是奇数了,确实有点尴尬),而输入图片最大为608*608,对应的特征图大小为19*19,在训练过程,每隔10个iterations随机选择一种输入图片大小,然后只需要修改对最后检测层的处理就可以重新训练。

 

 


采用Multi-Scale Training策略,使得YOLOV2可以适应不同大小的图片,对不同分辨率的图像进行检测,并且预测出很好的结果。在测试时,YOLOV2可以采用不同大小的图片作为输入,在VOC 2007数据集上的效果如下图所示。可以看到采用较小分辨率时,YOLOv2的mAP值略低,但是速度更快,而采用高分辨输入时,mAP值更高,但是速度略有下降,对于544*544,mAP高达78.6%。注意,这只是测试时输入图片大小不同,而实际上用的是同一个模型(采用Multi-Scale Training训练)。

 

 

 

 

8. Further Experiments

作者在VOC2012上对YOLOv2进行训练,下图是和其他方法的对比。YOLOv2精度达到了73.4%,并且速度更快。同时YOLOV2也在COCO上做了测试(IOU=0.5),也和Faster R-CNN、SSD作了成绩对比。总的来说,比上不足,比下有余。

 

 

 

 

 

 

总的看下这些技巧对mAP的贡献:

 

 


High Resolution Classifier的提升非常明显(近4%),另外通过结合dimension prior+localtion prediction这两种方式引入anchor也能带来近5%mAP的提升。

 

Faster

YOLO一向是速度和精度并重,作者为了改善检测速度,也作了一些相关工作。 
大多数检测网络有赖于VGG-16作为特征提取部分,VGG-16的确是一个强大而准确的分类网络,但是复杂度有些冗余。224 * 224的图片进行一次前向传播,其卷积层就需要多达306.9亿次浮点数运算。 
在YOLO v1中,作者采用的训练网络是基于GooleNet,这里作者将GooleNet和VGG16做了简单的对比,GooleNet在计算复杂度上要优于VGG16(8.25 billion operation VS 30.69 billion operation),但是前者在ImageNet上的top-5准确率要稍低于后者(88% VS 90%)。 
YOLOv2使用的是基于Googlenet的定制网络,比VGG-16更快,一次前向传播仅需85.2亿次运算。可是它的精度要略低于VGG-16,单张224 * 224取前五个预测概率的对比成绩为88%和90%(低一点点也是可以接受的),即作者采用了新的分类模型作为基础网络,那就是Darknet-19。

New Network:Darknet-19

YOLOv2采用了一个新的基础模型(特征提取器),称为Darknet-19,包括19个卷积层和5个maxpooling层,在YOLO v1中采用的GooleNet,包含24个卷积层和2个全连接层,如图4所示。Darknet-19与VGG16模型设计原则是一致的,主要采用3*3卷积,采用2*2的maxpooling层之后,特征图维度降低2倍,而同时将特征图的channles增加两倍。与NIN(Network in Network)类似,Darknet-19最终采用global avg pooling做预测,并且在3*3卷积之间使用1*1卷积来压缩特征图channles以降低模型计算量和参数。Darknet-19每个卷积层后面同样使用了batch norm层以加快收敛速度,降低模型过拟合。在ImageNet分类数据集上,Darknet-19的top-1准确度为72.9%,top-5准确度为91.2%,但是模型参数相对小一些。使用Darknet-19之后,YOLOv2的mAP值没有显著提升,但是计算量却可以减少约33%。

 

 

 

Training for classification and Training for detection

YOLOv2的训练主要包括三个阶段。第一阶段就是先在ImageNet分类数据集上预训练Darknet-19,此时模型输入为224*224,共训练160个epochs。然后第二阶段将网络的输入调整为448*448,继续在ImageNet数据集上finetune分类模型,训练10个epochs,此时分类模型的top-1准确度为76.5%,而top-5准确度为93.3%。第三个阶段就是修改Darknet-19分类模型为检测模型,并在检测数据集上继续finetune网络。网络修改包括(网路结构可视化):移除最后一个卷积层、global avgpooling层以及softmax层,并且新增了三个3*3*2014卷积层,同时增加了一个passthrough层,最后使用1*1卷积层输出预测结果,输出的channels数为:,和训练采用的数据集有关系。由于anchors数为5,对于VOC数据集输出的channels数就是125,而对于COCO数据集则为425。这里以VOC数据集为例,最终的预测矩阵为T(shape为,可以先将其reshape为,其中为边界框的位置和大小,,为边界框的置信度,而为类别预测值。

 

YOLOV2网络模型

 

 

 

 

 

 

 

YOLOv2的网络结构以及训练参数我们都知道了,但是貌似少了点东西。仔细一想,原来作者并没有给出YOLOv2的训练过程的两个最重要方面,即先验框匹配(样本选择)以及训练的损失函数,难怪Ng说YOLO论文很难懂,没有这两方面的说明我们确实不知道YOLOv2到底是怎么训练起来的。不过默认按照YOLOv1的处理方式也是可以处理,我看了YOLO在TensorFlow上的实现darkflow(见yolov2/train.py),发现它就是如此处理的:和YOLOv1一样,对于训练图片中的ground truth,若其中心点落在某个cell内,那么该cell内的5个先验框所对应的边界框负责预测它,具体是哪个边界框预测它,需要在训练中确定,即由那个与ground truth的IOU最大的边界框预测它,而剩余的4个边界框不与该ground truth匹配。YOLOv2同样需要假定每个cell至多含有一个grounth truth,而在实际上基本不会出现多于1个的情况。与ground truth匹配的先验框计算坐标误差、置信度误差(此时target为1)以及分类误差,而其它的边界框只计算置信度误差(此时target为0)。YOLOv2和YOLOv1的损失函数一样,为均方差函数。但是我看了YOLOv2的源码(训练样本处理与loss计算都包含在文件region_layer.c中,YOLO源码没有任何注释,反正我看了是直摇头),并且参考国外的blog以及allanzelener/YAD2K(Ng深度学习教程所参考的那个Keras实现)上的实现,发现YOLOv2的处理比原来的v1版本更加复杂。先给出loss计算公式:

 

损失函数

 

我们来一点点解释,首先W,H分别指的是特征图(13*13)的宽与高,而A指的是先验框数目(这里是5),各个

 

值是各个loss部分的权重系数。第一项loss是计算background的置信度误差,但是哪些预测框来预测背景呢,需要先计算各个预测框和所有ground truth的IOU值,并且取最大值Max_IOU,如果该值小于一定的阈值(YOLOv2使用的是0.6),那么这个预测框就标记为background,需要计算noobj的置信度误差。第二项是计算先验框与预测宽的坐标误差,但是只在前12800个iterations间计算,我觉得这项应该是在训练前期使预测框快速学习到先验框的形状。第三大项计算与某个ground truth匹配的预测框各部分loss值,包括坐标误差、置信度误差以及分类误差。先说一下匹配原则,对于某个ground truth,首先要确定其中心点要落在哪个cell上,然后计算这个cell的5个先验框与ground truth的IOU值(YOLOv2中bias_match=1),计算IOU值时不考虑坐标,只考虑形状,所以先将先验框与ground truth的中心点都偏移到同一位置(原点),然后计算出对应的IOU值,IOU值最大的那个先验框与ground truth匹配,对应的预测框用来预测这个ground truth。在计算obj置信度时,在YOLOv1中target=1,而YOLOv2增加了一个控制参数rescore,当其为1时,target取预测框与ground truth的真实IOU值。对于那些没有与ground truth匹配的先验框(与预测框对应),除去那些Max_IOU低于阈值的,其它的就全部忽略,不计算任何误差。这点在YOLOv3论文中也有相关说明:YOLO中一个ground truth只会与一个先验框匹配(IOU值最好的),对于那些IOU值超过一定阈值的先验框,其预测结果就忽略了。这和SSD与RPN网络的处理方式有很大不同,因为它们可以将一个ground truth分配给多个先验框。尽管YOLOv2和YOLOv1计算loss处理上有不同,但都是采用均方差来计算loss。另外需要注意的一点是,在计算boxes的和误差时,YOLOv1中采用的是平方根以降低boxes的大小对误差的影响,而YOLOv2是直接计算,但是根据ground truth的大小对权重系数进行修正:l.coord_scale * (2 - truth.w*truth.h),这样对于尺度较小的boxes其权重系数会更大一些,起到和YOLOv1计算平方根相似的效果(参考YOLO v2 损失函数源码分析)。

 

最终的YOLOv2模型在速度上比YOLOv1还快(采用了计算量更少的Darknet-19模型),而且模型的准确度比YOLOv1有显著提升,详情见paper。

Stronger
Dataset combination with WordTree
Joint classification and detection

在这一步提出YOLO9000,YOLO9000是在YOLOv2的基础上提出的一种可以检测超过9000个类别的模型,其主要贡献点在于提出了一种分类和检测的联合训练策略。众多周知,检测数据集的标注要比分类数据集打标签繁琐的多,所以ImageNet分类数据集比VOC等检测数据集高出几个数量级。在YOLO中,边界框的预测其实并不依赖于物体的标签,所以YOLO可以实现在分类和检测数据集上的联合训练。对于检测数据集,可以用来学习预测物体的边界框、置信度以及为物体分类,而对于分类数据集可以仅用来学习分类,但是其可以大大扩充模型所能检测的物体种类。 
作者选择在COCO和ImageNet数据集上进行联合训练,但是遇到的第一问题是两者的类别并不是完全互斥的,比如”Norfolk terrier”明显属于”dog”,所以作者提出了一种层级分类方法(Hierarchical classification),主要思路是根据各个类别之间的从属关系(根据WordNet)建立一种树结构WordTree,结合COCO和ImageNet建立的WordTree如下图所示:

 

 


WordTree中的根节点为”physical object”,每个节点的子节点都属于同一子类,可以对它们进行softmax处理。在给出某个类别的预测概率时,需要找到其所在的位置,遍历这个path,然后计算path上各个节点的概率之积。

 

 

 


在训练时,如果是检测样本,按照YOLOv2的loss计算误差,而对于分类样本,只计算分类误差。在预测时,YOLOv2给出的置信度就是,同时会给出边界框位置以及一个树状概率图。在这个概率图中找到概率最高的路径,当达到某一个阈值时停止,就用当前节点表示预测的类别。

 

conclusion

通过联合训练策略,YOLO9000可以快速检测出超过9000个类别的物体,总体mAP值为19,7%。我觉得这是作者在这篇论文作出的最大的贡献,因为YOLOv2的改进策略亮点并不是很突出,但是YOLO9000算是开创之举。

YOLOV3

出自:arXiv 2018 时间:2018.08 引用:111 
Redmon J, Farhadi A. Yolov3: An incremental improvement[J]. arXiv preprint arXiv:1804.02767, 2018. 
论文链接:https://pjreddie.com/media/files/papers/YOLOv3.pdf 
YOLOv3论文地址:https://arxiv.org/abs/1804.02767 
blog: https://blog.csdn.net/u014380165/article/details/80202337 ** 
blog:https://www.cnblogs.com/cvtoEyes/p/8608205.html * 
blog :https://blog.csdn.net/wfei101/article/details/80011474 
源码code:https://pjreddie.com/yolo/ 
blog: https://blog.paperspace.com/tag/series-yolo/,其中part1是介绍YOLO算法相关的基础知识,part2到part5是介绍如何用PyTorch实现YOLO v3算法,非常推荐 
pytorch: YOLOv3实现 https://blog.csdn.net/l7H9JA4/article/details/80655711 
pytorch 代码1:https://github.com/Codermay/PyTorch-YOLOv3 注释:https://github.com/Codermay/eriklindernoren-PyTorch-YOLOv3-chinese-comment (训练的损失函数有点问题) 
pytorch 代码2:https://github.com/Codermay/yolov3-1 (阔以看看) 
pytorch实现:https://github.com/Codermay/pytorch-yolo-v3 可以跑跑 
pytorch 靠谱实现:https://github.com/ultralytics/yolov3 ** 向老 
pytorch : https://github.com/DeNA/PyTorch_YOLOv3 新出的

motivation

  • 主要叙述了作者这一年来在YOLOV3上做的工作,算是一个技术报告类型的东西,作者主要介绍了YOLOV3的整个技术流程,并且借鉴别人工作的方法来进行算法精度和速度上的改进,并且与现有的方法进行对比。

  • 此外,介绍了作者尝试的几个没有成功的改进。

background

YOLO算法的基本思想是:首先通过特征提取网络对输入图像提取特征,得到一定size的feature map,比如13*13,然后将输入图像分成13*13个grid cell,接着如果ground truth中某个object的中心坐标落在哪个grid cell中,那么就由该grid cell来预测该object,因为每个grid cell都会预测固定数量的bounding box(YOLO v1中是2个,YOLO v2中是5个,YOLO v3中是3个,这几个bounding box的初始size是不一样的),那么这几个bounding box中最终是由哪一个来预测该object?答案是:这几个bounding box中只有和ground truth的IOU最大的bounding box才是用来预测该object的。可以看出预测得到的输出feature map有两个维度是提取到的特征的维度,比如13*13,还有一个维度(深度)是B*(5+C),注:YOLO v1中是(B*5+C),其中B表示每个grid cell预测的bounding box的数量,比如YOLO v1中是2个,YOLO v2中是5个,YOLO v3中是3个,C表示bounding box的类别数(没有背景类,所以对于VOC数据集是20),5表示4个坐标信息和一个置信度(objectness score)。算法在速度和精度上的提升可以看下图。

 

 

 

methods

Bounding Box Prediction

bounding box的坐标预测方式还是延续了YOLO v2的做法,简单讲就是下面这个截图的公式,tx、ty、tw、th就是模型的预测输出。cx和cy表示grid cell的坐标,比如某层的feature map大小是13*13,那么grid cell就有13*13个,第0行第1列的grid cell的坐标cx就是1,cy就是0。pw和ph表示预测前bounding box的size。bx、by。bw和bh就是预测得到的bounding box的中心的坐标和size。坐标的损失采用的是平方误差损失(sum of squared error loss)。

 

 

 

 

 


YOLOV3利用logistics regression为每个bounding box预测objectness score(Faster R-CNN 中的RPN)。如果预测的bounding box与ground truth重叠(overlaps: IOU??)的地方最多,则objectness score为1;如果预测的bounding box不是最好的,但是和ground truth object的重叠也超过了一个阈值threshold,(遵循Faster R-CNN)则忽略这个bounding box(不奖励也不惩罚的机制)。与Fatser R-CNN中不同的是,YOLOV3为每个ground truth只分配一个bounding box。如果这个bounding box没有被分配给ground truth,则再算loss的时候不会计算这个bounding box的coordinate以及class predictions的loss,只计算objectness score loss。

 

Class Prediction

类别预测方面主要是将原来的单标签分类改进为多标签分类,因此网络结构上就将原来用于单标签多分类的softmax层换成用于多标签多分类的逻辑回归层。首先说明一下为什么要做这样的修改,原来分类网络中的softmax层都是假设一张图像或一个object只属于一个类别,但是在一些复杂场景下,一个object可能属于多个类,比如你的类别中有woman和person这两个类,那么如果一张图像中有一个woman,那么你检测的结果中类别标签就要同时有woman和person两个类,这就是多标签分类,需要用逻辑回归层来对每个类别做二分类。逻辑回归层主要用到sigmoid函数,该函数可以将输入约束在0到1的范围内,因此当一张图像经过特征提取后的某一类输出经过sigmoid函数约束后如果大于0.5,就表示属于该类。

Predictions Across Scales

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

关于bounding box的初始尺寸还是采用YOLO v2中的k-means聚类的方式来做,这种先验知识对于bounding box的初始化帮助还是很大的,毕竟过多的bounding box虽然对于效果来说有保障,但是对于算法速度影响还是比较大的。作者在COCO数据集上得到的9种聚类结果:(10*13); (16*30); (33*23); (30*61); (62*45); (59*119); (116*90); (156*198); (373*326),这应该是按照输入图像的尺寸是416*416计算得到的。

 

 

 

Feature Extractor

网络结构(Darknet-53)一方面基本采用全卷积(YOLO v2中采用pooling层做feature map的sample,这里都换成卷积层来做了),另一方面引入了residual结构(YOLO v2中还是类似VGG那样直筒型的网络结构,层数太多训起来会有梯度问题,所以Darknet-19也就19层,因此得益于ResNet的residual结构,训深层网络难度大大减小,因此这里可以将网络做到53层,精度提升比较明显)。Darknet-53只是特征提取层,源码中只使用了pooling层前面的卷积层来提取特征,因此multi-scale的特征融合和预测支路并没有在该网络结构中体现,具体信息可看源码:https://github.com/pjreddie/darknet/blob/master/cfg/yolov3.cfg。 
预测支路采用的也是全卷积的结构,其中最后一个卷积层的卷积核个数是255,是针对COCO数据集的80类:3*(80+4+1)=255,3表示一个grid cell包含3个bounding box,4表示框的4个坐标信息,1表示objectness score。模型训练方面还是采用原来YOLO v2中的multi-scale training。

 

YOLOV3所用的Darknet-53模型

 

 

YOLOv3网络结构示意图(VOC数据集)

 

Training

模型训练方面还是对整张图进行训练,没有进行难样本挖掘等。并且还是采用原来YOLO v2中的multi-scale training,许多data augmentation,batch normalization等。

experiments

YOLOv3与其它检测模型的对比如下图所示,可以看到在速度上YOLOv3完胜其它方法,虽然AP值并不是最好的(如果比较AP-0.5,YOLOv3优势更明显)。

 

 


Table2是几个网络在ImageNet数据集上的性能和精度对比。可以看出Darknet-53的性能还是非常不错的。

 

 

 


YOLO v3的实验结果对比可以看Table3。原来YOLO v2对于小目标的检测效果是比较差的,通过引入多尺度特征融合的方式,可以看出YOLO v3的APS要比YOLO v2的APS高出不少。

 

 

 


最后这张图非常有意思,直接用All the other slow ones来代表其他算法,实实在在展现了本篇文章随性的风格。

 

 

 

 

conclusion

YOLOv3发布了,但是正如作者所说,这仅仅是他们近一年的一个工作报告(TECH REPORT),不算是一个完整的paper,因为他们实际上是把其它论文的一些工作在YOLO上尝试了一下。相比YOLOv2,我觉得YOLOv3最大的变化包括两点:使用残差模型和采用FPN架构。YOLOv3的特征提取器是一个残差模型,因为包含53个卷积层,所以称为Darknet-53,从网络结构上看,相比Darknet-19网络使用了残差单元,所以可以构建得更深。另外一个点是采用FPN架构(Feature Pyramid Networks for Object Detection)来实现多尺度检测。YOLOv3采用了3个尺度的特征图(当输入为416*416时):(13*13),(26*26),(52*52),VOC数据集上的YOLOv3网络结构如图15所示,其中红色部分为各个尺度特征图的检测结果。YOLOv3每个位置使用3个先验框,所以使用k-means得到9个先验框,并将其划分到3个尺度特征图上,尺度更大的特征图使用更小的先验框,和SSD类似。 
从YOLO的三代变革中可以看到,在目标检测领域比较好的策略包含:设置先验框,采用全卷积做预测(去除了pooling),采用残差网络,采用多尺度特征图做预测。同样作者还做了一下几种尝试,但是效果不好:

  • Anchor box x; y offset predictions. We tried using the normal anchor box prediction mechanism where you predict the x; y offset as a multiple of the box width or height using a linear activation. We found this formulation decreased model stability and didn’t work very well.

  • Linear x; y predictions instead of logistic. We tried using a linear activation to directly predict the x; y offset instead of the logistic activation. This led to a couple point drop in mAP.

  • Focal loss. We tried using focal loss. It dropped our mAP about 2 points. YOLOv3 may already be robust to the problem focal loss is trying to solve because it has separate objectness predictions and conditional class predictions. Thus for most examples there is no loss from the class predictions? Or something? We aren’t totally sure.

 
 
 
 

转载于:https://www.cnblogs.com/superjn/p/10893821.html

你可能感兴趣的:(YOLO1至YOLOV3方法讲解)