基于AI开放平台的不安全驾驶行为警示器
2020年苏州市职业教育创新创业大赛一等奖
摘要:
城市道路错综复杂,新驾驶员数量每年都在增加,导致交通事故频发。目前,许多关于驾驶行为的研究以降低交通事故发生率,这些主要针对疲劳驾驶,通过分析身体部分的动作特征或者生理特性进行判断,需要大量传感器或者昂贵的处理设备。本文研究的AI的行为检测装置,利用无线网络将驾驶员交给AI进行识别,准确性和稳定性更高,而且制作成本更低。
1、研究背景
随着国民经济的快速增长,汽车保有量迅速增长,数据显示2018年上半年新注册登记机动车达1636万辆,截至6月底,全国机动车保有量达3.19亿辆。汽车给人们生活带来便利,同时,带来大量的交通事故;特别新驾驶员数量每年都在增加,另外城市道路错综复杂,交通安全形势非常严峻。
根据交通事故统计数据显示,绝大多少数据是由驾驶员操作不当造成的。面对如此严峻的交通安全形势,政府监管部门和相关技术研究人员都在研究如何降低交通事故的发生。政府监管部门出台各种交通法规和管理制度,但是这些法规和制度是被动的。因此,一些技术研究人员尝试采用技术手段对加驾驶员进行检测和提醒,此种方式可以有效的降低交通事故的发生。经实际调查和查阅资料后发现,虽然技术上可行,但是现有车辆并没有配对任何驾驶行为的检测装置。造成这种现象的主要原因是设备制作安装困难,另外,需要改装车辆,设备价值较高,精确度较低,由于这些问题的存在,在很大程度上限制了驾驶行为提醒设备的使用和推广。
二、研究目的
为了解决以上问题,设计一种新型的驾驶行为提醒器显得很有必要。笔者走访市场和查阅资料发现,现有的设备多采用传感器或者摄像头。采用传感器安装复杂、成本较高,如果单独采用摄像头进行检测,数据在本地进行处理,由于设备的计算能力有限造成精度不高,如果采用计算能力较高的计算机,价格相对昂贵而且占用大量空间。
根据现有设备的缺点,设计了新型的装置,采用摄像头采集驾驶员行为,将照片传输给AI,根据AI反馈的信息进行语音提醒。
三、设计思路及系统设计
(一)工作原理
设备的原理框图如图1所示。此新型设备分为5个模块分别是:云端AI服务器、树莓派设备端、调试服务器、调试APP组成、音频播放模块。树莓派设备端套通过摄像头采集驾驶员行为,将突破通过高速网络传送给云端AI服务器,服务器分析后将结果反馈给树莓派设备端,如果属于不良的驾驶行为,树莓派设备端通过音频模块播放语音提醒。在首次使用设备时,可以通过调试APP进行调试安装,具体工作流程如下:树莓派设备端运行后,将IP地址发送给调试服务器,调试服务器将IP地址发送给调试APP,调试APP通过获取的IP地址登录树莓派设备端内置web服务器查看其拍摄的照片,用于根据照片调整设的安装位置。
(二)、云端AI服务器的测试
1、AI驾驶行为分析的介绍
针对车载场景,识别驾驶员使用手机、抽烟、不系安全带、双手离开方向盘等动作姿态,分析预警危险针对车载场景,识别驾驶员使用手机、抽烟、不系安全带、双手离开方向盘等动作姿态,分析预警危险驾驶行为,提升行车安全性驾驶行为,提升行车安全性对于输入的一张车载监控图片(可正常解码,且长宽比适宜),识别图像中是否有人体(驾驶员),若检测到至少1个人体,则进一步识别属性行为,可识别使用手机、抽烟、未系安全带、双手离开方向盘、视线未朝前方5种典型行为姿态。
2、测试
针对5中不良的驾驶行为分别拍摄了40张图片,上传到AI进行检测,检测链接https://ai.baidu.com/tech/body/driver,检测数据结果如下:
驾驶行为 |
数量 |
成功 |
失败 |
成功率 |
双手离开方向盘 |
40 |
40 |
20 |
100% |
拨打手机 |
40 |
34 |
6 |
85% |
抽烟 |
40 |
36 |
4 |
90% |
未系安全带 |
40 |
40 |
0 |
100% |
视线未朝前方 |
40 |
38 |
2 |
95% |
表一 AI测试数据
考虑到抽烟和拨打手机角度的问题,可以说AI的检测结果十分准确,完全到达商业的精度。
2、研究过程
(一)树莓派设备端
1、工作原理
树莓派通过CSI摄像头拍摄驾驶员照片,随后树莓派将照片解码成Base64格式发送给AI平台,然后等待AI平台的返回数据,根据返回数据播放提示语音。
流程图如图所示。
2、摄像头的安装与调试
为了方便安装和测试,采用USB摄像头。摄像头的使用和安装方法如下:
在开始下面两项工作前,树莓派应该已经设置了静态IP,或者路由绑定了IP,否则每次树莓派IP会变,不方便操作。
2.11. 开启SSH
树莓派开启SSH很简单,只要在树莓派的/boot目录下创建一个空的,名称为ssh的文件即可。有了SSH,我们可以和树莓派通过终端进行交互。
2.2. 开启VNC
派开启VNC需要在树莓派安装tightvncserver,在终端执行以下命令:
$ sudo apt-get update
$ sudo apt-get install tightvncserver
成后,输入命令,运行服务器:
vncserver :1
登录时VNC服务器地址为:树莓派IP地址:1
如果需要树莓派开机自动起vnc服务,可以在~/.config/autostart/目录下创建tightvnc.desktop文件
$ cd ~/.config/autostart/
$ vim tightvnc.desktop
然后输入以下内容:
[Desktop Entry]
Type=Application
Name=TightVNC
Exec=vncserver :1
StartupNotify=false
连接并测试USB摄像头
树莓派接USB摄像头十分简单,毕竟树莓派是Linux系统的卡片电脑,将买来的USB摄像头直接连在树莓派的USB口上,然后我们看看摄像头是否被识别,有两种方法:
1. 使用lsusb命令
$ lsusb
SSH终端会显示树莓派当前接入的USB设备列表,我们可以先不插摄像头,lsusb,然后插上摄像头lsusb,就可以看到USB摄像头对应的是哪个设备了。下图是我的摄像头。
2. 查看设备文件
也可以查看设备文件,输入命令:
$ ls /dev/video*
严格的,也应该插拔摄像头各执行一次,看看是否有新的摄像头设备被识别。我的设备文件是/dev/video0.实际上,这种方法更直接,稍后会使用设备文件。
查找到摄像头,我们可以使用fswebcam命令测试抓图:
$ sudo apt-get install fswebcam
$ fswebcam /dev/video0 ~/image.jpg
fswebcam最简单的用法,第一个参数是摄像头对应的设备文件路径,第二个参数是保存截图的路径。
如果不满足于抓图,还可以看看摄像头的效果。只需要登录VNC,启动树莓派上的终端,使用luvcview即可:
$ sudo apt-get install luvcview
$ luvcview -s 1080x720
1080x720是展示的视频分辨率,不过使用VNC界面会有些卡顿,但是可以验证摄像头是否正常工作。
3、主要实现代码
3.1照片的获取和转码代码如下:
def take_picture():
os.system(“fswebcam --no-banner -r 640x480 image3.jpg”)
def open_pic():
f = open('image.jpg', 'rb')
img = base64.b64encode(f.read())
return img
3.2连接AI平台代码如下:
def handle_net(img):
request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/driver_behavior"
params = {"image":img}
params = urllib.urlencode(params)
request_url = request_url + "?access_token=" + access_token
request = urllib2.Request(url=request_url, data=params)
request.add_header('Content-Type', 'application/x-www-form-urlencoded')
response = urllib2.urlopen(request)
content = response.read()
if content:
req_data = json.loads(content)
result = req_data
return result
3.3处理平台返回的数据
def atcion():
list_score = []
take_picture()
img = open_pic()
content = handle_net(img)
# print("content type is %s,len = %d"%(type(content),len(content)))
# print(content)
a= str(content)
print(a)
if len(a)>80:
print("a i len= %d"%len(a))
json = content['person_info']
phone = Json_handle.score(json,"cellphone")
smoke = Json_handle.score(json,"smoke")
wheel = Json_handle.score(json,"both_hands_leaving_wheel")
front = Json_handle.score(json,"not_facing_front")
buck = Json_handle.score(json,"not_buckling_up")
list_score = [phone,smoke,wheel,front,buck]
else:
print("No driver was detected. Please put it in the right place.")
sound.voice("mp3/erro.mp3")
return list_score
(二)调试APP
1、功能介绍
在首次使用设备时,可以通过调试APP进行调试安装,具体工作流程如下:树莓派设备端运行后,将IP地址发送给调试服务器,调试服务器将IP地址发送给调试APP,调试APP通过获取的IP地址登录树莓派设备端内置web服务器查看其拍摄的照片,用于根据照片调整设的安装位置。
2、主要代码
2.1 网页服务器代码如下:
"""用来完成整体的控制"""
# 1. 创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 2. 绑定
tcp_server_socket.bind(("", 8080))
# 3. 变为监听套接字
tcp_server_socket.listen(128)
while True:
# 4. 等待新客户端的链接
new_socket, client_addr = tcp_server_socket.accept()
# 5. 创建子进程为这个客户端返回数据
p = multiprocessing.Process(target=service_client, args=(new_socket,))
# 5. 为这个客户端服务
p.start()
new_socket.close()
2.3手机APP主要代码如下:
事件 浏览框1.载入完毕(地址 为 文本型)
主窗口.标题 = 浏览框1.取标题()
图片框1.载入字节图片(浏览框1.取图标())
标签1.标题 = "载入完毕:" & 地址
浏览框1.释放内存()
结束 事件
事件 浏览框1.开始下载(文件地址 为 文本型,文件大小 为 长整数型)
信息框("下载文件","文件地址:" & 文件地址 & "\n文件大小:" & 文件大小 & "bytes" & "\n请调用下载器组件进行下载" ,"确定")
'此处请自行调用下载器组件进行下载
结束 事件
事件 浏览框1.触摸手势(手势类型 为 整数型)
判断 手势类型
分支 右滑
如果 浏览框1.可否后退 = 真 则
浏览框1.后退()
主窗口.标题 = 浏览框1.取标题()
结束 如果
分支 左滑
如果 浏览框1.可否前进 = 真 则
浏览框1.前进()
主窗口.标题 = 浏览框1.取标题()
结束 如果
结束 判断
结束 事件
事件 按钮1.被单击()
浏览框1.跳转(编辑框1.内容)
结束 事件
事件 按钮2.被单击()
如果 浏览框1.可否后退 = 真 则
浏览框1.后退()
主窗口.标题 = 浏览框1.取标题()
结束 如果
结束 事件
(三)音频播放模块
因树莓派没有专门播放音响,所以DIY了小型音频播放器,主要有电源、充电板、功放模块、和喇叭构成。连接如图所示:
四、测试与使用
1、使用方法
(1)将路由器或者手机热点账号设置成test1234,密码设置为12341234。(必须先开热点,后开设备)
(2)将USB摄像头对准人。
(3)插上设备电源(12V供电),手机app连接热点,根据手机APP调整镜头角度。
2、测试数据
设备制作完成后,对设备进行测试,测试数据如下:
编号 |
测试人数 |
设备记录不良行为测试 |
人工记录不行行为次数 |
1 |
10 |
8 |
10 |
2 |
10 |
7 |
10 |
3 |
10 |
8 |
10 |
4 |
10 |
8 |
10 |
5 |
10 |
9 |
10 |
表三 设备测试数据
从数据看设备的成功率很高。
五、技术创新点
1、AI是全球领先的人工智能开发平台,利用人工智能技术,检测准确率极高。
2、远程检测可以有效降低设备制作成本,仅仅需要无线设备和摄像头就可以实现,有利于设备的推广和使用。
3、通过手机APP调试设备,无需昂贵的现实屏幕。
作者:张美琪 辅导老师:许宇航
用户登录