队伍名称:
从头越——北京工业大学
获得奖项:
国家一等奖&地平线特别创新奖
成员信息:
贾玉哲、张洪瑞、曾浩然
主控板卡:
RDK X3
技术要点:
通过算法识别驾驶人员是否抽烟、接听电话,同时还可以识别交警手势。小车在接受到来自开发板的信息后,会根据不同的结果进行对应的降速、转弯等操作,有效降低风险,缓解驾驶人员压力。
(1)开发板通过摄像头获取图像,通过MediaPipe框架对图像进行关键点标注,并利用人体标注的关键点的编号获取对应关键点的坐标信息,从而识别八种交警指挥手指的动作不同,进而映射到对应的坐标系中;
(2)通过YOLOv5算法识别驾驶人员是否抽烟、接听电话,通过地平线公司提供工具链将算法进行转换,最终部署在开发板,并将识别效果反馈给小车;
(3)使用奥尼A50摄像模块获取交警手势,对交警手势进行识别,并将识别效果反馈给小车。小车在接受到来自开发板信息后对不同的结果通过语音模块进行展示,同时根据识别效果进行对应的降速、转弯等操作。
目录
一、分心检测
1、项目介绍
2、模型的下载
3、预训练模型的选择
4、数据集的准备
5、训练环境的配置
6、模型训练
7、模型的导出
8、模型的转化
二、姿态识别
1、运行环境
2、板端开发
3、板端运行
三、疲劳识别
1、配置环境
2、板端开发
3、板端运行
四、盲区检测
1、毫米波雷达检测车辆前方盲区
2、毫米波雷达检测车辆前方盲区
六、比赛总结
一、分心检测
1、项目介绍
分心驾驶是导致交通事故的主要原因之一。当驾驶人分心时,他们可能无法及时察觉道路上的变化、交通标志或其他车辆的动向。这增加了发生交通事故的风险。为了降低发生交通事故的风险,本项目使用YOLOv5模型进行训练,检测驾驶员的分心行为,如抽烟、使用手机、喝水,并且将其部署到开发板上。使用语音播报提醒他们重新集中注意力并且开启灯光报警。
2、模型的下载
为了更好的适配地平线旭日X3派的关于YOLOv5的后处理代码,本项目选择的版本为YOLOv5 v2.0版本进行模型的训练。进入YOLOv5在GitHub上的分支,其中master选择v2.0版本后下载模型的源码。源码界面以及版本选择如下图1所示:

图1 版本选取
3、预训练模型的选择
通过大量的数据中训练获得预训练模型中的参数,比起在自己的小数据集上从头开始训练参数,在预训练模型参数基础上继续训练的速度更快。所以为了加速训练使模型收敛的更快以及提高模型的性能,本项目选取YOLOv5的预训练模型。YOLOv5在官网上一共存在4个模型,分别是YOLOV5s,YOLOV5m,YOLOV5l和YOLOV5x。其中,YOLOV5s深度最小,并且是特征图的宽度最小的网路,检测速度较快,对硬件设备的要求较低。因此,本项目选择YOLOV5s预训练模型进行训练。模型的对比图如下图2所示:

图 2 模型选择
4、数据集的准备
驾驶人员分心驾驶行为包括吸烟、喝水和玩手机。所以,数据集分为了三类,其中吸烟类别2000张左右,喝水数据集与玩手机的数据集1500张左右。每张图片不仅标注了学习框还对人脸框进行了标注。数据集的目录结构如下图3所示:

图 3 数据集目录结构
其中images文件夹内train文件夹内存放训练集图片,val文件夹内存放测试集图片。labels文件夹内train文件夹内存放训练集标签,val文件夹内存放测试集标签。
5、训练环境的配置
首先,通过官网安装Anaconda环境管理软件,可以通过Anaconda建立一个虚拟环境,在虚拟环境中安装配置不同版本的软件。打开cmd,通过activate base命令进入base环境(Anaconda自带的环境),命令执行如下如图4所示:

图4 创建环境
通过conda create -n yolov5 python=3.6.8命令安装环境名为yolov5且指定python版本的环境后,通过activate yolov5命令进入到新的环境中。命令运行如下图5所示:

图5 创建环境
进入下载后的YOLOv5源文件目录下,通过pip install -U -r requirements.txt,安装训练模型需要的软件以及版本,文件内容如下图6所示:

图6 安装依赖
6、模型训练
对模型训练时需要修改源文件中对应的配置文件,通过配置文件来指定数据集以及测试集的路径、学习的类别以及名称等,配置文件如下图7所示:

图7 配置文件修改
修改配置文件后,通过修改train.py文件中的参数来适配自己的训练模型,其中--data参数指定训练数据集的配置文件的路径;--epochs参数指定了训练的轮次;--img-size参数指定数据集中图片的大小;--weights指定预训练模型的路径,参数修改如下图8所示:

图8 训练参数修改
修改train.py文件后,通过PyCharm下方Terminal进入配置完成的Anaconda环境,通过cd命令进入到YOLOv5源文件目录,通过python train.py命令开始模型的训练,训练流程如下图9所示:

图9 训练开始示意图
训练后的结果分析如下图10所示,由此可以看出随着训练的轮次不断的增加,其损失值在不断的减小,召回率与正确率在不断的增加。当模型训练到300轮时,随着轮次的增加,其损失值曲线下降的极慢,并且召回率不再增加。说明,此模型训练的结果满足正常的使用需求。

图10 训练结果分析
7、模型的导出
训练完成后的模型保存在runs文件夹中,其模型名为best.pt。由于地平线部署深度学习模型时,其支持Caffe模型和ONNX模型,所以我们需要将best.pt转化为onnx模型后进行部署。
进行模型转换时使用了YOLOv5官方的转换代码,为了更好地适配后处理代码,对转换代码进行了修改,去除了每个输出分支尾部从4维到5维的reshape,然后将layout从NHWC转换成NCHW再输出。同时,修改源模型路径参数,并且修改--img-size参数,将数据输入尺寸修改为[672,672]。修改示意图以及导出后模型结构如下图11、图12所示:

图11 导出参数修改

图12 导出模型结构图
8、模型的转化
模块进行导出为ONNX模型后,我们通过Docker对ONNX模型进行验证、转换等操作,将ONNX模型转换为可以直接部署到开发板上使用。
首先,通过hb_mapper checker命令以及参数来对模型进行配置。其中,--model-type为模型类型,--march为开发板类型,--model为待验证的模型,--input-shape为模型输入层输入图像的维度大小。我们通过hb_mapper checker --model-type onnx –march bernoulli2--model best.onnx--input-shape image 1x3x672x672命令来对模型进行验证。
验证通过后,我们需要编写转换模型需要的yaml配置文件来完成对模型的转换。配置文件内容以及含义如下图13、图14所示:

图13 配置文件内容

图14 参数含义
完成配置文件的编写后,本项目通过hb_mapper makertbin --config convert_yolov5.yaml --model-type onnx命令进行模型的转换。其中,--config参数需要填写编辑的配置文件路径,--model-type则需要填写待转换模型的类型。转换完成后,会在当前路径下产生对应的.bin模型文件。
9、板端的运行
将转换完成的.bin文件通过MobaXterm软件导入到开发板系统中。在开发板中,通过cd /opt/tros/share/hobot_car/hobot_dnn-develop/dnn_node_example/config/x3/命令进入到识别项目的配置文件中。文件内容如下图15所示:

图15 文件位置示意图
修改coco.list文件内容为YOLOv5模型识别的类别,一行代表一个类别,修改内容如下图16所示:

图16 文件内容示意图
修改yolov5workconfig.json配置文件内容,将对应的模型路径修改为转换后的模型路径。文件修改后内容如下图17所示:

图17 文件内容示意图
在桌面打开终端,通过cd /opt/tros/share/hobot_car/hobot_dnn-develop/命令进入到包含分心驾驶行为检测文件夹的目录下。分别通过,source /opt/tros/setup.bash、colcon build --packages-select dnn_node_example命令完成分心驾驶行为检测项目的编译。为了节省启动时间,我们将启动项目需要的四条指令,集中到了一个名为start.sh的bash文件中,启动时仅需要bash start.sh一条指令即可完成项目的启动。启动流程以及bash文件内容如下图18、图19所示:

图18 启动命令示意图

图19 start.bash文件内容示意图
项目启动后,我们通过ifconfig指令获取本机的IP地址,通过在浏览器输入IP地址以及端口号8000,即可查看摄像头数据,同时在终端也会输出项目的运行结果。运行结果如下图20、图21所示:

图20 ifconfig运行结果示意图

图21 项目运行示意图
二、姿态识别
1、运行环境
本系统运行在TogetheROS.Bot操作系统上,TogetheROS.Bot是地平线面向机器人厂商和生态开发者推出的机器人操作系统,可以助力开发者高效、便捷的进行机器人开发,其组成如下图22所示:

图22 TogetheROS.Bot组成示意图
Communication是地平线在ROS2 Foxy版本通信核心组件基础上进行的功能优化和扩展。其中蓝色部分为地平线优化、新增模块,其提供了“hobot_dnn”简化板端算法模型推理与部署,释放了BPU算力,降低了智能算法的使用门槛;并且还提供了“hobot_codec”软硬结合来加速视频编解码,节省了CPU资源;“hobot Render”则提供了Web端和HDMI动态可视化功能,实时渲染算法结果(仅限Web端),便于展示与调试。
最后,其支持最小化和模块化剪裁,方便根据需要部署在资源受限的嵌入式产品中。
2、板端开发
Apps是基于地平线机器人操作系统Communication和Boxs开发的算法应用示例,旨在打通图像输入、感知、策略等完整链路,展示应用效果,加速客户demo开发效率。
交警手势检测基于Apps应用示例中身体关键点检测继续开发,通过订阅摄像头发布的图片消息,检测出人体关键点后分析人体姿态,并发布姿态事件。姿态事件使用自定义算法msg发布出去, 用户可以订阅此topic的msg用于应用开发。其自定义msg如下图23所示:

图23 项目msg组成示意图
自定义msg包含了关键点感知结果(Point.msg)、属性感知消息(Attribute.msg)、性能统计信息等(Perf.msg)、感知结果(PerceptionTargets.msg)等,其中关键点感知结果msg内包含关键点感知类型、关键点数值和关键点的置信度;属性感知消息msg包含属性类型、属性数值和属性结果的置信度;性能统计信息msg包含开始处理与处理完成的时间戳和处理耗时等。msg信息如关键点感知结果代码如下图24所示:

图24 Point.msg文件内容示意图
项目启动姿态检测的节点运行时,同时启动身体关键点检测节点,并且将身体关键点检测的结果发布,由姿态检测的节点进行订阅,基于订阅到的关键点数据进行进一步的开发。关键点序号示意图如下图25所示:

图25 关键点序号示意图
根据关键点序号来获取订阅得到的具体关键点的坐标信息,根据每个关键点的坐标信息值,来对姿态进行具体分类。例如通过6号、8号以及10号这三个关键点,通过计算6号和8号的中点与8号和10号的中点之间连线与坐标轴之间的角度,即可判断手臂是否处于水平状态。
3、板端运行
首先,进度开发板的Ubuntu系统,在桌面打开终端,通过cd /opt/tros/share命令进入到包含手势检测文件夹的目录下。分别通过,source /opt/tros/setup.bash、colcon build --packages-select hobot_falldown_detection命令对手势检测进行项目的编译。项目启动的命令复杂且有四条指令才可以完成项目的启动,为了节省启动时间,将这四条指令集中到了一个名为start.sh的bash文件中,启动时仅需要bash start.sh一条指令即可完成项目的启动。启动流程以及bash文件内容如下图26、图27、图28所示:

图 26 进入管理员模式

图 27 运行start.sh命令示意图

图 28 start.sh文件内容示意图
项目启动后,可以通过ifconfig指令获取本机的IP地址,通过在浏览器输入IP地址以及端口号8000,即可查看摄像头数据,同时在终端也会输出项目的运行结果。流程如下图29、图30所示:

图 29 ifconfig命令运行示意图

图 30 项目运行示意图
三、 疲劳识别
通过调用dlib库识别人脸68关键点坐标,使用EAR算法进行判断是否闭眼与打哈欠,当闭眼超过三秒通过socket通信发送信号给系统,进行相应的预警。
1、配置环境
首先安装CMake与Python开发环境,使用命令如下所示:
sudo apt-get install build-essential cmake
sudo apt-get install python3-dev
接下来安装dlib依赖项,使用如下命令:
sudo apt-get install libx11-dev libopenblas-dev libopencv-dev
最后使用pip命令安装dlib,使用如下命令:
pip install dlib
2、板端开发
将附件三拷贝到开发板中,其中shape_predictor_68_face_landmarks.dat为模型文件,使用如下命令加载面部关键点模型
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
使用面部检测器检测图像中的面部,使用预测期预测68个面部关键点
faces = detector(image, 1)
landmarks = predictor(image, face)
landmarks = np.array(landmarks).astype(np.int)

图 31 人脸68关键点
使用EAR算法计算眼宽比,根据眼宽比的计算结果来判定是否闭眼。

图 32 右眼局部图
将左眼数据进行编号分别为[P1,P6],EAR算法如下:

在睁眼状态时EAR通常保持恒定,而闭眼时EAR趋近于零。通过EAR的值判断是否闭眼。
由于加载进面部检测器的图像是灰度图,因此在使用过程中发现当左右脸亮度不对称或者局部有显著亮度差,面部检测器出现识别不了的问题,因此使用局部对比度增强算法,通过对图像中每个像素点及其邻近像素点的灰度值进行处理,使每个像素点的灰度值都与其周围像素点的灰度值产生差异,从而实现对比度的提升,同时保持图像的整体亮度不变。识别效果稳定且保持在十帧左右,满足本项目需求。
3、板端运行
打开终端,使用如下命令即可
Sudo python3 USBCAM.py

图 33 项目运行示意图
四、 盲区检测
1、毫米波雷达检测车辆前方盲区
LD2410B是一款高灵敏度的 24GHz 人体存在感应模组。工作原理是利用FMCW 调频连续波对设定空间内的人体目标进行探测,结合雷达信号处理精确人体感应算法实现高灵敏度的人体存在状态感应,可识别运动和静止状态下的人体。
通过串口通信接收毫米波雷达发回的数据。使用状态机识别包头包尾接收模块发来的数据包,再从接收到的数据中找到距离的数据。在实测中盲区距离车头为3.2m,将毫米波雷达超过3.5m的灵敏度降为0,可大幅降低数据的跳动。在程序中对接收到的距离进行判断,当检测到3.2m内有活体存在触发系统警报。由于毫米波雷达模块刚刚开启时会传一个随机的距离所以为防止误报,添加标识不播报第一次报警。

图 34 防止启动误报
2、毫米波雷达检测车辆前方盲区
使用两个超声波检测模块检测右前方盲区,给模块trige引脚高电平开始发出超声波,并开启定时器计数,当echo引脚接收到返回超声波发出高电平时停止计数,并根据计数结果计算检测距离。
六、比赛总结
此次比赛中在6月21日拿到开发板到8月24日比赛,中间一共两个月时间,借助于开发者论坛丰富的资料与工作人员及时解答实现比预期多很多功能。开始预期做疲劳检测与盲区检测,这两个部分花费时间最短,花费时间最长是在交警手势检测部分,经常误触发,对人体节点位置不断调整最终比赛稳定运行。还有分心检测对数据集有很高的要求,花费了半个月时间筛选数据集,最终成功在比赛中展示。强烈推荐使用地平线产品,上手快,有保姆级教程,工作人员快速回复,很大程度减少开发过程中困难。祝开发者社区越办越好。