1. 引言
随着计算机和人工智能的飞速发展,深度神经网络已经成为计算机视觉领域近年来最为热门的研究方向,并且在机器视觉、语言识别和文本处理等诸多应用领域中取得了重大突破。
目标检测是计算机视觉领域的一个经典的任务,是进行场景内容分析和理解等高级视觉任务的基本前提。现有的目标检测算法的框架主要分为两大类:一阶段算法和二阶段算法。二阶段算法,如Faster R-CNN [1] 利用选择性搜索算法从图像提取候选框,对图像进行一次特征提取,通过空间金字塔池化映射为固定长度的特征向量,再通过全连接层进行分类来预测边界框的坐标,从而对候选框进行修正。基于候选区域的算法在主流数据测试集中达到了非常高的检测精度。但是二阶段算法处理速度较慢,没有先进的硬件设备使得该类算法很难在实时的场景中落地。而一阶段算法的性能达到实时性要求且精度满足大部分需求。典型的一阶段算法如YOLO系列算法,通过将候选区域与分类合二为一,利用整张图的特征来预测多个类别的概率和和每个边界框的置信度。YOLO系列经过v1~v4 [2] [3] [4] [5] 多个版本的迭代,已经在精度方面逐渐逼近二阶段算法,由于极高的实时性可以轻松在应用在各个类型的场景中。
司机违章行为检测是目标检测的一个重要的应用场景。在行车途中,司机的驾驶行为是否符合安全规范直接关系到全车人的人身安全,所以对司机进行视频监控是一项重要的安防措施。一般的车辆行驶中,在特定路段设置的抓拍系统只能对固定范围进行监控,仅能在一定程度上约束司机的违章行为。而日常的大部分时间里,在司机行驶过程中,通常会出现打电话、抽烟及喝水等违章行为,这些属于违章行为。在未被监控的时段,司机的行为仅靠个人的自觉遵守,很难对其进行监管。特别在公交系统,出租车、客运车、货车、冷链车等大型交通工具中,这些违章行为存在极大的风险系数,危害着公共安全。
安全驾驶监督系统离不开目标检测技术的发展。当前国内外大多数智能司机行为检测集中于汽车行业,由于驾驶舱内部狭小,司机人脸和手部等有明确的特征,可以达到实时行为检测的目标。而对于机车来说,现有的系统一般搭载于昂贵的远程大型服务器上,只能在列车运行结束后收集运行保存的监控视频检测,无法实现实时和随车检测,只能进行司机非安全行为发生后的追查和定责。因此,采用一种低成本,可随车一起运行的嵌入式设备,在其上部署可以实时运行的监控系统,以便实时传回违章信息便成为一项极有意义的工作。为解决实时、高精度检测司机安全驾驶监督的问题,本文针对打电话、喝水、抽烟三种违章行为进行算法设计,采用轻量级的目标检测算法YOLOv4-tiny,成功地在计算能力较低的嵌入式设备上部署,并实现了较高精度下实时运行的目的。
2. 目标检测算法
2.1. CSPDarknet-53
YOLO系列目标检测算法作为一阶段算法实时性的代表,常用于大量的实际场景中。经过多个版本的迭代,速度不断提高,而在精度方面正不断的赶超二阶段的复杂网络结构算法。DarkNet网络作为一种小众的Backbone,在图像分类的性能堪比ResNet [6] 系列的卷积神经网络,应用在YOLOv2及之后的版本。YOLOv3的作者将DarkNet网络从最初DarkNet-19更新到DarkNet-53,增加了卷积层的深度和宽度,同时引入了残差单元,在通用特征表示方面得到了极大的提升。
最近的研究从网络层的梯度流动方向出发,在减少网络计算量的同时,实现一个更丰富的梯度结合。CSPNet [7] 通过切分梯度流动,使得梯度流动是通过不同的网络路径进行传播。CSPDarkNet-53在原始结果DarkNet-53基础上改进了每个阶段的梯度,在每次下采样后将输出特征图的通道一分为二,其中一个路径经过该阶段的所有残差单元,在该阶段的末端与另一个路径进行合并。如图1所示。
该主干网络增强了CNN的学习能力,使得在轻量化的同时保持准确性,降低了计算瓶颈和内存成本。
DarkNet-53的卷积层采用卷积 + BN层 + Leaky RELU的组合,而在CSPDarkNet-53中将Leaky RELU替换成Mish,关于Mish激活函数的优越性质有如下三点:无上界且有界、非单调函数、无穷阶连续性和光滑性。Mish激活函数的应用,在YOLOv4中得到了明显的性能提升。

Figure 1. CSP structure of CSPDarkNet-53
图1. CSPDarkNet-53的CSP结构
2.2. 检测层与损失函数
在目标检测领域,为了更好的提取融合特征,通常在Backbone和输出层之间插入一些层,这个部分称为Neck。YOLOv4使用了SPP [8] 模块,相比单纯的使用k*k最大池化的方式,更有效的增加主干特征的接收范围,显著的分离了最重要的上下文特征。
另外,YOLOv4在FPN层的后面还添加了一个自底向上的特征金字塔。其中包含两个PAN结构。这样结合操作,FPN层自顶向下传达强语义特征,而特征金字塔则自底向上传达强定位特征,两者相辅相成,从不同的主干层对不同的检测层进行参数聚合,在输出层进行边框回归时,传统的目标检测模型(比如YOLOv3)等,直接根据预测框和真实框的中心点坐标以及宽高信息设定MSE (均方误差)损失函数。MSE损失函数将检测框中心点坐标和宽高等信息作为独立的变量对待的,而实际上两者之间是有关联的。从直观上来考量,框的中心点和宽高的确存在着一定的关系。使用IOU损失相比MSE损失更能表征其联系,CIOU [9] 损失在IOU损失的基础上考虑了边框的重合度、中心距离和宽高比的尺度信息,最终YOLOv4在设计损失函数时,在定位损失部分使用了CIOU损失,即L(bbox)。总损失函数为:
(1)
(2)
(3)
(4)
损失函数由定位损失L(bbox)、置信度损失L(conf)和分类损失L(cls)构成。其中,定位损失采用了CIOU损失,置信度损失和分类损失都使用了交叉熵损失。IOU为真实框与预测框的交并比,ρ表示欧式距离, C表示真实框与预测框的最小外界矩形的对角线距离,υ用来度量长宽比的相似性,λ为超参数,K为特征图的大小,M为锚框的数量,第ij个位置为目标时等于1,c为类别,p(c)代表类别的置信度。
2.3. 改进的YOLOv4-Tiny

Figure 2. CSP structure of YOLOv4-tiny
图2. YOLOv4-tiny的CSP结构
为了方便YOLOv4在移动平台或边缘设备进行部署,使用一个更精简的模型YOLOv4-tiny,该检测网络在YOLOv3-tiny的基础上,引入了残差单元,采用YOLOv4类似的CSP结构,在原有7层卷积层增加至18层,改进的卷积网络能提取更多的语义信息,特征提取能力提升显著。
YOLOv4-tiny的骨干网络使用残差单元进行特征表示,并进行微小改进,将3 × 3卷积前后的特征进行堆叠,保留了原始的信息。类似CSP的结构,如图2所示,跨阶段的特征融合,在残差单元之前,摒弃一半通道的特征,在参数上更精简,梯度传导更加高效,去除了大量的计算冗余。整个骨干网络保留了YOLOv4原有架构4个阶段的形式,32倍下采样,使用两个分支进行预测,覆盖了所有多个尺度的特征。
YOLOv3-tiny仅使用3 × 3 + 最大池化的组合方式进行特征提取与尺度变换,而YOLOv4-tiny考虑了更高效的特征表示,并使用梯度截断使得大量的冗余梯度被剔除,两者的特征表示与梯度传导如下:
(5)
(6)
其中,*为卷积操作,X[0:C]表示只选取X中0~C的通道,[X0,X1]代表X0与X1的堆叠操作(即Concat),MaxPool(X)为池化,公式(5)为YOLOv3-tiny基本结构的特征表示,公式(6)为YOLOv4-tiny的CSP结构的特征表示,如果使用反向传播算法更新权重,则上述两者的权重更新方程可写为:
(7)
(8)
其中,f(X)为权重更新函数,gi代表反向传播到第i层的梯度,从公式(7)中可以发现当串联多个基本结构时,大量的梯度信息被重新用于更新不同密集层的权重。这将导致不同的卷积层重复学习复制的梯度信息。而公式(8)使用跨阶段部分残差连接,并与最原始层进行堆叠后经过另一个过渡层Wk−1,可以看到来自残差变换层的梯度是独立积分的。另一个路径中没有经过残差变换层的特征图Xk−1也是独立积分。因此用于更新权重的梯度信息中,两者之间都不包含属于彼此重复的梯度信息。
跨阶段的特征融合,在残差单元之前,摒弃一半通道的特征,在参数上更精简,梯度传导更加高效,去除了大量的计算冗余。整个骨干网络保留了YOLOv4原有架构4阶段的形式,32倍下采样,使用两个检测分支进行预测,可覆盖多个尺度的特征。
该算法训练过程的数据增强采用了马赛克增强,在基于CutMix [10] 的两张图片拼接的基础上,采用4张随机缩放、随机裁剪或随机排布的图片进行拼接。这极大地丰富了检测数据集,特别是通过随机缩放增加了更多的小目标,使得网络的鲁棒性更好。
对于损失函数,需要用预测概率去拟合真实概率,而拟合one-hot的真实概率函数会带来两个问题。深度学习的样本中通常会存在少量错误标签,这些错误标签会影响到预测的效果。采用标签平滑策略在训练时假设标签可能存在错误,避免“过分”相信训练样本的标签。
3. 司机违章行为检测
3.1. 行为分析
对于司机的违章行为,分为三个类别:打电话(包括玩手机)、喝水、吸烟。通过给共用车辆装备车载终端等方式,面向车内司机部署红外摄像头持续监控司机的异常行为,被系统成功识别的行为进行语音提示并将异常行为上报至云端。
YOLO系算法由于其可观的检测性能以及较快的检测速度被广泛应用于不同的物体检测实际场景中。YOLO的网络架构中采用简易的残差单元和4个阶段结构使得在模型转换以及边缘端部署具备良好的保障,因此司机的违章行为检测采用物体检测的方法,通过对红外摄像头的视频帧逐帧处理,对图像中的手机,水瓶,香烟等小目标进行定位与分类,并融合连续帧之间的多个检测结果,确定最终司机的驾驶状态。
3.2. 行为数据集制作
通用数据集中关于手机,水瓶,香烟等物体的图片集,由于背景的复杂以及图片类型,形状的差异,使得该数据集并不适用于驾驶舱的红外特定场景中。
通过在驾驶舱中放置多个固定的红外相机,持续采集不同司机的规定动作,分别录制被采集人不用人脸角度下左右手手持手机、水瓶、香烟等动作。具体设计的动作考虑到了行车过程中可能会发现的情形,因此为保证最终检测算法的性能,设计了多种动作。关于持手机的动作,分为放置耳边打电话、放置耳边听语音、放置嘴边发语音、玩手机等;关于持香烟的动作,分为嘴叼烟、不同夹烟手势吸烟等;关于持水瓶的动作,直接录制拿起水瓶到喝的过程,如图3所示。

Figure 3. Different action design of calling, smoking, drinking
图3. 不同的打电话、抽烟、喝水动作设计
利用Opencv录制分辨率为1280 × 720,帧率为25,时长为30分钟的被采集人视频,使用VOTT进行标注,最终的违章动作数据集分为3个类别,分别为打电话、喝水、抽烟。总标注图片数量为5000张。
3.3. 移动平台部署
TensorFlow Lite是一种用于边缘端推断的开源轻量级深度学习框架。可以把训练好的TF模型通过转化、部署和优化三个步骤,达到提升运算速度,减少内存、显存占用的效果。
在TensorFlow的深度学习框架下,利用大型图像分类数据集ImageNet2012 [11] 预训练CSPDarkNet-53,通过迁移学习的方式在违章动作数据集上微调检测网络YOLOv4,将其作为教师模型将知识蒸馏给学生模型YOLOv4-tiny,将训练好的TF框架模型转换至TFLite,将Python端的整套模型推理流程移植到Android端,采用JAVA语言调用TFLite模型推理框架,实现YOLOv4-tiny在移动端的部署。
3.4. 应用层逻辑
在驾驶舱中安装车载终端以及红外摄像头,当系统稳定运行时,司机违章动作识别系统读取摄像头视频帧,对图像像素进行检测,从而定位图像中的物体以及预测该物体的类别。
漏检与误检是目标检测难以解决的两大难题,为了保障算法在车载终端上的稳定性,直接采用检测结果判断司机状态显然不合适。在实际的服务中,通过建立一个缓存队列,保存当前检测结果和历史检测结果。根据检测类别在缓存队列的比例输出当前的司机状态,对于违章动作给予告警以及信息上报。
应用层的主要流程:挂载一个APP的后台服务进行算法部署,通过安卓API访问系统摄像头,读取每一视频帧,对图像进行预处理,输入到TFLite模型推理框架,将预测的检测结果输送至缓存队列,判定当前驾驶员的状态,从而实现对司机违章行为的持续监测。
4. 实验
4.1. 评价标准
深度学习模型需要在“验证/测试”数据集上来评估性能,性能衡量使用各种统计量如准确度,精确率,召回率等。选择的统计量通常针对特定应用场景和用例。对于每个应用场景,选择一个能够客观比较模型的度量指标非常重要。
mAP (Mean Average Precision)是目标检测问题中的最常用评估指标。多个类别物体检测中,每一个类别都可以根据召回率和准确率绘制一条曲线,AP就是该曲线下的面积,mAP为多个类别AP的平均值。
4.2. 公开数据集的性能对比与分析
为了更直观的评价算法之间的差异,在PASCAL VOC和COCO两大公开数据集上分别对比YOLOv3与YOLOv4的性能。
在VOC数据集上,训练集采用VOC2007-train和VOC2012-train,在VOC2007-test上测试mAP,性能对比如图4所示。
在COCO数据集中,YOLOv3和YOLOv4对比了320 × 320、416 × 416、512 × 512三种不同尺度,在YOLOv3-tiny和YOLOv4-tiny则使用416 × 416单尺度测试,如图5所示。
从实验数据中可以看出,VOC数据集上,YOLOv4相比于YOLOv3,其性能提升了约5%,精简版YOLOv4-tiny在YOLOv3-tiny的基础上提升了将近10%,与YOLOv3仅相差约5%。而在COCO数据集上,YOLOv4在3个尺度上的性能全面优于YOLOv3,YOLOv4-tiny的性能超越了YOLOv3-tiny近7%。

Figure 4. Performance comparison on VOC dataset
图4. VOC数据集上的性能对比

Figure 5. Performance comparison on COCO dataset
图5. COCO数据集上的性能对比
4.3. 自建数据集的性能对比与分析
在自建的司机违章动作数据集上,将数据集分为两个部分,80%的数据用于模型训练,20%的数据用于性能测试。4个模型使用了相同的训练策略,批次大小为16,使用k-均值重新聚类的锚框,设置相同的数据增强,统一的优化器Adam,训练共100个epoch。性能对比如下表1所示。

Table 1. Performance comparison of driver violation datasets
表1. 司机违章行为数据集性能对比
结果分析:YOLOv4达到了70%,而YOLOv4-tiny在该数据集的性能比YOLOv3更好,高出近10%,这得益于知识蒸馏的策略方法使得tiny版本更好的学习了YOLOv4的泛化性能,实验表明YOLOv4-tiny相比于YOLOv3和YOLOv3-tiny在性能上有了巨大的提升。
问题:由于采集多种人脸角度、不同遮挡情况的目标图像,同一个类别之间的差异较大。对于手机这一类别,其颜色通常为黑色,在红外场景中,存在大量相似的黑色物体,其手机不同角度形状各异;对于水瓶,其种类繁多,其体积各异,颜色丰富;对于香烟,目标极小。众多的难样本导致所有的算法在测试集上精度并不高。
4.4. 多平台的速度对比与分析
实时性作为目标检测算法评估的重要指标,通常决定着是否能应用至实际场景中。特别在驾驶场景,其实时性的重要程度不言而喻。因此,在多个平台上测试YOLOv4-tiny的处理速度,使用FPS作为参考指标,如图6所示:

Figure 6. Multi-platform processing delay comparison
图6. 多平台处理延迟对比
通过数据可知,YOLOv4-tiny在服务端和边缘端都具备极快的推理速度,在移动手机上的两款常用芯片麒麟和骁龙系列测试结果显示具备良好的实时性,在RK3399上的处理速度也中规中矩,在硬件资源极差的树霉派上达到了7FPS,这说明YOLOv4-tiny在车载终端具备优异的处理速度,使得检测算法在更多的实时场景中落地提供了方向。
5. 结语
本文基于目标检测的方法对司机行车过程中的违章动作进行识别与研究。在YOLOv3的基础上,改进其骨干网络,引入新的激活函数Mish,将CIOU损失替换原有定位损失函数,为方便算法在边缘端的部署,采用更小的网络结构,并使用知识蒸馏的方法继承大模型的精度。实验表明,新的模型在精度和速度两个方面全面领先上一个版本,且在多个平台中都具备极佳的检测速度。该模型在司机这个特定场景中表现优异,使得算法为在各类追求实时性的场景中的落地提供了坚实的基础,具有巨大的工程意义。