基于深度学习的人体识别智能交通灯设计*
2023-01-31李卓寰刘煜彭程
李卓寰 刘煜 彭程
湖南人文科技学院能源与机电工程学院 湖南 娄底 417000
引言
在城市道路中,交叉路口是道路交通系统的咽喉,作为相交道路车辆和行人汇集、转向的所在地,交叉路口处的交通组成、交通特征非常复杂,因此常成为交通事故的多发点[1]。据统计数据表明,我国城市交通事故抽样统计表明,发生在交叉路口的交通事故数约为50%,而其中车辆和行人之间的交通事故又占到一半以上。交叉路口区域高密度的车流以及行人相互之间严重的相互干扰,极易引发交通事故[2],引起交通阻塞,车辆延误增加等连锁性反应,进而影响整个路网运营效率。特别的对行人的伤害事故尤其多,这不仅对行人的生命健康造成伤害,也会带来极大的经济损失[3]。目前这些路段常采用的安全措施是采用凸面反光镜等方式,扩大司机视野及早发现弯道对面车辆,以减少交通事故的发生[4]。但是凸面反光镜由于凸面反光镜变形严重、安装位置过高和扩大视野有限等原因,实际应用时效果不是太明显。目前国内开始引入行人过街按钮,目前国内开始引入行人过街按钮,目前已经在成都、武汉、哈尔滨、长沙等许多城市的不同路口进行安装并投入使用。
目前的交叉路口的交通灯智能化制度不高,对路口的交通通行提高有限。本论文通过在人流量较大的学校、小区等交叉路段,特别是在一些交叉路口和丁字路口等交叉路口设置高清摄像头,系统利用摄像头的图像信息对路面行人进行识别,通过识别出驾驶员不易观察到的交叉路段区域行人的数量、位置等信息,并利用识别的人体信息来点亮相关的交通信号灯等装置。
1 硬件及其开发环境搭建
亚博K210开发板是一款以K210芯片为控制中心,K210是嘉楠公司推出的一款MCU,其特色在于芯片架构中包含了一个自研的神经网络硬件加速器KPU,可以高性能地进行卷积神经网络运算[5]。该开发板可以在低功耗情况下进行卷积神经网络计算,是低门槛机器视觉嵌入式解决方案。
开发板使用的硬件连接示意图如图1所示。其中K210芯片为开发板主芯片,整个板子的核心处理器,128M-bit串行闪存作为内存扩展,触摸屏分辨率320*240,提供显示和触摸输入;摄像头采用图像传感器OV2640,该摄像头支持自动曝光控制、自动增益控制、自动白平衡、自动消除灯光条纹等自动控制功能。板载CH340虚拟串口,提供供电、下载、固件和串口调试等。
图1 硬件连接示意图
K210的开发环境主要包括最基本的cmake命令行开发环境、IDE开发环境和Python脚本式开发环境。本文为了方便选择了Kendryte IDE集成开发环境,Kendryte IDE集成开发环境是基于VS Code完成的,所以开发界面与VS Code类似,程序编译成功后可以通过串口刷写程序。
2 分类模型训练
为了方便训练样本采用了Mx-yolov3进行模型训练。Mxyolov3模型训练主要包括如下几个步骤[6-8]:
2.1 软件环境配置
软件环境配置包括python环境、相关依赖包、GPU训练配置。
如果有满足要求的显卡,则需要安装CUDA_10.0和Cudnn_7.6.4,如果满足要求安装成功后将自动启用GPU进行训练。
2.2 训练样本标定
准备大量样本并通过软件转换为分辨率为224×224大小的图片。利用labelImg等软件对图片依次进行标注。为了标定方便主要标定为4类,行人、单车(包括电动车、摩托车)、汽车和伞(避免打伞遮挡人头)。
2.3 样本本地训练
img文件夹包含着所有的训练图片,而xml文件夹包含所有已标注好的标签文件。计算训练模型的锚点,然后进行样本本地训练,如果能进行显卡加速能加快训练速度,迭代运算完毕生成yolov2.h5和yolov2.tflite两个文件。
2.4 转换模型
将yolov2.tflite模型文件转换成.kmodel模型文件。
3 编程实现
如图2所示为程序流程,内部初始化包括系统时钟、串口、I/O、系统中断 和Flash等,外部硬件初始化包括触摸屏和Ov2640摄像头初始化等。物体分类初始化包括模型加载和物体分类层配置初始化;而这一部分设计到物体分类模型的建立[9-10]。
图2 程序流程图
Main.c和region_layer.c等文件需要修改的代码如下:
3.1 添加和修改以下内容
anchor分类的数目、模型的文件名称、分类显示数组(根据自己实际训练的修改)
3.2 画框的位置定义修改
画框不大于224*224。
3.3 检测阈值和NMS阈值的修改和层的定义
使用卷积层降采样(factor为32),使得输入卷积网络的224 * 224图片最终得到7 * 7的卷积特征图(224/32=7)。初始化检测模型时,添加以下代码:
obj_detect_rl.threshold=0.3;
obj_detect_rl.nms_value=0.3;
int flag=region_layer_init(&obj_detect_rl,7,7,4,224,224);
printf( “flag: %d”,flag);
3.4 修改初始化参数
int region_layer_init(region_layer_t *rl,int width,int height,int channels,int origin_width,int origin height)
{......
rl->coords=4;//坐标个数
rl->image_width=224;
rl->image_height=224;
rl->classes=channels;
......}
3.5 添加串口通信
程序编译通过后生成.BIN文件,通过kflash下载到K210开发板。
如图3所示:将设备安装在交叉路口,开机上电后显示屏显示摄像头采集的画面,并且实时检测车、行人、单车和伞等4种物体并标记位置和显示识别的结果,并通过串口输出检测结果给交通灯进行显示。
图3 检测图片
4 结束语
由于每一类的训练样本大约是300张左右,实际测试时的识别率基本上能满足基本的使用需求。通过增加训练样本还能有效提高物体识别率,这样能满足实际使用需求。采用K210作为图像识别终端基本能满足物体实时检测识别的需求,而且整体价格低廉能实现大范围的推广。