“吸烟有害健康”这是我们经常说的一句话,在烟盒上也有这么一句话,中国是世界上最大的烟草生产国和消费国,与一手烟相比,二手烟对人体伤害更严重,吸烟带来的危害已经成为全球第二号杀手,截至目前,我国北京、上海、杭州、深圳等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.目前,只有静态版本,后期建议出动态版本,通过摄像头直接可以输出结果。
全民禁烟
是个好想法,不过这个需要视频输入
不仅自己的身体对别人的身体也是
这个系统还可用于影视审查。检测影视作品的“烟雾指数”。
自己收集数据、标注得要不少money吧。最好能搭便车。当然还得保证生产环境下的召回率。
万一喊出大爷心脏病来,咋办?科技公司也不是那么好干的。干之前得咨询法务。
电梯喊话,肯定管用
没有这么细分的,可以自己上传数据进行训练
paddle有没有检测液体或瓶子的预训练模型,或用其他的目标检测预训练模型也比重新训练好?
恩,这个可以自己定制
这个是easyDL平台的功能么?有没有水杯(包括饮料等的液体瓶子)检测的项目?
装电梯上
健康的确是最重要的
恩,处罚能起到一定作用
有处罚就会有效果
这种需要人人遵守、从小抓起
北京要求的比较严格
人们越来越注重健康
让国家更加法制化
用AI控制吸烟会更有效