基于YOLOv3改进的手势检测算法*
2021-07-25詹金峰
许 冠,詹金峰
(1.佛山市南海中南机械有限公司,广东 佛山 528247;2.华南理工大学自动化科学与工程学院,广州 510640)
0 引言
手势检测的目标是检测出图像中手势所在的位置,并用矩形框、椭圆框等加以标示。手势检测作为手势识别、手势估计的基础任务,在人机交互等领域中有着诸多应用。为了将其应用在实际场景中,手势检测相对其他目标检测任务要求更高的检测精度以及检测准确率。
手势检测是目标检测的特例化,因此一般的手势检测方法是在通用的目标检测算法中融合手势特征得以实现。目前的手势检测方法主要包括基于肤色模型的检测方法、基于运动的检测方法、基于分割的检测方法、基于深度学习的检测方法等[1]。
基于肤色模型的检测方法是一种传统且高效的方法,一般将手势图像从RGB空间转化到YCrCb空间、HSV空间、YUV空间等,因为在这些空间内肤色有着很好的规律,可以从其他颜色背景中完整地提取出来。HF Hashem等[2]提出了一种自适应的HSV肤色模型,可以根据不同的光照条件动态调整阈值。S Kolkur等[3]提出融合多个肤色空间进行肤色提取的方法,相比基于单个肤色空间的方法有更高的准确率。
基于运动的检测方法假设被检测物体相对于背景是运动的,通过对视频帧中连续的两帧或者多帧进行分析,从而提取出目标。其主要方法有光流法、帧间差分法和背景差分法。
基于分割的检测方法通过对图像进行像素级的分类,能够得到比一般检测方法更加精确的结果。Grab cut[4]结合图论理论对图像进行分析,将每个像素点视为带权无向图的顶点,进而将原问题转化成图的顶点划分问题。SLIC[5]基于超像素进行图像分割,能通过对图像的颜色、亮度、纹理等特征进行聚类以形成超像素块,然后进行迭代聚合。FCN[6]开创了利用深度学习进行图像分割的先河,其摒弃了传统网络的全连接层,并创造性地使用了反卷积模块。
基于深度学习的检测方法具有不需要人工提取特征、检测准确率高等特点,是手势检测的发展趋势。R-CNN[7]的提出让基于深度学习的检测方法成为目标检测的研究主流方向,其通过对图像进行密集采样,将目标检测问题转化成了图像分类问题。之后Fast R-CNN[8]以及Faster R-CNN[9]对原始的R-CNN进行了一系列改进,获得了突破性的性能提升。但是基于两阶段的R-CNN系列网络结构复杂,不能端到端的训练,且实时性较差。因此基于一阶段的检测方法,例如YOLO[10]系列检测算法凭借其网络架构简单高效、端到端训练、拓展性强,且相对于多阶段网络实时性能好等优点,更加适合应用在实际检测的任务中。马巧梅等[11]将YOLOv3应用到车牌检测中,在复杂的场景中取得了更好的检测效果。郝帅等[12]利用改进的YOLOv3算法来检测输电线路的故障,通过引入注意力机制等方法提高了检测准确率。
YOLOv3[13]在YOLOv2的基础上将骨架网络由Dark⁃net-19更改成了Darknet-53,加深了网络的深度,同时融入了残差单元,然后将Darknet-53的中间层作为不同感受野的特征进行融合,输出3个不同尺度的特征图,接着直接在特征图上进行损失计算。其还将分类输出函数Softmax替换为Logistic Classifier,减小计算量的同时提升了检测效果。通过这些改进,YOLOv3在各大手势检测数据集中获得了非常好的准确率和检测速度。
1 改进的YOLOv3算法
针对手势检测实时性要求较高,且在背景杂乱以及有肤色干扰时准确率低的问题,本文提出一种基于YO⁃LOv3改进的手势检测算法。首先,重新对训练集中的手势尺度进行Kmeans++[14]聚类,改进Prior的初始值,这能得到一组接近数据集分布的初始集,因此有利于网络更快地收敛以及得到更准确的结果。然后针对目标检测中常见的正负样本不均衡以及难易样本不均衡的问题,引入Focalloss[15]改进网络的损失函数,加快了网络的训练速度。最后,针对常规非极大值抑制算法(NMS)选取候选框不够准确的特点,引入了加权NMS[16],并根据候选框的位置关系去除冗余的候选框。在Egohands数据集[17]中实验表明,本文提出的算法相对于标准的YOLOv3算法在准确率和mAP上有较大的提升。
1.1 Kmeans++重聚类
原始的YOLOv3网络使用Kmeans在VOC、COCO等数据集上进行聚类,得到的聚类中心并不符合本文数据库中的手势分布,所以对数据集进行重新聚类有助于网络更快地收敛以及更准确的回归。
Kmeans++相对于Kmeans算法,改变了初始化聚类中心的策略,相比于Kmeans采取随机初始化的方式,Kmeans++的核心策略是使各聚类中心尽量的远。其一般步骤是先初始化第一个聚类中心,然后计算其他点到此中心的距离,记为D(x),D(x)越大则成为下一个初始中心概率也就越大。接着采用轮盘法逐个确认初始中心直到到达设定聚类中心数量:
式中:͂为与x最近的聚类中心;D(x)为欧式距离;Λ为全体集合。
虽然Kmeans++在初始化中心时花费了额外的时间,但是极大地加速了收敛时间,所以整体上比Kmeans有更快的运行速度。
1.2 引入Focal Loss改进损失函数
Focal Loss是何凯明等在2017年提出的基于交叉熵损失函数改进的新型损失函数,它主要解决了目标检测中正负样本极不均衡的问题并且更加关注困难分类的样本。对于一般的交叉熵损失函数计算如下:
引入一个α系数可以解决正负样本不均衡的问题,如下所示:
Focal Loss在式(5)的基础上进一步引入了新的调制项。
式中:γ为调制系数,当γ=0时,式(4)退化为式(3),γ越大,则对难分类样本的关注程度也就越大;pt为样本的分类难度,其值越接近1,惩罚力度越大,通过这种对难易样本采取不同的惩罚力度达到关注难分类样本的效果。
YOLOv3的损失函数由4个坐标的均值平方差损失、类别交叉熵损失以及置信度的交叉熵损失构成,其中类别损失由正样本类别损失和负样本类别损失构成。由于置信度的高低代表着样本的难易程度,本文将置信度损失项改为Focal Loss损失,改进后的损失函数为:
式中:S2为特征图的尺寸,本文保留YOLOv3设置的13、26、52;N为每个特征点对应的Prior数,本文为3;为特征图的掩膜,YOLOv3训练阶段只保留目标框对应位置特征点与之IOU最大的一个Prior,也就是说每次计算损失时每一个尺度的特征图上只有和目标框相同数量的特征点参与计算;coord为预测坐标;pt同式(3)中定义;α,γ分别为Focal Loss的系数;classes为预测的类别数量,本文中为2。
1.3 改进NMS
非极大值抑制(NMS)是筛除冗余检测框最常见且最有效的方法,传统的NMS基本流程如下:
(1)设定置信度阈值,去除低于阈值的候选框;
(2)按照置信度进行排序,取出最高置信度的候选框,计算其他同标签的候选框和它的IOU;
(3)挑选出IOU大于设定阈值的候选框,认定其为冗余的候选框,输出最高置信度的候选框,并在候选框集合中去除(2)中挑选出的候选框;
(4)重复(2)~(3)的步骤,直到没有候选框剩余。
传统的NMS算法只根据最高置信度挑选候选框,导致鲁棒性不强,且没有综合其他候选框结果,导致准确率也不高。Zhou等[16]提出了一种根据置信度对候选框加权得到新的候选框的方式,改善了上述问题。
本文基于加权NMS进行实验,在分析实验结果时发现,对于两个高置信度的候选框,当他们是相互包含的关系且NMS阈值较低时,此算法无法过滤掉置信度较低的候选框,导致结果出现冗余,进而降低了预测的准确率。虽然降低NMS阈值可以避免这个问题,但是降低NMS阈值意味着每次进入步骤(3)会包含过多的相交框,特别当两只手有交互时,算法极大概率会漏掉一个目标。因此,本文针对多个手势极少出现相互包含的情况,提出对候选框之间的关系进行判定,筛除与最高置信度候选框相互包含的干扰框,从而达到去除冗余的目的。实现公式如下:
式中:M、分别为最高置信度候选框和与之IOU大于小于阈值的其他候选框的左上角坐标;N、为相应的右下角坐标;&为相与操作;thres为候选框之间判定相互包含的严格程度。
2 实验结果与分析
本文采用了Egohands数据集[17]进行对比实验。Ego⁃hands数据集是由Google眼镜采集的共48个内容为2个人进行复杂手势互动的视频。视频包含了4个人、3种不同场景、4种不同活动。每个视频不等间距地抽取100帧图片进行像素级的标注,既可以用于手势分割任务,又很容易转换成目标检测的标注框。标注还区分了观察者左右手和他人左右手,数据集总共包含4 800帧标注,15 053个手势对象。图片中的手势具有不确定数量、手势不完整、手势模糊、手势大小范围大等特点,使得数据集富有挑战性。本文将数据集随机分出4 500帧作为训练集,另外的300帧作为测试集。
为了更加准确地评估本文算法,本文采用通用的目标检测评价指标mAP和准确率来测试算法性能。本文使用的mAP算法实现来自Rafael Padilla等[18]的开源项目,其对目标检测常用的评价标准进行总结,并给出mAP的通用实现。
2.1 实验细节
本文实验在ubuntu16.04操作系统,Intel Core i7-8700K CPU,GeForce GTX 1070Ti单个显卡,Pychar⁃mIDE,Pytorch1.1.0环境下完成。
Egohands数据集中包含着一些不存在目标的数据帧,训练过程直接去除掉这些帧,同时数据集的标签是根据给定的分割标签自动生成,原来的标签包含观察者左右手、其他人左右手4种标注,本文重新整理为观察者手势和其他人手势两种类别。
样本的预处理阶段,首先将原图像720×1 280大小,通过pad操作得到1 280×1 280大小,然后通过最近邻插值缩小到416×416的标准大小。本文默认在训练阶段扩充数据集,扩充方式为旋转图像。
训练阶段,使用了最小批迭代,最小批大小为8,Focal Loss的α、γ分别设置为1和2。采用Adam方法进行参数迭代学习,本文利用迁移学习的方法,网络模型预先经过COCO数据集的训练,加快了训练的收敛速度。
2.2 Kmeans++重聚类
本文直接对训练集尺度进行聚类,不同于YOLOv3中以最大的平均IOU作为评判标准,为了更加关注初始Prior和数据集尺度的贴合程度,本文直接对图像的宽和高进行聚类,聚类结果如图1~2所示。
图1 Kmeans聚类结果
图1所示为Kmeans的聚类结果,图2所示为Kmeans++的聚类结果。可以看出,Kmeans++的聚类效果更加均匀,特别对于较大尺度的样本,Kmeans++能够给定一个较好的初始Prior,这有效加速了网络的收敛速度,同时提高了准确率。经过Kmeans++重新聚类得到的初始Prior大小如表1所示。表中特征图尺寸越小,相应的感受野越大,所以初始的Prior尺寸也就越大。
图2 Kmeans++聚类结果
表1 Keans++聚类得到Prior初始值
2.3 Focal Loss损失函数的引入
为了分析引入Focal Loss对网络训练的影响,给出了网络在两个损失函数下的Loss变化曲线,结果如图3所示。由图可知引入Focal Loss之后,初始损失更小,这得益于对简单样本损失项的权重系数变小。同时训练的收敛速度更快,表明网络更有针对性的进行训练。而且最终的损失也更小,说明网络的收敛效果得到了提升。
图3 不同损失函数收敛
2.4 改进的NMS
为了说明本文提出改进的NMS算法的有效性,在Kmeans++重新聚类的YOLOv3网络上,对比不同的NMS方法在不同的IOU阈值下所得的准确率。本文选取原始的NMS算法,以及加权NMS算法进行比较,结果如表2所示。由表可见,引入加权NMS后准确率有了明显的提升,并且随着IOU阈值的增加,提升效果越明显,在IOU为0.8时提升了近14%,加入候选框去冗余算法后,在各个IOU阈值的情况下都有近0.5%的提升。
表2 各NMS在不同IOU阈值下准确率比较
进一步分析提出的NMS算法与标准NMS在不同IOU阈值下的mAP指标,发现改进算法同样有很大的提升,而且随之IOU的增大效果越明显,在IOU为0.8时,提升了近20%。实验结果如表3所示。
表3 各NMS在不同IOU阈值下mAP比较
2.5 定性分析
为了更直观地展示改进的YOLOv3算法在检测效果上的表现,本文选取了在测试集中的几组典型检测结果。
(1)Kmeans++重聚类对检测结果的影响
本文分别对重聚类前后的网络,提取置信度在0.8以上且未经过NMS处理的结果进行分析,结果如图4~5所示。由图可知,重聚类之前虽然能检测出手势,但是误差较大,而聚类之后手势候选框相当贴合GroundTruth。
图4 重聚类前检测结果
图5 重聚类后检测结果
(2)候选框去冗余算法对检测结果的影响
在改进算法的基础上,分别对加入去冗余算法前后进行评估,结果如图6~7所示。由图可知,对于两个置信度很高且相互包含的候选框,因为其IOU较小,原NMS算法无法将其筛除,而改进的NMS算法准确地筛除了冗余的候选框。
图6 未加入去冗余算法
图7 加入去冗余算法
(3)改进算法对难检测样本的检测效果
本文选取手势检测中最为常见的遮挡,以及不完整手势样本,进行检测。图8所示为改进算法在严重遮挡的场景下的检测结果,可见不论是手掌被遮挡还是手指被遮挡,算法都能很好地检测出目标。图9所示为目标不完整的检测结果,可见当手势部分移出界外时,算法能准确检测出目标,同时当手势被手臂完全遮挡时,算法不会产生误判。
图8 严重遮挡下的检测效果
图9 手势不完整下的检测结果
3 结束语
本文针对手势检测对于检测准确度、检测准确率以及实时性要求较高的特点,选取了YOLOv3来进行手势检测。由于原始的YOLOv3无法满足手势检测的要求,本文从3个方面进行了改进:用Kmeans++进行尺度重聚类,使得网络初始Prior更贴合数据分布;引入FocalLoss损失函数代替了原本的交叉熵置信度损失函数,改善网络的训练过程;用加权NMS替换了传统的NMS,并加入位置判别的去冗余模块,提高检测框与GroundTruth的贴合程度并有效地去除冗余候选框。通过实验验证,本文提出的算法相较于原算法,在检测率以及mAP上都取得了较大的提升。