(西南交通大学 机械工程学院, 成都 610031)
随着我国经济高速全面发展,铁路运输能力的快速提高,铁路运输在交通运输的地位愈为重要。确保铁路安全平稳成为铁路运输部门的一项重要工作。在众多的铁路安全事故中,人始终是影响铁路行车安全的重要因素。文献[1]总结了1990~2009年10年中重大列车事故原因,其中人为因素占总事故数目的64.76%。因此,对铁路系统中的人加强监管就显得极为重要,尤其是直接关系到整车安全的机车驾驶员。
当前,我国铁路管理部门在原有安全监测设备基础上重新设计,构建了机车车载系统、地面专家系统一体化的机车安全防护体系(6A系统)[2]。这套系统在每辆机车的机车驾驶室后方安装了摄像头以加强对驾驶员的监督。当列车开始行驶后,摄像头会开启并记录驾驶室人员视频信息。当列车停止运行后,铁路管理人员会以人工浏览察看视频的方式进行分析,用于司机的绩效评定和事故后责任的分析。可见,当前的驾驶室视频系统只能做到对驾驶员事先的心理提醒,无法对驾驶员在机车运行过程中不当行为进行实时提醒。随着深度学习在图像处理方面的发展应用,使用计算机实现自动司机行为识别已经成为了可能。搭建一种车载智能监控系统,实现实时司机行为识别,如检测出问题便及时将图片传回地面铁路管理人员,便成为一项极有意义的工作。
由此,本文融合目标检测和关键点检测两种深度学习算法,创新实现了一种可以同时检测司机人体关键点和手机的神经网络,通过分析人体关节角度和人体关键点与手机目标的位置关系对司机行为进行了分类识别,并利用半精度加速和层级融合的方法对模型进行了加速和压缩,最终将其成功的部署在嵌入式边缘计算设备上,实现了较好检测效果下的实时运行。
本文将需要检测的司机行为分为以下几类:1)离岗:驾驶室内未检测到司机;2)使用手机:司机使用手机并处于打电话或者玩手机的状态;3)进行手势:司机做出右手向前方示意或者高举右手握拳的规定行为;4)站立:司机处于站立状态;5)坐:司机处于正常坐下状态;6)瞌睡:司机趴在驾驶台上或后仰在椅子上。
为能够确保数据的多样性, 我们采集多组列车驾驶室原始视频数据进行抽帧提取训练图片以及测试图片,标记其中出现司机人体关键点和手机目标框。针对司机人体关键点,根据实际需求,采用和AI Challenger数据集[3]相近的标注结构,标注每个人的目标框和人体的14个关节,分别为头部、脖子、左右肩、左右肘、左右手腕、左右髋、左右膝和左右踝部,对于可见、可知不可见和不可知不可见的人体关键点分别以数字“0”、“1”、“2”进行区分,标注如图1所示。
图1 人体关键点标注
我们共提取了2 750张不同司机姿态的图片,共标注了4 379个人体对象和1 139个手机目标。其中共有主司机目标3 015个,副司机目标1 299个,其他人员65个。司机站立姿态1 315个,正常坐姿2 734个,瞌睡330个。司机进行手势对象1 590个。并将其按10∶1的比例随机划分为训练集和测试集。
根据需求,本文中的模型需要同时检测出人体关键点和手机目标框才可以进行司机是否使用手机的判别。传统意义上这是两类截然不同的图像识别任务,需要分别运行人体关键点检测网络和目标检测网路完成识别。然而同时运行两种网络并保持输出结果的实时性,无疑需求强大的计算能力。在每台机车上部署高性能主机耗价昂贵,而机车也未必能满足计算机运行所需的稳定的环境和电力需求。而选择远程部署实时分析的方法,当前我国的网络建设也很难满足实时传输机车视频的需求。因此,本文融合目标检测和关键点检测两种深度学习算法,基于目标框检测实现了一种可以同时检测司机人体关键点和手机目标的神经网络。
目标检测算法可以分为单阶段和双阶段两类,单阶段目标检测通过神经网络提取图片特征,输出长宽为原始图片n分之一的特征图,特征图每个点回归预测固定个数的目标框的中心点、长宽、置信度和类别,通过非最大抑制算法[4]得到最终的目标框和目标类别,如Yolo[5]和SSD[6]网络。人体关键点检测算法根据先检测关键点再连接成人体还是先检测出人体再检测每个关键点可以分为自底而上和自顶而下两种方式,其都是通过神经网络对人体关键点位置进行直接预测。自顶而下一般具有相对较高的准确率,但是处理速度较低,而且当出现多人时,处理速度会出现明显的波动,不利于实时检测,近些年代表性的算法为Alphapose[8]。自底而上的处理速度较快,不受人数多少的影响,其经过神经网络处理后分别得到两张特征图,分别为人体关键点的置信度和用作指示关键点的指向作为肢体连接的概率,通过最大匹配的方法连接各个人体关键点组成人体姿势。近些年代表性的算法为Openpose[7]。
Pose proposal network[9]借鉴单阶段目标检测的思想,将人体姿态估计转换为目标检测问题,即将每个人体关键点标注的人体关节视为一个目标框,从图像中直接回归出包含人体关键点的目标框。将目标框的中心点视为要预测的人体关键点,通过计算肢体连接概率对关键点进行连接,得到人体姿态。相关实验[9]表明,Pose proposal network在mpii、coco等主流数据集上取得了和openpose等以直接预测关键点的人体姿态估计算法不相上下的成绩,而模型的计算量较小,运行的速度大为提高,适于计算受限情况下的部署。
由此,我们可以通过目标框识别将人体关键点和手机识别统一起来,通过一个主干网络统一提取图片中的特征信息,分别得到H×W大小的包含人体关键点、手机目标框的特征图B和只包含肢体关系的特征图C,如式(1)所示:
C={{p(ki,ki+1,x,x+Δx)}i}i∈{1,....H×W},(ki,ki+1)∈L
(1)
(2)
特征图B通过conf确定目标框,并通过ox、oy、w、h得到每个目标框的位置大小后,通过非最大值抑制去除重复的目标框,将人体关键点代入肢体关系特征图C中进行二分图匹配连接,区分得到不同的人类个体,最后输出人体姿势和手机目标,如图2所示。
图2 融合模型设计
为了满足模型在嵌入式设备上运行的需求,本文通过使用TensorRT框架[10]完成对模型的压缩提速。TensoRT是英伟达公司为满足深度学习的高速推理需求所推出的只用于部署推理的神经网络框架。其通过实现模型简化和降低模型运行计算复杂度对模型推理速度进行加速和对模型体积压缩,使嵌入式设备也可以满足实时运行深度网络的需求。
TensorRT的模型简化通过整合卷积层(convolution layer)和批归一化层(batch normalization layer)为一层实现。神经网络中,卷积层运算可以表示为:
xl+1=W*xl
(3)
其中:xl代表特征图输入,xl+1代表特征图输出,W代表卷积核参数,*代表卷积运算。而批归一化层可以表示为:
(4)
其中:μ代表事先学习中保存的训练集xl+1的均值,σ代表xl+1的标准差,γ、β代表两个调节因子。可以将(3)和(4)融合为:
(5)
TensorRT降低模型运行计算复杂度通过降低模型运行时计算的字节位数实现。神经网络运行时默认采用单精度32位浮点数进行计算,而TensorRT可以将模型更换为半精度16位浮点数乃至8位整数进行推算并保存模型参数,调用设备的GPU实现模型提速。相关实验表明,当模型采用16位浮点数计算时,模型运行速度有近乎原有速度数倍的提升,而模型的精度几乎没有变化。
当完成人体骨架和手机的检测后,模型输出识别出的人体各个关节点和手机的目标框。我们可以通过分析人体各部分的角度关系得到司机的姿态和动作,并通过检测得到的手机框与人体手部框和人体头部框的关系可以得到司机是否接电话或者使用手机。
如图3所示,本文通过人体各关节点坐标得到人体肢体的向量,通过余弦公式得到肢体之间的角度。本文计算右大臂和躯干角度α、右大臂与右小臂角度β对司机是否正进行手势进行二分判别;计算左右大腿和人体躯干的角度δ、γ判别司机处于站立还是坐着;计算人体躯干与水平面角度ε、头部与躯干角度ζ判别司机是否瞌睡;如未在规定范围内检测到人体,则判断为离岗。当检测结果中出现手机目标框时,则计算手机目标框与各个人体的手部、头部的目标框的的重叠情况,当手机目标框中心点落于手部、头部的目标框内或手部、头部的目标框中心点落于手机目标框内时,判定其处于使用手机的状态。整体的后处理流程如图4所示。
图3 人体骨架示意图
图4 后处理流程图
本文使用了Pytorch深度学习框架完成融合模型的搭建。基于嵌入式设备计算量限制的需求,主干网络选择有较好精度表现并且计算量相对较少的Densent[11],特征提取层由两层3×3、一层1×1的卷积层和相应的批归一化层、relu非线性激活层组成,损失函数选择均方误差函数(mean square error,MSE)。训练GPU为RTX2070 8G,系统为Ubuntu16.04,python环境为python3.6.8。训练设置图片输入大小为288×288,初始学习率为1e-3,按1e-3*(1-当前循环次数/总循环次数)衰减,每批次输入图片张数设为32,共循环训练集1 000次。为使模型不对训练集产生过拟合现象、提高样本多样性和图片质量,使用随机旋转、左右翻转、随机裁剪、随机改变图片明暗度、饱和度等方式在训练过程中扩增训练集。
本文选择的部署嵌入式平台为较为廉价、适于工业部署的NVIDIA Jetson TX2,如图5所示。NVIDIA Jetson TX2是英伟达公司推出的嵌入式高性能开发板,其采用NVIDIA Pascal架构,配备256个 CUDA核心,CPU和GPU共用内存为8 GB,可进行16位浮点数计算。
图5 NVIDIA Jetson TX2
本文采用OKS(目标关键点相似度,Object Keypoint Similarity)[12]作为每张图片人体关键点识别好坏的衡量标准,其计算公式如下:
(6)
式中,p表示真实目标中当前检测的人的代码,i代表被标记的人的每一个关节,dpi表示真实目标中每个人和预测的每个人的关键点的欧氏距离,Sp表示当前人的尺度因子,等于人所占面积的平方根,表示人体每个关键点的归一化因子,这个值反映了当前关键点的识别的难易程度,υpi代表第i个点是否可见。
统计测试集所有图片的OKS以计算MAP(mean average precision,均值平均精度)作为人体关键点的衡量指标。对于手机目标,本文则采用目标检测中常用的IOU(intersection over union,交并比)作为识别好坏的衡量标准,同样统计测试集所有图片的MAP作为手机目标框的衡量指标。
图6和表1分别展示了模型的训练曲线和融合模型在测试集上的MAP。人体关键点和手机框识别均处于较为良好的识别水平,满足进行人体识别后处理的要求。
图6 训练损失和测试集损失曲线
表1 模型检测精度
随后,搭建TensorRT加速模型和压缩模型体积。由于模型采用Pytorch搭建,无法直接转换为TesnorRT可读取的参数格式,先将Pytorch模型转换为ONNX(Open Neural Network Exchange) 开放式格式的模型,再输入TesnorRT程序读入。表2展示了TenosrRT加速前后模型在精度、速度和体积上的区别,表中各项都是在Jetson TX2中测得。经过TensorRT加速后,模型在人体关键点上MAP下降了0.000 7,而在手机目标框上上升了0.000 2,模型精度基本没有太大变化。而加速后,模型的推理时间较低到了两位数范围以内,模型运行速度加速比为8.08,基本满足实时运行的要求。同时,模型的体积降低了36.8%,节省了嵌入式设备的存储空间。图7展示了模型在测试集上的检测效果,模型展现了较好的鲁棒性,在驾驶室内光照情况有巨大区别的情况下依然可以较为精准地识别出人体姿态。
表2 加速前后模型对比
图7 模型检测效果图
表3统计了经过第2.3节所描述的后处理后,模型在测试集的精确率(Precision)和召回率(Recall)。模型在大多数行为检测中表现较好,其中在使用手机的行为上检测表现最好,精确率达到92.31%。模型在检测司机离岗的情况最差,精确率为62.12%。
表3 后处理检测效果 %
在这项工作中,本文成功融合了目标检测和关键点检测两种深度学习算法,创新实现了一种可以同时检测司机人体关键点和手机的神经网络,通过分析人体关节角度和人体关键点与手机目标框位置对司机行为进行了分类识别。并对算法模型进行了加速和压缩,最终将其成功地部署在嵌入式边缘计算设备上,模型推理速度为25 ms,可以达到实时运行的目标。另一方面,模型在各类别行为的检测效果不一,其中离岗行为识别的检测效果不佳,模型训练的样本量较少,基于各关节角度的后处理方法仍有较大的改善空间,需进一步研究。