【征稿计划第三期】驾驶行为分析
风搅火 发布于2019-09-15 浏览:1552 回复:1
1
收藏
最后编辑于2019-09-16

【使用攻略】【驾驶行为分析】

在日常生活中开车的时候如果有手机、抽烟、不系安全带、双手离开方向盘等行为会很危险,尤其是对于营运车辆来说,更是如此。百度推出了驾驶行为分析功能,针对车载场景,识别驾驶员使用手机、抽烟、不系安全带、双手离开方向盘等动作姿态,分析预警危险驾驶行为,提升行车安全性。具体为:识别图像中是否有人体(驾驶员),若检测到多个人体,则将目标最大的人体作为驾驶员,返回坐标位置。检测到驾驶员后,进一步识别行为属性,可识别使用手机、抽烟、不系安全带、双手离开方向盘、视角未朝前方5大类行为

功能接入:
点击OCR功能链接:https://console.bce.baidu.com/ai/?fromai=1#/ai/body/overview/index
进入界面后点击“创建应用”

输入应用信息即可。


百度现在提供每天一定量的免费调用额度,足够大家测试使用了。


获取Access Token
调用驾驶行为分析功能前需要先调用鉴权API,确保安全。
具体说明请查阅:http://ai.baidu.com/docs#/Auth/top

请求URL数据格式
向授权服务地址https://aip.baidubce.com/oauth/2.0/token发送请求(推荐使用POST),并在URL中带上以下参数:
grant_type: 必须参数,固定为client_credentials;
client_id: 必须参数,应用的API Key;
client_secret: 必须参数,应用的Secret Key;
例如:
https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHlA4Fq5eR3LT0vuXV4&client_secret=0rDSjzQ20XUj5itV6WRtznPQSzr5pVw2&


驾驶行为分析AP调用
驾驶行为的API说明链接为:https://ai.baidu.com/docs#/Body-API/2387dd4f

接口描述:
对于输入的一张车载监控图片(可正常解码,且长宽比适宜),识别图像中是否有人体(驾驶员),若检测到至少1个人体,则进一步识别属性行为,可识别使用手机、抽烟、未系安全带、双手离开方向盘、视线未朝前方5种典型行为姿态。
图片质量要求:
1、服务只适用于车载司机场景,请使用驾驶室的真实监控图片测试,勿用网图、非车载场景的普通监控图片、或者乘客的监控图片测试,否则效果不具备代表性。
2、车内摄像头硬件选型无特殊要求,分辨率建议720p以上,但更低分辨率的图片也能识别,只是效果可能有差异。
3、车内摄像头部署方案建议:尽可能拍全驾驶员的身体,并充分考虑背光、角度、方向盘遮挡等因素。
4、服务适用于夜间红外监控图片,识别效果跟可见光图片相比可能略微有差异。
5、图片主体内容清晰可见,模糊、驾驶员遮挡严重、光线暗等情况下,识别效果肯定不理想。

请求说明
请求URL:https://aip.baidubce.com/rest/2.0/image-classify/v1/driver_behavior

具体参数:


返回示例
{
"person_num": 1,
"person_info": [{
"attributes": {
"cellphone": {
"threshold": 0.9,
"score": 0.500098466873169
},
"both_hands_leaving_wheel": {
"threshold": 0.9,
"score": 0.468360424041748
},
"not_facing_front": {
"threshold": 0.9,
"score": 0.08260071277618408
},
"not_buckling_up": {
"threshold": 0.9,
"score": 0.998087465763092
},
"smoke": {
"threshold": 0.9,
"score": 6.29425048828125e-05
}
},
"location": {
"width": 483,
"top": 5,
"height": 238,
"left": 8
}
}],
"log_id": 2320165720061799596
}


详细代码(C#):

    public static class AccessToken
	{
	    // 调用getAccessToken()获取的 access_token建议根据expires_in 时间 设置缓存
	    // 返回token示例
     // 百度云中开通对应服务应用的 API Key 建议开通应用的时候多选服务
		private static String clientId = "你获得的ID";
		// 百度云中开通对应服务应用的 Secret Key
		private static String clientSecret = "你获得的KEY";

		public static String getAccessToken() {
			String authHost = "https://aip.baidubce.com/oauth/2.0/token";
			HttpClient client = new HttpClient();
			List> paraList = new List>();
			paraList.Add(new KeyValuePair("grant_type", "client_credentials"));
			paraList.Add(new KeyValuePair("client_id", clientId));
			paraList.Add(new KeyValuePair("client_secret", clientSecret));

			HttpResponseMessage response = client.PostAsync(authHost, new FormUrlEncodedContent(paraList)).Result;
			String result = response.Content.ReadAsStringAsync().Result;
			Console.WriteLine(result);
            JObject jobject = (JObject)JsonConvert.DeserializeObject(result);
            string token = jobject["access_token"].ToString();
            return token;
			//return result;
		}
		public class DriverBehavior
    {
        // 驾驶行为分析
        public static string driverBehavior(String imagefilename)
        {
            string token = AccessToken.getAccessToken();
            Console.WriteLine(token);
            string host = "https://aip.baidubce.com/rest/2.0/image-classify/v1/driver_behavior?access_token=" + token;
            Encoding encoding = Encoding.Default;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
            request.Method = "post";
            request.KeepAlive = true;
            // 图片的base64编码
            string base64 = getFileBase64(imagefilename);
            String str = "image=" + HttpUtility.UrlEncode(base64);
            byte[] buffer = encoding.GetBytes(str);
            request.ContentLength = buffer.Length;
            request.GetRequestStream().Write(buffer, 0, buffer.Length);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
            string result = reader.ReadToEnd();
            Console.WriteLine("驾驶行为分析:");
            //Console.WriteLine(result);
            JObject jo = (JObject)JsonConvert.DeserializeObject(result);

            List msgList = jo["person_info"].ToObject>();
            int number = int.Parse(jo["person_num"].ToString());
            int curNumber = 1;
            float score = 0;
            float threshold = 0;
            Console.WriteLine("人数:" + number + "");
            foreach (JToken ms in msgList)
            {
                if (number > 1)
                {
                    Console.WriteLine("第 " + (curNumber++).ToString() + " 人:");
                }
                score = float.Parse(ms["attributes"]["smoke"]["score"].ToString());
                threshold = float.Parse(ms["attributes"]["smoke"]["threshold"].ToString());
                Console.WriteLine("吸烟:" + (score > threshold ? "是" : "否"));
                Console.WriteLine("概率:" + score.ToString());
                Console.WriteLine("阈值:" + threshold.ToString());

                score = float.Parse(ms["attributes"]["cellphone"]["score"].ToString());
                threshold = float.Parse(ms["attributes"]["cellphone"]["threshold"].ToString());
                Console.WriteLine("使用手机:" + (score > threshold ? "是" : "否"));
                Console.WriteLine("概率:" + score.ToString());
                Console.WriteLine("阈值:" + threshold.ToString());

                score = float.Parse(ms["attributes"]["not_buckling_up"]["score"].ToString());
                threshold = float.Parse(ms["attributes"]["not_buckling_up"]["threshold"].ToString());
                Console.WriteLine("未系安全带:" + (score > threshold ? "是" : "否"));
                Console.WriteLine("概率:" + score.ToString());
                Console.WriteLine("阈值:" + threshold.ToString());

                score = float.Parse(ms["attributes"]["both_hands_leaving_wheel"]["score"].ToString());
                threshold = float.Parse(ms["attributes"]["both_hands_leaving_wheel"]["threshold"].ToString());
                Console.WriteLine("双手离开方向盘:" + (score > threshold ? "是" : "否"));
                Console.WriteLine("概率:" + score.ToString());
                Console.WriteLine("阈值:" + threshold.ToString());

                score = float.Parse(ms["attributes"]["not_facing_front"]["score"].ToString());
                threshold = float.Parse(ms["attributes"]["not_facing_front"]["threshold"].ToString());
                Console.WriteLine("视角未朝前方:" + (score > threshold ? "是" : "否"));
                Console.WriteLine("概率:" + score.ToString());
                Console.WriteLine("阈值:" + threshold.ToString());
            }
            return result;
        }

        public static String getFileBase64(String fileName) {
            FileStream filestream = new FileStream(fileName, FileMode.Open);
            byte[] arr = new byte[filestream.Length];
            filestream.Read(arr, 0, (int)filestream.Length);
            string baser64 = Convert.ToBase64String(arr);
            filestream.Close();
            return baser64;
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            DriverBehavior.driverBehavior("../img/drive1.jpg");
        }
    }
    

 

功能测试:

驾驶行为分析:
人数:1
吸烟:否
概率:0.0003602256
阈值:0.437
使用手机:否
概率:0.04357946
阈值:0.638
未系安全带:否
概率:0.01523042
阈值:0.449
双手离开方向盘:是
概率:0.5139307


驾驶行为分析:
人数:1
吸烟:否
概率:0.0007686249
阈值:0.437
使用手机:是
概率:0.9862325
阈值:0.638
未系安全带:否
概率:0.2255544
阈值:0.449
双手离开方向盘:否
概率:0.0227523


测试后发现效果很好,调用速度很快,结果准确。可以用与很多方面,比如针对出租车、客车、公交车、货车等各类营运车辆,实时监控车内情况,识别驾驶员抽烟、使用手机、未系安全带等危险行为,及时预警,降低事故发生率,保障人身财产安全。

收藏
点赞
1
个赞
共1条回复 最后由风搅火回复于2019-09-16
#2风搅火回复于2019-09-16

真的很好,大家一起来试一试吧!

0
TOP
切换版块