“老师要点名啦!快来快来!”
“啊?我一不来,老师就点名呀!”
不管了,帮我答个到吧!”
……
总有一些不安分的同学,在逃课问题上绞尽脑汁地与老师们“斗智斗勇”
正所谓 魔高一尺,道高一丈。
老师的各种“花式点名”纷至沓来
这不,利用百度AI,凭一张照片就能查出今天来了多少人,是不是要点个名呢?
其实,老师“花式点名”的初衷
是督促同学们潜心学习,莫负青春好年华!
星辰大海,以梦为马
努力才不枉此番少年时
希望大家都可以拥有充实而难忘的大学时光!
言归正传......
一.平台接入
1.进入控制台,选择人体分析服务。
https://ai.baidu.com/
2.创建服务,如图示:
3.输入名称及描述
4.此处显示AK,SK,后面程序中会用到
二.分析接口文档
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
image -图像数据,Base64编码字符串,以图片文件形式请求时必填。图片的base64编码是不包含图片头的,如(data:image/jpg;base64,),(支持图片格式:jpg,bmp,png),图片Base64编码后大小不超过4M。最短边至少50px,最长边最大4096px
show - 是否输出渲染的图片,默认不返回,选true时返回渲染后的图片(base64),其它无效值或为空则默认false
(3)返回参数
person_num -识别出的人体数目
image-渲染后的图片,输入参数show=true时输出该字段
返回示例
{
"log_id": 716033439,
"person_num": 16,
"image": "/9j/4AAoFS2P/9k="
}
注意,返回的image参数为Base64编码字符串,需要解码,还原成渲染后的图片。
为了大家看的明白,先把Base64编码字符串打印出来。如下:
2.获取accesstoken
#client_id 为官网获取的AK, client_secret 为官网获取的SK
client_id =【百度云应用的AK】
client_secret =【百度云应用的SK】
#获取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
三.识别结果
识别部分代码:
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, img_path):
f = open(img_path, 'rb')
strover = '图中人数共:'
img_str = base64.b64encode(f.read())
params = {'image': img_str,'show':'true'}
tic = time.clock()
rp_json = self.get_result(params)
person_num = rp_json['person_num']
strover += ' {} 人 '.format(person_num)
print(strover)
toc = time.clock()
print('用时 :'+'%.2f' %(toc - tic) +' s')
img_b64encode = rp_json['image']
# print(img_b64encode)
img_b64decode = base64.b64decode(img_b64encode) # base64解码
image = io.BytesIO(img_b64decode)
img = Image.open(image)
img.show()
file=open('1.jpg','wb')
file.write(img_b64decode)
file.close()
1.单张图片检测
原图如下:
渲染后的图形:
人流量检测输出结果:
输出人数正确,有2个头部遮挡的也检测出来了,关键是2秒钟查完33人,已经超越人类了。
2.多张图片检测
采用10张教室上课图片,进行批量处理
输出结果如下:
准确率方面:10张图有6张统计正确;受人体遮挡等影响,头部露出一半或完全被遮挡,会检测不出来;同时,也有误检的,如y3应该是22人,但检出24个,有可能是学生拿的平板被误检。每张图片人流量统计误差在2人以内。
处理速度方面:10张图片,平均处理用时2.243s,还不错的响应结果。
四.意见建议
1.同一个教室,拍摄角度的不同,可能检测出的人数不一样,可能后排睡觉的同学被前排挡住了,就检测不出来。同一个教室不同角度拍出来的照片能不能做融合处理呢,只要在一张图片中检测出来就认为这个同学是在的,感觉有些难度……
2.对于拍摄不全的照片,比如只露一条胳膊,当然人来数的话,肯定会当做一个人来算,用AI来数,因为检测的是头部,所以就不作数,后期是否可以增加更多的人体检测细节来增加人流量统计的准确率。
上网课也可以截图点名了
而且很快
以后开会统计人数方便了