summer

YOLOV3的初步认知

在这里插入图片描述YOLOV3论文地址https://pjreddie.com/media/files/papers/YOLOv3.pdf
如果你想深入了解YOLOV3,那么你还需要去阅读YOLOV2,不过YOLOV1大可不必再去深纠,如同你时间不够的话。
YOLOV2论文地址:https://arxiv.org/abs/1612.08242

YOLO是什么

 YOLO(You Only Look Once)系列是目标检测 One-Stage类的代表算法,其中One-Stage,不需要region proposal阶段,直接产生物体的类别概率和位置坐标。其中类别概率在YOLO中是置信度以及种类。由于经过一次检测就可以得出最终预测结果,因此相比于Two-Stage在速度上是很显著的。
 目标检测主要解决两个问题:“what”,“where”,也就是目标是什么,以及目标在哪里。因此在YOLO中的输出会包括目标的四个位置和类别。最终会在图片上用框表示出来。
在这里插入图片描述
 我们简单的说明一下从YOLOv1到YOLOV3的变化,从第一代的YOLOV1(提出到基本模型One-stage),其次的YOLOV2(提升性能,利用K-means算法聚类出五个锚框),到YOLOV3算法的(提升性能,变成九个锚框。)

YOLO网络结构

第一张
在这里插入图片描述
 第一张是YOLOV3简易版本的框架图,第二张是详细的,一般而言我们在修改YOLOV3网络时,比如基于YOLOV3网络想要做某个改进时会需要两张对照看。基于YOLOV3做改进的文章数不胜数,因此网络图也没有固定的形式。以上两张是我学习以来认为能够清楚且直观表现YOLOV3网络结构的两张图片。
 接下来我们详细的介绍一下YOLOV3的网络结构。
 图一中的最左侧一列是YOLOV3的主干网络部分,也被称之为Darknet53,可以看到的是,从带有残差网络部分开始的网络段,都进行了步长为2的下采样。通道数扩大一倍,但长宽却各自缩小一倍。除此之外主干部借鉴的残差网络的思想也解决了深层次网络梯度的问题。残差网络如下图。
在这里插入图片描述
 但是在YOLOv3中的残差块却并不是如上图所示的如此单一。事实上,当阅读代码后会发现,作者加入的残差块由一个卷积核大小为(1,1)以及(3,3)的构成,补充一点,在YOLOV3中使用(1,1)的卷积核降低通道,减少参数和使用(3,3)的卷积核提取特征的做法是非常常见的。
 如果对残差网络不太熟悉的朋友我大致描述一下它所起到的作用。当它从输入层牵引的一根线条到输出端,就意味着,经由中间层计算所得到的数据,也许它通过网络经过复杂的计算所得出的数值并不重要。如果没有从输入到输出的这根线,也许在网络达到一定的深度时,你的网络情况会变得很糟糕,甚至会得到一批等于0或者无限接近于0的无用数值。但通过这跟线或者称之为shortcut部分,你的网络至少不太比此前输入的要差。通过公式来理解:
                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~                            input=middle+input
   ~~   经过middle部分的计算,我们极限思考一个例子,也许middle会是0,但至少你会保留Input此前的值。下面是YOLOV3中的残差网络。
在这里插入图片描述
 关于Residual Block(number)中的number一值,在YOLOv3中代表着此模块被建立几次,原论文中是[1,2,8,8,4]。
 图一右方部分,涉及到一个锚框的思想,虽然在YOLOv2中已有5个锚框,但在YOLOV3中,作者延续了这一思想并增加到了9个锚框。
 在右半部分YOLOV3借鉴了金字塔特征图思想,小尺寸用来检测大尺寸物体,而大尺寸则是检测小尺寸物体。读者可以看到最后面三个方框的输出值,如果阅读过源码则可以知道它的shape分别是(batch,13,13,255)、(batch,26,26,255)、(batch,52,52,255)。其中尺度52,52)、(26,26)、(13,13)分别对应检测小尺度、中尺度、大尺度。如下图所示。
在这里插入图片描述
 其中有不明白特征金字塔的在这里补充说明一下。图像金字塔是图像多尺度表达的一种,一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。如下图。
在这里插入图片描述
 那么可能有人会不明白中间层的作用,其中除了七次卷积操作,还有上采样与连接。其中关于七次卷积操作,值得一提的是。其中五次卷积后的数据是向上回溯,与上方部分尺度的图像进行了连接,而剩下的两次卷积则是得出了最后的预测结果。其中上采样是为了调整尺度大小能与其他不同尺度进行连接。例如(13,13)在yolo源码中采用了系数为2的上采样,经此可得到(26,26)的尺度。而至于为何链接,笔者猜测应是与FPN网络相似,丰富了特征程度。使得大中小尺度预测的效果接近,但其实YOLO系列的小尺度检测一直是人们诟病的地方。

YOLOV3的锚框

Loss损失函数

 需要事先说明的是,YOLOV3的锚框对于初学者而言是一个难点,因此无法一次性就弄懂,除了看懂公式外还需要借助于代码理解。首先是公式的理解,如下图。

在这里插入图片描述

 这大概是网上流行比较常见的关于YOLOv3的Loss函数的计算。但我研习代码时却发现并不是如同上述公式所写。所以笔者根据代码重新整理了公式。
 YOLOv3的Loss公式主要由三大部分组成:第一个是来自于预测框与真实框的Loss,其次是物体存在的置信度Loss,最后则是物体种类的置信度Loss。

  1. 预测框与真实框的Loss

 首先YOLOv3代码中的计算方式最大的不同是在于预测框与真实框之间的Loss。由于YOLOv3是多尺度预测,就会存在一个问题,不同锚框之间大小不一,大尺度的物体带来的权重自然要高过小物体的权重。为了解决这个问题,作者便修改了公式,在原来的基础上加上了(2-scale_w*scale_h)。强调的是,此处scale_wscale_h不是任意的锚框而是与某真实物体交并比(IOU)最大的锚框宽度与长度,许多博主并未在此讲清。我们可以分析此处为何会加上(2-scale_w*scale_h),当物体锚框很大时,输出因子会变小,而锚框很小时,输出因子会变大,这样就平衡了大小框权重不一的问题。还需要提出一点的是,此处的参数都是归一化了的即数值在(0-1)之间。因此我们可以总结出这样的一个公式。

在这里插入图片描述
λ_coord:是一个可调参数,如果你希望此处loss需要变大则调大。
K:代表着grid size,在YOLOv3中分别为:1313、2626、52*52。
I(obj):代表着有目标物体的位置。有目标的数值是1,不存在的目标的数值是0。

  1. obj的loss

在这里插入图片描述

I(no_obj):这个符号有许多博主也解释过,但各执一词,有说是无目标的,也有说是忽略目标的。
我们来详细解释一下,拿(13,13)这个特征层来举例子。起初我们会去创建一个no_object,它的shape是(batch_size,3,13,13),比如输入batch为8,或者16,只要你乐意,多少都可以,它只是表示着网络一次性批量处理的图像数量,3则是代表着(13*13)特征层对应的三个锚框值。而它的初始值则是全部的1。它一共进行了两次修改值,第一次是将此批量处理的图像中所有的存在物体,也即所标注的所有物体所在的位置,此处位置是归一化后的位置全部置为0。第二次计算是将网络预测的位置(Cx,C,W,H)与此次批量处理的真实位置(Gx,Gy,scale_W,scale_H)进行IOU处理,将所得出的最大值,此最大值仍需大于最初所设置的threshold。一般设置为0.5。那么之所以会设置无目标的数值计算也是为了增加网络的健壮性,在网络的大多数情况下有目标是较少的,大多数的地方是没有目标的。
C:则是代表着预测的置信度与真实的置信度。

  1. 种类的损失函数
    在这里插入图片描述
    P(c):代表着只会计算有目标位置的数值。
     那我们可以通过一张完整的Loss计算图来整体观察。
    在这里插入图片描述
     最后补充一点的是作者在计算过程中分别使用了BCELoss以及MSELoss计算的方法。为了方便看懂举一个例子。
    在这里插入图片描述
     列如网络输出的数值是tensor([0.5,0.4,0.3]),而你的target是[0,1,1],那么可得到的算式则是:
     第一列:0*ln(0.5)+(1-0)*ln(1-0.5)
     第二列:…
     所有的Loss计算到此也就介绍了,但其实这一部分是许多学者在论文中改动比较多的一个地方。值得一提的是,许多的学者用YOLOv3做单目标的检测,于是我认为一篇写得很好的论文:“嵌入 DenseNet 结构和空洞卷积模块的改进YOLO v3 火灾检测算法”
     在该论文中,作者只是专注于火灾这一单体目标,因此它删去了分类的损失函数。变成了如下部分。
    在这里插入图片描述
    最后作者又做了位置误差的修改,如下图所示。
    在这里插入图片描述
     作者将平方和改成了绝对值的形式。最后的测试结果是,精确度与召回率都是99%。只是其中我对作者修改的一些地方不甚理解,比如他依旧用的三个特征框来提取的,但是在文章他论述到:“基于COCO 数据集生成了 9 个不同尺寸的锚框大小。由于该数据集不包含火焰这类物体,因此笔者在自建的火灾数据集上重新生成新的锚框尺寸.改进的聚类算法对于输入分辨率为 416×416 的火灾图片,生成的 10 个锚框尺寸。”我们需要知晓的是,YOLOv3中九个框是被三个特征层分别平均了的,每个特征层拥有三个。所以在该文章中,10个框如何被三个特征层分,我猜测可能是(3,3,4)或者(4,4,3)亦或者是(3,4,3)?具体如何,在文章中没有详细说明,我曾致函过通讯作者渴望得到源码以解疑惑,但未曾回电。

YOLOV3锚框机制

 锚框机制是yolov3比较核心的一个地方,我们先从论文给出的公式入手。
在这里插入图片描述
 tx,th,tw,th何为呢?此处公式与Faster—cnn系列文章里面的公式颇有些相似,但又有些不同我们通过下面一张图片来看。

 那么现在问题变成了Gx,Px的问题了。我们透过代码可以发现的是,Gx是Target里面所标注的真实框的x中心点,Gw是真实框的宽度,同理Gy与Gh则分别是y中心点以及真实框的高度。而Px与Pw呢?Px与Py其实是Gx与Gy取整的int类型的整数,比如Gx为7.45,那么Gx则是7。那么这是代表什么意思呢?它的意思其实就是该物体在相对于特征层而言的位置,但此处位置是中心点的左上方的坐标。
在这里插入图片描述
 从上图可以看见此处的tx是预测的四个值,tx,ty,tw,th。那么此处的tx与此前的tx有何种关系呢?说实话,很多博主都会用这两个图来解释这两个公式之间的联系。但其实没有联系,所以大家不要混淆这两个东西。上面的tx的公式所计算的是真实框的中心值与宽度,当然都是相对于当前特征层而言的。而下面的则是网络预测的tx。在前向传播里面它们两个根本就没有任何关系,所以我不知道为何有这么多人回去混淆这两个东西。所以原文没有提到我所述的上面那张图。所以我着重解释下面这张图。但需要提及一下Pw是来自于与真实框相交的IOU最大的那个锚框的宽度以及高度。
 我们着重讲解下面这张图,首先这些数值都是经过处理映射到特征层上的数值,例如是(13,13)的。那么Cx与Cy其实是生成的两个shape分别为(batch_size,3,13,13)数值分别为(0-13)的数,但存储的方式不一样,Cx是(0-13)但是Cy是(0-0)一共是13个,然后(1-1)又是13个。大家可以理解为生成的是(13,13)的一个网格盘。所以其实bx最后得出的也是shape(batch_size,3,13,13)的数,它代表了(13*13)的特征层上每一个网格预测的tx。最后与该层上所有的真实框进行交并比计算,得出的最大IOU且阈值大于0.5的加入到No_object做损失计算。所以解释起来就这么点东西,起码在前向传播中只有这些点。

YOLO的修改与提升

 介绍到上面其实YOLOV3的核心理论已经介绍完结,但很多学者基于YOLOV3做了很多修改,我们可以来随便聊聊。

“一种基于改进YOLOv3的遥感影像飞机目标检测算法”

 这篇文章中作者提到:“
本文在原有的 3 个检测尺度上,
增加 1 个检测尺度,对网络输出的 8 倍降采样特
征图进行 2 倍上采样,与网络中第 2 个残差块输
出的 4 倍降采样特征图进行融合,建立 4 倍降采
样特征融合目标检测层,以提供更多的位置和细
节信息对尺寸更小的飞机目标进行检测。同时,
为更加充分地提取低层特征,在网络的第 2 个残
差块中增加两个残差单元,将网络第 2 个残差块
中的残差单元的数量由 2 个增加至 4 个。”
在这里插入图片描述
 可以看到的是她增加了(104*104)的特征层,这个是非常好理解的,精度肯定会提升,因为它多了一个检测口。那么这个改进很多人都用过。这已经不算做“猴戏”了。我此前用舰船的做过一次测试。效果如下。在这里插入图片描述
在这里插入图片描述
 相比于此前,原YOLOV3的精确度提升了2%左右,此外我还修改了锚框。因为特征层变成了4个,所以锚框就需要重新聚合,需要12个。在此过程中我留意到一位作者在利用K-means聚合时效果变差的问题。他似乎是做医学方面的目标检测。他说由于自己的数据集尺度都很集中,所以聚合后效果变得不太理想于是自己就拉伸了一下。在这里插入图片描述
测试的结果呢?似乎还不错。
在这里插入图片描述

在这里插入图片描述
 但是由于他是进行的线性拉伸,尺度变化太大,我于是做了一些改进。
原始数据:(19,20,21,26,25,33,27,22,32,24,36,29)
原作者”:(9,10, 20,25, 43,58, 55,45, 84,63, 108,87)
改进的”:(9,10, 19,24, 38,50, 46,37, 61,46, 71,57)
 改进后的数据更加平滑一些,但效果由于没有这样的特定数据集,我们遥感的数据集都是多尺度的,所以在多尺度的表现下并没有太明显的提升。如果尺度相对集中可能效果要好一些。

K-means++

 由于在YOLOV3中作者使用的是K-means算法聚合的,所以学者都使用了K-means++来替换。但有一点需要说明的是原始的K-means算法中的距离计算并不适用于图像,因为如何去表现图像与图像直接的距离呢?有人提出了用IOU来计算。
在这里插入图片描述
 其中IOU越大,就说名两者图片重合就越大,所以距离就越小。
在这里插入图片描述
 k-means++算法比之于k-means算法特定在于它使用概率来选择距离最大的样本作为新的聚合点,也就说两者的本质区别在于k个聚合框的初始化过程。比如聚合过程中,使用k-means算法,则需要实现的指定k个聚类中心点,但如果不做数据的统计是不好选择的。比如以下数据采用K-means算法聚合后得出的效果并不理想。在这里插入图片描述
在这里插入图片描述

但如果使用k-means++算法后的效果则会显得更好一些。
在这里插入图片描述

“CBAM: Convolutional Block Attention Module”

“The module has two sequential sub-modules:
channel and spatial. The intermediate feature map is adaptively refined through our module (CBAM) at every convolutional block of deep networks”
在这里插入图片描述
 如同原文所述,作者提出的CBAM有两个子模块“channel”and“spatial”而中间的则是一个映射层。我们先来大致了解一下各个层的状况。

Channel Attentin Module

"channel attention focuses on ‘what’ is
meaningful given an input image"

在这里插入图片描述
 首先将输入的feature map在spatial维度上分别使用了MaxPool与AvgPool进行操作,得到了两个不同的“spatial context descriptors”
分别是:
在这里插入图片描述
 最后两者经过中间层(MLP)。再次之前两者的shape是(C,1,1)但MLP中是两个(1*1)的卷积核,在经过第一次卷积的时候通道数减少到C/r,作者解释,此举是为了减少参数的开销,经过第二个卷积的时候通道数恢复到C。最后合并两者数,经过sigmod函数输出。那么总结起来的公式原文给出如下所示。
在这里插入图片描述
“where σ denotes the sigmoid function, W0 ∈ R
C/r×C , and W1 ∈ R C×C/r. Note that the MLP weights, W0 and W1, are shared for both inputs and the ReLU
activation function is followed by W0”
 值得注意的一点是,ReLU函数的激活是在第一次的卷积之后。而sigmod则是在所有元素相加之后进行的。

Spatial attention module

Different from the channel attention,
the spatial attention focuses on ‘where’ is an informative par
t”
在这里插入图片描述
 此前神经网络的研究,对于attention方法只关注了通道层面上哪些层会具有更强的反馈能力,但是在空间维度上并不能体现出attention的意思。CBAM作为本文的亮点,将attention同时运用在channel和spatial两个维度上,CBAM与SE Module一样,可以嵌入了目前大部分主流网络中,在不显著增加计算量和参数量的前提下能提升网络模型的特征提取能力。

spatial attention module 在原文中是被设计在Channel attention Module之后的因此对于他的输入值,其实是经过此前的处理数值,但如果有留心会发现,经过Channel之后的数值shape是(C,1,1)因此有一步细节操作是与最初的input进行了element-wise,经过乘积后的shape会变成(C,H,W),与input的shape一致。
 此后作者用到了一个MaxPool以及AvgPool,但与Channel Attention Module不同的是,他们只是在通道数由C变为了1,W与H并未发生改变最后经过乘积后恢复到(C,W,H)。此处需要注意的是在Max与Avg后会经过一次卷积,其中所用到的卷积核是(7*7)的。最后论文所总结的公式如下。
在这里插入图片描述
 最后论文作者还总结到,他们发现:“ the channel-first order iis slightly better than the spatial-first”因此有这一发现才最终敲定了Channel Attention Module在Spatial Attetion Module之前,也就是如下结构图。在这里插入图片描述

有一些细节

 在代码复现的过程中,笔者发现了一些些问题。在Channel与spatial Module模块之前,还有一个结构——bottleneck Module。如下图所示
在这里插入图片描述
 这个由于形似瓶颈,因此也被人成为瓶颈层,一般使用在比较深的网络之中。它的两个卷积核大小都是(1*1),分别起到了降低通道与升高通道。作用则是减少参数与计算量。
 现在问题则来了,这样的一个结构——CBAM作为一个“plug-and-play”的模块应该嵌入到YOLOv3网络的那个地方呢?我们借鉴了一篇文章“Improved YOLOv3 Based on Attention Mechanism for Fast andAccurate Ship Detection in Optical Remote SensingImages”,

Improved YOLOv3 Based on Attention Mechanism …

 首先他并不是直接将CBAM就应用到网络里面去了,而是继续添加了一部分,看来SCI与知网的论文还是有差距的,一个是润色了下,一个是拿来直接食用。
在这里插入图片描述
 所以可以从上图看到,他将CBAM嵌入到了Darknet-53部分以及特征提取部分。之所以叫做DAM是因为他在CBAM的基础上做了些修改。这给我们提供了一个方向,我们也尝试用自己的数据集去做了一下。他的数据集比较好,是来自于“ GF-1 satellite and six panchromaticimages from GF-2 satellite ”。毕竟是武大的,所以来自于高分系列也不足为奇。
 笔者在自己所收集的一些数据集中测试了下,得到如下的表格。
在这里插入图片描述
 可以看到还是有提升的。其实该文章是分了四大类,其中比较难的ship是小目标已经移动的目标。但这个数据集还是比较难找到的,之所以在他文章中小目标以及移动目标准确率比较低,是因为他的数据集也不是很多。可见数据集对于网络的重要性。
 说道数据集不由得叨扰一句,一般开源的数据集都是怼着港口拍的卫星图像,所以大部分都是下图所示。
在这里插入图片描述
在这里插入图片描述
 大多数都是民用的舰船,而且没有什么特别的特点,可能第二张要好一些,属于密集型图片。但是应用前景并不是很大。静止型如同靶子一样。但有些比较好的数据集,比如此前那篇论文中的。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
 无法看见船的形状,仅仅只能依靠泛起的水波去判断。这是一个难点,但却具有比较大的前景。

Squeeze-and-Excitation Networks

 类似于此前的Attention机制的Module,SEnet也属于一种即插即用的Module。作者寻找到了一种特征通道直接的相互依赖关系。需要知道的是,卷积是网络的核心算子,而卷积的操作实际上就是在对一个局部区域进行特征融合,这包括空间以及通道间的特征融合。在文章中,作者的主要思想是:“ it can learn to use global information to selectively emphasise informative features and suppress less useful ones.”通过作者提出的一种被称作:“feature recalibration”的机制来选择重要的特征信息,而去抑制当前任务中作用不大的特征信息。而文章核心的技术则是Squeeze和Excitation。
在这里插入图片描述

squeeze

 首先是Squeeze操作,作者顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野,这一点很有用。

Excitation

 它是一个类似于循环神经网络中门的机制。通过参数 来为每个特征通道生成权重,其中参数 被学习用来显式地建模特征通道间的相关性。
 我们需要了解到一些细节。从Squeeze开始,作者使用了全局平均池化进行的压缩,而出使得数值具有全局的感受野,因此可以让网络底层也可以利用全局信息。在这里插入图片描述
 其中U就是多个feature map,最后得到的shape是(C,1,1)。
 再第二个模块中,作者使用了类似瓶颈模块的两个FC(fully-connected)。并设置了减少率为16。
在这里插入图片描述

关于SEnet的应用问题。

 笔者在知网中找到的一篇写得比较好的论文——“嵌入 SENet 结构的改进 YOLOV3 目标识别算法”。之所以觉得好,是因为笔者发现它的应用点有些意思。
在这里插入图片描述
 作者将SEnet嵌入在Darknet的残差网络层,SE-shortcut 结构将原始的信息引入深层,抑制信息的退化,文后进行池化扩大感受野,多角度融合浅层信息与深层信息,使得组合后的输出包含多层
级的信息,增强了特征图的表达能力。但其实这样做以后计算量会变得很大。因为他一共加了(1+2+8+8+4)个SEnet。且不管效果如何,应用点还是比较有意思
在这里插入图片描述
 忍不住吐槽一下,这个作者是怎么想到用黑色的锚框线去描绘的?嵌入SEnet后,将边缘一些残缺的零件都能有效的识别,但是由于没有原网络的对照,感觉有些不严谨啊。于是我也去试了了。
 因为在切除图片的过程中总会有被切一般或者切去一个角的,类似于在正中间的图片都是经过筛选过的图片,所以图片预处理已经标签化着实不易。在这里插入图片描述
在这里插入图片描述
 最上面那张是Original的网络图,下面那张是SEnet的网络图。所以可以很明显的看出,SEnet网络要比原始网络识别残缺部分要高一些些。所以SEnet增加了全局的感受野应该也是有效果的。

Summary

 最近我在做一些关于Dilated Convolution的工作,感觉这一块还是蛮有趣的。平时也比较忙乘着假期就补一补月末总结吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值