目标检测算法-YOLO算法纵向对比理解

摘要:
目标检测算法YOLO算法用于纵向比较和理解深度学习的目标检测任务。主要分为两类:一类,两类,以RCNN、FastRCNN、FastRCNN为代表,一类主要包括YOLO、SSD等算法。因为一个部分在最后直接分类和回归,所以一个部分得到了很大的发展。在VOC数据集和COCO数据集中对bbox进行k均值聚类分析后,锚机制从最初的习惯9锚规则减少到仅保留最常见的5锚。

目标检测算法-YOLO算法纵向对比理解

DeepLearning的目标检测任务主要有两大类:一段式,两段式

其中两段式主要包括RCNN、FastRCNN、FasterRCNN为代表,

一段式主要包括YOLO,SSD等算法

由于一段式直接在最后进行分类(判断所属类别)和回归(标记物体的位置框框),所以现在一段式大有发展。


YOLO v1

论文地址:You Only Look Once: Unified, Real-Time Object Detection

目标检测算法-YOLO算法纵向对比理解第1张

YOLOv1是one-stage detector鼻祖、real-time detector鼻祖。

所谓one-stage,即不需额外一个stage来生成RP,而是直接分类回归出output:

目标检测算法-YOLO算法纵向对比理解第2张

YOLOv1直接将整张图片分成 S×S的小格子区域,论文中S=7,共49个每个小格子,每个小格子预测输出 B个bbox、和B个bbox的置信度、以及C个可能的类别(论文中是在Pascal VOC数据集上训练的,S=7,B=2,C=20),论文中输出是S×S×(B*5+C),所以论文输出应是7×7×30的tensor

目标检测算法-YOLO算法纵向对比理解第3张

这里笔者要仔细说下这个算法的anchor box到底是怎么产生的呢?

就是直接将原图分成S×S个格子,每个格子(grid)但是没有去确定anchor box的长宽比等,所以yolo v1时anchor free的。详细解释:

目标检测算法-YOLO算法纵向对比理解第4张

  图片来源[6]

 “简单来说就是网络中用卷积层代替了全连接层,上图所示。输入图片大小是16x16,经过一系列卷积操作,提取了2x2的特征图,但是这个2x2的图上每个元素都是和原图是一一对应的,如图上蓝色的格子对应蓝色的区域,这不就是相当于在原图上做大小为14x14的窗口滑动,且步长为2,共产生4个子区域。最终输出的通道数为4,可以看成4个类别的预测概率值”[6]

其实这么理解:对原图进行卷积得到特征图,特征图上的每个像素都是对应原图中每个小方格但不是anchor box,这里其实还有一种等价说法,特征图上的每个像素的感受野为原图的一个grid(小方格),所以只要对每个像素值做分类回归即可,当特征图上第m,n位置处的像素分类预测为狗时,那么也就等于原图中的第m,n位置的小方格区域预测为属于狗这个类别,将来再配合IoU交并比来去确定bbox的位置大小。

YOLOv1最后一层的输出是一个S×S×(B∗5+C) 的tensor
其中,S为每维的格子段数,B为每格生成的bbox数,C为前景类别数。

目标检测算法-YOLO算法纵向对比理解第5张

YOLO v1包括24个conv layer + 2 fc layer

YOLOv1采用了山寨版的GoogleNet作为backbone;

在第24层时,每个单点对应原图的感受野达到了782×782。而原图只有448×448,覆盖了整张原图。也就意味着,到了第24层的时候,每个单点都能看到整张原图。更不要提第25、26层是两个fc操作了。另外,快速版本的YOLO v1:Fast YOLOv1=9×Conv+2×FC。速度更快,但精度也略低。

这里提供一个感受野计算神器:

https://fomoro.com/research/article/receptive-field-calculator#3,1,1,VALID;2,2,1,VALID;3,1,1,VALID;2,2,1,VALID;3,1,1,VALID;3,1,1,VALID;2,2,1,VALID

那输出是7×7×30的tensor,该tensor又和最终输出结果又是什么关系呢,毕竟tensor没法直接看出来最终的bbox的位置,置信度,类别嘛。

最后一层输出为7×7×30的维度。每个 1×1×30的维度对应原图7×7个cell中的一个,1×1×30中含有类别预测和bbox坐标预测。总得来讲就是让网格负责类别信息,bounding box主要负责坐标信息(部分负责类别信息:confidence也算类别信息)。具体如下

目标检测算法-YOLO算法纵向对比理解第6张

图片来源[8]

$Pr(Class_{i}|Object)*Pr(Object)*IoUmathop{}_{pred}^{truth}=Pr(Class_{i})*IoUmathop{}_{pred}^{truth}$

其中左边第一项$Pr(Class_{i}|Object)$是每个grid预测的类别的信息,第二、三项相乘是每个预测的bbox的置信度,然后整体三者的乘积的意思是encode了预测bbox属于某一类的概率,即每个bounding box的class-specific confidence score

目标检测算法-YOLO算法纵向对比理解第7张

目标检测算法-YOLO算法纵向对比理解第8张

 对每一个网格的每一个bbox执行同样操作: 7×7×2 = 98 bbox  (每个bbox既有对应的class信息又有坐标信息)

目标检测算法-YOLO算法纵向对比理解第9张

目标检测算法-YOLO算法纵向对比理解第10张

目标检测算法-YOLO算法纵向对比理解第11张

 图片来源[8]

得到每个bbox的class-specific confidence score以后,设置阈值,滤掉得分低于阈值的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果

目标检测算法-YOLO算法纵向对比理解第12张

  图片来源[8]

 


 

YOLO v2

论文地址:YOLO9000: Better, Faster, Stronger

 

2.0版本的算法作者发明的一系列操作(Dimension Clusters、Direct location prediction、Multi-Scale Training、DarkNet-19

引入Batch Normalization,涨0.2,防止过拟合。

训练分类的阶段,每10个epoch就在448×448的高像素图片上fine-tune一下,使之能更好地适应高像素的输入图像。该操作对mAP涨0.4。

抛弃后段的FC层,改用anchor机制来预测bbox。该操作虽然使得mAP从69.5降至69.2,但是召回率从81暴涨至88。

Dimension Clusters (维度聚类) 。经过对VOC数据集和COCO数据集中bbox的k-means聚类分析,将anchor机制中原本惯用的 9 anchor 法则 删减为仅保留最常出现的 5 anchor 。其中,狭长型的anchor是被保留的主体。即,先验的anchor box是通过IoU聚类得到的。
新的 encode/decode机制 —— Direct location prediction (直接位置预测) 。号称用新的位置预测算法来缩小参数范围,使之更容易学习,也使得网络更加稳定。然而现在看来并没有什么影响力,大家主流用的还是Faster R-CNN中设计好的那一套encode/decode机制。

在 26×26 size层设置了通道层接至 13×13 size层。号称保留了更多的位置信息,从而提升细粒度分类的能力。本质上即为single-scale上处理two-scale的feature map信息。该操作涨点1。

Multi-Scale Training (多尺度训练) 。每10个batch就在 320,352,...,608(均为32整数倍)320,352,...,608(均为32整数倍) 中随机选择一个新的input size,该操作据说能锻炼对多尺度input的预测能力。个人感觉这就是集成学习。

passthrough层:和Resnet很像,它把前面高分辨率的特征和后面低分辨率的特征合并在一起,为了保持合并时shape的一致性,所以有很好的细粒度。
对于anchor box和bbox的理解

目标检测算法-YOLO算法纵向对比理解第13张

 图片来源[7]

 "yolo v2 借鉴了RPN的技巧,但是是略有不同的。

Anchor box:上图的黑色虚线框,$ p_{w} $ 和 $ p_{h} $代表它的长宽,

问题1:anchor box的中心点在哪?

BoundingBox:上图蓝色框,通过回归得到偏移值后,以anchor box为基准进行尺度缩放变换后的框,$b_{w}$和$b_{h}$是根据anchor box的$ p_{w} $ 和 $ p_{h} $来变化的。

问题2:Boundingbox 的值是如何变化的呢?

上面这个图有点误导人,这个是框回归产生偏移之后的结果。因为 anchor box作为参考基准,它的整体位置和中心点应该是不变的,但是图里面居然也随着变动了位置,具体原因见下面的分析。

分析与解释:

yolo通过聚类得到的9种先验框(anchor box)的高宽(是一个固定值 参考上图设为:$P_{w}$,$P_{h}$),只是用几个固定的宽高比例来描述anchor box的尺寸信息的,所以论文中聚类得到的是5种anchor box的高宽,不需要中心坐标!那么"中心坐标"在哪呢? 回忆,上面yolo v1中是将图片划分成N×N的块,每一块都是原图片的一小块(如上图的红色小块),而anchor box的这个所谓的中心点其实可以看作是每一块的左上角坐标,如上图的箭头所指点C,其中$C_{x}$和$C_{y}$是C点的坐标,这里先假设$t_{x}$,$t_{y}$,$t_{w}$,$t_{h}$是网络输出的预测值,代表坐标的偏移值(将函数值约束到[0,1]),就可以使得偏移后的C点也就是中心点落在红色这一块中)按上图公式进行计算$sigma(t) + C$就是以C点为基准进行$sigma(t)$(取值0-1)不超过一个框大小的偏移。而计算$b_{w}$和$b_{h}$就是唯一用到anchor box的地方,只用到了anchorbox的宽高($P_{w}$和$P_{h}$)。$e^{t_{w}}$,$e^{t_{h}}$代表着缩放比例,将$e^{t_{w}}$,$e^{t_{h}}$和($P_{w}$,$P_{h}$)相乘后得到缩放后的长宽(参考上图),最后得到的这个($b_{x}$,$b_{y}$,$b_{w}$,$b_{h}$)就是描述的BoundingBox(预测框)的信息。

那么如何去描述他们的损失呢? 

首先,yolo按照上面同样的方式先用GroundTruth(真实框)和anchor box(先验框,锚框)反向算出偏移和缩放比,设为$d_{x}$,$d_{y}$,$d_{h}$,$d_{w}$,这个即标签label。

然后网络输出的BoundingBox(预测框)是$t_{x}$,$t_{y}$,$t_{h}$,$t_{w}$四个值(代表相较于anchor box(先验框,锚框)的偏移和缩放比),这个是网络输出预测值predict。

我们的目标是通过网络不断学习得到的($t_{x}$,$t_{y}$,$t_{w}$,$t_{h}$)这四个值,然后用这四个值去微调(平移,缩放)anchor box(先验框,锚框)得到BoundingBox(预测框),使得BoundingBox不断接近GroundTruth(真实框),也就是($t_{x}$,$t_{y}$,$t_{w}$,$t_{h}$)不断的接近($d_{x}$,$d_{y}$,$d_{h}$,$d_{w}$),梯度下降的目标也就是缩小这两者的LOSS,这就是yolov2中的回归方法。 (具体YOLO损失函数可以网上搜索)"[7]

不如看这个图[7]

目标检测算法-YOLO算法纵向对比理解第14张

 作者嫌弃主流backbone VGG-16计算量太大(224×224的图像需要计算30.69 billion次浮点运算),于是自己发明了DarkNet-19出来。

目标检测算法-YOLO算法纵向对比理解第15张

 softmax嵌套softmax,从而实现分级语法树,带有分级语法树的YOLOv2,进化为了YOLO9000

YOLO v2结构

目标检测算法-YOLO算法纵向对比理解第16张

 YOLOv2的网络架构,22卷积层,global average pooling替代了FC(全连接层)

最终输出tensor解释

目标检测算法-YOLO算法纵向对比理解第17张

 图片来源[9]


YOLO v3

论文地址:YOLOv3: An Incremental Improvement

backbone从darknet-19增加到了darknet-53

该文章继承了YOLOv2的bbox预测任务的方法,即预测相对于anchor box的偏移值,对bbox分类任务进行了修改 (用logistic替换下softmax) 

目标检测算法-YOLO算法纵向对比理解第18张

图片来源[10]

ResX组件中每个Res unit前都有一个CBL组件,该组件是为了降采样。

我们将Neck部分用立体图画出来,更直观的看下两部分之间是如何通过FPN结构融合的。

目标检测算法-YOLO算法纵向对比理解第19张

 DarkNet-53结构

目标检测算法-YOLO算法纵向对比理解第20张

且大大改善了YOLO之前的一大弊病:小物体漏检。使之在APs这一单项上能够达到和 FPN 同级别,且仅逊于RetinaNet的程度


YOLO v4

论文地址:YOLOv4: Optimal Speed and Accuracy of Object Detection

代码地址:https://github.com/AlexeyAB/darknet

目标检测算法-YOLO算法纵向对比理解第21张

作者对比了 YOLOv4 和当前最优目标检测器,发现 YOLOv4 在取得与 EfficientDet 同等性能的情况下,速度是 EfficientDet 的二倍!此外,与 YOLOv3 相比,新版本的 AP 和 FPS 分别提高了 10% 和 12%。笔者刚撸完EfficientDet,结果更牛又出来了。。。

YoloV4的架构:

目标检测算法-YOLO算法纵向对比理解第22张

图片来源[10]

  1. 输入端:这里指的创新主要是训练时对输入端的改进,主要包括Mosaic数据增强、cmBN、SAT自对抗训练

  2. BackBone主干网络:将各种新的方式结合起来,包括:CSPDarknet53、Mish激活函数、Dropblock

  3. Neck:目标检测网络在BackBone和最后的输出层之间往往会插入一些层,比如Yolov4中的SPP模块、FPN+PAN结构

  4. Prediction:输出层的锚框机制和Yolov3相同,主要改进的是训练时的损失函数CIOU_Loss,以及预测框筛选的nms变为DIOU_nms

前面CSPDarknet53中讲到,每个CSP模块前面的卷积核都是3*3大小,相当于下采样操作。

因此可以看到三个紫色箭头处的特征图是76*76、38*38、19*19。

以及最后Prediction中用于预测的三个特征图:①76*76*255,②38*38*255,③19*19*255。

我们也看下Neck部分的立体图像,看下两部分是如何通过FPN+PAN结构进行融合的。

目标检测算法-YOLO算法纵向对比理解第23张

 图片来源[10]

加权残差连接(WRC)

Cross-Stage-Partial-connection,CSP

Cross mini-Batch Normalization,CmBN

自对抗训练(Self-adversarial-training,SAT)

leaky ReLU和Mish 激活(Mish-activation)

输入是Mosaic 数据增强

DropBlock 正则化

CIoU 损失,对bbox的回归损失

$CIoU_Loss=1-CIoU=1-(IoU-frac{Distance_2^{2}}{Distance_C^{2}}-frac{v^{2}}{(1-IoU)+v})$

$v=frac{4}{pi^{2}}(arctanfrac{W^{gt}}{h^{gt}}-arctanfrac{W^{p}}{h^{p}})^{2}$

YoloV4 的基本目标是提高生产系统中神经网络的运行速度,同时为并行计算做出优化,而不是针对低计算量理论指标(BFLOP)进行优化。YoloV4 的作者提出了两种实时神经网络:

对于 GPU,研究者在卷积层中使用少量组(1-8 组):CSPResNeXt50 / CSPDarknet53;

对于 VPU,研究者使用了分组卷积(grouped-convolution),但避免使用 Squeeze-and-excitement(SE)块。具体而言,它包括以下模型:EfficientNet-lite / MixNet / GhostNet / MobileNetV3

YOLOv4 包含以下三部分:

backbone网络:CSPDarknet53

Neck:SPP、PAN

Head:YOLOv3

具体而言,YOLO v4 使用了:

用于骨干网络的 Bag of Freebies(BoF):CutMix 和 Mosaic 数据增强、DropBlock 正则化和类标签平滑;

用于骨干网络的 Bag of Specials(BoS):Mish 激活、CSP 和多输入加权残差连接(MiWRC);

用于检测器的 Bag of Freebies(BoF):CIoU-loss、CmBN、DropBlock 正则化、Mosaic 数据增强、自对抗训练、消除网格敏感性(Eliminate grid sensitivity)、针对一个真值使用多个锚、余弦退火调度器、优化超参数和随机训练形状;

用于检测器的 Bag of Specials(BoS):Mish 激活、SPP 块、SAM 块、PAN 路径聚合块和 DIoU-NMS。

为了使检测器更适合在单个 GPU 上进行训练,研究者还做出了以下额外的设计与改进:

提出新型数据增强方法 Mosaic 和自对抗训练(SAT);

在应用遗传算法时选择最优超参数;

新型数据增强方法 Mosaic 混合了 4 张训练图像,而 CutMix 只混合了两张输入图像。

自对抗训练(SAT)也是一种新的数据增强方法,它包括两个阶段。第一个阶段中,神经网络更改原始图像;第二阶段中,训练神经网络以正常方式在修改后的图像上执行目标检测任务。

CmBN 是 CBN 的改进版,它仅收集单个批次内 mini-batch 之间的统计数据。

Yolov4在Yolov3的基础上进行了很多的创新。
比如输入端采用mosaic数据增强,
Backbone上采用了CSPDarknet53、Mish激活函数、Dropblock等方式,
Neck中采用了SPP、FPN+PAN的结构,
输出端则采用CIOU_Loss、DIOU_nms操作。


YOLO v5

论文地址:暂无

代码地址:https://github.com/ultralytics/yolov5

 yolov5s版本的架构:

目标检测算法-YOLO算法纵向对比理解第24张

 图片来源[10-11]

1)输入端:Mosaic数据增强、自适应锚框计算(聚类)
2)Backbone:Focus结构,CSP结构
3)Neck:FPN+PAN结构
4)Prediction:GIOU_Loss

focus结构:

目标检测算法-YOLO算法纵向对比理解第25张

 图片来源[11]

GIOU_Loss做Bounding box的损失函数

Reference

[1] https://blog.csdn.net/jningwei/article/details/80010567

[2] https://zhuanlan.zhihu.com/p/73606306?from_voters_page=true

[3] https://cloud.tencent.com/developer/article/1347518

[4] https://blog.csdn.net/jningwei/article/details/80022603

[5] https://tech.sina.com.cn/roll/2020-04-24/doc-iircuyvh9580271.shtml

[6] https://www.cnblogs.com/liuboblog/p/11729329.html

[7] https://blog.csdn.net/shenkunchang1877/article/details/105648111

 [8] https://blog.csdn.net/c20081052/article/details/80236015

 [9] https://zhuanlan.zhihu.com/p/25167153

 [10] https://mp.weixin.qq.com/s?__biz=MzUyMjE2MTE0Mw%3D%3D&chksm=f9d14616cea6cf008515d3a99179771f577e1e5e5269dd132751cd8184d6c0adfa93ed2f93ca&idx=1&mid=2247489678&scene=21&sn=c8bd061cea81c57d95a02987073f085b#wechat_redirect

 [11] https://blog.csdn.net/l7h9ja4/article/details/109152890

    

 

免责声明:文章转载自《目标检测算法-YOLO算法纵向对比理解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇oracle多表关联查询和子查询鼠标放在放在输入框上面提示效果下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

小目标检测技术分析

小目标检测技术分析 小目标检测及跟踪系统分为四个模块: · 硬件模块   该模块基于标准PCI总线,并配以超大规模可编程芯片(DSP、FPGA),具有极强的运算、处理能力。 · DSP 程序模块   其功能主要实现复杂背景下的小目标检测、跟踪。考虑到系统的实时性要求,复杂背景下的小目标检测采用红外能量积累技术。首先对红外图像进行增强;然后在对小目标进行粗检...

YOLOv3:训练自己的数据(附优化与问题总结)

环境说明 系统:ubuntu16.04 显卡:Tesla k80 12G显存 python环境: 2.7 && 3.6 前提条件:cuda9.0 cudnn7.0 opencv3.4.0 安装cuda和cudnn教程 安装opencv3.4.0教程 实现YOLOV3的demo 首先安装darknet框架,官网链接 git c...

YOLO v4分析

YOLO v4分析 YOLO v4 的作者共有三位:Alexey Bochkovskiy、Chien-Yao Wang 和 Hong-Yuan Mark Liao。其中一作 Alexey Bochkovskiy 是位俄罗斯开发者,此前曾做出 YOLO 的 windows 版本。那么,YOLOv4 性能如何呢? 在实际研究中,有很多特性可以提高卷积神经网络(...

配置glibc

cmake_minimum_required(VERSION 3.10)project(yolo_example)set(CMAKE_CXX_STANDARD 11)include(FindPkgConfig)pkg_check_modules(GLIB glib-2.0 REQUIRED)include_directories(${GLIB_INCLUD...

VOC标签转化为YOLO标签

参考darknet自带的voc_label.py import xml.etree.ElementTree as ET import pickle import os from os import listdir, getcwd from os.path import join classes = ["dog", "cat"] def convert...

【YOLO】YOLO网络中参数的解读

1.Batch_Size(批尺寸) 该参数主要用于批梯度下降算法(Batch Gradient Descent)中,批梯度下降算法是每次迭代都遍历批中的所有样本,由批中的样本共同决定最优的方向,Batch_Size 正是批中的样本数量。  若数据集比较小,可以采用全数据集(Full Batch Learning)的形式,由全数据确定的方向能更好地代表样本总...