黄奕川,李凉海,马纪军,崔慧敏
(北京遥测技术研究所 北京 100076)
近年来,随着计算平台和深度学习技术的发展,目标检测技术在各个领域都得到了广泛地应用。将目标检测技术搭载在无人机上,通过对无人机拍摄得到图片进行智能图像处理与分析,从而得到目标在图像中的类别与位置信息,可以极大地扩展无人机的应用场景。随着无人机在社会生活中的应用越来越广泛,对航拍图像的分析需求逐年增大,将目标检测技术与无人机航拍技术相互结合逐渐成为当前的研究热点之一[1]。
不同于技术相对成熟的地面静态目标检测,当前无人机航拍目标检测还存在许多未解决的问题,这些问题主要可以归结于四个方面:①检测目标数量大。与一般的目标检测数据集不同,无人机目标检测往往有可能在一张图片中包含上百个需要检测的模型,如果选用占用资源较大的算法,可能会出现资源不够用的情况[2]。② 目标尺寸多样性。无人机在拍摄图像时,由于其飞行高度、拍摄角度、物体远近和目标类别的不同,拍摄得到的样本大小也多种多样,这给深度学习算法的训练带来了一定挑战[3]。③运动模糊。相比于静止平台上摄像头的成像,无人机飞行过程中摄像头成像容易出现运动模糊,这给目标检测算法带来了一定难度[4]。④ 算力限制。由于无人机整机功耗和尺寸的限制,无人机在进行实时目标检测时对于算法复杂度有较高要求[5]。
近年来,深度学习技术在计算机视觉方向上有较大的进步与发展,以卷积神经网络为代表的深度学习算法相较于传统的手工特征目标检测算法,在检测精度与速度上都有显著提升,逐渐取代了传统目标检测算法,成为了当前目标检测技术的主流算法。基于深度学习的目标检测算法主要分为单阶段和两阶段两种[6]。单阶段目标检测算法采用端对端的方式[7],直接在原图中提取特征,并以此来预测目标的类别和位置。两阶段目标检测算法将检测过程分成了两步进行:首先,通过候选区域生成算法生成候选区域;然后,将生成得到的候选区域输出到后续网络,以确定目标的所属类别和位置[8]。单阶段目标检测算法的结构相对较为简单,且检测速度更快,但是其定位精度往往不如两阶段目标检测算法[9]。
由于无人机本身算力的限制和对实时性的要求,本文选用SSD 单阶段目标检测算法作为基准算法。并针对无人机航拍图像中目标尺寸多样、算力有限等问题,对SSD 算法做出相应改进,最后对比改进前后的算法效果,体现改进的有效性。
SSD 算法使用VGG16 作为基础特征提取网络[10],在保证和Faster R-CNN 算法具有同样检测精度的同时,检测速度快于YOLO 算法[11]。算法通过骨干网络(Backbone)后得到38×38×512 的特征图,然后将特征图进行下采样,依次得到19×19×1 024、10×10×512、5×5×256、3×3×256、1×1×256 的特征图,然后将这些特征图作为检测预测层的输入,在不同维度下预测目标框的位置,最后再经过极大值抑制算法NMS(Non-Maxmum Suppression),输出预测目标框的位置和类别[12],其结构如图1 所示。
图1 SSD 网络框架图Fig.1 The structure of SSD
SSD 算法通过在基础特征提取网络后添加卷积特征层,这些层的尺寸逐渐缩小,通过在这些不同大小的特征层上进行训练和预测,利用多层特征图的组合作为预测目标类别和位置的依据,以达到多尺度融合效果[13],确保了检测算法对于多尺度目标的有效性。但是,由于SSD 算法使用浅层网络的特征信息检测小目标,而浅层特征卷积层数少,缺乏深层语义特征,表征能力不够强,导致对小目标物体的召回率很低。
在SSD 原始模型中,采用了VGG16 作为检测算法的主干网络。VGG16 由13 个卷积层、3 个全连接层和5 个池化层组成,其突出特点是结构简单,网络通过堆叠若干卷积层和池化层构成,网络的搭建较为容易实现。其缺点在于,VGG16 的层数较浅,特征提取并不充分,特别是在对小目标的检测上,性能并不理想。
本文参考CVPR2017 上提出的Densenet-121 结构作为主干网络[14]。稠密网络(Densenet)是由稠密块(Dense block)模块加上过度(Transition)模块组合而成,Densenet 由若干Dense block 组成,每个Dense block 由若干卷积层组成,稠密块中的特征图大小一致。相比于其他网络,Densenet 提出了一种稠密连接方法,稠密块中每个卷积层都会接受其前面所有层的输出作为其额外的输入,网络通过这种稠密连接的方式加强了不同网络层之间的特征复用,更有效地利用了特征。传统网络结构可以表示为
而Densenet 将同一稠密块中前面所有层的输出拼接起来作为输入,可以表示为
其中,xl表示第l层的特征图,Hl(·)代表第l层输入到输出的映射,Dense block 示意图如图2 所示。
图2 稠密块示意图Fig.2 Schematic of a dense block
在Densenet 中不同的Dense block用Transition 层连接在一起,Transition层由1 个1×1 的卷积层和1 个2×2 的平均池化层组成,其作用是改变特征图的通道数,Densenet 的总体架构如图3 所示。
图3 稠密特征提取网络架构图Fig.3 The structure of Densenet
Densenet 相比于SSD 原始特征提取网络VGG,使用了更加稠密的网络连接,即互联了同一稠密块中的所有层,其每一层都会接受前面所有层的输出作为其额外输入。这既可以增强特征之间的传播,又在一定程度上增强了不同层次特征的复用,另外,Densenet 也在一定程度上缓解了网络中的梯度消失问题,使得浅层特征层的训练更为有效。通过对特征提取网络的改进,可以使得图像的特征提取更加充分,提升了网络的检测精度。
本文在原卷积神经网络的结构上引入分组卷积[15]。不同于一般卷积操作,分组卷积在卷积操作之前,首先对输入的特征层进行分组,将经过分组操作得到的不同特征层分组分别进行卷积操作,最后将不同分组的输出结果拼接起来,得到分组卷积的输出,其示意图如图4 所示。
图4 分组卷积示意图Fig.4 Schematic of a group convolution
图4 中,H代表输入图像的高度,W代表输入图像的宽度,C代表输入图像的深度,g代表分组卷积所分的组数,H′代表输出图像的高度,W′代表输出图像的宽度,K代表输出特征图的深度。分组卷积相比于一般卷积操作,极大地减少了网络参数量。一般卷积和分组卷积的参数量分别为
式(3)中,Par代表一般卷积操作的参数量,g_Par代表分组卷积的参数量,inc代表输入特征图的通道数,outc代表输出特征图的通道数,ken代表卷积核的大小,分组卷积的参数量是一般卷积的g分之一。在网络中使用分组卷积,可以降低网络的参数量,提升网络的训练和推理的速度。
焦点损失(Focal Loss)主要为了解决单阶段目标检测算法中出现的正负样本不均衡问题[16]。在单阶段目标检测算法中,由于一张图片中往往大部分位置都属于背景,这将导致训练集出现正负样本不均衡的问题。过多的负样本会引起网络权重的偏移,从而影响正样本的预测,并且这些负样本大多往往是易分类的,这会严重影响网络的收敛速度。
为了有效解决类别不均衡的问题,本文在SSD 中引入Focal Loss 损失函数
式(4)中,FL(pt)为Focal Loss 损失函数,αt为权重因子,pt为样本预测正确的概率,γ为调制系数。Focal Loss 通过权重因子控制正负样本对损失函数的贡献比例,在损失函数中减少负样本的权重,可以在一定程度上缓解正负样本不均衡带来的影响。另一方面,Focal Loss 引入调制系数,减少了易分类样本对损失函数的贡献,使得模型训练时更加专注于难分类的样本。
实验选用VisDrone2019 数据集作为训练样本,该数据集由主办方天津大学负责收集,全部数据由无人机采集得到。检测目标分为10 类,包括行人、不在行走的人、脚踏车、汽车、面包车、三轮车、带遮阳伞的三轮车、公交车、摩托车、其他。训练集图片尺寸为1 920×1 080,其中最大目标占图像面积的30.29 %,而最小目标仅占图像面积的二十万分之三,数据集中目标有密度分布不均、尺度变化多样、相互遮挡的情况存在。
实验平台配置为操作系统:Ubuntu20.04,深度学习库:Pytorch,CPU:Intel i7-10700,GPU:RTX3080。本文对SSD 和改进SSD 网络分别进行训练,SSD 将图像预处理为300×300 大小作为网络输入,改进SSD网络将图像预处理为512×512 大小作为网络输入,设置网络的学习率为0.01,动量为0.9,学习率衰减系数为0.3,batch-size 为16,分别迭代50 次。
SSD 算法和改进SSD 算法的损失函数收敛曲线如图5 所示。
图5 网络损失函数曲线Fig.5 Network loss function curve
由图5 可以看出,SSD 算法在训练损失为5 左右到达收敛,而改进SSD 算法在训练损失达到4.3 左右收敛,算法经过改进以后,收敛性能明显好于原算法。用训练得到的网络对航拍图像目标进行检测,其结果如图6 所示,可以看出改进算法对于行人、摩托车、三轮车等难分类中小目标的检测性能明显高于原算法。
图6 算法效果图Fig.6 Algorithm renderings
实验比较算法改进前后的预测结果,设置交并比阈值为50 %,在Visdrone2019-DET 验证集下,算法对各种目标的平均检测精度见表1。
表1 原算法与改进算法各类别平均精度Table 1 The average percision of the original algorithm and the improved algorithm in each category
经过对表1 的分析可以看出,数据集的总体平均精度均值MAP(Mean Average Precision)从24.0 %提升至29.3 %,这是由于改进SSD 算法使用更优的主干网络和更高分辨率图像作为输入,对于大多数类别目标的检测性能都有一定程度的提升。表1 中行人、人(非行人)、脚踏车、带遮阳伞的三轮车、公交车、摩托车目标检测性能提升较大,其中带遮阳伞的三轮车的平均精度从14.1 %提升到37.3 %,提升幅度达到23.2 %。这说明改进后的SSD 算法对于航拍图像目标的检测性能有了较大提升,而面包车、三轮车的检测精度小幅度降低,是由于改进SSD 算法使用的分组卷积在减小算法运算量的同时,也在一定程度上引入了稀疏连接,减弱了卷积的表达能力,从而在一定程度上影响了部分对分辨率改变不敏感类别目标的检测精度。
为了进一步说明改进算法对不同尺度目标的检测能力,从数据集中分别筛选出面积小于322 像素的目标作为小目标,大于322 像素小于962 像素的目标作为中等目标,大于962 像素的目标作为大目标。对这三种目标的检测精度进行统计,结果见表2。
分析表2 可以看出,改进SSD 算法主要在小目标和中等目标的检测上相比于原始SSD 算法有较大提升,小目标平均检测精度均值从4.1 %提升到了10.6 %,中等目标平均检测精度均值从31.2 %提升到了36.7 %。这主要是由于本文对网络的改进,增强了对难分类中小目标的识别能力。而大目标检测也有小幅度提升,本文认为这是因为优化了特征提取网络结构,提升了对不同尺度目标的特征提取能力。
表2 原算法与改进算法各尺度平均检测精度Table 2 The average precision of the original algorithm and the improved algorithm at each scale
综上,改进后的模型能显著提高对航拍目标的检测能力。
本文针对无人机航拍中的问题和研究现状,在SSD 算法的基础上对原算法进行改进,提出了基于改进SSD 算法的航拍目标检测算法。训练阶段,通过学习50 轮训练数据集,原算法和改进算法分别在训练损失为5 和4.3 处达到收敛,改进算法的收敛效果好于原算法,这表明改进算法在训练集上的检测精度高于原算法。验证阶段,原算法和改进算法的平均检测精度均值分别为24.0 %和29.3 %,算法经过改进后平均精度均值提升5.3 个百分点,进一步验证了算法改进的有效性。