【产品建议】【人体分析】室内禁烟监控
wangwei8638 发布于2019-04 浏览:8820 回复:55
1
收藏
最后编辑于2022-04

“吸烟有害健康”这是我们经常说的一句话,在烟盒上也有这么一句话,中国是世界上最大的烟草生产国和消费国,与一手烟相比,二手烟对人体伤害更严重,吸烟带来的危害已经成为全球第二号杀手,截至目前,我国北京、上海、杭州、深圳等18个城市通过了室内禁烟立法,控烟效果明显。百度Ai人体属性分析服务具有识别是否吸烟的功能,用来作为室内禁烟监控怎样呢?先来尝鲜一试。

一.平台接入

1.进入控制台,选择人体分析服务。

https://ai.baidu.com/

2.创建服务,如图示:

3.输入名称及描述

 

4.此处显示AK,SK,后面程序中会用到

二.分析接口文档

1.打开API文档页面,分析接口要求

https://ai.baidu.com/docs#/Body-API/cabb300c

   (1)接口描述

对于输入的一张图片(可正常解码,且长宽比适宜),检测图像中的所有人体并返回每个人体的矩形框位置,识别人体的静态属性和行为,共支持20余种属性,包括:性别、年龄阶段、衣着(含类别/颜色)、是否戴帽子、是否戴眼镜、是否背包、是否使用手机、身体朝向等。

主要适用于监控场景的中低空斜拍视角,支持人体轻度重叠、轻度遮挡、背面、侧面、动作变化等复杂场景。摄像头硬件选型无特殊要求,分辨率建议720p以上,更低分辨率的图片也能识别,只是效果可能有差异。暂不适用夜间红外监控图片,后续会考虑扩展。

注:接口返回的属性信息包括人体的遮挡、截断情况,在应用时可基于此过滤掉“无效人体”,比如严重遮挡、严重截断的人体。

(2)请求说明

需要用到的信息有:

请求URL:https://aip.baidubce.com/rest/2.0/image-classify/v1/body_attr

Header格式:Content-Type:application/x-www-form-urlencoded

image - 图像数据,Base64编码字符串,以图片文件形式请求时必填。图片的base64编码是不包含图片头的,如(data:image/jpg;base64,),(支持图片格式:jpg,bmp,png),图片Base64编码后大小不超过4M。最短边至少50px,最长边最大4096px
type - type 参数值可以是可选值的组合,用逗号分隔;如果无此参数默认输出全部21个属性
(3)返回参数

    返回每个人体的矩形框位置,识别人体的静态属性和行为,共支持20余种属性,包括:性别、年龄阶段、衣着(含类别/颜色)、是否戴帽子、是否戴眼镜、是否背包、是否使用手机、身体朝向等。

2.获取accesstoken

# encoding:utf-8
import base64
import urllib
import urllib2

'''
人体检测和属性识别
'''

request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_attr"

# 二进制方式打开图片文件
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}

        tic = time.clock()

        rp_json = self.get_result(params)

        toc = time.clock()

        person_info = rp_json['person_info']

        strover += '  {} \n '.format(person_info[0]['attributes']['smoke']['name'])

        print(strover)

        print('花费时长: '+'%.2f'  %(toc - tic) +' s')

1.单人情况下检测

返回参数结果:

{'log_id': 8547368530524717652,

 'person_info': [{'attributes': {'age': {'name': '青年',

                                         'score': 0.9645450711250305},

                                 'bag': {'name': '无背包',

                                         'score': 0.9906293749809265},

                                 'carrying_item': {'name': '不确定',

                                                  'score': 0.9812182784080505},

                                 'cellphone': {'name': '未使用手机',

                                               'score': 0.9278106689453125},

                                 'gender': {'name': '男性',

                                            'score': 0.9984872341156006},

                                 'glasses': {'name': '无眼镜',

                                             'score': 0.7505353689193726},

                                 'headwear': {'name': '无帽',

                                              'score': 0.966858983039856},

                                 'is_human': {'name': '不确定',

                                              'score': 0.996494472026825},

                                 'lower_color': {'name': '不确定',

                                                 'score': 0.999895453453064},

                                 'lower_cut': {'name': '有下方截断',

                                               'score': 0.9997745156288147},

                                 'lower_wear': {'name': '不确定',

                                                'score': 0.9999333620071411},

                                 'occlusion': {'name': '无遮挡',

                                               'score': 0.992655873298645},

                                 'orientation': {'name': '左侧面',

                                                 'score': 0.5788800120353699},

                                 'smoke': {'name': '未吸烟',

                                           'score': 0.923449695110321},

                                 'umbrella': {'name': '未打伞',

                                              'score': 0.9873664379119873},

                                 'upper_color': {'name': '白',

                                                 'score': 0.384524792432785},

                                 'upper_cut': {'name': '无上方截断',

                                               'score': 0.999879002571106},

                                 'upper_wear': {'name': '长袖',

                                                'score': 0.6885045170783997},

                                 'upper_wear_fg': {'name': '衬衫',

                                                 'score': 0.5808300971984863},

 

                                 'upper_wear_texture': {'name': '纯色',

                                                 'score': 0.9561682939529419},

                                 'vehicle': {'name': '无交通工具',

                                             'score': 0.9839165806770325}},

                  'location': {'height': 363,

                               'left': 162,

                               'score': 0.9679144620895386,

                               'top': 30,

                               'width': 388}}],

 'person_num': 1}

识别结果:  未吸烟

花费时长: 0.95 s

结论:未检测出吸烟的人。

2.多人情况下检测

返回参数结果:

{'log_id': 6256820848140517780,

 'person_info': [{'attributes': {'age': {'name': '青年',

                                         'score': 0.9250969290733337},

                                 'bag': {'name': '无背包',

                                         'score': 0.8046305179595947},

                                 'carrying_item': {'name': '无手提物',

                                                   'score': 0.91810542345047},

                                 'cellphone': {'name': '未使用手机',

                                               'score': 0.9667158126831055},

                                 'gender': {'name': '男性',

                                            'score': 0.5751416683197021},

                                 'glasses': {'name': '无眼镜',

                                             'score': 0.7396103143692017},

                                 'headwear': {'name': '无帽',

                                              'score': 0.8485463857650757},

                                 'is_human': {'name': '正常',

                                              'score': 0.9993274211883545},

                                 'lower_color': {'name': '灰',

                                                 'score': 0.9714739918708801},

                                 'lower_cut': {'name': '无下方截断',

                                               'score': 0.9987053871154785},

                                 'lower_wear': {'name': '长裤',

                                                'score': 0.9999043941497803},

                                 'occlusion': {'name': '无遮挡',

                                               'score': 0.9633927941322327},

                                 'orientation': {'name': '左侧面',

                                                 'score': 0.475334495306015},

                                 'smoke': {'name': '未吸烟',

                                           'score': 0.9933710098266602},

                                 'umbrella': {'name': '未打伞',

                                              'score': 0.9991402626037598},

                                 'upper_color': {'name': '黑',

                                                 'score': 0.4952010214328766},

                                 'upper_cut': {'name': '无上方截断',

                                               'score': 0.9995409250259399},

                                 'upper_wear': {'name': '长袖',

                                                'score': 0.9984028935432434},

                                 'upper_wear_fg': {'name': 'T恤',

                                                  'score': 0.3680217266082764},

                                 'upper_wear_texture': {'name': '纯色',

                                                  'score': 0.7187400460243225},

                                 'vehicle': {'name': '无交通工具',

                                             'score': 0.9977729916572571}},

                  'location': {'height': 700,

                               'left': 345,

                               'score': 0.9994909763336182,

                               'top': 45,

                               'width': 333}},

                 {'attributes': {'age': {'name': '青年',

                                         'score': 0.8654946684837341},

                                 'bag': {'name': '无背包',

                                         'score': 0.7426581978797913},

                                 'carrying_item': {'name': '无手提物',

                                                  'score': 0.8243087530136108},

                                 'cellphone': {'name': '未使用手机',

                                               'score': 0.9581600427627563},

                                 'gender': {'name': '女性',

                                            'score': 0.9557181596755981},

                                 'glasses': {'name': '无眼镜',

                                             'score': 0.7663536071777344},

                                 'headwear': {'name': '普通帽',

                                              'score': 0.4388768076896667},

                                 'is_human': {'name': '正常',

                                              'score': 0.9999759197235107},

                                 'lower_color': {'name': '灰',

                                                 'score': 0.6101317405700684},

                                 'lower_cut': {'name': '无下方截断',

                                               'score': 0.9993842840194702},

                                 'lower_wear': {'name': '短裙',

                                                'score': 0.5945636034011841},

                                 'occlusion': {'name': '无遮挡',

                                               'score': 0.9463974833488464},

                                 'orientation': {'name': '正面',

                                                 'score': 0.9892177581787109},

                                 'smoke': {'name': '未吸烟',

                                           'score': 0.9994227886199951},

                                 'umbrella': {'name': '未打伞',

                                              'score': 0.9987249970436096},

                                 'upper_color': {'name': '白',

                                                 'score': 0.8151127099990845},

                                 'upper_cut': {'name': '无上方截断',

                                               'score': 0.9998965263366699},

                                 'upper_wear': {'name': '短袖',

                                                'score': 0.9941295385360718},

                                 'upper_wear_fg': {'name': 'T恤',

                                                 'score': 0.3834067285060883},

                                 'upper_wear_texture': {'name': '纯色',

                                                  'score': 0.6701688170433044},

                                 'vehicle': {'name': '无交通工具',

                                             'score': 0.9988996982574463}},

                  'location': {'height': 576,

                               'left': 556,

                               'score': 0.7839263677597046,

                               'top': 84,

                               'width': 201}}],

 'person_num': 2} 

识别结果:  未吸烟

花费时长: 1.79 s

结论:2个抽烟的人均未检测出来。

四.意见建议

1.只针对人体属性分析抽烟这一项属性,尝试了多张吸烟图片,证明测试是不成功的。建议对该抽烟这一属性,增加数据集图片数量,训练出正确率更高的模型。

2.目前行为动作有抽烟/使用手机/撑伞等属性,建议增加是否手持管制刀具、枪炮弹药等属性,这在危险犯罪预警中是非常有用的。

3.目前,只有静态版本,后期建议出动态版本,通过摄像头直接可以输出结果。

收藏
点赞
1
个赞
共55条回复 最后由用户已被禁言回复于2022-04
#56wangwei8638回复于2020-05
#54 进985回复
不仅自己的身体对别人的身体也是

全民禁烟

0
#55wangwei8638回复于2020-05
#53 189******30回复
这个系统还可用于影视审查。检测影视作品的“烟雾指数”。

是个好想法,不过这个需要视频输入

0
#54进985回复于2020-05
#36 才能我浪费99回复
吸烟对健康损害太大

不仅自己的身体对别人的身体也是

0
#53189******30回复于2020-04

这个系统还可用于影视审查。检测影视作品的“烟雾指数”。

0
#52189******30回复于2020-04
#49 wangwei8638回复
没有这么细分的,可以自己上传数据进行训练

自己收集数据、标注得要不少money吧。最好能搭便车。当然还得保证生产环境下的召回率。

0
#51189******30回复于2020-04
#50 wangwei8638回复
电梯喊话,肯定管用

万一喊出大爷心脏病来,咋办?科技公司也不是那么好干的。干之前得咨询法务。

0
#50wangwei8638回复于2020-04
#45 189******30回复
装电梯上

电梯喊话,肯定管用

0
#49wangwei8638回复于2020-04
#48 189******30回复
paddle有没有检测液体或瓶子的预训练模型,或用其他的目标检测预训练模型也比重新训练好?
展开

没有这么细分的,可以自己上传数据进行训练

0
#48189******30回复于2020-02
#47 wangwei8638回复
恩,这个可以自己定制

paddle有没有检测液体或瓶子的预训练模型,或用其他的目标检测预训练模型也比重新训练好?

0
#47wangwei8638回复于2020-02
#46 189******30回复
这个是easyDL平台的功能么?有没有水杯(包括饮料等的液体瓶子)检测的项目?
展开

恩,这个可以自己定制

0
#46189******30回复于2020-02

这个是easyDL平台的功能么?有没有水杯(包括饮料等的液体瓶子)检测的项目?

0
#45189******30回复于2020-02

装电梯上

0
#44才能我浪费99回复于2020-01
#39 小雨青青润无声回复
人们越来越注重健康

健康的确是最重要的

0
#43wangwei8638回复于2019-12
#42 风搅火回复
有处罚就会有效果

恩,处罚能起到一定作用

0
#42风搅火回复于2019-12
#37 小雨青青润无声回复
用AI控制吸烟会更有效

有处罚就会有效果

0
#41风搅火回复于2019-12
#34 wangwei8638回复
北京公共场所室内禁烟

这种需要人人遵守、从小抓起

0
#40风搅火回复于2019-12
#34 wangwei8638回复
北京公共场所室内禁烟

北京要求的比较严格

0
#39小雨青青润无声回复于2019-12
#33 风搅火回复
戒烟大都是因为身体原因

人们越来越注重健康

0
#38小雨青青润无声回复于2019-12
#35 才能我浪费99回复
这个功能未来用途越来越多

让国家更加法制化

0
#37小雨青青润无声回复于2019-12
#36 才能我浪费99回复
吸烟对健康损害太大

用AI控制吸烟会更有效

0
TOP
切换版块