前言

首先说一下什么是目标检测:对计算机而言,能够“看到”的是图像被编码之后的数字,但它很难解高层语义概念,比如图像或者视频帧中出现目标的是人还是物体,更无法定位目标出现在图像中哪个区域。目标检测的主要目的是让计算机可以自动识别图片或者视频帧中所有目标的类别,并在该目标周围绘制边界框,标示出每个目标的位置。

如图所示:

目标检测难点和解决办法 目标检测的作用_卷积

  • (a)是图像分类任务,只需识别出这是一张斑马的图片。
  • (b)是目标检测任务,不仅要识别出这是一张斑马的图片,还要标出图中斑马的位置。

目标检测发展历程

在上一节中我们学习了图像分类处理基本流程,先使用卷积神经网络提取图像特征,然后再用这些特征预测分类概率,根据训练样本标签建立起分类损失函数,开启端到端的训练,如 图2 所示。



目标检测难点和解决办法 目标检测的作用_卷积_02


图2:图像分类流程示意图



但对于目标检测问题,按照 图2 的流程则行不通。因为在图像分类任务中,对整张图提取特征的过程中没能体现出不同目标之间的区别,最终也就没法分别标示出每个物体所在的位置。

为了解决这个问题,结合图片分类任务取得的成功经验,我们可以将目标检测任务进行拆分。假设我们现在有某种方式可以在输入图片上生成一系列可能包含物体的区域,这些区域称为候选区域,在一张图上可以生成很多个候选区域。然后对每个候选区域,可以把它单独当成一幅图像来看待,使用图像分类模型对它进行分类,看它属于哪个类别或者背景(即不包含任何物体的类别)。




目标检测难点和解决办法 目标检测的作用_目标检测难点和解决办法_03


图3:候选区域



A为图像上的某个像素点,B为A右下方另外一个像素点,A、B两点可以确定一个矩形框,记作AB。

  • 如图3(a)所示:A在图片左上角位置,B遍历除A之外的所有位置,生成矩形框A1B1, …, A1Bn, …
  • 如图3(b)所示:A在图片中间某个位置,B遍历A右下方所有位置,生成矩形框AkB1, …, AkBn, …

当A遍历图像上所有像素点,B则遍历它右下方所有的像素点,最终生成的矩形框集合{AiBj}将会包含图像上所有可以选择的区域。

只要我们对每个候选区域的分类足够的准确,则一定能找到跟实际物体足够接近的区域来。穷举法也许能得到正确的预测结果,但其计算量也是非常巨大的,其所生成的总的候选区域数目约为目标检测难点和解决办法 目标检测的作用_python_04,假设目标检测难点和解决办法 目标检测的作用_神经网络_05,总数将会达到目标检测难点和解决办法 目标检测的作用_卷积_06个,如此多的候选区域使得这种方法几乎没有什么实用性。但是通过这种方式,我们可以看出,假设分类任务完成的足够完美,从理论上来讲检测任务也是可以解决的,亟待解决的问题是如何设计出合适的方法来产生候选区域。

R-CNN的系列算法分成两个阶段,先在图像上产生候选区域,再对候选区域进行分类并预测目标物体位置,它们通常被叫做两阶段检测算法。SSD和YOLO算法则只使用一个网络同时产生候选区域并预测出物体的类别和位置,所以它们通常被叫做单阶段检测算法。

基本概念

边界框(bounding box)

检测任务需要同时预测物体的类别和位置,因此需要引入一些跟位置相关的概念。通常使用边界框(bounding box,bbox)来表示物体的位置,边界框是正好能包含住物体的矩形框,如 图4 所示,图中3个人分别对应3个边界框。



目标检测难点和解决办法 目标检测的作用_目标检测难点和解决办法_07


图4:边界框



通常有两种格式来表示边界框的位置:

  1. xyxy,即目标检测难点和解决办法 目标检测的作用_卷积_08,其中目标检测难点和解决办法 目标检测的作用_计算机视觉_09是矩形框左上角的坐标,目标检测难点和解决办法 目标检测的作用_python_10是矩形框右下角的坐标。图4中3个红色矩形框用xyxy格式表示如下:
  • 左:目标检测难点和解决办法 目标检测的作用_卷积_11
  • 中:目标检测难点和解决办法 目标检测的作用_python_12
  • 右:目标检测难点和解决办法 目标检测的作用_计算机视觉_13
  1. xywh,即目标检测难点和解决办法 目标检测的作用_卷积_14,其中目标检测难点和解决办法 目标检测的作用_神经网络_15是矩形框中心点的坐标,w是矩形框的宽度,h是矩形框的高度。

在检测任务中,训练数据集的标签里会给出目标物体真实边界框所对应的目标检测难点和解决办法 目标检测的作用_卷积_16,这样的边界框也被称为真实框(ground truth box),如 图4 所示,图中画出了3个人像所对应的真实框。模型会对目标物体可能出现的位置进行预测,由模型预测出的边界框则称为预测框(prediction box)。


注意:

  1. 在阅读代码时,请注意使用的是哪一种格式的表示方式。
  2. 图片坐标的原点在左上角,x轴向右为正方向,y轴向下为正方向。

要完成一项检测任务,我们通常希望模型能够根据输入的图片,输出一些预测的边界框,以及边界框中所包含的物体的类别或者说属于某个类别的概率,例如这种格式: 目标检测难点和解决办法 目标检测的作用_神经网络_17,其中L是类别标签,P是物体属于该类别的概率。一张输入图片可能会产生多个预测框,接下来让我们一起学习如何完成这样一项任务。

锚框(Anchor)

锚框与物体边界框不同,是由人们假想出来的一种框。先设定好锚框的大小和形状,再以图像上某一个点为中心画出矩形框。在下图中,以像素点[300, 500]为中心可以使用下面的程序生成3个框,如图中蓝色框所示,其中锚框A1跟人像区域非常接近。

在目标检测模型中,通常会以某种规则在图片上生成一系列锚框,将这些锚框当成可能的候选区域。模型对这些候选区域是否包含物体进行预测,如果包含目标物体,则还需要进一步预测出物体所属的类别。还有更为重要的一点是,由于锚框位置是固定的,它不大可能刚好跟物体边界框重合,所以需要在锚框的基础上进行微调以形成能准确描述物体位置的预测框,模型需要预测出微调的幅度。在训练过程中,模型通过学习不断的调整参数,最终能学会如何判别出锚框所代表的候选区域是否包含物体,如果包含物体的话,物体属于哪个类别,以及物体边界框相对于锚框位置需要调整的幅度。

交并比

上面我们画出了以点目标检测难点和解决办法 目标检测的作用_python_18为中心,生成的三个锚框,我们可以看到锚框A1 与真实框 G1的重合度比较好。那么如何衡量这三个锚框跟真实框之间的关系呢,在检测任务中是使用交并比(Intersection of Union,IoU)作为衡量指标。这一概念来源于数学中的集合,用来描述两个集合目标检测难点和解决办法 目标检测的作用_python_19目标检测难点和解决办法 目标检测的作用_目标检测难点和解决办法_20之间的关系,它等于两个集合的交集里面所包含的元素个数,除以它们的并集里面所包含的元素个数,具体计算公式如下:

目标检测难点和解决办法 目标检测的作用_目标检测难点和解决办法_21

我们将用这个概念来描述两个框之间的重合度。两个框可以看成是两个像素的集合,它们的交并比等于两个框重合部分的面积除以它们合并起来的面积。下图a中红色区域是两个框的重合面积,图b中蓝色区域是两个框的相并面积。用这两个面积相除即可得到它们之间的交并比,如 图5 所示。




目标检测难点和解决办法 目标检测的作用_计算机视觉_22


图5:交并比



假设两个矩形框A和B的位置分别为: $$A: [x_{a1}, y_{a1}, x_{a2}, y_{a2}]$$

目标检测难点和解决办法 目标检测的作用_python_23

假如位置关系如 图6 所示:



目标检测难点和解决办法 目标检测的作用_目标检测难点和解决办法_24


图6:计算交并比



如果二者有相交部分,则相交部分左上角坐标为:
目标检测难点和解决办法 目标检测的作用_python_25

相交部分右下角坐标为:
目标检测难点和解决办法 目标检测的作用_神经网络_26

计算先交部分面积:
目标检测难点和解决办法 目标检测的作用_目标检测难点和解决办法_27

矩形框A和B的面积分别是:
目标检测难点和解决办法 目标检测的作用_神经网络_28

目标检测难点和解决办法 目标检测的作用_python_29

计算相并部分面积:
目标检测难点和解决办法 目标检测的作用_卷积_30

计算交并比:

目标检测难点和解决办法 目标检测的作用_神经网络_31


思考:

两个矩形框之间的相对位置关系,除了上面的示意图之外,还有哪些可能,上面的公式能否覆盖所有的情形?


为了直观的展示交并比的大小跟重合程度之间的关系,图7 示意了不同交并比下两个框之间的相对位置关系,从 IoU = 0.95 到 IoU = 0.



目标检测难点和解决办法 目标检测的作用_计算机视觉_32


图7:不同交并比下两个框之间相对位置示意图



有了基础概念的基础,就可以开始模型了。

YOLOv4整体介绍

什么是YOLOv4

要想知道什么是YOLO首先要知道什么是yolo。
YOLO是You Only Look Once的缩写。它是一种使用深卷积神经网络学习的特征来检测物体的目标检测器。
物体检测的两个步骤可以概括为:

  • 检测目标位置(生成矩形框)
  • 对目标物体进行分类
    剩下的基础概念一级yolov1到v3可以看下这篇文章从V1到V4,让你读懂YOLO原理,大致了解下,这里将尽可能详细的讲一下YOLOv4的网络原理以及其代码实现。

主干网络

这里是YOLOv3的主干网络为Darknet53,整体结构如下



目标检测难点和解决办法 目标检测的作用_卷积_33

YOLOv3网络结构


YOLOv4主干网络为CSPDarkNet53,其有两种输入结构,一种是416X416




目标检测难点和解决办法 目标检测的作用_卷积_34

YOLOv4网络结构



另一种是608x608




目标检测难点和解决办法 目标检测的作用_目标检测难点和解决办法_35

YOLOv4网络结构


网络分解

主干特征提取网络CSPDarknet53

  • DarknetConv2D的激活函数由LeakyReLU修改成了Mish,卷积块由DarknetConv2D_BN_Leaky变成了DarknetConv2D_BN_Mish
  • 1个Darknet的2维卷积Conv2D层,即DarknetConv2D;
  • 1个批正则化(BN)层,即BatchNormalization();
  • 1个Mish激活函数




目标检测难点和解决办法 目标检测的作用_python_36



Mish=x×tanh(ln(1+e^x ))

  • 首先输入416X416X3(长宽和通道数RGB)的图片,经过一次darknet卷积,变成了416X416X32的,然后经过残差卷积块(包括卷积、标准化,激活函数)的处理,使最终图像的shape的长和宽不断压缩,通道数不断增大,最终变为13x13x1024。
  • resblock_body模块,其由一次下采样和多次残差结构的堆叠构成,Darknet53便是由resblock_body模块组合而成。1、2、8、4指的是残差卷积块的内部残差结构堆叠的次数。




目标检测难点和解决办法 目标检测的作用_卷积_37





不断进行下采样是为了获得更高语义的信息,最终我们只选择了最后三个shape的特征层进行下一步的操作,因为他们具有更高语义的信息。

下图左边是普通的残差卷积,右边是含有CSPnet结构的残差卷积,可以看到CSP残差结构有一个大的 残差边,直接跳过了堆叠的残差结果,直接连向输出




目标检测难点和解决办法 目标检测的作用_目标检测难点和解决办法_38



CSPnet结构

SPP结构——加强特征提取网络

目标检测难点和解决办法 目标检测的作用_计算机视觉_39

  • 接下来对最后一个13x13x1024的特征层进行三次卷积操作,然后对输入进来的特征层进行池化核大小分别为13x13、9x9、5x5、1x1(1x1即无处理)四种不同大小的最大池化,再对池化的结果进行堆叠,再进行三次卷积。它能够极大地增加感受野,分离出最显著的上下文特征。

PANet结构——加强特征提取网络

该部分也称为特征金字塔

目标检测难点和解决办法 目标检测的作用_神经网络_40

  • PANet是2018的一种实例分割算法,其具体结构由反复提升特征的意思。上图为原始的PANet的结构,可以看出来其具有**一个非常重要的特点就是特征的反复提取。**在(a)里面是传统的特征金字塔结构,在完成特征金字塔从下到上的特征提取后,还需要实现(b)中从上到下的特征提取。
  • 目标检测难点和解决办法 目标检测的作用_目标检测难点和解决办法_41

  • 这里对三次卷积后的特征层进行卷积和上采样处理,这里用的是两倍上采样,这样13x13x1024的特征层就变成了-26x26x512,这样我们就可以用我们上采样得到的特征层与我们主干网络获取到的26x26x512的特征层进行堆叠,从而实现特征融合,融合之后再卷积再次进行上采样,再堆叠融合,这样就对三个特征层都完成了特征融合了,然后我们还要加深特征提取。
  • 怎样加深呢?我们又采取了下采样的方式,进行52x52x256的就又变成了26x26x512的特征层,然后就又可以与下面的26x26x512的特征层进行堆叠融合了,再下采样,再融合。这样一套下来我们就得到了很有效的特征了。然后就交给yolo head对提取的特征进行结果预测。

YOLO head



目标检测难点和解决办法 目标检测的作用_卷积_42


yolov4和yolov3的yolohead是一样的结构,这里拿13x13x1024的yolohead为例子,来说明。

  • (3,3)的卷积可以看做是之前获得特征的总和
  • (1.1)的卷积就是利用这个特征,获得最终的输出结果
  • 这里13*13是图片的大小,也就是整个图片分成了13x13个框框,75为3x25。
  • 3是三个先验框,25是cov2007的20个类别,5是4+1,4是一个中心点坐标+一个框的长和宽,1为这个框是否包含这个物体,也可以说是置信度。
  • 如果使用的是coco训练集,类则为80种,最后的维度应该为255 = 3x(80+5},三个特征层的shape为(19,19,255),(38,38,255),(76,76,255)


目标检测难点和解决办法 目标检测的作用_目标检测难点和解决办法_43

目标检测难点和解决办法 目标检测的作用_神经网络_44

这两个和上面是一样的,就划分的网格多了许多。


除去CSPDarknet53和Yolo Head的结构外,都是特征金字塔的结构。

YOLOv4与YOLOv3的区别

主干特征提取网络Backbone的改进点有两个:

  1. 主干特征提取网络:DarkNet53 => CSPDarkNet53
  2. 激活函数:使用Mish激活函数

加强特征提取网络多了许多上采样和下采样。

先验框

由第二步我们可以获得三个特征层的预测结果,shape分别为(N,13,13,1024),(N,26,26,512),(N,52,52,256)的数据,对应每个图分为13X13、26X26、52X52,的网格上3个预测框的位置。

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

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

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

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

yolo4的解码过程就是将每个网格点加上它对应的x_offset和y_offset,加完后的结果就是预测框的中心,然后再利用 先验框和h、w结合 计算出预测框的长和宽。这样就能得到整个预测框的位置了。

当然得到最终的预测结构后还要进行得分排序与非极大抑制筛选

这一部分基本上是所有目标检测通用的部分。不过该项目的处理方式与其它项目不同。其对于每一个类进行判别。

1、取出每一类得分大于self.obj_threshold的框和得分。

2、利用框的位置和得分进行非极大抑制。

目标检测难点和解决办法 目标检测的作用_计算机视觉_45