【使用攻略】【人体分析】
每逢五一、十一黄金周,出去旅游的小伙伴都会体验一把人山人海的辛酸。利用Ai人体分析可以统计热门景点人流量,进行事先预警,提示安保人员提前介入,合理疏导人流量。
一.平台接入
此步骤比较简单,不多阐述。可参照之前文档:
https://ai.baidu.com/forum/topic/show/943162
二.分析接口文档
1.打开API文档页面,分析接口要求
https://ai.baidu.com/docs#/Body-API/1a6628be
(1)接口描述
对于输入的一张图片(可正常解码,且长宽比适宜),识别和统计图像当中的人体个数(静态统计,不支持追踪和去重)。
适用于3米以上的中远距离俯拍,以头部为主要识别目标统计人数,无需正脸、全身照,适应各类人流密集场景(如:机场、车展、景区、广场等);默认识别整图中的人数,支持指定不规则区域的人数统计,同时可输出渲染图片。
摄像头硬件选型无特殊要求,分辨率建议720p以上,更低分辨率的图片也能识别,只是效果可能有差异。暂不适用夜间红外监控图片,后续会考虑扩展。
渲染图输出示例:
接口默认返回整张图片中的人数,如需统计特定框选区域的人数,要使用area参数添加识别区域坐标信息。这也是本次测试的重点。
(这里看到之前测试提交的建议,已做优化,还是有点小欣慰,工程师们辛苦了!)
(2)请求说明
需要用到的信息有:
请求URL:https://aip.baidubce.com/rest/2.0/image-classify/v1/body_num
Header格式:Content-Type:application/x-www-form-urlencoded
Body中放置请求参数,参数详情如下:
(3)返回参数
返回示例
{
"log_id": 716033439,
"person_num": 16,
"image": "/9j/4AAoFS2P/9k="
}
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_num"
# 二进制方式打开图片文件
f = open('[本地文件]', 'rb')
img = base64.b64encode(f.read())
params = {"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
三.识别结果
1. 识别区域分离
2. 识别区域交叉
结论:
识别结果方面:多个识别区域分离,识别结果比较准确,总人数统计个别有问题(图一应为379人)。多个识别区域有交叉的情况下,总人数统计还是相当准确。
处理速度方面:每张图片处理时间在4-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_num' + '?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,连续读取图片
path = 'F:/paddle/renshu/kk.jpeg'#存放图片的文件夹路径
f = open(path, 'rb')
img_str = base64.b64encode(f.read())
params = {'area':'10,719,580,719,580,200,10,200;600,719,1079,719,1079,200,600,200','image':img_str,'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('F:/paddle/renshu/out/y4.jpg','wb')
file.write(img_b64decode)
file.close()
if __name__ == '__main__':
recognizer = Traffic_flowRecognizer(api_key, secret_key)
recognizer.detect()
五.意见建议
通过测试,整体表现较好,在多个识别区域有交叉的情况下,总人数统计还可以更精确,建议优化。
数人能力已经超过人类了
人山人海,容易出事故,所以得限流
妈耶,人山人海,锣鼓喧天,鞭炮齐鸣