“老师要点名啦!快来快来!”
“啊?我一不来,老师就点名呀!”
不管了,帮我答个到吧!”
……
总有一些不安分的同学,在逃课问题上绞尽脑汁地与老师们“斗智斗勇”
正所谓 魔高一尺,道高一丈。
老师的各种“花式点名”纷至沓来
这不,利用百度AI,凭一张照片就能查出今天来了多少人,是不是要点个名呢?
其实,老师“花式点名”的初衷
是督促同学们潜心学习,莫负青春好年华!
星辰大海,以梦为马
努力才不枉此番少年时
希望大家都可以拥有充实而难忘的大学时光!
言归正传......
一.平台接入
1.进入控制台,选择人体分析服务。
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来数,因为检测的是头部,所以就不作数,后期是否可以增加更多的人体检测细节来增加人流量统计的准确率。
上网课也可以截图点名了
而且很快
以后开会统计人数方便了