包晓敏, 王思琪
(浙江理工大学 信息学院,浙江 杭州 310018)
目标检测(object detection)[1]将待测目标的分割、识别、语义等高级视觉问题合为一体,对图像中的物体进行识别和定位,其准确性和实时性是衡量整个计算机视觉系统的一项重要标准。目标检测的目的在于解决图像的实例分割[2]和定位框表示,所以,对图像进行目标检测不仅要确定目标的类别,还要判断出其像素范围[3]。当前,目标检测被广泛应用于不同的领域[4~7],例如农业生产生活中的害虫检测[5],医学领域中对病变区域的检测[6],常见的视频监控[7]等等。
尽管传统的机器学习检测[8]方法在目标识别方面取得了较好的成果,但依旧存在着不足:1)采用基于滑动窗口的区域选择策略,存在运行成本和时间复杂度高等问题;2)由于待测目标成像时存在多样性变化和干扰,手动选择特征没有较好的鲁棒性。这使得传统目标检测方法的准确性和实时性存在着许多挑战。如何能够对物体进行精准、实时检测成为了当前目标检测算法研究的关键问题。2012年的ILSVRC图像分类比赛中,Alex提出了著名的AlexNet卷积神经网络(convolutional neural network,CNN)模型[8]在极大地提高了图片分类的准确率同时缩短了检测时间,摆脱了传统检测方法的困境,自此深度学习技术开始走进主流学术界。与传统的提取特征方法不同,深度学习依靠大量的数据,通过卷积神经网络自主学习获得有用的特征信息,从而对物体进行更高精度的分类识别[9]。
传统的目标检测方法存在着鲁棒性差、计算成本高等缺点,国内外的学者们不断在目标检测领域进行探索,希望找到新的方法突破这一瓶颈。两阶段深度学习算法[15]通过选择性搜索、边界箱等常见区域选择方法生成候选区域,接着在候选区域与卷积神经网络相结合提取特征并进行回归分类。这一类检测算法需要分两步完成,即先产生候选区域再进行特征提取,被称为两阶段深度学习算法,其具有准确度高但速度相对慢的特点,典型的基于候选区域的检测算法有区域卷积神经网络(region-CNN,R-CNN)、空间金字塔池化网络(spatial pyramid pooling-Net,SPP-Net)[16]、快速区域卷及神经网络(fast R-CNN)、快速区域卷及神经网络(faster R-CNN)和掩模卷积神经网络(mask R-CNN)。
在2014年,Girshick R等人[17]提出了R-CNN模型并在数据集Pascal VOC 2012上,将目标检测的重要验证指标均值平均精度(mean average precision,mAP)提升到了53.3 %。该成果比这以前的最好结果提升了30 %,引起了学术界的广泛关注。
R-CNN算法的具体流程为:1)通过选择搜索(selective search)网络对图像的纹理、颜色等特征进行分析,选取出2 000个大小不同的候选区域;2)对特征向量进行归一化处理;3)通过深度网络对输入的候选区域进行前向计算获得特征;4)训练支持向量机(support vector machine,SVM)分类器进行分类;5)使用回归器精细修正每个候选框的位置。图1为R-CNN算法示意图。
图1 R-CNN算法示意[18]
相较于传统的物体检测方法,R-CNN通过选择性搜索确定候选区域来进行目标检测,从根本上提高了检测效率。但是该算法依旧存在着明显的缺点:1)候选区需要进行归一化处理,这容易导致图像信息缺失;2)资源利用率低,在分类和回归操作时CNN模型的参数没有进行同步修改;3)每一个候选区域都需要输入到CNN中提取特征,占用大量磁盘空间,时间复杂度高。在数据集 Pascal VOC2007中,基于VGG卷积神经网络模型的R-CNN算法,检测一张图像的平均时间高达47 s。
在2015年,He K M等人[16]在R-CNN模型的基础上进行改进提出了SSP-Net模型,其在全连接层前接入了金字塔池化(spatial pyramid pooling,SPP)层来适应任何尺寸的图像输入,解决了R-CNN模型由于归一化导致的信息缺失问题。图2为SPP-Net算法示意图。
图2 SPP-Net算法示意[19]
SPP-Net对R-CNN的特征提取步骤进行了修改,这样特征提取不再需要每个候选区域都经过CNN,只需要将整张图片输入。感兴趣区域(region of interest,ROI)特征可以直接从特征图获取,使得运行速度得到了极大的提高。该算法仍然使用的是R-CNN框架,所以缺点十分明显,在运行时占用巨大的磁盘资源。
在2015年, Girshick R团队[18]在之前的基础上提出了Fast R-CNN算法,解决了之前存在的问题:1)训练分步过多导致训练速度慢,通过对整幅图像进行卷积操作,再从特征映射中选择候选区域,极大地提高了训练速度;2)训练时间和内存消耗比较大,R-CNN在训练SVM和回归的时候需要用网络训练的特征作为输入,将特征保存在磁盘上再读入。
Fast R-CNN结合了SPP-Net网络的优点,将R-CNN网络进行改进:1)对整张待测图像进行卷积操作,减少重复计算;2)整张待测图像归一化后送入深度网络,通过最后少数几层处理每个候选框,提升了运行速度;3)引入多任务损失(multi-task loss)函数,用深度网络统一实现类别判断和位置调整,减少内存占用。图3为Fast R-CNN算法示意图。
学生天天与数学打交道,却对生活中的数学熟视无睹,对数学缺乏兴趣,解决实际问题的能力得不到锻炼和提高。教学《可能性》时:以“分组摸球”比赛来探索可能性大小与什么有关,每组盒中有10个球,球的大小一样(各组盒中放的球颜色数量不同),每次摸一个球,然后把球放进去,搅拌后再摸。小组内每人摸2次,组长统计好结果,然后全班统计各组摸到颜色,评出摸到红色多的组获胜,引导学生观察、分析实验获得的数据,讨论交流发现:可能性的大小与在总数中所占数量的多少有关,在对比中更好地体会确定事件和不确定事件。
图3 Fast R-CNN算法示意[20]
在同样使用最大规模的网络的情况下,在数据集PASCAL VOC 2007上进行测试发现,Fast R-CNN相较于R-CNN的准确率相似,但在训练和测试时间上有了明显的缩短。表1为在VOC2007数据集上,基于VGG—16卷积网络模型的R-CNN与Fast R-CNN训练和测试性能对比。
表1 基于VGG—16的R-CNN与Fast R-CNN算法性能对比
在2015年,Ren S Q团队[19]在之前的基础上提出了Faster R-CNN算法,该算法在简单网络的目标检测速度达到17 fps,在PASCAL VOC上准确率为59.9 %,而复杂网络下达到5 fps,准确率78.8 %。
该算法将目标检测的4个基本步骤都整合在了一个深度网络中,提高了算法的综合性能,尤其在检测速度方面。Faster R-CNN算法的具体流程:1)将待测图像输入卷积网络中,生成特征映射;2)使用区域投标网络[20](region proposal network,RPN),在生成候选区域的同时产生锚点(anchors),通过判别函数判断并使用边框回归调整Anchors以获取准确的候选区域, 图4为RPN算法示意图;3)通过RoI池化层,解决最后输入全连接层的特征图的尺寸大小不同的问题;4)通过完全连接层来分别判断物体的类别和精准位置。由于采用RPN代替Fast R-CNN算法的选择性搜索方法,在检测率相同的情况下,Faster R-CNN算法的检测速度是之前的10倍。图5为Faster R-CNN算法示意图。
图4 RPN算法示意[21]
图5 Faster R-CNN算法示意[21]
2017年He K M等人[22]在基于Faster R-CNN的基础上进行改进提出了Mask R-CNN,该算法可以精确到像素级输出,高质量完成分割任务。此外两者的输出也有所不同。Faster R-CNN输出为种类标签和box坐标,而Mask R-CNN则会增加一个输出,即物体掩膜(object mask)。
Mask R-CNN具有以下特点:1)通过引入感兴趣区域聚集(RoI Align)层来替代Faster R-CNN采用的高校池以解决仅通过池化直接采样导致特征图谱在原图的对应位置与真实位置有所偏差的问题;2)多任务损失函数包括分类误差、回归误差、分割误差,即将识别预测和分割预测分割,掩膜分支针对每个RoI产生一个K×M×M二值的掩膜输出,其中K为分类物体的类别数目。该算法在COCO数据集上测试效果都略优于Faster R-CNN。图6为Mask R-CNN算法示意图。
图6 Mask R-CNN算法示意[24]
以上介绍深度学习算法都属于两阶段深度学习的算法,即分为候选区域生成和区域分类两步,存在着实时性较差的缺点。接着介绍的是单阶段深度学习方法[23],即端对端、单阶段对物体进行检测,对于一张待测图像仅使用一个卷积神经网络直接预测不同目标的类别与位置。这种端对端的检测方法极大地提高了算法的运行速度,满足目标检测实时性的要求,典型的算法有YOLO(you only look once)系列、SSD(single shot multibox detector)系列。
在2016年,Redmon J等人[24]提出YOLO算法使得基于深度学习的目标检测算法有了单阶段和两阶段的区分。与之前两阶段目标检测算法最明显的区别在于YOLO舍弃候选框提取,直接采用回归的方法进行物体分类和候选框预测[25]。这样的改进简化了网络结构,将检测速度提升至了Faster R-CNN的10倍左右。至此,基于深度学习的目标检测算法能够满足实时性的需求。YOLO v1首先将待测图像进行归一化处理,然后将处理后的图像输入CNN中进行特征提取以及边界框置信度的预测,最后采用非极大值抑制(non-maximum suppression,NMS)算法过滤边界框获得最优结果。但是算法只针对最后特征图进行分析,使得它对小目标的检测效果不佳,当多个目标出现在一个网格单元时不容易区分。图7为YOLO v1算法示意图。
图7 YOLO v1算法示意[26]
时隔一年,Redmon J等人[27]在YOLO v1的基础上进行改进提出了YOLO9000,该算法的检测速度远远超过其他检测算法,代表着当时业界最先进的检测水平。YOLO9000相较于YOLO v1做出了以下改进:1)对网络结构进行了优化,在消除对其他正则化的依赖的同时,提高了收敛性;2)YOLO v2提高了分辨率,为了适应高分辨率输入,使用新的高分辨率分类器;3)使用卷积层预测边界框位置并用标准欧氏距离的K-means聚类方法代替手动选择边界框个数、形状,以提高置信分数;4)采用新的特征提取网络模型Darknet—19,以提取到物体更精细的特征;5)采用多尺度图像训练,通过采用不同分辨率的图像进行模型迭代训练,增强模型对多尺度图像的预测鲁棒性。
2018年,Redmon J等人[26]在YOLO v2的基础上提出了效果更佳的YOLO v3算法,1)调整了网络结构,使用残差网络模型[29]Darknet—53进行特征提取;2)采用多尺度特征进行目标检测,借鉴特征金字塔网络(feature pyramid networks,FPN)思想,通过采用了3个不同尺度的特征图能获得细粒度的特征;3)进行分类时,采用多个单独的Logistic分类器取代了SoftMax,提升了检测速度与精度。
从YOLO算法被提出至今,一直在不断地改进提升,但依旧存在着物体定位准确度低、召回率差等问题需要解决。
在2016年,Liu W等人[28]提出了SSD算法,解决了同时期YOLO算法存在的定位精度低、难以检测小目标等问题。SSD算法有以下改进:1)采用CNN来直接进行检测,避免了YOLO方法在全连接之后再进行检测的操作;2)提出尺度不同的特征图来对物体进行检测,通过快速检测不同尺度特征图的准确度,明确区分预测;3)结合Faster R-CNN算法中的Anchor机制,通过大小不同的先验框在特征图中获取候选区域,提高了召回率。图8为SSD算法示意图。
图8 SSD算法示意图[31]
SSD通过对Faster R-CNN算法和YOLO算法的优点结合,利用特征的金字塔结构充分挖掘卷积层的特征信息,使得其在满足检测精度的同时保证了算法的速度,在一定程度上克服了YOLO算法难以检测小目标、定位不准的缺点。
2017年,Fu C Y等人[30]对SSD算法进一步优化提出了DSSD(deconvolutional single shot detector)算法,将SSD中的融合模块采用反卷积代替传统的双线性插值上采样,将高层语义与低层特征信息进行充分融合,进一步提升了对小目标的检测精度。与此同时,随着网络的复杂度增加,算法的检测速度有所下降。图9为DSSD算法示意图。
图9 DSSD算法示意图
同年,Li Z X等人[31]提出了FSSD(feature fusion single shot multibox detector)算法,通过借鉴FPN算法思想,将多尺度特征与信息融合,虽然对小目标的检测精度有所下降,检测速度得到了明显的提升。图10为FSSD算法示意图。
图10 FSSD算法示意图[31]
随着科学技术的不断发展,计算机的硬件基础不断增强,国内外数据集的规模不断扩增,深度学习目标检测算法的检测速度和精度也在不断上升。但与此同时,目标检测依然存在着许多困难与挑战:1)图像背景与目标状态的融合;2)多层级、多维度的特征提取方法;3)基于深度学习的特征表达;4)基于核的支持向量机分类方法;5)高维数据的分类方法;6)深度学习理论性指导。相信随着深度学习的不断发展,越来越多的学者在目标检测领域不断探究,将会涌现更好、更优的算法。