【产品建议】【人体分析】课堂人数检测
wangwei8638 发布于2019-04 浏览:4540 回复:3
2
收藏
最后编辑于2022-04

“老师要点名啦!快来快来!”

“啊?我一不来,老师就点名呀!”

不管了,帮我答个到吧!”

……

总有一些不安分的同学,在逃课问题上绞尽脑汁地与老师们“斗智斗勇”

正所谓  魔高一尺,道高一丈。

老师的各种“花式点名”纷至沓来

这不,利用百度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来数,因为检测的是头部,所以就不作数,后期是否可以增加更多的人体检测细节来增加人流量统计的准确率。

收藏
点赞
2
个赞
共3条回复 最后由用户已被禁言回复于2022-04
#4wangwei8638回复于2020-06

上网课也可以截图点名了

0
#3wangwei8638回复于2019-04
#2 风搅火回复
以后开会统计人数方便了

而且很快

0
#2风搅火回复于2019-04

以后开会统计人数方便了

0
TOP
切换版块