当前位置: 首页 > news >正文

[目标检测] YOLO系列算法讲解

前言

目标检测就是做到给模型输入一张图片或者视频,模型可以迅速判断出视频和图片里面感兴趣的目标所有的位置和它 的类别,而当前最热门的目标检测的模型也就是YOLO系列了。

YOLO系列的模型的提出,是为了解决当时目标检测的模型帧率太低而提出来的模型,英文全称是

You only look once。

深度学习目标检测算法分类:

(1)two-stage 两个阶段的检测,模型举例 Faster-RCNN Mask-Rcnn系列

   (2) one-stage 一个阶段的检测:YOLO系列

这两个主要区别可以简单理解为,两个阶段有一个选择预选框和物体分类的一个过程,而单阶段的将检测问题转换为一个回归问题

下边来详细讲解YOLO系列的各个阶段的模型。

一、YOLOv1

1、模型背景

YOLOV1,是以Joseph Redmon为首的大佬们于2015年提出的一种新的目标检测算法。它与之前的目标检测算法如R-CNN等不同之处在于,R-CNN等目标检测算法是两阶段算法, 步骤为先在图片上生成候选框,然后利用分类器对这些候选框进行逐一的判断;而YOLOv1是一阶段算法,是端到端的算法,它把目标检测问题看作回归问题,将图片输入单一的神经网络,然后就输出得到了图片的物体边界框(boundingbox)以及分类概率等信息。

总结:YOLOv1直接从输入的图像,仅仅经过一个神经网络,直接得到一些bounding box(位置坐标)以及每个bounding box对所有类别的一个概率情况,因为整个的检测过程仅仅有一个网络,所以可以直接进行端到端的优化,而无需像Faster R-CNN的分阶段的优化。

end-to-end(端到端):指的是一个过程,输入原始数据,输出最后结果。之前的网络Fast RCNN等这种网络分为两个阶段,一个是预选框的生成和目标分类与边界框回归,具体内容大家可以自行理解。

YOLO的核心思想就是把目标检测转变为一个回归问题,利用整张图作为网络的输入,仅仅经过一个神经网络,得到bounding box(边界框) 的位置及其所属的类别。

2、网络结构

YOLOv1的网络结构简单清晰,是一个最传统的one-stage的卷积神经网络。

网络输入:448*448*3的三通道图片

中间层:由若干卷积层和最大池化层组成,用于提取图片的抽象特征。

全连接层:由两个全连接层组成,用来预测目标的位置和类别概率值。

网络输出:7*7*30的预测结果。

3、网络细节

YOLOv1采用的是”分而治之“的策略,将一张图片平均分成7*7个网格,每个网格分别负责预测中心点落在该网格内的坐标,回忆一下,在Faster R-CNN中,是通过一个RPN来获得目标的感兴趣区域,这种方法精度很高,但是需要额外训练一个RPN网络,这无疑增加了训练的负担。在YOLOv1中,通过划分得到7*7个网络,(原图划分),这49个网格就相当于是目标的感兴趣区域。通过这种方式,我们就不需要再额外设计一个RPN网络,这正是YOLOv1作为单阶段网络的简单快捷之处。

补充说明过程:

1、将一副图像分成S*S个网格(grid cell),如果某个目标的中心落在这个网格中,那么这个网络就负责预测这个object。(原本中是7个)

2、每个网格要预测B个bounding box,每个bounding box要预测(x,y,w,h)和confidence共五个值。文中B为2。

其中:x和y是这些边界框的中心坐标相对于网格单元格的坐标。也就是说,x和y是边界框中心点相对于网格单元左上角的偏移量。坐标是以网格单元格的宽度和高度为单位的相对值。因此这两个值表示的是边界框中心的精确位置。

w和h,这些是边界框的宽度和高度的相对值,通常是相对于整张图片的宽度和高度,它们表示边界框的大小,也就是边界框的高度和宽度的预测值,这些值通常是对整张图片的归一化的比例值。

confidence(置信度):描述的是边界框的置信度(边界框包含物体的概率)。换句话说,它衡量了边界框中确实有物体的可信度。

3、每个网格还需要预测一个类别信息,记为C个类。文中为20,

4、总的来说,S*S个网格,每个网格预测2个bbx,还要预测20个类,那么网络最后输出的就是一个7*7*30.

在模型最后是生成了98个边界框,生成完边界框后,通过NMS(非极大值预测)来筛选出最优的边界框。

4、预测阶段

在模型训练完成后,向搭载玩参数的模型输入图片,然后得到最后结果的一个过程。

将网络当成一个黑箱子,输入的是一个448*448*3的RGB图像,最后输出的一个7*7*30的向量。

整体的网络结构很简单,都是卷积、池化、全连接层,一目了然。

而最后输出的向量,包含了类别、框、置信度等结果,而我们只需要解释这个向量就得到最后的结果了。

下面对最后输出的向量,进行一个分析,当我们输入一张图片的时候,最后会生成7*7*30的向量,如何去理解呢,可以将这个向量看做成7*7个1*30的向量,也就是49个1*30的向量,这里的每个1*30的向量,对应于前面的一个grid cell,将向量拆分为两个预测框的坐标以及预测框包含物体的置信度,和20个类别的条件概率。其中每个gridcell只会预测一个物体,也因此暴露出YOLOv1在小目标上检测的缺陷。然后预测中又引入了NMS向量对上述的98个框进行筛选,最后才可以得出我们的结果。

5、训练阶段

这个阶段,我首先主要是解释一下几个问题,

,首先是YOLOv1是端到端的一个网络,也就是输入的是原图,输出的是一个向量,而训练的过程包括两个过程,一个是前向传播,另一个就是反向传播,通过不断迭代,使梯度下降,进而使损失函数最小化,这个过程。训练的流程大致为,输入batchsize张图片,得出batchsize*7*7*30的一个张量,将该张量与标签(batchsize*7*7*30的向量)计算出损失为多少,然后根据这个损失对网络的参数进行梯度计算,不断迭代,不断优化参数,这样的一个过程。我觉得这样理解好理解的多。

这个代码大致流程可以分为以下部分

1、超参数初始化

2、数据初始化,构造数据迭代器,因为原本一张图片对应的标签并不是7*7*30的一个向量,因此要对数据进行预处理,把每一个图片的标签变成7*7*30的一个格式。

3、网络初始化,我这里给的代码使ResNet50的网络,这个网络也叫做backbone大家以后会经常看到的,网络结构差不多,然后输入是bs*448*448*3,输出就是bs*7*7*30的这样一个结构

4、上述都可以看成初始化过程,然后就开始训练,也就是前向传播,反向传播,参数优化这样迭代的一个过程,最后保存参数。

6、损失函数

可以大致看成四个部分,

第一部分表示负责检测物体的bounding box中心点定位误差,要和ground truth尽可能拟合,x xx带上标的是标注值,不带上标的是预测值。

第二表示表示负责检测物体的bounding box的宽高定位误差,加根号是为了使得对小框的误差更敏感。

第三部分:

第四部分是负责检测物体的grid的分类误差。

7、总结

模型优点:YOLO检测速度非常快,标准版本的YOLO可以每秒处理45张图像,YOLO的极速版本可以每秒处理150帧图像,这就意味着该模型可以实时处理视频,在当时,准确率比它高的,速度没他快,速度比他快的,精度没他高。

迁移能力强,能运用到其他新的领域。

局限:

1、YOLO对相互靠近的物体,以及很小的群体检测效果不好,因为只预测了98个框。假如一张图片有200个目标的话,根本检测不完。

2、由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体的处理上。有待提高。

3、对一些不常见的角度的目标泛化性能差。

二、YOLOv2

1、模型背景

2017年,作者 Joseph Redmon 和 Ali Farhadi 在 YOLOv1 的基础上,进行了大量改进,提出了 YOLOv2 和 YOLO9000。重点解决YOLOv1召回率和定位精度方面的不足。

YOLOv2 是一个先进的目标检测算法,比其它的检测器检测速度更快。除此之外,该网络可以适应多种尺寸的图片输入,并且能在检测精度和速度之间进行很好的权衡。

相比于YOLOv1是利用全连接层直接预测Bounding Box的坐标,YOLOv2借鉴了Faster R-CNN的思想,引入Anchor机制。利用K-means聚类的方法在训练集中聚类计算出更好的Anchor模板,大大提高了算法的召回率。同时结合图像细粒度特征(特征融合),将浅层特征与深层特征相连,有助于对小尺寸目标的检测。

YOLO9000 使用 WorldTree 来混合来自不同资源的训练数据,并使用联合优化技术同时在ImageNet和COCO数据集上进行训练,能够实时地检测超过9000种物体。由于 YOLO9000 的主要检测网络还是YOLOv2,所以这部分以讲解应用更为广泛的YOLOv2为主。

2、网络结构

YOLOv2 采用 Darknet-19 作为特征提取网络,DarkNet-19,后边的19指的是用了19个卷积层的意思。其整体结构如下:

说明:

1、DarkNet-19与VGG网络相似,使用了很多3*3的卷积核;并且每一次池化后,下一层的卷积核的通道数 = 池化输出的通道*2

2、每一次卷积后,都增加了BN(批量标准化)进行预处理。

3、采用了降维的思想,把1*1的卷积置于3*3之间,用来压缩特征。

4、在网络最后的输出增加了一个global average pooling层,这个层就是把一个二维的特征图缩减成一个数的一个操作。

5、网络整体上采用了19个卷积层、5个池化层。

上述流程中有很多细节之处,我简单总结一下。

1、在YOLOv1当中有全连接层,所以在YOLOv1当中是引入了Dropout正则化,用来防止过拟合,而在YOLOv2中去掉了全连接层,引入了BN层,在每一个卷积层后都加入了BN,也就是网络的每一层都做了归一化,收敛起来相对简单,引入BN层后提升了2%的MAP,目前BN层可以说是网络模型必备的处理方法。

2、引入了1*1和全局最大值池化对网络的参数量有很大减少,减少了计算量,提升了检测速度。

3、网络细节

1、引入了anchor机制

这个机制在Faster R-CNN中引入的,在YOLOV1是直接做的回归计算出bbx(bounding box)坐标值,并且是从全连接层变化来的,这会丢失较多的的空间信息,导致定位精度不高,并且在前期训练时很困难,很难收敛。

而YOLOv2中借鉴了Faster R-CNN中的anchor思想,使得网络在训练时更容易收敛。这里引入的机制,相对于FasterR-cnn中的anchor机制做了一些改进,在rcnn中是初始化设定好的anchor,而在YOLO中是通过K-means聚类的方法来选择出的合适训练数据集的anchor,K-means聚类在后续进行介绍。通过提前筛选得到的具有代表性先验框Anchors,使得网络在训练时更容易收敛。

在Faster R-CNN算法中,是通过预测boundingbox与ground truth的位置偏移值tx和ty,间接得到的boundingbox的位置,其公式如下:

这个公式是无拘束的,预测边界框很容易向任何方向偏移。因此,每个位置预测的边界框可以落在图片的任何位置,这会导致模型很不稳定。

因此YOLOv2在上述方法做了提高,预测边界框中心点相对于该网格左上角坐标(Cx,Cy)的相对偏移量,同时为了将bounding box的中心点坐标约束在当前网格中,使用sigmoid函数将tx和ty归一化处理,让这个值约束在0-1,

下图为anchor box 与 bounding box转换的示意图,其中蓝色是要预测的bounding box,黑色虚线框是Anchor box。

YOLOv2在最后一个卷积层输出了13*13的feature map,意味着一张图片被分成了13*13个网格,每个网格有5个anchor box来预测5个bounding box,每个bounding box预测得到五个值:tx、ty、tw、th和to,通过这五个值简介预测得到的bounding box的位置的计算公式为:

YOLOv1有一个缺陷是,一张图片被分成了7*7的网络,一个网格只能预测一个类,当一个网格中出现了多个类时,就无法检测出所有的类,针对这个问题,YOLOv2做出了相对应的改进:

1、首先将YOLOv1网络的FC层和最后一个Pooling层去掉,使得最后的卷积层的输出可以有更高的分辨率特征。

2、然后缩减网络,用416×416大小的输入代替原来的448×448,使得网络输出的特征图有奇数大小的宽和高,进而使得每个特征图在划分单元格的时候只有一个中心单元格(Center Cell)。YOLOv2通过5个Pooling层进行下采样,得到的输出是13×13的像素特征。
3、借鉴Faster R-CNN,YOLOv2通过引入Anchor Boxes,预测Anchor Box的偏移值与置信度,而不是直接预测坐标值。
4、采用Faster R-CNN中的方式,每个Cell可预测出9个Anchor Box,共13×13×9=1521个(YOLOv2确定Anchor Boxes的方法见是维度聚类,每个Cell选择5个Anchor Box)。比YOLOv1预测的98个bounding box 要多很多,因此在定位精度方面有较好的改善。

2、K-means聚类方法选择Anchors

Faster R-CNN 中 Anchor Box 的大小和比例是按经验设定的,不具有很好的代表性。若一开始就选择了更好的、更有代表性的先验框Anchor Boxes,那么网络就更容易学到准确的预测位置了!

YOLOv2 使用 K-means 聚类方法得到 Anchor Box 的大小,选择具有代表性的尺寸的Anchor Box进行一开始的初始化。传统的K-means聚类方法使用标准的欧氏距离作为距离度量,这意味着大的box会比小的box产生更多的错误。因此这里使用其他的距离度量公式。聚类的目的是使 Anchor boxes 和临近的 ground truth boxes有更大的IOU值,因此自定义的距离度量公式为 :

到聚类中心的距离越小越好,但IOU值是越大越好,所以使用 1 - IOU;这样就保证距离越小,IOU值越大。具体实现方法如下:

 如下图所示,是论文中的聚类效果,其中紫色和灰色也是分别表示两个不同的数据集,可以看出其基本形状是类似的。

从下表可以看出,YOLOv2采用5种 Anchor 比 Faster R-CNN 采用9种 Anchor 得到的平均 IOU 还略高,并且当 YOLOv2 采用9种时,平均 IOU 有显著提高。说明 K-means 方法的生成的Anchor boxes 更具有代表性。为了权衡精确度和速度的开销,最终选择K=5。

3、特征融合 Fine-Grained Features

细粒度特征,就是不同层之间的特征融合,和残差里面的概念很像,就是把浅层特征和深层特征融合在一起。YOLOv2通过添加了一个Passthrough Layer,把浅层特征和深层特征在不同的通道上进行融合,具体操作是:先获取浅层的26*26的特征图,再将最后输出的13*13的特征图进行拼接,再输入检测器进行检测,以此来提高对小目标的检测能力。

Passthrough层与ResNet网络的shortcut类似,以前面更高分辨率的特征图为输入,然后将其连接到后面的低分辨率特征图上。前面的特征图维度是后面的特征图的2倍,passthrough层抽取前面层的每个2×2的局部区域,然后将其转化为channel维度,对于26×26×512的特征图,经Passthrough层处理之后就变成了13×13×2048的新特征图(特征图大小降低4倍,而channles增加4倍),这样就可以与后面的13×13×1024特征图连接在一起形成13×13×3072的特征图,然后在此特征图基础上卷积做预测。示意图如下:

4、总结

在VOC2007数据集上进行测试,YOLOv2在速度为67fps时,精度可以达到76.8的mAP;在速度为40fps时,精度可以达到78.6的mAP,可以在速度和精度之间进行平衡。

三、YOLOv3

1、模型背景

2018年,作者Redmon又在YOLOv2的基础上做了一些改进,特征提取部分(backbone)网络结构darknet53代替了原来的darknet19,利用特征金字塔网络实现了多尺度预测,分类方法使用逻辑回归代替了softmax,在兼顾实时性的同时保证了目标检测的准确性。

从YOLOv1到YOLOv3,每一代性能的提升都与backbone(骨干网络)的改进密切相关。在YOLOv3中,作者不仅提供了darknet-53,还提供了轻量级的tiny-darknet。如果你想要检测精度与速度兼具,可以选择darknet-53作为backbone;如果希望达到更快的检测速度,精度方面可以妥协,那么tiny-darknet是最好的选择。总之,YOLOv3的灵活性使得在实际工程中得到很多人的青睐。

2、网络结构

相比于YOLOv2的骨干网络,YOLOv3进行了较大的改进。借助残差网络的思想,YOLOv3将原来的darknet-19改进成了darknet-53,论文中给出的整体结构如下。

DarkNet-53主要是由1*1和3*3的卷积核组成。每个卷积层之后包含一个批量归一化层和一个Leaky Relu,加入这两个部分的目的是防止过拟合。卷积层、批量归一化层以及Leaky Relu共同组成DarkNet-53中的基本卷积单元DBL。因为在DarkNet-53中包含53个这样的DBL,所以称为Darknet-53.

为了更加清晰了解DarkNet-53的网络结构,可以看下面这张图:

网络结构其实看的话,不是算很复杂。下面对主要的几个单元进行解释。

1、DBL:一个卷积层、一个BN层和一个Leaky ReLU组成的基本卷积单元。

这个是组成网络的基本组成单元,其中的话,中间层经过一个DBL后,特征图的大小不会发生变化

2、res unit:输入通过两个DBL后,再与原输入进行add;这是一种常规的残差单元。残差单元的目的是为了让网络可以提取到更深层次的特征,同时避免出现梯度消失或者爆炸。

通过一个残差块后,特征图的尺寸并没有发生变化,不管是特征图的长宽,还是特征图的通道数,都没有发生变化。

3、resn:其中的n表示的是n个res unit;所以resn = Zero Padding +DBL+n*res unit

4、concat:将darknet-53的中间层和后面的某一层的上采样进行张量拼接,达到多尺度特征融合的目的。这与残差层的add操作是不一样的,拼接会扩充张量的维度,而add直接相加不会导致张量维度的改变。

Y1、Y2、Y3:分别表示YOLOv3三种尺度的输出。

与darkNet-19对比可知,darkNet-53主要做了如下改进。

1、没有采用最大池化层,而是采用步长为2的卷积层进行下采样。

2、为了防止过拟合,每个卷积层后加入了一个BN层和一个Leaky ReLU。

3、引入了残差网络的思想,目的是为了让网络可以提取到更深层的特征,同时为了防止出现梯度的消失和爆炸。

4、将网络的中间层和后面某一层的上采样进行张量拼接,达到多尺度特征融合的目的。

3、改进之处

YOLOv3最大的改进之处还在于网络结构的改进,由于上面已经讲过了。因此下面主要对其他改进方面进行介绍。

1、多尺度预测

为了能给预测多尺度的目标,YOLOv3选了三种不同shape的Anchors,同时每种Anchors具有三种不同的尺度,一共9种不同大小的Anchors。在COCO数据集上选择的9种Anchors的尺寸如下图红色框所示:

借鉴特征金字塔网的思想,YOLOv3设计了三种不同尺度的网络输出Y1、Y2、Y3、目的是为了预测不同尺度的坐标,由于每一个尺度网格都负责预测3个边界框,且COCO数据集有80个类。所以网络输出的张量应该是:N*N*(3*(5+1+80)).由下采样次数不同,得到的N不同,最终,Y1、Y2、Y3的shape分别为:[13, 13, 255]、[26, 26, 255]、[52, 52, 255]。可见参见原文:

先写到这里,后续有时间再写。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章:

  • Manus逆向工程:AI智能体的“思考”与“行动”
  • Nginx 反向代理 静态文件404异常处理
  • 【SSL证书系列】客户端如何验证https网站服务器发的证书是否由受信任的根证书签发机构签发
  • MySQL知识点总结(持续更新)
  • 企业数字化转型背景下的企业知识管理挑战与经验杂谈
  • GTM4.1-CCM
  • ARM杂谈——临界段保护恢复的中断状态可靠吗
  • 【解析:新能源汽车芯片主要玩家及技术发展】
  • 码题集——魔数、A的B次方、网球比赛、三角形、点与线段的关系
  • 数据清洗的艺术:如何为AI模型准备高质量数据集?
  • ACM算法
  • redis 缓存穿透,缓存击穿,缓存雪崩
  • LeetCode Hot100 (1/100)
  • 数据科学和机器学习的“看家兵器”——pandas模块 之一
  • flutter 视频通话flutter_webrtc
  • 【网络编程】八、Cookie Session 抓包原理
  • 火山引擎实时音视频 高代码跑通日志
  • 深度学习Dropout实现
  • day25-异常处理
  • Python爬虫之品牌口碑数据抓取
  • 3年多来俄乌要首次直接对话?能谈得拢吗?
  • 日本前卫艺术先驱群展上海:当具体派相遇古树古宅
  • 重庆发布经济犯罪案件接报警电子地图,企业可查询导航属地经侦服务点
  • 美政府以拨款为要挟胁迫各州服从移民政策,20个州联合起诉
  • 宝通科技:与宇树合作已签约,四足机器人在工业场景落地是重点商业化项目
  • 北京航空航天大学首个海外创新研究院落户巴西