YOLO v1深入理解

YOLO v1深入理解,第1张

YOLO(You Only Look Once)是一种基于深度神经网络的对象识别和定位算法,其最大的特点是运行速度很快,可以用于实时系统。

现在YOLO已经发展到v3版本,不过新版本也是在原有版本基础上不断改进演化的,所以本文先分析YOLO v1版本。

关于 YOLOv2/YOLO9000 的分析理解请移步 YOLO v2 / YOLO 9000 。

输入一张,要求输出其中所包含的对象,以及每个对象的位置(包含该对象的矩形框)。

对象识别和定位,可以看成两个任务:找到中某个存在对象的区域,然后识别出该区域中具体是哪个对象。

对象识别这件事(一张仅包含一个对象,且基本占据的整个范围),最近几年基于CNN卷积神经网络的各种方法已经能达到不错的效果了。所以主要需要解决的问题是,对象在哪里。

最简单的想法,就是遍历中所有可能的位置,地毯式搜索不同大小,不同宽高比,不同位置的每个区域,逐一检测其中是否存在某个对象,挑选其中概率最大的结果作为输出。显然这种方法效率太低。

RCNN开创性的提出了候选区(Region Proposals)的方法,先从中搜索出一些可能存在对象的候选区(Selective Search),大概2000个左右,然后对每个候选区进行对象识别。大幅提升了对象识别和定位的效率。

不过RCNN的速度依然很慢,其处理一张大概需要49秒。因此又有了后续的Fast RCNN 和 Faster RCNN,针对 RCNN的神经网络结构和候选区的算法不断改进,Faster RCNN已经可以达到一张约02秒的处理速度。下图来自 R-CNN, Fast R-CNN, Faster R-CNN, YOLO — Object Detection Algorithms

但总体来说,RCNN系列依然是两阶段处理模式:先提出候选区,再识别候选区中的对象。

YOLO意思是You Only Look Once,创造性的将候选区和对象识别这两个阶段合二为一,看一眼(不用看两眼哦)就能知道有哪些对象以及它们的位置。

实际上,YOLO并没有真正去掉候选区,而是采用了预定义的候选区(准确点说应该是预测区,因为并不是Faster RCNN所采用的Anchor)。也就是将划分为 77=49 个网格(grid),每个网格允许预测出2个边框(bounding box,包含某个对象的矩形框),总共 492=98 个bounding box。可以理解为98个候选区,它们很粗略的覆盖了的整个区域。

RCNN虽然会找到一些候选区,但毕竟只是候选,等真正识别出其中的对象以后,还要对候选区进行微调,使之更接近真实的bounding box。这个过程就是 边框回归 :将候选区bounding box调整到更接近真实的bounding box。

既然反正最后都是要调整的,干嘛还要先费劲去寻找候选区呢,大致有个区域范围就行了,所以YOLO就这么干了。

不过话说回来,边框回归为啥能起作用,我觉得本质上是因为 分类信息 中已经包含了 位置信息。就像你看到主子的脸和身体,就能推测出耳朵和屁股的位置。

下面具体看下YOLO的实现方案。

1)结构

去掉候选区这个步骤以后,YOLO的结构非常简单,就是单纯的卷积、池化最后加了两层全连接。单看网络结构的话,和普通的CNN对象分类网络几乎没有本质的区别,最大的差异是最后输出层用线性函数做激活函数,因为需要预测bounding box的位置(数值型),而不仅仅是对象的概率。所以粗略来说,YOLO的整个结构就是输入经过神经网络的变换得到一个输出的张量,如下图所示。

因为只是一些常规的神经网络结构,所以,理解YOLO的设计的时候,重要的是理解输入和输出的映射关系

2)输入和输出的映射关系

3)输入

参考图5,输入就是原始图像,唯一的要求是缩放到448448的大小。主要是因为YOLO的网络中,卷积层最后接了两个全连接层,全连接层是要求固定大小的向量作为输入,所以倒推回去也就要求原始图像有固定的尺寸。那么YOLO设计的尺寸就是448448。

4)输出

输出是一个 7730 的张量(tensor)。

41)77网格

根据YOLO的设计,输入图像被划分为 77 的网格(grid),输出张量中的 77 就对应着输入图像的 77 网格。或者我们把 7730 的张量看作 77=49个30维的向量,也就是输入图像中的每个网格对应输出一个30维的向量。参考上面图5,比如输入图像左上角的网格对应到输出张量中左上角的向量。

要注意的是,并不是说仅仅网格内的信息被映射到一个30维向量。经过神经网络对输入图像信息的提取和变换,网格周边的信息也会被识别和整理,最后编码到那个30维向量中。

42)30维向量

具体来看每个网格对应的30维向量中包含了哪些信息。

① 20个对象分类的概率

因为YOLO支持识别20种不同的对象(人、鸟、猫、汽车、椅子等),所以这里有20个值表示该网格位置存在任一种对象的概率。可以记为 ,之所以写成条件概率,意思是如果该网格存在一个对象Object,那么它是 的概率是 。(记不清条件概率的同学可以参考一下 理解贝叶斯定理 )

② 2个bounding box的位置

每个bounding box需要4个数值来表示其位置,(Center_x,Center_y,width,height),即(bounding box的中心点的x坐标,y坐标,bounding box的宽度,高度),2个bounding box共需要8个数值来表示其位置。

③ 2个bounding box的置信度

bounding box的置信度 = 该bounding box内存在对象的概率 该bounding box与该对象实际bounding box的IOU

用公式来表示就是

是bounding box内存在对象的概率,区别于上面第①点的 。Pr(Object)并不管是哪个对象,它体现的是 有或没有 对象的概率。第①点中的 意思是假设已经有一个对象在网格中了,这个对象具体是哪一个。

是 bounding box 与 对象真实bounding box 的IOU(Intersection over Union,交并比)。要注意的是,现在讨论的30维向量中的bounding box是YOLO网络的输出,也就是预测的bounding box。所以 体现了预测的bounding box与真实bounding box的接近程度。

还要说明的是,虽然有时说"预测"的bounding box,但这个IOU是在训练阶段计算的。等到了测试阶段(Inference),这时并不知道真实对象在哪里,只能完全依赖于网络的输出,这时已经不需要(也无法)计算IOU了。

综合来说,一个bounding box的置信度Confidence意味着它 是否包含对象且位置准确的程度。置信度高表示这里存在一个对象且位置比较准确,置信度低表示可能没有对象 或者 即便有对象也存在较大的位置偏差。

简单解释一下IOU。下图来自Andrew Ng的深度学习课程,IOU=交集部分面积/并集部分面积,2个box完全重合时IOU=1,不相交时IOU=0。

总的来说,30维向量 = 20个对象的概率 + 2个bounding box 4个坐标 + 2个bounding box的置信度

43)讨论

① 一张最多可以检测出49个对象

每个30维向量中只有一组(20个)对象分类的概率,也就只能预测出一个对象。所以输出的 77=49个 30维向量,最多表示出49个对象。

② 总共有 492=98 个候选区(bounding box)

每个30维向量中有2组bounding box,所以总共是98个候选区。

③ YOLO的bounding box并不是Faster RCNN的Anchor

Faster RCNN等一些算法采用每个grid中手工设置n个Anchor(先验框,预先设置好位置的bounding box)的设计,每个Anchor有不同的大小和宽高比。YOLO的bounding box看起来很像一个grid中2个Anchor,但它们不是。YOLO并没有预先设置2个bounding box的大小和形状,也没有对每个bounding box分别输出一个对象的预测。它的意思仅仅是对一个对象预测出2个bounding box,选择预测得相对比较准的那个。

这里采用2个bounding box,有点不完全算监督算法,而是像进化算法。如果是监督算法,我们需要 事先 根据样本就能给出一个正确的bounding box作为回归的目标。但YOLO的2个bounding box事先并不知道会在什么位置,只有经过前向计算,网络会输出2个bounding box,这两个bounding box与样本中对象实际的bounding box计算IOU。这时才能确定,IOU值大的那个bounding box,作为负责预测该对象的bounding box。

训练开始阶段,网络预测的bounding box可能都是乱来的,但总是选择IOU相对好一些的那个,随着训练的进行,每个bounding box会逐渐擅长对某些情况的预测(可能是对象大小、宽高比、不同类型的对象等)。所以,这是一种进化或者非监督学习的思想。

另外论文中经常提到 responsible 。比如:Our system divides the input image into an SS grid If the center of an object falls into a grid cell, that grid cell is responsible for detecting that object 这个 responsible 有点让人疑惑,对预测"负责"是啥意思。其实没啥特别意思,就是一个Object只由一个grid来进行预测,不要多个grid都抢着预测同一个Object。更具体一点说,就是在设置训练样本的时候,样本中的每个Object归属到且仅归属到一个grid,即便有时Object跨越了几个grid,也仅指定其中一个。具体就是计算出该Object的bounding box的中心位置,这个中心位置落在哪个grid,该grid对应的输出向量中该对象的类别概率是1(该gird负责预测该对象),所有其它grid对该Object的预测概率设为0(不负责预测该对象)。

还有:YOLO predicts multiple bounding boxes per grid cell At training time we only want one bounding box predictor to be responsible for each object 同样,虽然一个grid中会产生2个bounding box,但我们会选择其中一个作为预测结果,另一个会被忽略。下面构造训练样本的部分会看的更清楚。

④ 可以调整网格数量、bounding box数量

77网格,每个网格2个bounding box,对448448输入图像来说覆盖粒度有点粗。我们也可以设置更多的网格以及更多的bounding box。设网格数量为 SS,每个网格产生B个边框,网络支持识别C个不同的对象。这时,输出的向量长度为:

整个输出的tensor就是:

YOLO选择的参数是 77网格,2个bounding box,20种对象,因此 输出向量长度 = 20 + 2 (4+1) = 30。整个输出的tensor就是 7730。

因为网格和bounding box设置的比较稀疏,所以这个版本的YOLO训练出来后预测的准确率和召回率都不是很理想,后续的v2、v3版本还会改进。当然,因为其速度能够满足实时处理的要求,所以对工业界还是挺有吸引力的。

5)训练样本构造

作为监督学习,我们需要先构造好训练样本,才能让模型从中学习。

对于一张输入,其对应输出的7730张量(也就是通常监督学习所说的标签y或者label)应该填写什么数据呢。

首先,输出的 77维度 对应于输入的 77 网格。

然后具体看下30维向量的填写(请对照上面图6)。

① 20个对象分类的概率

对于输入图像中的每个对象,先找到其中心点。比如图8中的自行车,其中心点在**圆点位置,中心点落在**网格内,所以这个**网格对应的30维向量中,自行车的概率是1,其它对象的概率是0。所有其它48个网格的30维向量中,该自行车的概率都是0。这就是所谓的"中心点所在的网格对预测该对象负责"。狗和汽车的分类概率也是同样的方法填写。

② 2个bounding box的位置

训练样本的bounding box位置应该填写对象实际的bounding box,但一个对象对应了2个bounding box,该填哪一个呢?上面讨论过,需要根据网络输出的bounding box与对象实际bounding box的IOU来选择,所以要在训练过程中动态决定到底填哪一个bounding box。参考下面第③点。

③ 2个bounding box的置信度

上面讨论过置信度公式

可以直接计算出来,就是用网络输出的2个bounding box与对象真实bounding box一起计算出IOU。

然后看2个bounding box的IOU,哪个比较大(更接近对象实际的bounding box),就由哪个bounding box来负责预测该对象是否存在,即该bounding box的 ,同时对象真实bounding box的位置也就填入该bounding box。另一个不负责预测的bounding box的 。

总的来说就是,与对象实际bounding box最接近的那个bounding box,其 ,该网格的其它bounding box的 。

举个例子,比如上图中自行车的中心点位于4行3列网格中,所以输出tensor中4行3列位置的30维向量如下图所示。

翻译成人话就是:4行3列网格位置有一辆自行车,它的中心点在这个网格内,它的位置边框是bounding box1所填写的自行车实际边框。

注意,图中将自行车的位置放在bounding box1,但实际上是在训练过程中等网络输出以后,比较两个bounding box与自行车实际位置的IOU,自行车的位置(实际bounding box)放置在IOU比较大的那个bounding box(图中假设是bounding box1),且该bounding box的置信度设为1。

6)损失函数

损失就是网络实际输出值与样本标签值之间的偏差。

YOLO给出的损失函数如下

公式中

意思是网格i中存在对象。

意思是网格i的第j个bounding box中存在对象。

意思是网格i的第j个bounding box中不存在对象。

总的来说,就是用网络输出与样本标签的各项内容的误差平方和作为一个样本的整体误差。

损失函数中的几个项是与输出的30维向量中的内容相对应的。

① 对象分类的误差

公式第5行,注意 意味着存在对象的网格才计入误差。

② bounding box的位置误差

公式第1行和第2行。

a)都带有 意味着只有"负责"(IOU比较大)预测的那个bounding box的数据才会计入误差。

b)第2行宽度和高度先取了平方根,因为如果直接取差值的话,大的对象对差值的敏感度较低,小的对象对差值的敏感度较高,所以取平方根可以降低这种敏感度的差异,使得较大的对象和较小的对象在尺寸误差上有相似的权重。

c)乘以 调节bounding box位置误差的权重(相对分类误差和置信度误差)。YOLO设置 ,即调高位置误差的权重。

③ bounding box的置信度误差

公式第3行和第4行。

a)第3行是存在对象的bounding box的置信度误差。带有 意味着只有"负责"(IOU比较大)预测的那个bounding box的置信度才会计入误差。

b)第4行是不存在对象的bounding box的置信度误差。因为不存在对象的bounding box应该老老实实的说"我这里没有对象",也就是输出尽量低的置信度。如果它不恰当的输出较高的置信度,会与真正"负责"该对象预测的那个bounding box产生混淆。其实就像对象分类一样,正确的对象概率最好是1,所有其它对象的概率最好是0。

c)第4行会乘以 调节不存在对象的bounding box的置信度的权重(相对其它误差)。YOLO设置 ,即调低不存在对象的bounding box的置信度误差的权重。

7)训练

YOLO先使用ImageNet数据集对前20层卷积网络进行预训练,然后使用完整的网络,在PASCAL VOC数据集上进行对象识别和定位的训练和预测。YOLO的网络结构如下图所示:

YOLO的最后一层采用线性激活函数,其它层都是Leaky ReLU。训练中采用了drop out和数据增强(data augmentation)来防止过拟合。更多细节请参考原论文。

8)预测(inference)

训练好的YOLO网络,输入一张,将输出一个 7730 的张量(tensor)来表示中所有网格包含的对象(概率)以及该对象可能的2个位置(bounding box)和可信程度(置信度)。

为了从中提取出最有可能的那些对象和位置,YOLO采用NMS(Non-maximal suppression,非极大值抑制)算法。

9)NMS(非极大值抑制)

NMS方法并不复杂,其核心思想是:选择得分最高的作为输出,与该输出重叠的去掉,不断重复这一过程直到所有备选处理完。

YOLO的NMS计算方法如下。

网络输出的7730的张量,在每一个网格中,对象 位于第j个bounding box的得分:

它代表着某个对象 存在于第j个bounding box的可能性。

每个网格有:20个对象的概率2个bounding box的置信度,共40个得分(候选对象)。49个网格共1960个得分。Andrew Ng建议每种对象分别进行NMS,那么每种对象有 1960/20=98 个得分。

NMS步骤如下:

1)设置一个Score的阈值,低于该阈值的候选对象排除掉(将该Score设为0)

2)遍历每一个对象类别

 21)遍历该对象的98个得分

  211)找到Score最大的那个对象及其bounding box,添加到输出列表

  212)对每个Score不为0的候选对象,计算其与上面211输出对象的bounding box的IOU

  213)根据预先设置的IOU阈值,所有高于该阈值(重叠度较高)的候选对象排除掉(将Score设为0)

  214)如果所有bounding box要么在输出列表中,要么Score=0,则该对象类别的NMS完成,返回步骤2处理下一种对象

3)输出列表即为预测的对象

10)小结

YOLO以速度见长,处理速度可以达到45fps,其快速版本(网络较小)甚至可以达到155fps。这得益于其识别和定位合二为一的网络设计,而且这种统一的设计也使得训练和预测可以端到端的进行,非常简便。

不足之处是小对象检测效果不太好(尤其是一些聚集在一起的小对象),对边框的预测准确度不是很高,总体预测精度略低于Fast RCNN。主要是因为网格设置比较稀疏,而且每个网格只预测两个边框,另外Pooling层会丢失一些细节信息,对定位存在影响。

更多细节请参考原论文。

最后,如果你竟然坚持看到这里,觉得还有所帮助的话,请点个赞:)๑۩۞۩๑

You Only Look Once: Unified, Real-Time Object Detection

Andrew Ng的深度学习工程师 - 04卷积神经网络

图解YOLO

你真的读懂yolo了吗?

目标检测|YOLO原理与实现

1 简介

针对无人机捕获场景的目标检测是最近比较流行的一项任务。由于无人机在不同高度飞行,目标尺度变化较大,这样给模型的优化也带来了很大的负担。此外,在无人机进行高速低空飞行时,也会带来密集目标的运动模糊问题。

图1 小目标与密集问题

为了解决上述2个问题,本文提出了 TPH-YOLOv5 TPH-YOLOv5 在YOLOv5的基础上增加了一个prediction heads 来检测不同尺度的目标。然后通过探索Self-Attention的预测潜力使用了Transformer Prediction Heads(TPH)代替原来的prediction heads。同时作者还集成了卷积块Attention模型(CBAM)来寻找密集场景下的注意力区域。

为了进一步改进 TPH-YOLOv5 ,作者还提供了大量有用的策略,如数据增强、多尺度测试、多模型集成和使用额外的分类器。

在VisDrone2021数据集上的大量实验表明,TPH-YOLOv5在无人机捕获场景上具有良好的性能和可解释性。在DET-test-challenge数据集上,TPH-YOLOv5的AP结果为3918%,比之前的SOTA方法(DPNetV3)提高了181%。在VisDrone Challenge 2021中,TPH-YOLOv5与YOLOv5相比提高了约7%。

本文的贡献如下:

2 前人工作总结 21 Data Augmentation

数据增强的意义主要是扩展数据集,使模型对不同环境下获得的图像具有较高的鲁棒性。

Photometric和geometric被研究人员广泛使用。对于Photometric主要是对图像的色相、饱和度和值进行了调整。在处理geometric时主要是添加随机缩放、裁剪、平移、剪切和旋转。

除了上述的全局像素增强方法外,还有一些比较独特的数据增强方法。一些研究者提出了将多幅图像结合在一起进行数据增强的方法,如MixUp、CutMix和Mosaic。

MixUp从训练图像中随机选取2个样本进行随机加权求和,样本的标签也对应于加权求和。不同于通常使用零像素mask遮挡图像的遮挡工作,CutMix使用另一个图像的区域覆盖被遮挡的区域。Mosaic是CutMix的改进版。拼接4幅图像,极大地丰富了被检测物体的背景。此外,batch normalization计算每层上4张不同图像的激活统计量。

在TPH-YOLOv5的工作中主要是结合了MixUp、Mosaic以及传统方法进行的数据增强。

22 Multi-Model Ensemble Method

我们都知道深度学习模型是一种非线性方法。它们提供了更大的灵活性,并可以根据训练数据量的比例进行扩展。这种灵活性的一个缺点是,它们通过随机训练算法进行学习,这意味着它们对训练数据的细节非常敏感,每次训练时可能会得到一组不同的权重,从而导致不同的预测。 这给模型带来了一个高方差

减少模型方差的一个成功方法是训练多个模型而不是单一模型,并结合这些模型的预测。

针对不同的目标检测模型,有3种不同的ensemble boxes方法:非最大抑制(NMS)、Soft-NMS、Weighted Boxes Fusion(WBF)。

在NMS方法中,如果boxes的overlap, Intersection Over Union(IoU)大于某个阈值,则认为它们属于同一个对象。对于每个目标NMS只留下一个置信度最高的box删除其他box。因此,box过滤过程依赖于这个单一IoU阈值的选择,这对模型性能有很大的影响。

Soft-NMS是对NMS进行轻微的修改,使得Soft-NMS在标准基准数据集(如PASCAL VOC和MS COCO)上比传统NMS有了明显的改进。它根据IoU值对相邻边界box的置信度设置衰减函数,而不是完全将其置信度评分设为0并将其删除。

WBF的工作原理与NMS不同。NMS和Soft-NMS都排除了一些框,而WBF将所有框合并形成最终结果。因此,它可以解决模型中所有不准确的预测。本文使用WBF对最终模型进行集成,其性能明显优于NMS。

23 Object Detection

基于CNN的物体检测器可分为多种类型:

一些检测器是专门为无人机捕获的图像设计的,如RRNet、PENet、CenterNet等。但从组件的角度来看,它们通常由2部分组成,一是基于CNN的主干,用于图像特征提取,另一部分是检测头,用于预测目标的类和Box。

此外,近年来发展起来的目标检测器往往在backbone和head之间插入一些层,人们通常称这部分为检测器的Neck。接下来分别对这3种结构进行详细介绍:

Backbone

常用的Backbone包括VGG、ResNet、DenseNet、MobileNet、EfficientNet、CSPDarknet53、Swin-Transformer等,均不是自己设计的网络。因为这些网络已经证明它们在分类和其他问题上有很强的特征提取能力。但研究人员也将微调Backbone,使其更适合特定的垂直任务。

Neck

Neck的设计是为了更好地利用Backbone提取的特征。对Backbone提取的特征图进行不同阶段的再处理和合理使用。通常,一个Neck由几个自底向上的路径和几个自顶向下的路径组成。Neck是目标检测框架中的关键环节。最早的Neck是使用上下取样块。该方法的特点是没有特征层聚合操作,如SSD,直接跟随头部后的多层次特征图。

常用的Neck聚合块有:FPN、PANet、NAS-FPN、BiFPN、ASFF、SAM。这些方法的共性是反复使用各种上下采样、拼接、点和或点积来设计聚合策略。Neck也有一些额外的块,如SPP, ASPP, RFB, CBAM。

Head

作为一个分类网络,Backbone无法完成定位任务,Head负责通过Backbone提取的特征图检测目标的位置和类别。

Head一般分为2种:One-Stage检测器和Two-Stage检测器。

两级检测器一直是目标检测领域的主导方法,其中最具代表性的是RCNN系列。与Two-Stage检测器相比One-Stage检测器同时预测box和目标的类别。One-Stage检测器的速度优势明显,但精度较低。对于One-Stage检测器,最具代表性的型号是YOLO系列、SSD和RetaNet。

3TPH-YOLOv531 Overview of YOLOv5

YOLOv5有4种不同的配置,包括YOLOv5s,YOLOv5m, YOLOv5l和YOLOv5x。一般情况下,YOLOv5分别使用CSPDarknet53+SPP为Backbone,PANet为Neck, YOLO检测Head。为了进一步优化整个架构。由于它是最显著和最方便的One-Stage检测器,作者选择它作为Baseline。

图2 THP-YOLOv5整体架构

当使用VisDrone2021数据集训练模型时,使用数据增强策略(Mosaic和MixUp)发现YOLOv5x的结果远远好于YOLOv5s、YOLOv5m和YOLOv5l, AP值的差距大于15%。虽然YOLOv5x模型的训练计算成本比其他3种模型都要高,但仍然选择使用YOLOv5x来追求最好的检测性能。此外,根据无人机捕获图像的特点,对常用的photometric和geometric参数进行了调整。

32 TPH-YOLOv5

TPH-YOLOv5的框架如图3所示。修改了原来的YOLOv5,使其专一于VisDrone2021数据集:

图3 TPH-YOLOv5模型结构 微小物体的预测头

作者统计了VisDrone2021数据集,发现它包含了很多非常小的目标,所以增加了一个用于微小物体检测的预测头。结合其他3个预测头,4头结构可以缓解剧烈的目标尺度变化带来的负面影响。如图3所示,添加的预测头(Head 1)是由low-level、高分辨率的feature map生成的,对微小物体更加敏感。增加检测头后,虽然增加了计算和存储成本,但对微小物体的检测性能得到了很大的提高。

Transformer encoder block

图4 Transformer Block

用Transformer encoder块替换了YOLOv5原版中的一些卷积块和CSP bottleneck blocks。其结构如图4所示。与CSPDarknet53中原有的bottleneck blocks相比,作者认为Transformer encoder block可以捕获全局信息和丰富的上下文信息。

每个Transformer encoder block包含2个子层。第1子层为multi-head attention layer,第2子层(MLP)为全连接层。每个子层之间使用残差连接。Transformer encoder block增加了捕获不同局部信息的能力。它还可以利用自注意力机制来挖掘特征表征潜能。在VisDrone2021数据集中,Transformer encoder block在高密度闭塞对象上有更好的性能。

基于YOLOv5,作者只在头部部分应用Transformer encoder block形成transformer Prediction head(TPH)和backbone端。因为网络末端的特征图分辨率较低。将TPH应用于低分辨率特征图可以降低计算和存储成本。此外,当放大输入图像的分辨率时可选择去除早期层的一些TPH块,以使训练过程可用。

Convolutional block attention module (CBAM)

CBAM是一个简单但有效的注意力模块。它是一个轻量级模块,可以即插即用到CNN架构中,并且可以以端到端方式进行训练。给定一个特征映射,CBAM将沿着通道和空间两个独立维度依次推断出注意力映射,然后将注意力映射与输入特征映射相乘,以执行自适应特征细化。

图5 CBAM注意力机制

CBAM模块的结构如图5所示。通过本文的实验,在不同的分类和检测数据集上将CBAM集成到不同的模型中,模型的性能得到了很大的提高,证明了该模块的有效性。

在无人机捕获的图像中,大覆盖区域总是包含令人困惑的地理元素。使用CBAM可以提取注意区域,以帮助TPH-YOLOv5抵制令人困惑的信息,并关注有用的目标对象。

Self-trained classifier

用TPH-YOLOv5对VisDrone2021数据集进行训练后,对test-dev数据集进行测试,然后通过可视化失败案例分析结果,得出TPH-YOLOv5定位能力较好,分类能力较差的结论。作者进一步探索如图6所示的混淆矩阵,观察到一些硬类别,如三轮车和遮阳三轮车的精度非常低。

图6 检测混淆矩阵

因此,作者提出了一个Self-trained classifier。首先,通过裁剪ground-truth边界框并将每个图像patch的大小调整为64 64来构建训练集。然后选择ResNet18作为分类器网络。实验结果表明,在这个Self-trained classifier的帮助下,所提方法对AP值提高了约08%~10%。

4实验与结论

最终在test-set-challenge上取得了3918的好成绩,远远高于VisDrone2020的最高成绩3737。

图9 检测结果图

深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理。  目标检测可以理解为是物体识别和物体定位的综合 ,不仅仅要识别出物体属于哪个分类,更重要的是得到物体在中的具体位置。

2014年R-CNN算法被提出,基本奠定了two-stage方式在目标检测领域的应用。它的算法结构如下图

算法步骤如下:

R-CNN较传统的目标检测算法获得了50%的性能提升,在使用VGG-16模型作为物体识别模型情况下,在voc2007数据集上可以取得66%的准确率,已经算还不错的一个成绩了。其最大的问题是速度很慢,内存占用量很大,主要原因有两个

针对R-CNN的部分问题,2015年微软提出了Fast R-CNN算法,它主要优化了两个问题。

R-CNN和fast R-CNN均存在一个问题,那就是 由选择性搜索来生成候选框,这个算法很慢 。而且R-CNN中生成的2000个左右的候选框全部需要经过一次卷积神经网络,也就是需要经过2000次左右的CNN网络,这个是十分耗时的(fast R-CNN已经做了改进,只需要对整图经过一次CNN网络)。这也是导致这两个算法检测速度较慢的最主要原因。

faster R-CNN 针对这个问题, 提出了RPN网络来进行候选框的获取,从而摆脱了选择性搜索算法,也只需要一次卷积层操作,从而大大提高了识别速度 。这个算法十分复杂,我们会详细分析。它的基本结构如下图

主要分为四个步骤:

使用VGG-16卷积模型的网络结构:

卷积层采用的VGG-16模型,先将PxQ的原始,缩放裁剪为MxN的,然后经过13个conv-relu层,其中会穿插4个max-pooling层。所有的卷积的kernel都是3x3的,padding为1,stride为1。pooling层kernel为2x2, padding为0,stride为2。

MxN的,经过卷积层后,变为了(M/16) x (N/16)的feature map了。

faster R-CNN抛弃了R-CNN中的选择性搜索(selective search)方法,使用RPN层来生成候选框,能极大的提升候选框的生成速度。RPN层先经过3x3的卷积运算,然后分为两路。一路用来判断候选框是前景还是背景,它先reshape成一维向量,然后softmax来判断是前景还是背景,然后reshape恢复为二维feature map。另一路用来确定候选框的位置,通过bounding box regression实现,后面再详细讲。两路计算结束后,挑选出前景候选框(因为物体在前景中),并利用计算得到的候选框位置,得到我们感兴趣的特征子图proposal。

卷积层提取原始图像信息,得到了256个feature map,经过RPN层的3x3卷积后,仍然为256个feature map。但是每个点融合了周围3x3的空间信息。对每个feature map上的一个点,生成k个anchor(k默认为9)。anchor分为前景和背景两类(我们先不去管它具体是飞机还是汽车,只用区分它是前景还是背景即可)。anchor有[x,y,w,h]四个坐标偏移量,x,y表示中心点坐标,w和h表示宽度和高度。这样,对于feature map上的每个点,就得到了k个大小形状各不相同的选区region。

对于生成的anchors,我们首先要判断它是前景还是背景。由于感兴趣的物体位于前景中,故经过这一步之后,我们就可以舍弃背景anchors了。大部分的anchors都是属于背景,故这一步可以筛选掉很多无用的anchor,从而减少全连接层的计算量。

对于经过了3x3的卷积后得到的256个feature map,先经过1x1的卷积,变换为18个feature map。然后reshape为一维向量,经过softmax判断是前景还是背景。此处reshape的唯一作用就是让数据可以进行softmax计算。然后输出识别得到的前景anchors。

另一路用来确定候选框的位置,也就是anchors的[x,y,w,h]坐标值。如下图所示,红色代表我们当前的选区,绿色代表真实的选区。虽然我们当前的选取能够大概框选出飞机,但离绿色的真实位置和形状还是有很大差别,故需要对生成的anchors进行调整。这个过程我们称为bounding box regression。

假设红色框的坐标为[x,y,w,h], 绿色框,也就是目标框的坐标为[Gx, Gy,Gw,Gh], 我们要建立一个变换,使得[x,y,w,h]能够变为[Gx, Gy,Gw,Gh]。最简单的思路是,先做平移,使得中心点接近,然后进行缩放,使得w和h接近。如下:

我们要学习的就是dx dy dw dh这四个变换。由于是线性变换,我们可以用线性回归来建模。设定loss和优化方法后,就可以利用深度学习进行训练,并得到模型了。对于空间位置loss,我们一般采用均方差算法,而不是交叉熵(交叉熵使用在分类预测中)。优化方法可以采用自适应梯度下降算法Adam。

得到了前景anchors,并确定了他们的位置和形状后,我们就可以输出前景的特征子图proposal了。步骤如下:

1,得到前景anchors和他们的[x y w h]坐标。

2,按照anchors为前景的不同概率,从大到小排序,选取前pre_nms_topN个anchors,比如前6000个

3,剔除非常小的anchors。

4,通过NMS非极大值抑制,从anchors中找出置信度较高的。这个主要是为了解决选取交叠问题。首先计算每一个选区面积,然后根据他们在softmax中的score(也就是是否为前景的概率)进行排序,将score最大的选区放入队列中。接下来,计算其余选区与当前最大score选区的IOU(IOU为两box交集面积除以两box并集面积,它衡量了两个box之间重叠程度)。去除IOU大于设定阈值的选区。这样就解决了选区重叠问题。

5,选取前post_nms_topN个结果作为最终选区proposal进行输出,比如300个。

经过这一步之后,物体定位应该就基本结束了,剩下的就是物体识别了。

和fast R-CNN中类似,这一层主要解决之前得到的proposal大小形状各不相同,导致没法做全连接。全连接计算只能对确定的shape进行运算,故必须使proposal大小形状变为相同。通过裁剪和缩放的手段,可以解决这个问题,但会带来信息丢失和形变问题。我们使用ROI pooling可以有效的解决这个问题。

ROI pooling中,如果目标输出为MxN,则在水平和竖直方向上,将输入proposal划分为MxN份,每一份取最大值,从而得到MxN的输出特征图。

ROI Pooling层后的特征图,通过全连接层与softmax,就可以计算属于哪个具体类别,比如人,狗,飞机,并可以得到cls_prob概率向量。同时再次利用bounding box regression精细调整proposal位置,得到bbox_pred,用于回归更加精确的目标检测框。

这样就完成了faster R-CNN的整个过程了。算法还是相当复杂的,对于每个细节需要反复理解。faster R-CNN使用resNet101模型作为卷积层,在voc2012数据集上可以达到838%的准确率,超过yolo ssd和yoloV2。其最大的问题是速度偏慢,每秒只能处理5帧,达不到实时性要求。

针对于two-stage目标检测算法普遍存在的运算速度慢的缺点, yolo创造性的提出了one-stage。也就是将物体分类和物体定位在一个步骤中完成。 yolo直接在输出层回归bounding box的位置和bounding box所属类别,从而实现one-stage。通过这种方式, yolo可实现45帧每秒的运算速度,完全能满足实时性要求 (达到24帧每秒,人眼就认为是连续的)。它的网络结构如下图:

主要分为三个部分:卷积层,目标检测层,NMS筛选层。

采用Google inceptionV1网络,对应到上图中的第一个阶段,共20层。这一层主要是进行特征提取,从而提高模型泛化能力。但作者对inceptionV1进行了改造,他没有使用inception module结构,而是用一个1x1的卷积,并联一个3x3的卷积来替代。(可以认为只使用了inception module中的一个分支,应该是为了简化网络结构)

先经过4个卷积层和2个全连接层,最后生成7x7x30的输出。先经过4个卷积层的目的是为了提高模型泛化能力。yolo将一副448x448的原图分割成了7x7个网格,每个网格要预测两个bounding box的坐标(x,y,w,h)和box内包含物体的置信度confidence,以及物体属于20类别中每一类的概率(yolo的训练数据为voc2012,它是一个20分类的数据集)。所以一个网格对应的参数为(4x2+2+20) = 30。如下图

其中前一项表示有无人工标记的物体落入了网格内,如果有则为1,否则为0。第二项代表bounding box和真实标记的box之间的重合度。它等于两个box面积交集,除以面积并集。值越大则box越接近真实位置。

分类信息: yolo的目标训练集为voc2012,它是一个20分类的目标检测数据集 。常用目标检测数据集如下表:

| Name | # Images (trainval) | # Classes | Last updated |

| --------------- | ------------------- | --------- | ------------ |

| ImageNet | 450k | 200 | 2015 |

| COCO | 120K | 90 | 2014 |

| Pascal VOC | 12k | 20 | 2012 |

| Oxford-IIIT Pet | 7K | 37 | 2012 |

| KITTI Vision | 7K | 3 | |

每个网格还需要预测它属于20分类中每一个类别的概率。分类信息是针对每个网格的,而不是bounding box。故只需要20个,而不是40个。而confidence则是针对bounding box的,它只表示box内是否有物体,而不需要预测物体是20分类中的哪一个,故只需要2个参数。虽然分类信息和confidence都是概率,但表达含义完全不同。

筛选层是为了在多个结果中(多个bounding box)筛选出最合适的几个,这个方法和faster R-CNN 中基本相同。都是先过滤掉score低于阈值的box,对剩下的box进行NMS非极大值抑制,去除掉重叠度比较高的box(NMS具体算法可以回顾上面faster R-CNN小节)。这样就得到了最终的最合适的几个box和他们的类别。

yolo的损失函数包含三部分,位置误差,confidence误差,分类误差。具体公式如下:

误差均采用了均方差算法,其实我认为,位置误差应该采用均方差算法,而分类误差应该采用交叉熵。由于物体位置只有4个参数,而类别有20个参数,他们的累加和不同。如果赋予相同的权重,显然不合理。故yolo中位置误差权重为5,类别误差权重为1。由于我们不是特别关心不包含物体的bounding box,故赋予不包含物体的box的置信度confidence误差的权重为05,包含物体的权重则为1。

Faster R-CNN准确率mAP较高,漏检率recall较低,但速度较慢。而yolo则相反,速度快,但准确率和漏检率不尽人意。SSD综合了他们的优缺点,对输入300x300的图像,在voc2007数据集上test,能够达到58 帧每秒( Titan X 的 GPU ),721%的mAP。

SSD网络结构如下图:

和yolo一样,也分为三部分:卷积层,目标检测层和NMS筛选层

SSD论文采用了VGG16的基础网络,其实这也是几乎所有目标检测神经网络的惯用方法。先用一个CNN网络来提取特征,然后再进行后续的目标定位和目标分类识别。

这一层由5个卷积层和一个平均池化层组成。去掉了最后的全连接层。SSD认为目标检测中的物体,只与周围信息相关,它的感受野不是全局的,故没必要也不应该做全连接。SSD的特点如下。

每一个卷积层,都会输出不同大小感受野的feature map。在这些不同尺度的feature map上,进行目标位置和类别的训练和预测,从而达到 多尺度检测 的目的,可以克服yolo对于宽高比不常见的物体,识别准确率较低的问题。而yolo中,只在最后一个卷积层上做目标位置和类别的训练和预测。这是SSD相对于yolo能提高准确率的一个关键所在。

如上所示,在每个卷积层上都会进行目标检测和分类,最后由NMS进行筛选,输出最终的结果。多尺度feature map上做目标检测,就相当于多了很多宽高比例的bounding box,可以大大提高泛化能力。

和faster R-CNN相似,SSD也提出了anchor的概念。卷积输出的feature map,每个点对应为原图的一个区域的中心点。以这个点为中心,构造出6个宽高比例不同,大小不同的anchor(SSD中称为default box)。每个anchor对应4个位置参数(x,y,w,h)和21个类别概率(voc训练集为20分类问题,在加上anchor是否为背景,共21分类)。如下图所示:

另外,在训练阶段,SSD将正负样本比例定位1:3。训练集给定了输入图像以及每个物体的真实区域(ground true box),将default box和真实box最接近的选为正样本。然后在剩下的default box中选择任意一个与真实box IOU大于05的,作为正样本。而其他的则作为负样本。由于绝大部分的box为负样本,会导致正负失衡,故根据每个box类别概率排序,使正负比例保持在1:3。SSD认为这个策略提高了4%的准确率

另外,SSD采用了数据增强。生成与目标物体真实box间IOU为01 03 05 07 09的patch,随机选取这些patch参与训练,并对他们进行随机水平翻转等操作。SSD认为这个策略提高了88%的准确率。

和yolo的筛选层基本一致,同样先过滤掉类别概率低于阈值的default box,再采用NMS非极大值抑制,筛掉重叠度较高的。只不过SSD综合了各个不同feature map上的目标检测输出的default box。

SSD基本已经可以满足我们手机端上实时物体检测需求了,TensorFlow在Android上的目标检测官方模型ssd_mobilenet_v1_android_exportpb,就是通过SSD算法实现的。它的基础卷积网络采用的是mobileNet,适合在终端上部署和运行。

针对yolo准确率不高,容易漏检,对长宽比不常见物体效果差等问题,结合SSD的特点,提出了yoloV2。它主要还是采用了yolo的网络结构,在其基础上做了一些优化和改进,如下

网络采用DarkNet-19:19层,里面包含了大量3x3卷积,同时借鉴inceptionV1,加入1x1卷积核全局平均池化层。结构如下

yolo和yoloV2只能识别20类物体,为了优化这个问题,提出了yolo9000,可以识别9000类物体。它在yoloV2基础上,进行了imageNet和coco的联合训练。这种方式充分利用imageNet可以识别1000类物体和coco可以进行目标位置检测的优点。当使用imageNet训练时,只更新物体分类相关的参数。而使用coco时,则更新全部所有参数。

YOLOv3可以说出来直接吊打一切图像检测算法。比同期的DSSD(反卷积SSD), FPN(feature pyramid networks)准确率更高或相仿,速度是其1/3。

YOLOv3的改动主要有如下几点:

不过如果要求更精准的预测边框,采用COCO AP做评估标准的话,YOLO3在精确率上的表现就弱了一些。如下图所示。

当前目标检测模型算法也是层出不穷。在two-stage领域, 2017年Facebook提出了mask R-CNN 。CMU也提出了A-Fast-RCNN 算法,将对抗学习引入到目标检测领域。Face++也提出了Light-Head R-CNN,主要探讨了 R-CNN 如何在物体检测中平衡精确度和速度。

one-stage领域也是百花齐放,2017年首尔大学提出 R-SSD 算法,主要解决小尺寸物体检测效果差的问题。清华大学提出了 RON 算法,结合 two stage 名的方法和 one stage 方法的优势,更加关注多尺度对象定位和负空间样本挖掘问题。

目标检测领域的深度学习算法,需要进行目标定位和物体识别,算法相对来说还是很复杂的。当前各种新算法也是层不出穷,但模型之间有很强的延续性,大部分模型算法都是借鉴了前人的思想,站在巨人的肩膀上。我们需要知道经典模型的特点,这些tricks是为了解决什么问题,以及为什么解决了这些问题。这样才能举一反三,万变不离其宗。综合下来,目标检测领域主要的难点如下:

一文读懂目标检测AI算法:R-CNN,faster R-CNN,yolo,SSD,yoloV2

从YOLOv1到v3的进化之路

SSD-Tensorflow超详细解析一:加载模型对进行测试  https://blogcsdnnet/k87974/article/details/80606407

YOLO    https://pjreddiecom/darknet/yolo/      https://githubcom/pjreddie/darknet   

C#项目参考:https://githubcom/AlturosDestinations/AlturosYolo

项目实践贴个图。

为什么如今有那么多人来到江小白YOLO,因为这里他们能够看到这些rapper们最真实的情感流露。

“是金子总会发光。”这句话没错,但是在如今这个社会,不是金子不会发光,而是你看不到它在发光。这时候需要的是一个好的平台,这个平台能够帮助金子让大家看到,而非继续隐藏起来。

或许江小白YOLO就是这样,它见证了这些顶尖rapper们最珍贵也最真实的情感,同时将这份感情毫无保留地展现在大众的面前。

成长的不仅是rapper和说唱,还有YOLO和观众

时间,往往意味着一些改变。纵观2016年第一季YOLO和今年的YOLO,我们会发现很多的不同。

最让人直观的便是这些rapper们,2016年的他们很多还站在地下,而如今他们成为广为人知的明星,或许这些rapper们三年前都不曾想过自己会在如此隆重炫彩的舞台上,不曾想过台下上万观众的欢呼和呐喊,如今却真实的存在了。

说唱文化也是同样的,因为更多优秀rapper的出现而不断发展着。

这种改变,不失为是一种成长。

当然,我们不能把功劳都丢给YOLO,YOLO只是顺应了这个潮流,成为其中最为有力的支柱。但是,我们也不能否认YOLO在说唱后续发展中所带来的作用。

而在这个潮流的发展中,YOLO也在成长。

从2016年的江小白YOLO音乐现场到今年的江小白YOLO青年文化节,江小白YOLO不再仅仅是一个舞台,现在的它代表的是青年文化,是这个舞台上所有人想要传递出去的精神。

2016年的YOLO,几千人坐在现场,今年的YOLO,数万人站满整个场地,YOLO的成长也是观众的成长——越来越多的人喜欢说唱文化,也认可说唱文化。

这种改变,这种成长是令人欣喜的,它代表的是国内音乐的扩展和成熟,是大众对于音乐选择的多样化。

说唱界的“春晚”

如今江小白YOLO青年文化节俨然发展成为了说唱界“春晚”般的存在。

长沙站是今年YOLO的第一站,哪怕没有去到现场,都可以从微博上感受到现场的躁动和炸裂。

能够把一个领域里顶尖的存在共邀同台,能够让数万人随着现场的气氛呐喊舞动,或许只有春晚能够达到吧。

而这次双冠同台,更是将YOLO升华到一个非比寻常的高度。今年新说唱的全国总冠军艾热与去年同为全国总冠军的GAI共同站在YOLO的舞台上,或许对于说唱的粉丝来说,没有能比这更让人兴奋的事情了。

甚至在微博上,#江小白神预测#的话题更是出现在热搜榜上——在YOLO宣传片中,艾热曾说到,“这一次,要稳赢。”

而YOLO的下一站将于11月3、4日在南京举行,说唱的躁动和炸裂还将继续。

长沙站的火热已然为今年的江小白YOLO青年文化节开了一个好头,后续的江小白YOLO也势必会更燃,更炸裂!我们期待江小白YOLO青年文化节,可以推动着说唱,走向更好的未来,在音乐界的大舞台上,展现更多的精彩

《MC厂长》不到一周再次更新了一集。敖厂长在片中宣布他的“成都养鸡二厂”服务器将于12月25日12时正式开启。

敖厂长在本次探险中发生了什么趣事?即将上线的服务器又有哪些新颖玩法?一起来了解一下吧。

  重返中国城,敖厂长旅程再启

  随着《MC厂长》中国季的持续发布,视频仅在Bilibili单平台的播放量就已突破700万,玩家们的热情可见一斑。无论是温情回归的冒险家,还是组团创造的新朋友,敖厂长在《我的世界》中国版重启的冒险为他们带来了许多乐趣。

  在上期节目中,冒险家AO在中国城加持光影组件,天边阳光洒下,水面波光凌凌。七彩琉璃瓦在阳光下熠熠夺目,盏盏萤石亮起,华灯初上,美轮美奂。但急着找回YOLO的冒险家AO并没有迷失其中,继续着他的旅程……

  寻回YOLO,初试新生物鹦鹉

  使用鞘翅从空中飞下,站高望远的厂长很快就发现了许久不见的YOLO。短暂的寒暄后,二人再次踏上了冒险旅途。他们采集小麦种子尝试在中国城内的鹦鹉山附近驯服鹦鹉。相比一次就驯服成功的厂长,YOLO可是非洲的不得了,多次驯服失败只能放弃。

  二人随后来到了中国城的餐厅,尝试播放音乐让鹦鹉跳舞,但鹦鹉疑似离得太远无法跳舞,于是厂长开始手动操作鹦鹉跳舞,无比魔性。最后,童心不泯的厂长小施恶作剧,因为鹦鹉吃到曲奇会中毒致死,让YOLO喂食鹦鹉曲奇,结果显而易见……

  从小哥到**姐,YOLO究竟是谁

  从《MC厂长》中国季的第一集到第三集,再到最新的第七集,一向放荡不羁的敖厂长对YOLO不但耐心慢慢,还秘之温柔,早就引发了粉丝的种种猜测,Ta究竟是敖厂长的女票还是基友,抑或其实是厂长一人分饰两角呢

  而这个问题在本期仿佛已经有了答案,视频的标题也在证明粉丝此前的种种猜想。令玩家倍感意外的是,YOLO本人也有意无意地透露了自己的身份。难道她真的是敖厂长的女朋友预知详情如何,就要等厂长亲自告诉我们了。

  养鸡二厂服务器即将开放,圣诞节不见不散

  为了欢迎集结而来的冒险家们,敖厂长在本期视频中正式宣布,成都养鸡二厂服务器将于12月25日圣诞当天中午正式上架《我的世界》PC Java版。

  基于粉丝们呼声强烈的纯净生存玩法,冒险家AO准备了多种有趣的珍藏插件,希望通过家园、签到、成就、称号、家族等丰富的系统体系,为玩家带来温馨而奇妙的冒险旅程。这份特别的彩蛋,让翘首以盼的冒险家们惊喜不已。

欢迎分享,转载请注明来源:浪漫分享网

原文地址:https://hunlipic.com/jiehun/201780.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-06-18
下一篇2023-06-18

发表评论

登录后才能评论

评论列表(0条)

    保存