从V1到V4,让你读懂YOLO原理

YOLO概述

YOLO是You Only Look Once的缩写。它是一种使用深卷积神经网络学习的特征来检测物体的目标检测器。
物体检测的两个步骤能够归纳为:html

  1. 检测目标位置(生成矩形框)
  2. 对目标物体进行分类

物体检测主流的算法框架大体分为one-stage与two-stage。two-stage算法表明有R-CNN系列,one-stage算法表明有Yolo系列。按笔者理解,two-stage算法将步骤一与步骤二分开执行,输入图像先通过候选框生成网络(例如faster rcnn中的RPN网络),再通过分类网络;one-stage算法将步骤一与步骤二同时执行,输入图像只通过一个网络,生成的结果中同时包含位置与类别信息。two-stage与one-stage相比,精度高,可是计算量更大,因此运算较慢。web

模型时间轴

在这里插入图片描述
可见,Yolo系列发表日期所有在Faster RCNN以后,Faster RCNN算法的精度是state-of-the-art(最早进)级别的,Yolo算法的精度没有超越Faster RCNN,而是在速度与精度之间进行权衡。Yolo v3在改进屡次以后,既有必定的精度,也保持了较高的运行速度。在不少边缘计算、实时性要求较高的任务中,Yolo v3备受青睐。在RCNN算法日益成熟以后,Yolo算法却能横空出世,离不开其高性能和使用回归思想作物体检测的两个特色。
YOLO有如下特色:
4. Yolo很快,由于用回归的方法,而且不用复杂的框架。
5. Yolo会基于整张图片信息进行预测,而其余滑窗式的检测框架,只能基于局部图片信息进行推理。
6. Yolo学到的图片特征更为通用。算法

YOLOv1

原理

YOLOv1用回归的方法去作目标检测,执行速度快,达到很是高效的检测。YOLOv1的基本思想是把一副图片,首先reshape成 448 448 448*448 大小(因为网络中使用了全链接层,因此图片的尺寸需固定大小输入到CNN中),而后将划分红SxS个单元格,以每一个格子所在位置和对应内容为基础,来预测。网络

如图,先将图片划分红 s s s*s (本图是 7 7 7*7 )个栅格,每一个栅格负责检测中心落在该栅格中的物体。每个栅格预测B( B表示每一个单元能够预测的边界框的数量本图是两个)个bounding boxes(边界),以及这些bounding boxes的confidence scores(置信度,若是里面没有预测物体,得分就是0)。
YOLO对每一个bounding box有5个预测:x, y, w, h,和 confidence。坐标x,y表明了预测的bounding box的中心与栅格边界的相对值。 坐标w,h表明了预测的bounding box的width、height相对于整幅图像width,height的比例。 confidence就是预测的bounding box和ground truth box的IOU值(两个矩形交集的面积/两个矩形的并集面积 在[0,1]之间)。 每个栅格还要预测C(总标记类别,原题有20个)个conditional class probability(条件类别几率)。
Fig2 YOLO将检测模型化为回归问题。 它将图像划分为S×S网格,而且每一个网格单元预测B个边界框,对这些框的置信度以及C类几率。 这些预测值被编码为S×S×(B * 5 + C) 张量。( 7 7 2 5 + 20 7*7*(2*5+20) app

在这里插入图片描述

网络结构

在这里插入图片描述
输入图像大小为 448 448 448*448 ,通过若干个卷积层与池化层,变为 7 7 1024 7*7*1024 张量,最后通过两层全链接层,输出张量维度为7730,这就是Yolo v1的整个神经网络结构,和通常的卷积物体分类网络没有太多区别,最大的不一样就是:分类网络最后的全链接层,通常链接于一个一维向量,向量的不一样位表明不一样类别,而这里的输出向量是一个三维的张量 7 7 30 (7*7*30) 。上图中Yolo的backbone网络结构,受启发于GoogLeNet,也是v二、v3中Darknet的先锋。本质上来讲没有什么特别,没有使用BN层,用了一层Dropout。除了最后一层的输出使用了线性激活函数,其余层所有使用Leaky Relu激活函数。网络结构没有特别的东西,再也不赘述。框架

损失函数

神经网络结构肯定以后,训练效果好坏,由Loss函数和优化器决定。Yolo v1使用普通的梯度降低法做为优化器。Yolo v1使用的Loss函数(如今也看不懂就不说了)在这里插入图片描述ide

  • YOLOv1对位置偏差,confidence偏差,分类偏差均使用了均方差做为损失函数。
  • 三部分偏差损失(位置偏差,confidence偏差,分类偏差),在损失函数中所占权重不同,位置偏差权重系数最大,为5。
  • 因为一副图片中没有目标的网格占大多数,有目标的网格占少数,因此损失函数中对没有目标的网格中预测的bbox(bounding box)的confidence偏差给予小的权重系数,为0.5。
  • 有目标的网格中预测的bbox的confidence损失和分类损失,权重系数正常为1。
  • 因为相同的位置偏差对大目标和小目标的影响是不一样的,相同的误差对于小目标来讲影响要比大目标大,故做者选择将预测的bbox的w,h先取其平方根,再求均方差损失。
  • 一个网格预测2个bbox,在计算损失函数的时候,只取与ground truth box中IoU大的那个预测框来计算损失。
  • 分类偏差,只有当单元格中含有目标时才计算,没有目标的单元格的分类偏差不计算在内。

激活函数

  • 最后一层全链接层用线性激活函数
  • 其他层采用leak RELU

YOLOv1的缺陷

  • 每一个单元格只预测2个bbox,而后每一个单元格最后只取与gt_bbox的IOU高的那个最为最后的检测框,也只是说每一个单元格最多只预测一个目标,若单个单元格有多个目标时,只能检测出其余的一个,致使小目标漏检,所以YOLOv1对小目标检测效果很差。
  • 虽然YOLOv1中损失函数中位置偏差,对预测的w,h取平方根处理再求均方差,来缓解相同位置偏差对大目标,小目标影响不一样的弊端,可是做用甚微,没有根本解决问题对于小物体。小的目标的 置信度偏差也会对网络优化过程形成很大的影响,从而下降了物体检测的定位准确性。
  • 因为输出层为全链接层,所以在检测时,YOLO 训练模型只支持与训练图像相同的输入分辨率的图片。
  • YOLO对背景内容的误判率(4.75%)比Fast RCNN的误判率(13.6%)低不少。可是YOLO的定位准确率(Localization)较差,占总偏差比例的19.0%,而Fast RCNN仅为8.6%。
    在这里插入图片描述

YOLOv2

与最早进的检测系统相比,YOLO有不少缺点。YOLO与Fast R-CNN的偏差分析代表,YOLO的定位偏差至关大。此外,与基于区域建议的方法相比,YOLO的召回率相对较低。所以,咱们的重点是提升召回和定位,同时保持分类的准确性。
YOLOv2相对v1版本,在继续保持处理速度的基础上,从预测更准确(Better),速度更快(Faster),识别对象更多(Stronger)这三个方面进行了改进。其中识别更多对象也就是扩展到可以检测9000种不一样对象,称之为YOLO9000。svg

Better

Batch Normalization(批归一化)

归一化就是把数据弄到均值为0 方差为1的
批归一化有助于解决反向传播过程当中的梯度消失和梯度爆炸问题,下降对一些超参数(好比学习率、网络参数的大小范围、激活函数的选择)的敏感性,而且每一个batch分别进行归一化的时候,起到了必定的正则化效果,从而可以得到更好的收敛速度和收敛效果。
检测系列的网络结构中,BN逐渐变成了标配。在Yolo的每一个卷积层中加入BN以后,mAP(Mean Average Precision,即 平均AP( Average Precision平均精确度)值 )提高了2.4,而且去除了Dropout。函数

High Resolution Classifier. 高分辨率的分类器。

目前大部分的检测模型都会出如今ImageNet分类数据集上预训练模型的主体部分(CNN特征提取器),因为历史缘由,ImageNet分类模型基本采用大小为&224224&的图片做为输入,分辨率相对较低,不利于检测模型。因此YOLOv1在采用 &224224&分类模型预训练后,将分辨率增长至 [公式] ,并使用这个高分辨率在检测数据集上微调。可是直接切换分辨率,检测模型可能难以快速适应高分辨率。因此YOLOv2增长了在ImageNet数据集上使用 & 448*448&输入来finetune分类网络这一中间过程(10 epochs),这可使得模型在检测数据集上finetune以前已经适用高分辨率输入。使用高分辨率分类器后,YOLOv2的mAP提高了3.7。性能

Anchor Boxes 采用先验框

借鉴Faster RCNN的作法,YOLO2也尝试采用先验框(anchor)。在每一个grid预先设定一组不一样大小和宽高比的边框,来覆盖整个图像的不一样位置和多种尺度,这些先验框做为预约义的候选区在神经网络中将检测其中是否存在对象,以及微调边框的位置。
同时YOLO2移除了全链接层。另外去掉了一个池化层,使网络卷积层输出具备更高的分辨率。

Dimension Clusters

在Faster R-CNN和SSD中,先验框的维度(长和宽)都是手动设定的,带有必定的主观性。若是选取的先验框维度比较合适,那么模型更容易学习,从而作出更好的预测。所以,YOLOv2采用k-means聚类方法对训练集中的边界框作了聚类分析。由于设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,因此聚类分析时选用box与聚类中心box之间的IOU值做为距离指标: d = 1 I O U d=1-IOU

New Network:Darknet-19

YOLOv2采用了一个新的基础模型(特征提取器),称为Darknet-19,包括19个卷积层和5个maxpooling层,如图4所示。Darknet-19与VGG16模型设计原则是一致的,主要采用33卷积,采用22的maxpooling层以后,特征图维度下降2倍,而同时将特征图的channles增长两倍。与NIN(Network in Network)相似,Darknet-19最终采用global avgpooling作预测,而且在33卷积之间使用11卷积来压缩特征图channles以下降模型计算量和参数。Darknet-19每一个卷积层后面一样使用了batch norm层以加快收敛速度,下降模型过拟合。在ImageNet分类数据集上,Darknet-19的top-1准确度为72.9%,top-5准确度为91.2%,可是模型参数相对小一些。使用Darknet-19以后,YOLOv2的mAP值没有显著提高,可是计算量却能够减小约33%。### Direct location prediction约束预测边框的位置
借鉴于Faster RCNN的先验框方法,在训练的早期阶段,其位置预测容易不稳定。。按照以前YOLO的方法,网络不会预测偏移量,而是根据YOLO中的网格单元的位置来预测坐标,这就让Ground Truth的值介于0到1之间。

在这里插入图片描述

passthrough层实例

做者在后期的实现中借鉴了ResNet网络,不是直接对高分辨特征图处理,而是增长了一个中间卷积层,先采用64个11卷积核进行卷积,而后再进行passthrough处理,这样2626512的特征图获得1313*256的特征图。这算是实现上的一个小细节。使用Fine-Grained Features以后YOLOv2的性能有1%的提高。
在这里插入图片描述

Multi-Scale Training

因为YOLOv2模型中只有卷积层和池化层,因此YOLOv2的输入能够不限于416416大小的图片。为了加强模型的鲁棒性,YOLOv2采用了多尺度输入训练策略,具体来讲就是在训练过程当中每间隔必定的迭代以后改变模型的输入图片大小。因为YOLOv2的下采样总步长为32,输入图片大小选择一系列为32倍数的值。输入图片最小为320320,此时对应的特征图大小为1010(不是奇数了,确实有点尴尬),而输入图片最大为608608,对应的特征图大小为19*19,在训练过程,每隔10个迭代随机选择一种输入图片大小,而后只须要修改对最后检测层的处理就能够从新训练。
在这里插入图片描述

Stronger

Joint classification and detection联合分类与检测

如以前所说,物体分类,是对整张图片打标签,好比这张图片中含有人,另外一张图片中的物体为狗;而物体检测不只对物体的类别进行预测,同时须要框出物体在图片中的位置。物体分类的数据集,最著名的ImageNet,物体类别有上万个,而物体检测数据集,例如coco,只有80个类别,由于物体检测、分割的打标签成本比物体分类打标签成本要高不少。因此在这里,做者提出了分类、检测训练集联合训练的方案。
联合训练方法思路简单清晰,Yolo v2中物体矩形框生成,不依赖于物理类别预测,两者同时独立进行。当输入是检测数据集时,标注信息有类别、有位置,那么对整个loss函数计算loss,进行反向传播;当输入图片只包含分类信息时,loss函数只计算分类loss,其他部分loss为零。固然,通常的训练策略为,先在检测数据集上训练必定的epoch,待预测框的loss基本稳定后,再联合分类数据集、检测数据集进行交替训练,同时为了分类、检测数据量平衡,做者对coco数据集进行了上采样,使得coco数据总数和ImageNet大体相同。
联合分类与检测数据集,这里不一样于将网络的backbone在ImageNet上进行预训练,预训练只能提升卷积核的鲁棒性,而分类检测数据集联合,能够扩充识别物体种类。例如,在检测物体数据集中,有类别人,当网络有了必定的找出人的位置的能力后,能够经过分类数据集,添加细分类别:男人、女人、小孩、成人、运动员等等。这里会遇到一个问题,类别之间并不必定是互斥关系,多是包含(例如人与男人)、相交(运动员与男人),那么在网络中,该怎么对类别进行预测和训练呢?

Dataset combination with WordTree

树结构表示物体之间的从属关系很是合适,第一个大类,物体,物体之下有动物、人工制品、天然物体等,动物中又有更具体的分类。此时,在类别中,不对全部的类别进行softmax操做,而对同一层级的类别进行softmax:
在这里插入图片描述
树结构表示物体之间的从属关系很是合适,第一个大类,物体,物体之下有动物、人工制品、天然物体等,动物中又有更具体的分类。此时,在类别中,不对全部的类别进行softmax操做,而对同一层级的类别进行softmax:
在这里插入图片描述
如图中所示,同一颜色的位置,进行softmax操做,使得同一颜色中只有一个类别预测分值最大。在预测时,从树的根节点开始向下检索,每次选取预测分值最高的子节点,直到全部选择的节点预测分值连乘后小于某一阈值时中止。在训练时,若是标签为人,那么只对人这个节点以及其全部的父节点进行loss计算,而其子节点,男人、女人、小孩等,不进行loss计算。

最后的结果是,Yolo v2能够识别超过9000个物体,做者美其名曰Yolo9000。固然原文中也提到,只有当父节点在检测集中出现过,子节点的预测才会有效。若是子节点是裤子、T恤、裙子等,而父节点衣服在检测集中没有出现过,那么整条预测类别支路几乎都是检测失效的状态。这也合理,给神经网络看的都是狗,让它去预测猫,目前神经网络尚未这么智能。

YOLOv3

darknet53

在这里插入图片描述
YOLOv3相比于以前的yolo1和yolo2,改进较大,主要改进方向有:

  1. 主干网络修改成darknet53,其重要特色是使用了残差网络Residual,darknet53中的残差卷积就是进行一次3X三、步长为2的卷积,而后保存该卷积layer,再进行一次1X1的卷积和一次3X3的卷积,并把这个结果加上layer做为最后的结果, 残差网络的特色是容易优化,而且可以经过增长至关的深度来提升准确率。其内部的残差块使用了跳跃链接,缓解了在深度神经网络中增长深度带来的梯度消失问题。
  2. darknet53的每个卷积部分使用了特有的DarknetConv2D结构,每一次卷积的时候进行l2正则化,完成卷积后进行BatchNormalization标准化与LeakyReLU。普通的ReLU是将全部的负值都设为零,Leaky ReLU则是给全部负值赋予一个非零斜率。

从特征获取预测结果

一、在特征利用部分,yolo3提取多特征层进行目标检测,一共提取三个特征层,三个特征层位于主干部分darknet53的不一样位置,分别位于中间层,中下层,底层,三个特征层的shape分别为(52,52,256)、(26,26,512)、(13,13,1024)。

二、三个特征层进行5次卷积处理,处理完后一部分用于输出该特征层对应的预测结果,一部分用于进行反卷积UmSampling2d后与其它特征层进行结合。

三、输出层的shape分别为(13,13,75),(26,26,75),(52,52,75),最后一个维度为75是由于该图是基于voc数据集的,它的类为20种,yolo3只有针对每个特征层存在3个先验框,因此最后维度为3x25;
若是使用的是coco训练集,类则为80种,最后的维度应该为255 = 3x85,三个特征层的shape为(13,13,255),(26,26,255),(52,52,255)

其实际状况就是,输入N张416x416的图片,在通过多层的运算后,会输出三个shape分别为(N,13,13,255),(N,26,26,255),(N,52,52,255)的数据,对应每一个图分为13x1三、26x2六、52x52的网格上3个先验框的位置。

预测结果的解码

由第二步咱们能够得到三个特征层的预测结果,shape分别为(N,13,13,255),(N,26,26,255),(N,52,52,255)的数据,对应每一个图分为13x1三、26x2六、52x52的网格上3个预测框的位置。

可是这个预测结果并不对应着最终的预测框在图片上的位置,还须要解码才能够完成。

此处要讲一下yolo3的预测原理,yolo3的3个特征层分别将整幅图分为13x1三、26x2六、52x52的网格,每一个网络点负责一个区域的检测。

咱们知道特征层的预测结果对应着三个预测框的位置,咱们先将其reshape一下,其结果为(N,13,13,3,85),(N,26,26,3,85),(N,52,52,3,85)。

最后一个维度中的85包含了4+1+80,分别表明x_offset、y_offset、h和w、置信度、分类结果。

yolo3的解码过程就是将每一个网格点加上它对应的x_offset和y_offset,加完后的结果就是预测框的中心,而后再利用 先验框和h、w结合 计算出预测框的长和宽。这样就能获得整个预测框的位置了。
在这里插入图片描述
固然获得最终的预测结构后还要进行得分排序与非极大抑制筛选
这一部分基本上是全部目标检测通用的部分。不过该项目的处理方式与其它项目不一样。其对于每个类进行判别。
一、取出每一类得分大于self.obj_threshold的框和得分。
二、利用框的位置和得分进行非极大抑制。

在原图上进行绘制

经过第三步,咱们能够得到预测框在原图上的位置,并且这些预测框都是通过筛选的。这些筛选后的框能够直接绘制在图片上,就能够得到结果了。

YOLOV4

YOLOV4是YOLOV3的改进版,在YOLOV3的基础上结合了很是多的小Tricks。
尽管没有目标检测上革命性的改变,可是YOLOV4依然很好的结合了速度与精度。
根据上图也能够看出来,YOLOV4在YOLOV3的基础上,在FPS不降低的状况下,mAP达到了44,提升很是明显。

YOLOV4总体上的检测思路和YOLOV3相比相差并不大,都是使用三个特征层进行分类与回归预测。
YOLOV4改进的部分(不彻底)
一、主干特征提取网络:DarkNet53 => CSPDarkNet53

二、特征金字塔:SPP,PAN

三、分类回归层:YOLOv3(未改变)

四、训练用到的小技巧:Mosaic数据加强、Label Smoothing平滑、CIOU、学习率余弦退火衰减

五、激活函数:使用Mish激活函数

以上并不是所有的改进部分,还存在一些其它的改进,因为YOLOV4使用的改进实在太多了,很难彻底实现与列出来,这里只列出来了一些我比较感兴趣,并且很是有效的改进。
在这里插入图片描述
主干特征提取网络Backbone的改进点有两个:
a).主干特征提取网络:DarkNet53 => CSPDarkNet53
b).激活函数:使用Mish激活函数
而在YOLOV4中,其对该部分进行了必定的修改。
一、其一是将DarknetConv2D的激活函数由LeakyReLU修改为了Mish,卷积块由DarknetConv2D_BN_Leaky变成了DarknetConv2D_BN_Mish。
Mish函数的公式与图像以下:
在这里插入图片描述
其二是将resblock_body的结构进行修改,使用了CSPnet结构。此时YOLOV4当中的Darknet53被修改为了CSPDarknet53。

特征金字塔

在特征金字塔部分,YOLOV4结合了两种改进:
a).使用了SPP结构。
b).使用了PANet结构。
如上图所示,除去CSPDarknet53和Yolo Head的结构外,都是特征金字塔的结构。
一、SPP结构参杂在对CSPdarknet53的最后一个特征层的卷积里,在对CSPdarknet53的最后一个特征层进行三次DarknetConv2D_BN_Leaky卷积后,分别利用四个不一样尺度的最大池化进行处理,最大池化的池化核大小分别为13x1三、9x九、5x五、1x1(1x1即无处理)

二、PANet是2018的一种实例分割算法,其具体结构由反复提高特征的意思。
在这里插入图片描述
上图为原始的PANet的结构,能够看出来其具备一个很是重要的特色就是特征的反复提取。
在(a)里面是传统的特征金字塔结构,在完成特征金字塔从下到上的特征提取后,还须要实现(b)中从上到下的特征提取。

YoloHead利用得到到的特征进行预测

一、在特征利用部分,YoloV4提取多特征层进行目标检测,一共提取三个特征层,分别位于中间层,中下层,底层,三个特征层的shape分别为(76,76,256)、(38,38,512)、(19,19,1024)。

二、输出层的shape分别为(19,19,75),(38,38,75),(76,76,75),最后一个维度为75是由于该图是基于voc数据集的,它的类为20种,YoloV4只有针对每个特征层存在3个先验框,因此最后维度为3x25;
若是使用的是coco训练集,类则为80种,最后的维度应该为255 = 3x85,三个特征层的shape为(19,19,255),(38,38,255),(76,76,255)

预测结果的解码

由第二步咱们能够得到三个特征层的预测结果,shape分别为(N,19,19,255),(N,38,38,255),(N,76,76,255)的数据,对应每一个图分为19x1九、38x3八、76x76的网格上3个预测框的位置。

可是这个预测结果并不对应着最终的预测框在图片上的位置,还须要解码才能够完成。

此处要讲一下yolo3的预测原理,yolo3的3个特征层分别将整幅图分为19x1九、38x3八、76x76的网格,每一个网络点负责一个区域的检测。

咱们知道特征层的预测结果对应着三个预测框的位置,咱们先将其reshape一下,其结果为(N,19,19,3,85),(N,38,38,3,85),(N,76,76,3,85)。

最后一个维度中的85包含了4+1+80,分别表明x_offset、y_offset、h和w、置信度、分类结果。

yolo3的解码过程就是将每一个网格点加上它对应的x_offset和y_offset,加完后的结果就是预测框的中心,而后再利用 先验框和h、w结合 计算出预测框的长和宽。这样就能获得整个预测框的位置了。
在这里插入图片描述
固然获得最终的预测结构后还要进行得分排序与非极大抑制筛选
这一部分基本上是全部目标检测通用的部分。不过该项目的处理方式与其它项目不一样。其对于每个类进行判别。
一、取出每一类得分大于self.obj_threshold的框和得分。
二、利用框的位置和得分进行非极大抑制。

声明:
yolov1和v2主要参考于知乎csdn
v3和v4主要参考于优秀博主及up主Bubbliiiing
v3
v4
B站 以上均总结与网络,版权归原做者全部,为传播信息而发,若有侵权请联系我,将当即删除。