一.平台接入
此步骤比较简单,不多阐述。可参照之前文档:
https://ai.baidu.com/forum/topic/show/943162
二.分析接口文档
1.打开API文档页面,分析接口要求
https://ai.baidu.com/docs#/Body-API/ab92bcdc
(1)接口描述
动态人数统计和跟踪:传入监控视频抓拍图片序列,进行人体追踪,返回每个人体框的坐标和所属ID;并根据目标轨迹判断进出区域行为,进行动态人数统计,返回区域进出人数。同时可输出渲染结果图(含统计值和跟踪框渲染)。(注:抽祯频率需>2fps,否则无法有效跟踪,建议5fps,接口默认保证5qps)
渲染图示例:
(2)请求说明
需要用到的信息有:
请求URL:https://aip.baidubce.com/rest/2.0/image-classify/v1/body_tracking
Header格式:Content-Type:application/x-www-form-urlencoded
Body中放置请求参数,参数详情如下:
(3)返回参数
返回示例
检测到2个人和2条轨迹,1人离开区域:
{
"person_num":2,
"person_info":
[
{
"ID":3
"location":
{
"left": 100,
"top": 200,
"width": 200,
"height": 400,
}
}
{
"ID": 5
"location":
{
"left": 400,
"top": 200,
"width": 200,
"height": 400,
}
}
]
“person_count”:
{
"in":0,
"out":1
}
}
2.获取access_token
# encoding:utf-8
import base64
import urllib
import urllib2
'''
人流量统计(动态版)
'''
request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_tracking"
# 二进制方式打开图片文件
f = open('[本地文件]', 'rb')
img = base64.b64encode(f.read())
params = {"area":"1,1,719,1,719,719,1,719","case_id":1,"case_init":"false","dynamic":"true","image":img}
params = urllib.urlencode(params)
access_token = '[调用鉴权接口获取的token]'
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:
print content
三.识别结果
识别结果方面:选取一段渲染后的输出图片,结果只能用“牛X”来形容。人数识别结果比较准确。对远处人体识别程度不高,当然这里可能受图片质量是否清晰等因素影响。
处理速度方面:每张图片处理时间在3-8s,相对于视频来说,略有卡顿。
四.源码共享
# -*- 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 = '*******************'
secret_key = '***********************'
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/body_tracking' + '?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):
###对视频进行抽帧后,抽帧频率5fps,连续读取图片
WSI_MASK_PATH = 'E:/renliu/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 = {'dynamic':'true','area':'1,269,479,269,479,120,1,120','case_id':1213,'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:/renliu/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.建议对渲染后输出的图片文本信 息进行优化,使文字大小和颜色与原图片显示区分度更高,实现半透明卡片效果显示文字。
这个没有吧,能够识别人体就可以
需要用什么精度的摄像头才能满足分析的需求,有没有人有个具体的参数?
已经改过来了
帖子名字是不是错了?
进行二次分析,用高清摄像头才行