▲ 楼强 马佑 陶博 由博文 邓庆
本人完全了解第十五届全国大学生智能汽车竞赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和赞助公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。
随着互联网的发展和技术进步,深度学习技术已经逐渐走进我们生活,美颜自拍、人脸识别、自动驾驶、语音识别、自然语言处理等新技术深刻地改变了人类衣食住行各个方面。其中自动驾驶领域正是处于飞速发展的上升期,定将搭上5G的“快车”更加深刻全面地改变我们的生活。
深度学习的历史渊源可以追溯到1943年,Warren McCulloch和Walter Pitts搭建出第一个神经网络,并且明确了数学原理和算法结构。但“深度学习”一词直到2000年才和世人见面。还要归功于Geoffrey Hinton和RuslanSalakhutdinov在论文中揭示了了如何一次训练多层神经网络。
2012年,Google的算法已经具备了识别猫的能力。2014年,谷歌从英国收购了人工智能初创公司DeepMind。2017年,谷歌DeepMind的算法AlphaGo掌握了复杂的围棋游戏,并打败棋手柯洁。Yolo、Resnet、VGG、GoogleNet等经典网络相继问世。至此深度学习已经在历史的舞台上粉墨登场。
▲ 图1.1 深度学习在自动驾驶中的使用
深度学习智能车以官方统一提供的车模为硬件平台,通过python编程语言,以开源框架百度飞桨 paddlepaddle作为软件开发平台,自主进行对赛道数据的采集以及处理,采用卷积神经网络算法CNN构建数据模型,并在基干深度学习平台飞桨的一站式 AI 开发平台AI Studio上进行模型训练,最终使智能车实现对道路和交通标志的识别。智能车的硬件系统以基于百度Edgeboard系列的高性能板卡作为主处理器,由带编码器差速底盘、直流电机、摄像头等组成,在此硬件基础上,要使智能车能自主移动并实现对交通标志物的识别,则需要分别对车道线和标志物进行检测和模型的搭建,通过手柄控制智能车前进并通过摄像头采集数据到板卡上并通过PC端传回的模型对采集到的数据进行推理,得到速度指令和转向指令,使之完成任务,实现路线如图1.2所示。
▲ 图1.2 系统实现路径
在收集数据的阶段,首先对摄像头采集的图像数据进行了特殊的处理,以便于模型在训练过程中能够提取更优质的特征,进而更好的收敛。对于车道线、路标,我们都进行了一系列的形态学操作,提高了训练集的质量,从而达到更好的训练效果。
在目标检测阶段,使用yolov3-tiny[20]、ssd-lite[22]、Fast Rcnn[21]三种目标检测网络对智能车任务进行测试,发现在各项比赛中表现优异的二阶段目标检测网络FastRcnn在FPGA平台上虽然准确性较高,但是对单帧图像的处理时间过长,不适合本次智能车的任务,所以我们主要对一阶段目标检测网络yolov3-tiny和ssd-lite进行了对比,在特征提取网络相同的情况下,yolov3-tiny的性能优于ssd-lite,最后我们采用了模型更轻量、速度更快的yolov3-tiny并对其进行了人为的修改,并在网络中引入cbam-block[10]、SE-block[9]等注意力机制来提升识别效果、并希望在速度和准确性之间获得一个平衡,平衡智能车在保持准确性的前提下以更快的速度行驶。
在模型的深度层面,进行了相关的实验来探究网络深度带来的精度提升的边际效益递减效应,逐渐地加深网络直到精度满足要求。因此智能车可以发挥出更好的性能。并且通过研究智能车的结构和底层功能,采用修改自动运行的代码、设置采样时的帧数、分辨率、等手段,尝试去减小实验情况和部署情况的差异。与此同时,许多的实际问题也达到了解决,比如各个标志物的含义以及当标志物在不同位置时的反应、红绿灯的位置、加减速问题等。
▲ 图1.3 总流程图
对于收集到的图像,进行自适应二值化处理时,但由于光照强度不同,得到的部分图像存在着问题,赛道的部分轨迹由于光照而导致二值化图像出现部分缺失,针对此现象对灰度图像进行处理。首先计算出亮度矩阵,将亮度矩阵与灰度图进行逐元素相乘,来削弱局部亮度,再进行二值化处理,进而在二值化图像中保留全部赛道轨迹。
从LeNet[23]到 Efficientnet[11],卷积神经网路不断刷新着识别性能和处理实际问题的能力,卷积神经网络已经成为当今图像处理领域性能最为优异的深度学习
模型,它能够将图像转化为任意维度的向量,通过此思想,希望通过大量的数据,将模型训练为具有对智能车的行驶具有指导意义的向量。对于智能车接收到的是图片,输出的是控制智能车的指令,因此可以通过神经网络的特性连接起输入和输出,可以通过训练自设计的卷积神经网络来训练出符合场景要求的神经网络。
从 2012 年 Lenet[23]问世开始,人们便开始不断探寻新的网络结构,AlexNet[24]的出现进一步证明了卷积神经网络的可行性,Vggnet[25]更是以卷积池化为基础模块,尝试更深的深度,inception 系列[2,3,4,5,6]借鉴 Network in Network[1]的思想,着眼网路结构的宽度,使用更少的计算资源,达到了更佳的计算效果,不同的版本提出了不同的网络优化方法,v2[3]提出了 batch normalization 的标准化方法称为沿用至今的缓解网络梯度消失的方法,v3[4]采用了深度可分离卷积同样说明了新模块对经典网络的改进作用。Resnet 更是提出了残差连接结构,解决了深层 cnn的梯度消失问题,以更深的结构提取了更加优质的特征,自 resnet[7]之后的卷积神经网络的识别性能已经超过了人类。但是我们并没有停止对更加优秀的网络结构的探索,Nasnet 结合强化学习的方法,人为限定搜索空间,尝试使用神经网络学习出最优的网络结构,mobilenet 系列[14,15,16,17]又尝试以为微小的精度损失为代价,换来更多的性能提升,使用了深度可分离卷积 bottleneck 等更加有效率的结构,来节省参数并能够加速模型的推断过程。这期间注意力机制的提出更是激发了人们对特征图进行深入研究的兴趣,从 se-block[9]到 cbam-block[10],注意力机制正不断地完善,最后 efficientnet[11]又对模型的深度、宽度、分辨率三个维度进行了平衡,得到了非常优质的模型。
对 cnn 有了一定理解之后希望跟据实际需求来设计出符合需要的神经网络,由于任务是让智能车自行行驶在赛道上,所以对速度有很高要求,我们第一个想到的是与 mobilenet[14]类似的模型,来保证速度的同时获得更高的精度。我们借鉴了 mobilenet 系列结构[14,15,16,17]的思想,在网络中大量使用了 mobilenext[17]网络中大量出现的 sandglass-block 的结构,该模块采用了残差结构,残差边(residual path)中输入的特征图经过深度可分离卷积对特征图进行降维得到 bottleneck,再利用 1*1 卷积和深度卷积对 bottleneck 进行升维,并与恒等映射(identity mapping)相加,详细结构见图 2.1 所示。我们在此模块中引入 cbam-block[10],sandglass-block 是在 mobilenext[17]中被提出的,希望在模块中的 bottleneck 中提取更加优质的特征,我们提出了自主研发的自适应注意力 cbam 模块,在原有的 cbam 模块的基础之上,在**函数之前加入了 batch-normalization(bn)[3]层,这样使得自适应 cbam 模块在加到原有的 cnn 中的时候能够保持原有的特征,而不受权重随机初始化的影响。**函数上我们采用了 h-sigmoid、ReLU6 来使得计算过程更加简便以提高单位时间内智能车识别图像的张数。我们通过堆叠 sandglass-block来构建基础结构最后采用全局平均池化代替全连接层,这样的做法减少了大量的参数,使得我们全部模型大小最终维持在 5.2M 左右。
▲ 图 2.1 sandglass-block 模块
特征图输入 block 后先进行深度卷积,再进行 11 降维形成 bottleneck,接下来通过 11 卷积进行升维,再进行深度卷积,并且与残差边相加。
标签的设置决定了模型学习的方向,显然更希望模型能够学习出不同形况下转弯的"程度",所以放弃了传统的 one-hot 标签,并且将本次任务转化为回归任务,根据观察发现智能车平稳前进的数值指令是 1500,对此结果进行了缩放,对平稳前进、左转、右转的指令进行转换,编码为 0 到 1 之间的小数,方便神经网络进行预测,得到预测结果后再进行解码,之后传给智能车。
通过给定的代码得知 encode 过程是(数值指令-500/2000),但是 decode 过程却是(数值指令*600+1200),这样做不符合直觉,于是将 decode 过程改回了(数值指令-500/2000),我们也找到了速度的指令,并且跟据标识牌来对应速度的变化。
通过对不同距离对识别到的标识进行调整测试后发现,在较远处检测出图标并且遵循图标的指令并不是所期望的结果(例如在斑马线前停车的场景,智能车不应该一检测到远处的斑马线就立即停下来),于是设定了 boundingbox 的左上角坐标和图像底边中心线的欧式距离的阈值来保证只有识别出的图标与智能车在有效距离内才会被执行。
注意到一张图片中可能标有多个标志物,这时智能车将跟随哪一个标志物的指示将成为一个值得商榷的问题,首先尝试使用类别得分大小来确定应该遵从的标志,但是类别得分只能表示网络对标志的识别结果的确定程度,并不说明该标志是智能车该遵从的。对于这种情况,优化并采取了以下的策略,找到图像的下边缘的中心点,对于检测到的 boundingbox 找到 boundingbox 的左上角的坐标,并计算该坐标与图像下边缘的中心点的欧式距离。选择距离最小的 boundingbox中的图标来遵循。这样就解决了多图标问题。
在实验中发现无论是图像的识别任务还是检测任务,都需要对原始图像进行特征提取,得到优质的 feature map,于是决定在 Yolov3 tiny 中增加回归分支来对检测到的车道线进行处理,并且将 yolov3 tiny 默认的 darknet 特征提取网络更改为 mobilenext 特征提取网络,这样一来得到的 feature map 可以进行两个任务,而不是每个任务分别提取一次 feature map。如图 2.2 所示,我们在 yolo v3 tiny[20]中加入了新的分支结构来来对车道线图像进行回归预测。
▲ 图 2.2 加入分支结构的 yolov3 tiny
由于网络结构有两条分支,都能够用来发送指令,所以智能车在同时遇到转弯标识和 T 字路口的时候,会不断收到相反的指令,是因为 T 字路口的弯道处,智能车习惯性的向右转,而标志牌指示智能车向左转,并且两个分支向智能车传递指令的速度有时差,智能车不断收到相反的指令便会在不断地左转右转中慢慢前进,等到视野中不见了标识牌,标志物检测的分支便不再提供指令给智能车,智能车便会继续右转。我们针对这种情况想到了解决方案:当智能车检测到标志物时,暂时关闭图像识别分支,只保留目标检测的分支。这样智能车就不会受到噪音信号的干扰。并且准确地识别标志物。
深度学习智能车的硬件架构简单可靠,清晰可懂如图 3.1 所示。其核心为EdgeBoard 高性能能计算板卡和基于 arduio 的驱动板,外围包括蓝牙手柄、电压表、开关等。将模型部署到 EdgeBoard 板卡上后,输入为摄像头采集到的图像,输出为智能车的目标速度和方向角和前方标志物信息,arduio 驱动板和Edgeboard 通过串口连接,arduio 驱动板收到控制指令后,向四个自带 PID 的总线电机发出 PWM 信号,从而实现智能车的可控移动。
▲ 图 3.1 智能车硬件架构图
整体采用由 sandglass-block 堆叠而成的特征提取网络来进行特征提取,并且将得到的特征图传入两个任务分支来节约计算成本,引入自主改进的自适应cbam 模块、近似**函数来对网络结构进行优化。并且在两个分支中分别采用对应的损失函数。来在训练中同时满足两个任务的需求。
Sandgalss-block 是在 mobilenext 网络中提出的新结构,适合于移动端网络来采用,我们采用类似的思路来构建我们的网络,因为采集的图片和 imagenet中的图片有非常大的不同,所以解冻了更多部分的预训练权重来进行训练
原论文中提出的 cbam 模块在开始训练时对与训练权重有破坏效果,因为cbam 模块权重的初始化是随机的,训练开始时 cbam 模块成为了模型的噪音模块,特征图中的元素和随机元素进行了运算,结果也相当于完全随机,并不利于模型收敛,所以加入了 bn 层,并且将 bn 层中的 Gama、Beta 均为 0 初始化来让初始化的 cbam 模块不改变特征图中的元素,在不断地学习中给不同的元素赋予不同的权重。详细原理和结构见第四章解释。
受到 mobilenetv3 的启发,我们认为近似**函数对于模型的计算速度有可见的提升,并且我们在第五章的实验部分也看到了本次任务中对速度的实际提升效果。
每张车到线上采集的图片将对应一个能够传给智能车的数值指令,该数值指令介于 900~2100 之间(从实验中得知)其中 1500 的数值指令表示智能车将径直向前行驶。以每张图片为输入 x,每张图片对应的数值指令为标签 y,将车道线识别的任务转换为回归任务,这样优化目标 φ 就可以表示为:
φ
:
min
w
L
[
F
(
x
,
w
)
,
y
]
\varphi :\mathop {\min }\limits_w L\left[ {F\left( {x,w} \right),y} \right]
φ:wminL[F(x,w),y]
其中F为模型;L为损失函数;w为权重;因为标签。
使用预训练的 yolov3 模型对采集到的数据集进行目标检测来筛选有标志物的图片,极大的省去了筛选有标志物图片的人工成本,后续我们使用labelimg 来对筛选得到的图片进行标注。对每个标志物图片,均采用了亮度矩阵来抵消局部亮度对图片整体的影响,此后我们对图像进行了二值化处理,来删减掉图片的多余特征。这样处理的好处在于模型可以提取更加丰富的特征。
在 yolov3 tiny 模型的使用中发现用 cnn 得到指令再用 yolov3 tiny 模型检测标志物的效率是非常低下的,因为这个过程中产生了两个 feature map,消耗了很多不必要的计算资源,这个过程必然对智能车的单帧图像处理速度造成一定的影响,所以在编写代码的过程中在 yolov3 tiny 模型中加入了回归分支来对车道线图片进行回归分析,原有框架对标志物图片进行目标检测综合二者的结果智能车发送指令,实验结果表明这种方法减少了近 43%处理单帧图像的时间。
在实际运行中发现,智能车自主运行代码的过程中不会留下预测的结果,这种特性不利于后续的调试,所以在代码中加入了保留预测结果文件的部分,这样就能够让我们在每次测试智能车之后看到智能车除了图片之后得到的指令,并且根据指令的正确与否继续对模型、智能车、代码逻辑进行优化。
重新写出智能车移动的控制逻辑,在未识别到标识的时候,智能车将遵循模型中回归分支的指令,当智能车在视野中识别到标识的时候,模型将暂时关闭回归分支,直到标识消失在智能车的视野之中,在此之前,智能车将跟据标志物的意义来给智能车下发指令,例如,识别到限速标志将会发送给智能车一个改变速度的指令。在特殊场景,识别到标志后则开环控制,由于只要给驱动板发送一个数据后,驱动板就会继续运行这一数据,并不会改变运行状态。下面列出一些其中一些场景的代码。
超车场景:
停车场场景
人行道场景
如影随形场景中训练不同的权重,数据集为"绿手套"也就是手套集,具体数据集见图 4.7 所示。并且创新性的加入手势引导机制,跟踪绿色拳头,但是出现绿色手掌后进行慢速后退,这样可以增加项目成功性,提高完赛率。追踪绿色拳头目标时使用 PD 算法使得追踪变得平顺,下面展示部分代码。
EdgeBoard 深度学习计算卡将摄像头采集到的视频数据,进行抽帧处理成一张张图片,通过优秀计算能力将图片作为模型输入,通过 python 脚本进行车道线预测和目标物识别。然后 EdgeBoard 和驱动板通过串口进行连接,EdgeBoard 发出前进方向和前进速度指令,驱动板收到信号后向 4 个自带 PID的总线电机发出 PWM 信号,从而控制每个车轮的转向,智能车是通过差速转向的。因此既可以以实现软硬件的结合,使智能车自主运行在赛道上,实现沿车道线行驶和识别到具体标志物做出反应的功能。
通过在 yolov3 tiny 中加入图像回归分支来处理该任务,以节省计算成本,通过在新的回归分支上对特征图进行 1*1 卷积,并且传入全连接层再进行输出得到回归结果。由于训练过程中由于我们有两个优化目标(回归预测得到方向指令,目标检测得到标志物类别及预测框)所以在训练中采用了双损失函数,对于回归任务采用了 L2 loss 来惩罚与结果偏离较大的回归预测,对于目标检测任务我们采用了默认的 yolo_loss,要保证两个损失函数对在梯度反向传播时对特征提取网络的影响是大致相同的,所以在回归分支中引入了α因子来平衡两个损失函数的影响,这样回归分支的损失函数由
L
(
x
,
y
)
L\left( {x,y} \right)
L(x,y)变为了
L
(
x
,
y
)
=
α
×
L
(
x
y
)
L\left( {x,y} \right) = \alpha \times L\left( {xy} \right)
L(x,y)=α×L(xy) 根据我们的实验, 的值为 0.85 时我们得到了比较好的结果。
L
(
p
i
,
t
i
)
=
1
N
c
l
s
∑
i
L
c
l
s
(
p
i
,
p
i
∗
)
+
λ
1
N
r
e
g
∑
i
p
i
∗
L
r
e
g
(
t
i
,
t
i
∗
)
L\left( {p_i ,t_i } \right) = {1 \over {N_{cls} }}\sum\limits_i^{} {L_{cls} \left( {p_i ,p_i^* } \right)} + \lambda {1 \over {N_{reg} }}\sum\limits_i^{} {p_i^* L_{reg} \left( {t_i ,t_i^* } \right)}
L(pi,ti)=Ncls1i∑Lcls(pi,pi∗)+λNreg1i∑pi∗Lreg(ti,ti∗)
p
i
p_i
pi:Anchor[i]的预测概率;
p
i
∗
p_i^*
pi∗:Anchor[i]是正样本,
p
i
∗
=
1
;
p_i^* = 1;
pi∗=1;; Anchor[i]是负样本:
p
i
∗
=
0
;
p_i^* = 0;
pi∗=0;
Inception v2 中提出的 batch normalization 方法被广泛地用于缓解梯度消失问题,但是网络又能够通过学习来抵消 bn 层(当网络学习出来的 beta、gama 为 0时,bn 层部队网络产生任何影响)
μ B ← 1 m ∑ i = 1 m x i σ B 2 ← 1 m ∑ i = 1 m ( x i − μ B ) 2 \mu _B \leftarrow {1 \over m}\sum\limits_{i = 1}^m {x_i } \,\,\,\sigma _B^2 \leftarrow {1 \over m}\sum\limits_{i = 1}^m {\left( {x_i - \mu _B } \right)^2 } μB←m1i=1∑mxiσB2←m1i=1∑m(xi−μB)2 x ^ i ← x i − μ B σ B 2 + ε y i ← γ x ^ i + β = B N γ , β ( x i ) \hat x_i^{} \leftarrow {{x_i - \mu _B } \over {\sqrt {\sigma _B^2 + \varepsilon } }}\,\,\,y_i \leftarrow \gamma \hat x_i + \beta = BN_{\gamma ,\beta } \left( {x_i } \right) x^i←σB2+ε xi−μByi←γx^i+β=BNγ,β(xi)
将这一思路引入 cbam 模块中便得到了自适应 cbam 模块(Adaptive cbamblock)公式原理见下图 4.1 所示。原来的 cbam 模块:特征图经过通道注意力机制和空间注意力机制的模块得到带有注意力权重的特征图。
▲ 图 4.1 cbam 模块
▲ 图 4.2 自适应 cbam 模块通道注意力部分
▲ 图 4.3 自适应 cbam 模块空间注意力部分
使用 opencv-python 将图像转化为灰度图,再进行二值化处理,产生的图像存在缺失问题,将图像分为 16 个小块,并将小块中的像素值求平均值 ,求出图像的平均值 ,亮度矩阵为的长宽为图像的长宽,元素的值即为 ,将亮度矩阵和原始灰度图逐元素相乘,得到新的经过亮度处理的灰度图,再经过二值化处理如图 4.4 所示,处理后的图像便没有了缺失问题。
▲ 图 4.4 优化后的图像对比
对标志物图片进行多角度、多尺度的采集,而不只是智能车沿车道线行驶时采集的数据能够达到更好的数据采集效果。数据集部分截图如图 4.5 所示。
▲ 图 4.5 部分数据集
▲ 图 4.6 数据集优化
▲ 图 4.7 手套集部分数据集
由于模型中的不同分支有不同的作用,所以对两个分支分别采用了不同的损失函数,对于回归分支我们采用了常见的 L2 loss,对于检测分支我们采用了yolov3 tiny 中的默认损失函数,并且引入了 因子来权衡两者的影响。训练过程中我们采用了标准的 RMSProp 作为优化器,decay 参数和 momentum 参数都设置为了 0.9 并且将 weight decay 参数设置为了 0.00004,学习率初始化为0.45,随后每一轮中学习率下降 0.02,采用百度飞浆平台的 tesra v100 进行训练200 轮得到模型。得到的实时监测的部分图片如图 4.8 所示。
▲ 图 4.8 实时监测网络训练效果图
利用 sandglass 模块构造的特征提取网络如表 4.1 所示,在网络的第一层有一个 32 通道的卷积层,在这之后,利用 sandglass-block 不断堆叠,详细的网络结构被列举在表格中。详细的 sandglass-block 的结构也被列举在表 4.2 中。
▲ 表 4.1 特征提取网络结构表
▲ sandglass-block 结构表
将原网络中的**函数进行近似处理,使用了
这样防止了 relu 得到的**值过大,并且简化了
s
i
g
m
o
i
d
(
x
)
=
1
1
+
e
−
x
sigmoid\left( x \right) = {1 \over {1 + e^{ - x} }}
sigmoid(x)=1+e−x1
将 cbam 模块引入 sandblock 模块的方式类似于[10]中将 cbam 模块引入resnet block 的方式如图 4.8 所示,我们将自适应 cbam 模块置于 sandglass-block中深度卷积和 1*1 卷积之间,在所有相邻的卷积层之间放置 cbam 模块会导致模型精度的下降,所以我们放弃了这种做法,具体细节见第五章测试分析。
▲ 图 4.8 cbam 模块在 resnet 中的引入
sandglass-block 借鉴了这种引入的方式在相邻的两个卷积层之间加入 cbam 模块如图 4.9 所示。
▲ 图 4.9 加入 cbam 模块之后的 snadglass-block
经过近似之后的**函数进行了 20 次性能上的对比测试结果如图 5.1 所示,发现近似后的**函数对速度有大约 4%的提升,测试的平均结果如表 5.1 所示。
▲ sandglass-block 结构表
▲ 图 5.1 **函数测试结果图
深度可分离卷积由 deepwise 卷积变化而来,近年来成为非常受欢迎的卷积方式,该模块参数大大减少,能够是在不损失过多精度的前提下减少运算次数,并且减小模型大小。我们在网络结构中采用了深度可分离卷积来减少模型处理单张图片所用时间,我们通过 20 次的实验测试,结果如图 5.2 所示,对比了未采用深度可分离卷积的模型和采用了深度可分离卷积的模型在两个任务中的识别准确性。测试结果如表 5.2 所示。
▲ 表 5.2 深度可分离卷积和卷积的比较表
▲ 图 5.2 深度可分离卷积测试结果图
对两种注意力机制进行了对比试验,cbam-block 效果更好,有更高的精度,这和它更复杂的结构有关。Se-block 只是建立了通道之间的联系,利用 pointwise卷积来让网络判断出更加重要的通道。而 cbam 模块是进一步探究了更加重要的位置(spital space),两者的对比试验如图 5.3、表 5.3 所示。
▲ 表 5.3 不同注意力机制模块的比较表
▲ 图 5.3 深度可分离卷积测试结果图
从表 5.3 中可以看出 cbam 的引入让模型具有更高的效率。但是根据研究发现 cbam 模块在网络刚开始训练的时候会对预训练的权重产生影响,预训练的权重经过随机初始化权重的卷积使得预训练权重失去了意义。为了解决这个问题,在此基础上改进了 cbam 模块, "自适应 cbam 模块"在该模块中我们引入了 bn层(batch-normalization)通过特定的初始化参数,使得 cbam 模块在训练初期不发挥作用,只有在训练了一段时间之后再发挥作用。从而让模型更快的收敛。
在 sandglass-block 中引入了残差连接,但是想要进一步探究残差连接是否像预想的一样起积极作用。在实验中移除了 sandglass-block 中的残差连接来测试模型的性能。测试结果如图 5.4、表 5.4 所示。
▲ 图 5.4 残差连接测试结果图
▲ 表 5.4 有无残差连接比较表比较表
发现从模型训练的时间来说,有残差结构的 sandglass-block 训练时间更短,从精度上来说有残差结构的 sandglass-block 有更强大的特征提取能力和泛化能力,认为残差结构的引入打破了网络深度的限制,很好的缓解了梯度消失的问题。
Bottleneck 在构建模型的基础模块中的位置对模型整体有着非常大的影响,自从 mobilenetv2 提出以后,在 bottleneck 之间建立起残差连接的结构就受到了人们的关注,但在低维度的 bottleneck 之间建立残差连接使得网络中蕴含的特征受到了限制,更倾向于在高维度的 feature map 之间建立残差连接,进而使得特征更好的保留下来,所以将 bottleneck 的位置放到 block 的中间,也就是原始bottleneck 结构的思想。于是选择了 mobilenext 中的 sandglass-block 模块构建网络,此模块和原始 bottleneck 结构的差异在于我们在计算过程中使用更少的参数,因为深度可分离卷积的存在,使得让改造后的 bottleneck 模块不耗费过多的算力。
▲ 图 5.5 三种不同的残差 bottleneck 模块图
尝试了四种 cbam 模块的位置,最后发现只有将自适应 cbam 置于两对深度卷积和 1*1 卷积之间的效果最好,原因是 cbam 的注意力机制使得一部分bottleneck 中经过压缩的信息传递不到下一层,信息的损失进而削弱了模型的泛化能力,具体实验数据如图 5.6、表 5.5 所示、四种改良结构如图 5.7 所示。
▲ 表 5.5 不同改良结构的比较表
▲ 图 5.6 不同改良结构的测试结果图
▲ 图 5.7 cbam 注意力机制在 sandglass-block 中的四种改良结构
(a)图为我们最终采用的结构分别在降维之前和升维之后加入 cbam 结构。b、c、d 图分别是在不同位置加入 cbam 结构的模块。
经过测试可以发现,坡道、人行道可以成功完成启停场景,限速场景正常减速、取消限速恢复速度,超车场景变道超车,十字场景顺利通过,左转场景原地左转,停车场景倒车入库,如图 5.8 所示。
▲ 图 5.8 智能交通元素实测
在强烈的阳光下布置锥桶障碍,由人指导智能车完成避障,可以发现系统鲁棒性很强,在复杂的光线场景中也可以准确跟踪目标,并且加入倒车手势极大提高了成功率。测试图如 5.9 所示。
▲ 图 5.9 如影随形实测
经过大量的实践与探索,最终使得智能车能够如愿自动行驶在赛道上,并且在性能方面表现突出,通过替换、修改网络结构,选择了适合本次任务的mobilenext-yolov3-tiny 模型,对**函数进行近似处理(ReLU6、h-sigmoid)来以微小的准确率为代价,换来了识别速度的显著提升。另外,近段时间流行的注意力机制也在我们的设计思想中得以体现,通过对不同通道的特征图进行线性变换来让网络学习出更重要的通道,以达到更高的精度和准度。
对数据的种种处理使得我们的模型更加关注的是赛道的几何特征,即使换了新赛道也同样能够流畅行驶。对模型的深层次思考和对实际问题的周到考虑使得智能车任务能够达到更高的准确率,借鉴了许多模型的思想,也致力于解决移动端部署问题,希望用更少的计算资源达到更佳的效果。
[1] Lin M, Chen Q, Yan S. Network in network[J]. arXiv preprint arXiv:1312.4400, 2013.
[2] Szegedy C, Liu W, Jia Y, et al. Going deeper with convolutions[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2015: 1-9.
[3] Ioffe S, Szegedy C. Batch normalization: Accelerating deep network training by reducing internal covariate shift[J]. arXiv preprint arXiv:1502.03167, 2015.
[4] Szegedy C, Vanhoucke V, Ioffe S, et al. Rethinking the inception architecture for computer vision[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 2818-2826.
[5] Szegedy C, Ioffe S, Vanhoucke V, et al. Inception-v4, inception-resnet and the impact of residual connections on learning[C]//Thirty-first AAAI conference on artificial intelligence. 2017. [6] Chollet F. Xception: Deep learning with depthwise separable convolutions[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 1251-1258.
[7] He K, Zhang X, Ren S, et al. Deep residual learning for image recognition[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 770-778.
[8] Xie S, Girshick R, Dollár P, et al. Aggregated residual transformations for deep neural networks[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 1492-1500.
[9] Hu J, Shen L, Sun G. Squeeze-and-excitation networks[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2018: 7132-7141.
[10] Woo S, Park J, Lee J Y, et al. Cbam: Convolutional block attention module[C]//Proceedings of the European conference on computer vision (ECCV). 2018: 3-19.
[11] Tan M, Le Q V. Efficientnet: Rethinking model scaling for convolutional neural networks[J]. arXiv preprint arXiv:1905.11946, 2019.
[12] Tan M, Chen B, Pang R, et al. Mnasnet: Platform-aware neural architecture search for mobile[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2019: 2820-2828.
[13] Zhang X, Zhou X, Lin M, et al. Shufflenet: An extremely efficient convolutional neural network for mobile devices[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2018: 6848-6856.
[14] Howard A G, Zhu M, Chen B, et al. Mobilenets: Efficient convolutional neural networks for mobile vision applications[J]. arXiv preprint arXiv:1704.04861, 2017.
[15] Sandler M, Howard A, Zhu M, et al. Mobilenetv2: Inverted residuals and linear bottlenecks[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2018: 4510-4520.
[16] Howard A, Sandler M, Chu G, et al. Searching for mobilenetv3[C]//Proceedings of the IEEE International Conference on Computer Vision. 2019: 1314-1324.
[17] Daquan Z, Hou Q, Chen Y, et al. Rethinking Bottleneck Structure for Efficient Mobile Network Design[J]. arXiv preprint arXiv:2007.02269, 2020.
[18] Redmon J, Divvala S, Girshick R, et al. You only look once: Unified, real-time object detection[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 779-788.
[19] Redmon J, Farhadi A. YOLO9000: better, faster, stronger[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 7263-7271.
[20] Redmon J, Farhadi A. Yolov3: An incremental improvement[J]. arXiv preprint arXiv:1804.02767, 2018.
[21] Girshick R. Fast r-cnn[C]//Proceedings of the IEEE international conference on computer vision. 2015: 1440-1448.
[22] Huang J, Rathod V, Sun C, et al. Speed/accuracy trade-offs for modern convolutional object detectors[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 7310-7311.
[23] LeCun Y, Bottou L, Bengio Y, et al. Gradient-based learning applied to document recognition[J]. Proceedings of the IEEE, 1998, 86(11): 2278-2324.
[24] Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]//Advances in neural information processing systems. 2012: 1097-1105.
[25] Simonyan K, Zisserman A. Very deep convolutional networks for large-scale image recognition[J]. arXiv preprint arXiv:1409.1556, 2014.