Yolo系列算法学习笔记——YoloV1

回到目录:算法学习笔记系列索引

YOLO系列算法之 • Yolo_V1

  几乎所有的深度学习算法都可以被描述为以下几个模块:网络结构,损失函数设计,数据集制作,训练和推理预测。编写本文的目的也是准备从这几个方面将自己在学习过程中的一些知识要点与心得体会整理记录下来,以便于后续温习和更好的理解掌握。此外,也希望能够从另一角度对其它准备学习该算法的人带一些帮助。


1、算法简介

  Yolo_V1论文发表时称作Yolo,V1是为了与后续版本区分)是YOLO系列算法中的开篇之作,创新性的将传统目标检测算法从two-stage变成了one-stage,即从图像中一次回归出目标位置和类型。极大提高了目标检测的速度。
  Yolo_V1算法的核心理念是把目标检测转变成一个回归问题。将整个图像作为网络的输入,仅仅经过一个神经网络的处理即可得到边界框的位置及其所属的类别。通俗的讲,即通过一次回归运算实现目标检测任务
  具体实现方式是:假设将图像划分为若干个网格区域(假设为 N × N N{\times}N N×N个网格),每个区域负责预测一个目标。在每个区域中事先设定多个检测框来表示该区域内的目标信息(假设设为 B B B个框),每个检测框都有一组数量固定的参数来表示的目标信息,即目标有无、目标位置、目标类型等。这样就将目标检测算法的输出变成了一批数据(即最终有 N × N × ( B × ( 有无置信度 + 位置 ) + 类型 ) N{\times}N{\times}(B{\times}(有无置信度+位置)+类型) N×N×(B×(有无置信度+位置)+类型)个数据),再通过一个专门设计的损失函数,即可实现从图像到输出数据的回归运算。
  在论文中,作者将图像大小先调整到 448 × 448 448{\times}448 448×448,然后将其分成了 7 × 7 7{\times}7 7×7个网格,每个网格中有 2 2 2个检测框。此外,作者选取的数据集为PASCAL VOC,其中包含了 20 20 20类数据用进行算法验证。因此,输出参数数量为 7 × 7 × ( 2 × 5 + 20 ) = 1470 7{\times}7{\times}(2{\times}5+20)=\bm{1470} 7×7×(2×5+20)=1470个。

2、网络结构

image

  Yolo_V1的网络结构借鉴了GoogLeNet,但没有使用Inception结构,而是用了 1 × 1 1{\times}1 1×1降维层。网络设计如上图所示,作者原文中的插图有一些错误数据,此处已经做了修正。从输入到输出总共经过 24 24 24个卷积层和 2 2 2个全链接层,作者将这些计算层分成了 8 8 8个步骤,同时,在卷积层的每个步骤间穿插了池化层。最终得到输出的数据,并将数据按前面假设变形成与网格对应的形式。

  当前网络结构有如下特点:

  • 3 × 3 3{\times}3 3×3的卷积后接 1 × 1 1{\times}1 1×1卷积,既降低了计算量,也提升了模型的非线性能力。
  • 除最后一层使用线性激活函数外,其余层都使用Leaky ReLU激活函数
  • 在训练中使用Dropout与数据增强的方法来防止过拟合。
  • 第一个全连接层作用:将卷积得到的分布式特征映射到样本标记空间。即把该输入图像的所有卷积特征整合到一起。
  • 第二个全连接层作用:将所有神经元得到的卷积特征进行维度转换,最后得到与目标检测网络输出维度相同的维度。

Yolo_V1网格结构与处理步骤说明

Step 1

将图像大小调整为 448 ∗ 448 ∗ 3 448*448*3 4484483

Step 2

2.1、卷积运算,卷积核大小为 7 ∗ 7 ∗ 3 7*7*3 773,卷积核数量为 64 64 64,卷积运算步长为 2 2 2。此时数据大小变为 224 ∗ 224 ∗ 64 224*224*64 22422464
2.2、池化运算,大小为 2 ∗ 2 2*2 22,步长为 2 2 2。此时数据大小变为 112 ∗ 112 ∗ 64 112*112*64 11211264

Step 3

3.1、卷积运算,卷积核大小为 3 ∗ 3 ∗ 64 3*3*64 3364,卷积核数量为 192 192 192,卷积运算步长为 1 1 1。此时数据大小变为112*112*192
3.2、池化运算,大小为 2 ∗ 2 2*2 22,步长为 2 2 2。此时数据大小变为56*56*192

Step 4

4.1、卷积运算,卷积核大小为 1 ∗ 1 ∗ 192 1*1*192 11192,卷积核数量为 128 128 128,卷积运算步长为 1 1 1。此时数据大小变为 56 ∗ 56 ∗ 128 56*56*128 5656128
4.2、卷积运算,卷积核大小为 3 ∗ 3 ∗ 128 3*3*128 33128,卷积核数量为 256 256 256,卷积运算步长为 1 1 1。此时数据大小变为 56 ∗ 56 ∗ 256 56*56*256 5656256
4.3、卷积运算,卷积核大小为 1 ∗ 1 ∗ 256 1*1*256 11256,卷积核数量为 256 256 256,卷积运算步长为 1 1 1。此时数据大小变为 56 ∗ 56 ∗ 256 56*56*256 5656256
4.4、卷积运算,卷积核大小为 3 ∗ 3 ∗ 256 3*3*256 33256,卷积核数量为 512 512 512,卷积运算步长为 1 1 1。此时数据大小变为 56 ∗ 56 ∗ 512 56*56*512 5656512
4.5、池化运算,大小为 2 ∗ 2 2*2 22,步长为 2 2 2。此时数据大小变为 28 ∗ 28 ∗ 512 28*28*512 2828512

Step 5:

5.1、卷积运算,卷积核大小为 1 ∗ 1 ∗ 512 1*1*512 11512,卷积核数量为 256 256 256,卷积运算步长为 1 1 1。此时数据大小变为 28 ∗ 28 ∗ 256 28*28*256 2828256
5.2、卷积运算,卷积核大小为 3 ∗ 3 ∗ 256 3*3*256 33256,卷积核数量为 512 512 512,卷积运算步长为 1 1 1。此时数据大小变为 28 ∗ 28 ∗ 512 28*28*512 2828512
5.3、卷积运算,卷积核大小为 1 ∗ 1 ∗ 512 1*1*512 11512,卷积核数量为 256 256 256,卷积运算步长为 1 1 1。此时数据大小变为 28 ∗ 28 ∗ 256 28*28*256 2828256
5.4、卷积运算,卷积核大小为 3 ∗ 3 ∗ 256 3*3*256 33256,卷积核数量为 512 512 512,卷积运算步长为 1 1 1。此时数据大小变为 28 ∗ 28 ∗ 512 28*28*512 2828512
5.5、卷积运算,卷积核大小为 1 ∗ 1 ∗ 512 1*1*512 11512,卷积核数量为 256 256 256,卷积运算步长为 1 1 1。此时数据大小变为 28 ∗ 28 ∗ 256 28*28*256 2828256
5.6、卷积运算,卷积核大小为 3 ∗ 3 ∗ 256 3*3*256 33256,卷积核数量为 512 512 512,卷积运算步长为 1 1 1。此时数据大小变为 28 ∗ 28 ∗ 512 28*28*512 2828512
5.7、卷积运算,卷积核大小为 1 ∗ 1 ∗ 512 1*1*512 11512,卷积核数量为 256 256 256,卷积运算步长为 1 1 1。此时数据大小变为 28 ∗ 28 ∗ 256 28*28*256 2828256
5.8、卷积运算,卷积核大小为 3 ∗ 3 ∗ 256 3*3*256 33256,卷积核数量为 512 512 512,卷积运算步长为 1 1 1。此时数据大小变为 28 ∗ 28 ∗ 512 28*28*512 2828512
5.9、卷积运算,卷积核大小为 1 ∗ 1 ∗ 512 1*1*512 11512,卷积核数量为 512 512 512,卷积运算步长为 1 1 1。此时数据大小变为 28 ∗ 28 ∗ 512 28*28*512 2828512
5.10、卷积运算,卷积核大小为 3 ∗ 3 ∗ 512 3*3*512 33512,卷积核数量为 1024 1024 1024,卷积运算步长为 1 1 1。此时数据大小变为 28 ∗ 28 ∗ 1024 28*28*1024 28281024
5.11、池化运算,大小为 2 ∗ 2 2*2 22,步长为 2 2 2。此时数据大小变为 14 ∗ 14 ∗ 1024 14*14*1024 14141024

Step 6:

6.1、卷积运算,卷积核大小为 1 ∗ 1 ∗ 1024 1*1*1024 111024,卷积核数量为 512 512 512,卷积运算步长为 1 1 1。此时数据大小变为 14 ∗ 14 ∗ 512 14*14*512 1414512
6.2、卷积运算,卷积核大小为 3 ∗ 3 ∗ 512 3*3*512 33512,卷积核数量为 1024 1024 1024,卷积运算步长为 1 1 1。此时数据大小变为 14 ∗ 14 ∗ 1024 14*14*1024 14141024
6.3、卷积运算,卷积核大小为 1 ∗ 1 ∗ 1024 1*1*1024 111024,卷积核数量为 512 512 512,卷积运算步长为 1 1 1。此时数据大小变为 14 ∗ 14 ∗ 512 14*14*512 1414512
6.4、卷积运算,卷积核大小为 3 ∗ 3 ∗ 512 3*3*512 33512,卷积核数量为 1024 1024 1024,卷积运算步长为 1 1 1。此时数据大小变为 14 ∗ 14 ∗ 1024 14*14*1024 14141024
6.5、卷积运算,卷积核大小为 3 ∗ 3 ∗ 1024 3*3*1024 331024,卷积核数量为 1024 1024 1024,卷积运算步长为 1 1 1。此时数据大小变为 14 ∗ 14 ∗ 1024 14*14*1024 14141024
6.6、卷积运算,卷积核大小为 3 ∗ 3 ∗ 1024 3*3*1024 331024,卷积核数量为 1024 1024 1024,卷积运算步长为 2 2 2。此时数据大小变为 7 ∗ 7 ∗ 1024 7*7*1024 771024

Step 7:

7.1、卷积运算,卷积核大小为 3 ∗ 3 ∗ 1024 3*3*1024 331024,卷积核数量为 1024 1024 1024,卷积运算步长为 1 1 1。此时数据大小变为 7 ∗ 7 ∗ 1024 7*7*1024 771024
7.2、卷积运算,卷积核大小为 3 ∗ 3 ∗ 1024 3*3*1024 331024,卷积核数量为 1024 1024 1024,卷积运算步长为 1 1 1。此时数据大小变为 7 ∗ 7 ∗ 1024 7*7*1024 771024

Step 8:

全链接层,数量为 4096 4096 4096。此时数据大小变为 1 ∗ 4096 ∗ 1 1*4096*1 140961

Step 9:

全链接层,数量为 1470 1470 1470。此时数据大小变为 1 ∗ 1470 ∗ 1 1*1470*1 114701

Step 10:

使输出与假设的网格数量对应,将形状调整为 7 ∗ 7 7*7 77。此时数据大小变为 7 ∗ 7 ∗ 30 7*7*30 7730

3、损失函数设计

  作者将目标检测转换为了回归问题,为了获取使回归运算结果误差最小的参数集,需要将训练目标定义为最小化损失函数。
  模型的最后一层输出负责预测类概率和边界框坐标。在该层中使用了线性激活函数,且将所有输出数值归一化到 [ 0 ∼ 1 ] [0\sim1] [01]之间,因此可直接计算输出值的平方和误差。但如果将损失函数直接定义为输出数据的平方和误差,并不完全符合最小化平均误差的目标。且这样做会导致模型不稳定,从而使得训练在早期就发散。为了弥补直接使用平方和误差的缺陷,作者专门设计了新的组合式的损失函数,利用多个权值参数和选择项参数,使平均误差计算更合理。
  作者将损失函数设计如下:
J ( θ ) = λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 ] + λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] + ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j ( C i − C ^ i ) 2 + λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B 1 i j n o o b j ( C i − C ^ i ) 2 + ∑ i = 0 S 2 1 i o b j ∑ c ∈ c l a s s e s ( p i ( c ) − p ^ i ( c ) ) 2 (3.1) \bm{J(\theta)}\quad=\quad\bm\lambda_{\mathrm{coord}}\sum_{i=0}^{S^2}\sum_{j=0}^{B}{\Large{1}}_{ij}^{\rm{obj}}[(x_i-\hat{x}_i)^2+(y_i-\hat{y}_i)^2] \\ +\bm\lambda_{\mathrm{coord}}\sum_{i=0}^{S^2}\sum_{j=0}^{B}{\Large{1}}_{ij}^{\rm{obj}}[(\sqrt{w_i}-\sqrt{\hat{w}_i})^2+(\sqrt{h_i}-\sqrt{\hat{h}_i})^2] \\ +\sum_{i=0}^{S^2}\sum_{j=0}^{B}{\Large{1}}_{ij}^{\rm{obj}}(C_i-\hat{C}_i)^2 \\ +\bm\lambda_{\mathrm{noobj}}\sum_{i=0}^{S^2}\sum_{j=0}^{B}{\Large{1}}_{ij}^{\rm{noobj}}(C_i-\hat{C}_i)^2 \\ +\sum_{i=0}^{S^2}{\Large{1}}_{i}^{\rm{obj}}\sum_{c{\in}\rm{classes}}(p_i(c)-\hat{p}_i(c))^2 \tag{3.1} J(θ)=λcoordi=0S2j=0B1ijobj[(xix^i)2+(yiy^i)2]+λcoordi=0S2j=0B1ijobj[(wi w^i )2+(hi h^i )2]+i=0S2j=0B1ijobj(CiC^i)2+λnoobji=0S2j=0B1ijnoobj(CiC^i)2+i=0S21iobjcclasses(pi(c)p^i(c))2(3.1)
其中, λ c o o r d \bm\lambda_{\mathrm{coord}} λcoord λ n o o b j \lambda_{\mathrm{noobj}} λnoobj是平衡误差权重参数,前者较大设为 5 5 5,后都较小设为 0.5 0.5 0.5 1 i j o b j {\Large{1}}_{ij}^{\rm{obj}} 1ijobj表示第 i i i个网格的第 j j j个检测框是否负责预测目标,预测时为 1 1 1,否则为 0 0 0 1 i j n o o b j {\Large{1}}_{ij}^{\rm{noobj}} 1ijnoobj表示第 i i i个网格的第 j j j个检测框是否负责预测目标,不预测时为 1 1 1,否则为 0 0 0 1 i o b j {\Large{1}}_{i}^{\rm{obj}} 1iobj表示第 i i i个网格是否负责预测目标,预测时为 1 1 1,否则为 0 0 0 C C C为目标置信度,预测时置信度为 [ 0 , 1 ] [0,1] [0,1]的值,标签中置信度为 1 1 1 p i c p_i{c} pic表示每个类别的概率, c c c为类别。预测时概率为 [ 0 , 1 ] [0,1] [0,1]的值,标签中概率为 1 1 1 0 0 0

公式详解
  公式中的每一行都表示一类损失元素。

  • 第一行表示位置坐标损失,其损失误差大小直接用目标中心点的坐标 x x x y y y的均方差来计算。这个损失非常重要,所以有一个较大的权重参数。
  • 第二行表示大小坐标损失,其损失误差大小直接用目标大小的宽高 w w w h h h的均方差来计算。这个损失非常重要,所以有一个较大的权重参数。

  第二行计算时加根号的原因是当大小不同的框的预测值和真实值相差同样数值时,对大框的影响比对小框的影响小。因此引入一个开放运算 z ′ = z {z^\prime=\sqrt{z}} z=z ,使得同样大小的 Δ z \Delta{z} Δz在较小 z 1 z_1 z1处有较大的值 Δ z 1 ′ \Delta{z_1^\prime} Δz1,在较大 z 2 z_2 z2时有较小的值 Δ z 2 ′ \Delta{z_2^\prime} Δz2
image

  • 第三行表示包含物体的置信度损失,其损失误差大小直接用目标置信度 C C C的均方差来计算。这个损失一般重要,所以正常计算即可。
  • 第二行表示不包含物体的置信度损失,其损失误差大小直接用目标置信度 C C C的均方差来计算。它不太重要但又不能没有,所以有一个较小的权重参数。
  • 第二行表示类别损失,其损失误差大小直接用目标每个类别的概率 p i ( c ) p_i(c) pi(c)的均方差之和来计算。这个损失一般重要,所以正常计算即可。

4、数据集制作

4.1、数据集标注

  Yolo_V1算法属于监督学习算法,所采用的训练数据是需要人工事先标注好的。数据集的标注工具可以采用一些开源的标工具(如LabelMe等),也可以自己开发标注工具软件,只需得到目标在图像中的外接矩形框数据即可。
  Yolo_V1数据集标注的格式为每个图像对应一个同名的文本文件(如001.jpg/001.txt),文本文件中存储了图像中所有目标的位置及类别信息,每个目标占据一行。每行目标的数据格式为:
类别 中心点坐标 X 中心点坐标 Y 目标宽度 目标高度 \rm{类别 \quad 中心点坐标X \quad 中心点坐标Y \quad 目标宽度 \quad 目标高度} 类别中心点坐标X中心点坐标Y目标宽度目标高度
其中,类别编号从 0 0 0开始,所有位置信息都需要归一化处理,即中心点坐标X和目标宽度需要除去图像宽度,中心点坐标Y和目标高度需要除去图像高度。
标注好的文件如下所示:

  6 0.700148 0.402841 0.0225673 0.0889295
  1 0.747121 0.400667 0.0208931 0.0852561
  0 0.821372 0.397336 0.0224258 0.0816718
  2 0.845673 0.395819 0.0220219 0.0862745
  1 0.149736 0.454767 0.0216501 0.0901321
  2 0.173309 0.455001 0.0234477 0.0868308
  3 0.409392 0.430519 0.0217106 0.0864021
  5 0.434075 0.430767 0.0227252 0.0861191
  7 0.555767 0.415482 0.0218351 0.0852946

4.2、网格与目标参数详解

  论文中,作者假设将图像划分成 7 ∗ 7 7*7 77大小的网格(即 N = 7 N=7 N=7),每个网格中包含 2 2 2个检测框(即 B = 2 B=2 B=2),每个检测框包含 5 5 5个元素: C e n t e r X , C e n t e r Y , O b j e c t W i d t h , O b j e c t H e i g h t , O b j e c t C o n f i d e n c e \rm{CenterX,CenterY,ObjectWidth,ObjectHeight,ObjectConfidence} CenterXCenterYObjectWidthObjectHeightObjectConfidence。此外,无论每个网格设置多少检测框,都只预测一个目标的类别。

  • 总共有 7 ∗ 7 7*7 77个网格,每个网格只检测一个目标,因此,最多只能检测 49 49 49个目标。
  • 每个网格中所有检测框共用一个类别,在训练时会选取与标签数据IoU更大的那个框负责回归该真实物体框;在测试时会选取置信度更高的那个框作为推理预测结果,另一个会被舍弃。
  • 检测框中的目标位置元素 C e n t e r X , C e n t e r Y \rm{CenterX,CenterY} CenterXCenterY的值定义为检测框中心坐标基于当前网格归一化后与该网格的相对位置偏移量,大小在 { 0 ∼ 1 } \{0\sim1\} {01}之间。计算方式为 x ^ = x o b j − x c u r r e n t    c e l l w i m g N = x o b j w i m g ∗ N − I d x    c u r r e n t    c e l l \hat{x}=\frac{x_{obj}-x_{current\;cell}}{\frac{w_{img}}{N}}=\frac{x_{obj}}{w_{img}}*N-Id_x^{\;current\;cell} x^=Nwimgxobjxcurrentcell=wimgxobjNIdxcurrentcell,同理, y ^ = y o b j h i m g ∗ N − I d y    c u r r e n t    c e l l \hat{y}=\frac{y_{obj}}{h_{img}}*N-Id_y^{\;current\;cell} y^=himgyobjNIdycurrentcell
  • 检测框中的目标位置元素 O b j e c t W i d t h , O b j e c t H e i g h t \rm{ObjectWidth,ObjectHeight} ObjectWidthObjectHeight的值定义为检测框宽高基于全图归一化后的值,大小在 { 0 ∼ 1 } \{0\sim1\} {01}之间。计算方式为 w ^ = x o b j w i m g \hat{w}=\frac{x_{obj}}{w_{img}} w^=wimgxobj,同理, h ^ = y o b j h i m g \hat{h}=\frac{y_{obj}}{h_{img}} h^=himgyobj
  • 检测框中目标置信度 O b j e c t C o n f i d e n c e \rm{ObjectConfidence} ObjectConfidence的值定义为该检测框包含目标的概率,大小在 { 0 ∼ 1 } \{0\sim1\} {01}之间。计算方式为 p ^ = P r ( O b j e c t ) ∗ I o U t r u t h p r e d \hat{p}=Pr(Object)*IoU\frac{truth}{pred} p^=Pr(Object)IoUpredtruth,其中, P r ( O b j e c t ) Pr(Object) Pr(Object)包含目标时为 1 1 1,否则为 0 0 0 I o U t r u t h p r e d IoU\frac{truth}{pred} IoUpredtruth为预测边框和Ground-Truth的IoU值。
  • 每个网格类别值取One-Hot向量形式,对每个类别计算条件概率 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i|Object) Pr(ClassiObject),大小在 { 0 ∼ 1 } \{0\sim1\} {01}之间。在预测时,将条件概率和单个检测框的置信度值相乘,最终计算方式为 p ^ c l a s s i = P r ( C l a s s i ∣ O b j e c t ) P r ( O b j e c t ) ∗ I o U t r u t h p r e d = P r ( C l a s s i ) ∗ I o U t r u t h p r e d \hat{p}_{class_i}=Pr(Class_i|Object)Pr(Object)*IoU\frac{truth}{pred}=Pr(Class_i)*IoU\frac{truth}{pred} p^classi=Pr(ClassiObject)Pr(Object)IoUpredtruth=Pr(Classi)IoUpredtruth

4.3、标注数据生成训练标签

  标注好的数据集并不能直接用于训练,而是要对标的数据进行转换,将其变成Yolo_v1假设的网格形式。具体转换方式为:

Step 1: 将图像宽高调整为 448 ∗ 448 448*448 448448,并记录下调整过程中的图像变换参数。调整方式在训练和推理时要保持一致。为保证图像比例,可通过尺度变换结合像素填充来实现,具体可参考5.1节的图像预处理部分。
Step 2: 将图像划分成 7 ∗ 7 7*7 77个网格区域,并根据标注信息计算得到每个网格中的目标数据。具体方式是遍历全部分好的网格,如果有目标中心点落在当前网格,则将标注信息写到目标数据中;如果没有目标中心点落在当前网络,则将目标数据全部置为 0 0 0即可。转换完成后会得到大小为 7 ∗ 7 ∗ M 1 7*7*M_1 77M1的标签数据。
Step 3: 将转换好的标签数据调整为 1 ∗ M 2 ∗ 1 1*M_2*1 1M21形式,用于后续训练(训练过程中,没有必要将最终数据转换成 7 ∗ 7 ∗ M 7*7*M 77M形式,这样可以减少运算步骤)。

5、训练

  目标检测是典型的监督学习,在训练集上已经标注了真实目标的位置框,而算法要使得预测框尽量去拟合真实框。监督学习的训练是通过梯度下降和反向传播等方法,迭代微调各个神经元的权重找到使损失函数最小的神经网络参数集。

5.1、训练技巧

  • 每个网格单元包含多个检测框。在训练时,每个目标只需要一个检测框来负责。若某检测框的预测值与目标的实际值的IoU最高,则这个检测框被指定为“负责”预测该目标。
  • 为避免过拟合,训练过程中使用了Dropout和大量的数据增强技术。作者在论文中引入高达 20 % 20\% 20%的原始图像大小的随机缩放和平移。还在HSV色彩空间中以高达 1.5 1.5 1.5的因子随机调整图像的曝光度和饱和度。
  • 训练之前先对输入的数据进行统一的预处理(处理方式见6.1节),然后再送到网络模型中进行训练。
  • 对于学习率,第一个迭代周期中可以将学习率从 1 0 − 3 10^{-3} 103提高到 1 0 − 3 10^{-3} 103,这样可以避免由于梯度不稳定而发散。后续继续以 1 0 − 2 10^{-2} 102的学习率训练 N 1 N_1 N1个迭代周期,然后用 1 0 − 3 10^{-3} 103的学习率训练 N 2 N_2 N2个迭代周期,最后用 1 0 − 4 10^{-4} 104的学习率训练 N 3 N_3 N3个迭代周期。

5.2、预训练网络

  为了提高训练速度以及减小数据标注工作量,可以先在其它数据集(ImageNet 1000)上预训练一个分类网络,该分类网络设计为前20层采用与第2节中网络前20层一样的结构,然后接一个平均池化层和一个全连接层。
  分类网络训练完成后,转换为第2章中的网络来训练检测任务。此时,可以复用前面预训练时的前20层网络参数,重点完成后面4个卷积层和2个全链接层的迁移学习

5.3、优化方法选择

  优化方法采用梯度下降法,该方法讲解参考深度学习优化方法详解

6、推理预测

  推理预测时,测试图像的检测只需要一次网络评估。在每张图像上网络模型会预测 7 ∗ 7 ∗ 2 = 98 7*7*2=98 772=98个边界框和 7 ∗ 7 = 49 7*7=49 77=49的类别概率。此时,一些目标可以被多个网格单元重复预测。采用非极大值抑制方法(NMS)可以用来修正这些多重检测。

6.1、预处理

  为了适应神经网络运算,通常将图像转换为同一尺寸,且将像素值归一化到 [ 0 ∼ 1 ] [0\sim1] [01]之间。此时原始会经过尺度变换,边缘填充等处理后再用于网络中。在训练和预测阶段,要保证图像的预处理方式一致。
  在本文中,先将图像等比例缩放到长边大小为 448 448 448,然后对短边进行边缘延拓与填充,将其大小也变为 448 448 448。然后对新图像的像素进行归一化处理,使每个像素值大小变为 [ 0 ∼ 1 ] [0\sim1] [01]之间。

6.2、非极大值抑制

  非极大值抑制(NMS)算法主要为了解决的一个目标被多次检测的问题,其目的是在一个区域内交叠的很多框中选一个最优的框作为最终结果。

论文中NMS具体实现步骤

  • Step 1: 将预测结果数据中每个检测框赋予一个类别概率。实现方式是将该检测框的目标置信度乘以其对应的类别条件概率,每个框即可得到一个类别概率向量。此时可得到一个 20 ∗ 98 20*98 2098的矩阵,每行表示一个类别,每列表示一个检测框。
  • Step 2: 初步筛选,将所有概率小于某个值(比如 0.2 0.2 0.2)的项的概率值直接置为 0 0 0。只保留较大的概率。
  • Step 3: 选择一行数据进行NMS运算,即对该类别的预测框进行去重叠处理,最终只保留不重叠的预测框(此时,保留的框有可能不是真实框,因为是对当前类别进行的处理,但这个框对应的概率最大的类别不一定是当前类别。仍然这么做而不是直接选最大概率检测框的目的是有可能图中有多个该类别的物体,所以要保留IoU小于阈值的检测框,哪怕它是错误的。)。
    该步骤具体实现方法是:
  • Step 3.1: 选择某一行所有数据,先拿出最大值概率的那个框,剩下的每一个都与它做比较,如果两者的IoU大于某个阈值,则认为这俩框重复识别了同一个物体,就将其中低概率的重置成0。否则概率值保持不变。
  • Step 3.2: 最大的那个框和其他的框比完之后,再从剩下的框找最大的,继续和其他的比,依次类推对直到该类别留下的所有框都不重叠。
  • Step 4:依次对每个类别重复操作Step 3,直到所有类别都只保留不重叠的预测框。
  • Step 5:依次对每一列数据进行处理,选择其中概率最大的类别并将其它类别概率值置为 0 0 0。最后即得到一个 20 ∗ 98 20*98 2098的稀疏矩阵,其中,每个元素值不为 0 0 0的项对应的检测框和类别即是最终检测到的结果。

  此外,NMS只发生在推理预测阶段。在训练阶段所有框的预测结果都会用于损失函数计算,因此都要保留。

7、个人感悟

7.1、不足之处

  • 模型中将图像分为 7 ∗ 7 7*7 77个网络且每个网格只预测一个目标,因此不适用小目标和重合目标的检测。
  • 每个网格只设定了两个不同大小的检测框,因此对形状比例不一样的目标,检测效果不稳定。
  • 作者只对宽高误差针对不同大小目标做了处理,并没有对位置误差做处理,因此位置检测效果不太好。

7.2、网格与检测框

  • 网格可看做检索方式与步长,每个网格可检测一次目标,为了提高检测精度与可检测尺度,可以将网格数量设置多一些。
  • 检测框可以看作目标的先验知识,本文中采用了两个检测框,在后续版本中,采用了数量更多的AnchorBox。这样可以更好的检测不同比例大小的目标。
  • 此外,在最后的NMS处理时,也可以对每个检测框中的概率设定一个阈值,而不是取最大概率。这样可以一定程度上提高重叠目标的检测。

7.3、其它

  总体来说,Yolo_V1主要是创新性的提出了One-Stage算法,在许多的细节处理上仍有很多不足之处。因此才有了后续各个升级版本。

  • 53
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LittleSlugBoZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值