【使用攻略】【图像识别】车流量统计(动态版)
wangwei8638 发布于2019-05 浏览:11094 回复:41
3
收藏
最后编辑于2022-04

Ai技术的发展,催生了智慧城市,智慧交通是其中很重要的一环。百度AI车流量统计(动态版)能够检测图片中所有机动车辆,返回每辆车的类型和坐标位置,以及运动轨迹。应用于智慧交通领域,可以很方便地监控城市道路交通情况,实现交通拥堵预警。利用大数据挖掘交通流量规律,可以对车流进行合理疏导。另外,对一些限行城市,还可以通过车牌识别、车型识别等技术,对违规车辆进行监控。

一.平台接入

此步骤比较简单,不多阐述。可参照之前文档:

https://ai.baidu.com/forum/topic/show/943028

二.接口API分析

1.接口API:

https://ai.baidu.com/docs#/ImageClassify-API/0d270ea1

   (1)接口描述

根据传入的连续视频图片序列,进行车辆检测和追踪,返回每个车辆的坐标位置、车辆类型(包括小汽车、卡车、巴士、摩托车、三轮车5大类)。在原图中指定区域,根据车辆轨迹判断驶入/驶出区域的行为,统计各类车辆的区域进出车流量,可返回含统计值和跟踪框的渲染图。

注:邀测的接口,不能直接在控制台调用,可通过提交工单申请开通测试权限。

 (2)请求说明

需要用到的信息有:

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

Header格式:Content-Type:application/x-www-form-urlencoded

(3)返回示例

检测到2辆小汽车、1辆卡车,3条轨迹,1辆卡车离开区域:

  {

    "vehicle_num":

    {

        "car":2,

        "truck":1,

        ...

         "tricycle":0

     },

     "vehicle_info":

    [

        {

            "ID":3

            "location":

            {

                "left": 100,

                "top": 200,

                "width": 200,

                "height": 400,

             }

            "type": "car"

        },

        {

            "ID": 5

            "location":

            {

                "left": 400,

                "top": 200,

                "width": 200,

                "height": 400,

             }

            "type": "car"

         },

         {

            "ID": 6

            "location":

            {

                "left": 600,

                "top": 200,

                "width": 300,

                "height": 400,

             }

            "type": "truck"

         }

    ],

    “vehicle_count”:

    {

        "car":

        {

            "in":0,

            "out":0

        },

        "truck":

        {

            "in":0

            "out":1

        },

         ...

    }

}

2.获取access_token

#client_id 为官网获取的AK, client_secret 为官网获取的SK
client_id =【百度云应用的AK】
client_secret =【百度云应用的SK】

#获取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.decode("utf-8"))
token_key = token_info['access_token']
return token_key


三.识别结果

识别结果方面:选取一段渲染后的输出图片,结果只能用“牛X”来形容。车辆识别结果比较准确,车辆分类基本正确。对远处车辆识别程度不高,当然这里可能受图片质量是否清晰等因素影响。

处理速度方面:每张图片处理时间在1-2s,相对于视频来说,略有卡顿。

四.源码共享

# -*- coding: utf-8 -*-
#!/usr/bin/env python
import os
import requests
import base64
import json
from pprint import pprint
import time
import io
from io import BytesIO
import cv2
import numpy as np
from PIL import Image
import glob
#client_id 为官网获取的AK, client_secret 为官网获取的SK
api_key = '77ibV7Kvyo8bMh3FovLzxc6D'
secret_key = 'EdKVNt56ce1FUIdB0oCZYHwO3uPKSiEz'

class Traffic_flowRecognizer(object):
    def __init__(self, api_key, secret_key):
        self.access_token = self._get_access_token(api_key=api_key, secret_key=secret_key)
        self.API_URL = 'https://aip.baidubce.com/rest/2.0/image-classify/v1/traffic_flow' + '?access_token=' \
                      + self.access_token
    #获取token
    @staticmethod
    def _get_access_token(api_key, secret_key):
        api = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials' \
            '&client_id={}&client_secret={}'.format(api_key, secret_key)
        rp = requests.post(api)
        if rp.ok:
            rp_json = rp.json()
            print(rp_json['access_token'])
            return rp_json['access_token']
        else:
            print('=> Error in get access token!')
    def get_result(self, params):
        rp = requests.post(self.API_URL, data=params)
        if rp.ok:
            print('=> Success! got result: ')
            rp_json = rp.json()
            pprint(rp_json)
            return rp_json
        else:
            print('=> Error! token invalid or network error!')
            print(rp.content)
            return None
    #识别车流量
    def detect(self):
        ###对视频进行抽帧后,连续读取图片
        WSI_MASK_PATH = 'E:/cheliu/chouzhen/'#存放图片的文件夹路径
        paths = glob.glob(os.path.join(WSI_MASK_PATH, '*.jpg'))
        paths.sort()
        data_list = []
        c = 1
        for path in paths:
            f = open(path, 'rb')
            img_str = base64.b64encode(f.read())
            data_list.append(img_str)
            params = {'area':'1,269,400,269,400,180,1,180','case_id':1214,'case_init':'false','image':data_list,'show':'true'}
            tic = time.clock()
            rp_json = self.get_result(params)
            toc = time.clock()
            print('单次处理时长: '+'%.2f'  %(toc - tic) +' s')
            img_b64encode = rp_json['image']
            img_b64decode = base64.b64decode(img_b64encode)  # base64解码
            #显示检测结果图片
            image = io.BytesIO(img_b64decode)
            img = Image.open(image)
            img.show()
            #存储检测结果图片
            file=open('E:/cheliu/out/'+str(c)+'.jpg','wb')
            file.write(img_b64decode)
            file.close()
            c = c + 1

if __name__ == '__main__':
    recognizer = Traffic_flowRecognizer(api_key, secret_key)
    recognizer.detect()

五.意见建议

1.目前API接口支持传入图片流,视频预处理比较复杂,后续是否有直接传入视频流的接口,这样的话对用户会更加友好。

2.对输入图片质量还要有一定要求,由于拍摄场景的原因,距离远、夜晚光线不好等造成图片模糊,均会影响识别效果,所以调用接口需要对抓拍图片进行筛选,建议明确图片质量要求。

3.渲染后输出的图片,车辆信息文本输出格式建议优化,如前面图示,输出文本仅打印出一部分,而且分的太开,颜色也不明显。

 

收藏
点赞
3
个赞
共41条回复 最后由mq40330回复于2022-04
#42wangwei8638回复于2020-08
#41 鹿鼎记肯定回复
这个有人流量统计吗

也有

0
#41鹿鼎记肯定回复于2020-08

这个有人流量统计吗

0
#40apple意阿婆回复于2020-08

出现了错误码为282004,应该怎么办呢?

0
#39wangwei8638回复于2020-07
#38 apple意阿婆回复
我是用php写的,就是请求之后,怎么返回结果

php没用过,百度一下吧

0
#38apple意阿婆回复于2020-07

我是用php写的,就是请求之后,怎么返回结果

0
#37wangwei8638回复于2020-07
#36 apple意阿婆回复
你是用什么语言写的?如果方便的话可以加个qq吗?我正好在弄这个东西,还有许多问题不明白的,身边也没什么人接触过
展开

python,现在有什么问题呢

0
#36apple意阿婆回复于2020-07

你是用什么语言写的?如果方便的话可以加个qq吗?我正好在弄这个东西,还有许多问题不明白的,身边也没什么人接触过

0
#35wangwei8638回复于2020-07
#34 apple意阿婆回复
我们这个借口不是邀测的吗,接口的测试权限哪里来呢?  

提交工单,审核通过就有权限了

0
#34apple意阿婆回复于2020-07

我们这个借口不是邀测的吗,接口的测试权限哪里来呢?

 

0
#33wangwei8638回复于2020-07
#31 apple意阿婆回复
现在支持视频流吗?  

目前还不支持

0
#32wangwei8638回复于2020-07
#30 apple意阿婆回复
那这个车流统计的Api Key和Secret Key 在哪里获取呢?  
展开

https://ai.baidu.com/

控制台新建项目

0
#31apple意阿婆回复于2020-07

现在支持视频流吗?

 

0
#30apple意阿婆回复于2020-07

那这个车流统计的Api Key和Secret Key 在哪里获取呢?

 

0
#29wangwei8638回复于2020-07
#28 apple意阿婆回复
申请试用大概要等多久呢?  

一两个工作日

0
#28apple意阿婆回复于2020-07

申请试用大概要等多久呢?

 

0
#27wangwei8638回复于2019-12
#25 rex浩076回复
我们的视频通常要五分钟到十分钟,每秒至少30帧,所以是不是每秒抽一帧,对结果不会产生影响的
展开

应该没有影响,车流在1s内应该不会有漏检

0
#26wangwei8638回复于2019-12
#25 rex浩076回复
我们的视频通常要五分钟到十分钟,每秒至少30帧,所以是不是每秒抽一帧,对结果不会产生影响的
展开

这个建议做个试验测试一下

0
#25rex浩076回复于2019-12
#24 wangwei8638回复
视频抽帧转变成图片流传入

我们的视频通常要五分钟到十分钟,每秒至少30帧,所以是不是每秒抽一帧,对结果不会产生影响的

0
#24wangwei8638回复于2019-12
#23 rex浩076回复
那如果我是视频怎么办呢?我要把视频处理成帧图片吗?我记得opencv读取的时候就是按照帧图片读取的 !
展开

视频抽帧转变成图片流传入

0
#23rex浩076回复于2019-12

那如果我是视频怎么办呢?我要把视频处理成帧图片吗?我记得opencv读取的时候就是按照帧图片读取的

0
TOP
切换版块