一、整体方案:
思路:整合百度AI功能,通过百度AI解决、优化在公交运行过程中遇到的运营、管理、安全等方面的问题。具体如下:
安全方面:
通过驾驶员检测+语音合成,对驾驶员状态进行实时检测,跟踪,告警。
通过人流量统计对车内人数进行跟踪,在人数过多的时候告警。
通过危险行为识别功能对驾驶室及车辆内部的危险行为进行识别,提出警告。并上传后台系统,启动安全预案,将危险控制在萌芽状态。
经营方面:
通过车内和车站人流量识别,判断车内乘客数量上传后台系统,对车辆调度计划进行优化。
整体方案如图所示:
二、相关功能介绍:
人流量统计
统计图像中的人体个数和流动趋势,以头肩为主要识别目标统计人数,无需正脸、全身照,适应人群密集、各种出入口场景,包括:
静态人流量统计:适用于3米以上的中远距离俯拍,以头部为识别目标统计图片中的瞬时人数;无人数上限,广泛适用于机场、车站、商场、展会、景区等人群密集场所
动态人流量统计:面向门店、通道等出入口场景,以头肩为识别目标,进行人体检测和追踪,根据目标轨迹判断进出区域方向,实现动态人数统计,返回区域进出人数
详细说明见:
https://ai.baidu.com/tech/body/num
驾驶行为分析:
针对车载场景,识别驾驶员使用手机、抽烟、不系安全带、双手离开方向盘等动作姿态,分析预警危险驾驶行为,提升行车安全性。可以针对出租车、客车、公交车、货车等各类营运车辆,实时监控车内情况,识别驾驶员抽烟、使用手机、未系安全带等危险行为,及时预警,降低事故发生率,保障人身财产安全
详细说明见:
https://ai.baidu.com/tech/body/driver
危险行为识别:
针对5s内的监控视频片段,识别行为类别,目前支持7类行为:单人-情绪性指人、单人-摔倒、单人-激烈抱怨、单人-砸东西、单人-正常、双人-危险(包含出拳/拉扯/推搡/激烈搂抱/砸按/踢踹等)、双人-正常。
详细说明见:
https://ai.baidu.com/tech/body/danger
文档:https://ai.baidu.com/docs#/Body-API/19f2f5e1
请求URL:https://aip.baidubce.com/rest/2.0/video-classify/v1/body_danger
三、关键调用代码(Python3)
#驾驶行为识别: import urllib import base64 import json import time #client_id 为官网获取的AK, client_secret 为官网获取的SK client_id = 'XXXXXXXX' client_secret = 'XXXXXXXXX' #获取token def get_token(): host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret request = urllib.request.Request(host) request.add_header('Content-Type', 'application/json; charset=UTF-8') response = urllib.request.urlopen(request) token_content = response.read() if token_content: token_info = json.loads(token_content) token_key = token_info['access_token'] return token_key #驾驶行为识别 def driver_behavior(filename): request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/driver_behavior" print(filename) # 二进制方式打开图片文件 f = open(filename, 'rb') img = base64.b64encode(f.read()) params = dict() params['image'] = img params = urllib.parse.urlencode(params).encode("utf-8") access_token = get_token() begin = time.perf_counter() request_url = request_url + "?access_token=" + access_token request = urllib.request.Request(url=request_url, data=params) request.add_header('Content-Type', 'application/x-www-form-urlencoded') response = urllib.request.urlopen(request) content = response.read() end = time.perf_counter() print('处理时长:'+'%.2f'%(end-begin)+'秒') if content: content=content.decode('utf-8') data = json.loads(content) print('人数:',data['person_num']) persons=data['person_info'] print (persons) #人流量统计 def body_num(filename): request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_num" # 二进制方式打开图片文件 f = open(filename, 'rb') img = base64.b64encode(f.read()) params = dict() params['image'] = img params['show'] = 'true' params = urllib.parse.urlencode(params).encode("utf-8") #params = json.dumps(params).encode('utf-8') access_token = get_token() request_url = request_url + "?access_token=" + access_token request = urllib.request.Request(url=request_url, data=params) request.add_header('Content-Type', 'application/x-www-form-urlencoded') response = urllib.request.urlopen(request) content = response.read() person_num=0 if content: #print(content) content=content.decode('utf-8') #print(content) data = json.loads(content) #print(data) person_num=data['person_num'] print ('person_num',person_num) return person_num
#危险行为识别 #filename:原图片名(本地存储包括路径) def body_danger(filename): request_url = "https://aip.baidubce.com/rest/2.0/video-classify/v1/body_danger" # 二进制方式打开图片文件 f = open(filename, 'rb') img = base64.b64encode(f.read()) params = dict() params['data'] = img params = urllib.parse.urlencode(params).encode("utf-8") #params = json.dumps(params).encode('utf-8') access_token = get_token() request_url = request_url + "?access_token=" + access_token request = urllib.request.Request(url=request_url, data=params) request.add_header('Content-Type', 'application/x-www-form-urlencoded') response = urllib.request.urlopen(request) content = response.read() if content: #print(content) content=content.decode('utf-8') #print(content) data = json.loads(content) print(data) for item in data['result']: print ('行为:',item['name']) print ('分数:',item['score'])
四、相关功能测试:
4.1 安全管理
(一)首先是驾驶行为分析,针对驾驶员的抽烟,打手机等不规范行为:
人数: 1
使用手机: 0.10
抽烟: 0.40
未系安全带: 0.81
双手离开方向盘: 0.24
视角未看前方: 0.16
警告:未系安全带
人数: 1
使用手机: 0.95
抽烟: 0.01
未系安全带: 0.80
双手离开方向盘: 0.95
视角未看前方: 0.98
警告:使用手机 未系安全带 双手离开方向盘 视角未看前方
(二)然后是针对驾驶室的危险行为,尤其是针对驾驶员的各种危险行为。这里以前一段时间的重庆万州的公交事故的驾驶室监控视频为例。因为社区不支持视频,所以使用图片示意。
大家可以通过微博地址查看视频:http://t.cn/EwM3WqQ
识别的速度很快,识别的内容如下:
行为: 双人-危险
分数: 0.954391598701477
可以发现,百度AI快速的识别了危险行为,而且危险分数很高。在系统的支持下,在自动报警的同时,通过语音合成技术大声语音警告:“对公共车辆驾驶员的暴力行为是违法的,为了所有人的安全请立刻停止!!!”
4.2 运营管理
对车辆内部及车站人数的统计,进而对车辆调度进行优化,同时也可以防止车辆过于拥挤产生踩踏事故。例如对下图的识别。
人数:6,未超过最大载荷。车内安全。
车站人数:8,很准确(右上角有一个穿白衣服人的背影)
结合车辆人的数量和车站人的数量就可以进行科学调度,对于这个例子来说,可以适当增加下一辆公交的发车时间了。
五、测试结论及展望:
通过对百度AI功能进行测试,发现识别的效果都很好。百度AI能快速、准确的识别各种风险,对人数的统计也非常的准确。针对现在公共出行的安全和管理的痛点进行了很好的解决,现在可以直接落地的技术包括:
安全方面:通过驾驶员检测+语音合成,对驾驶员状态进行实时检测,跟踪,告警;通过人流量统计对车内人数进行跟踪,在人数过多的时候告警;通过危险行为识别功能对驾驶室及车辆内部的危险行为进行识别,提出警告。并上传后台系统,启动安全预案,将危险控制在萌芽状态。
经营方面:通过车内和车站人流量识别,判断车内乘客数量上传后台系统,对车辆调度计划进行优化。
再配套开发对应的管理平台等平台结合起来就可以形成一整套的公交安全运营解决方案,对于提高公交运营的安全性和运营效率会有非常的的帮助。结合百度云技术、AI技术与开发平台,实现端云结合,让应用快速落地。在结合未来的全自动AI驾驶,百度城市大脑,相信公共出行会越来越安全、便捷。
作者:worddict