作者:wangwei8638
EasyDL定制物体检测模型,可以检测出图片里面的所有目标物体名称、位置。适用于一张图片中要识别多个物体,物体计数等场景中。在各检测物体之间差异明显的情况下,训练数据每个标签仅需覆盖20-100张图片,训练时间可能需要30分钟以上。
由于之前在做人体属性识别时,发现对是否抽烟的属性测试不理想。帖子地址:https://ai.baidu.com/forum/topic/show/943252
与官方沟通,认为吸烟图片数据集少,训练不够导致识别率低,所以自己用EasyDL做了一个专门训练吸烟属性的模型,本文介绍简要流程。
一.创建模型
1.进入控制台,选择定制化物体检测。
https://ai.baidu.com/easydl/image
2.创建模型,如图示:
3.输入名称及描述
4.在侧边栏数据中心点击创建数据集,输入名称
5.点击数据标注/上传,选择刚创建的数据集,点击上传图片
6.标注图片。按图示可视化界面,只需3步即可完成图片标注,非常简洁。注意每次最多上传20张图片。
二.训练模型
在侧边栏模型中心点击训练模型,添加参与训练的标签,点击开始训练
三.校验模型
在侧边栏模型中心点击校验模型,上传用于测试的图片,右侧可以看到识别结果
四.发布模型
在侧边栏模型中心点击发布模型,输入服务名称及接口地址,点击提交申请,即可申请发布模型。
发布结果稍后可在我的模型中查看,差不多一个工作日就有结果。当然要得到预测准确的模型,需要不断的优化迭代,重新发布。
五.模型调用
1.单人检测
返回结果: {“log_id”:1125331439121144977,“results”:[{“location”:{“height”:56,“left”:184,“to
p”:77,“width”:44},“name”:“smoke”,“score”:0.9822428226470947}]}
2.多人检测
返回结果:
可以看出,两个抽烟的位置均标出smoke标签。
调用代码:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
import urllib3
import certifi
import os
import requests
import base64
import json
from pprint import pprint
import time
#client_id 为官网获取的AK, client_secret 为官网获取的SK
api_key = '************'
secret_key = '*******************'
class LandmarkRecognizer(object):
def __init__(self, api_key, secret_key):
self.access_token = self._get_access_token(api_key=api_key, secret_key=secret_key)
self.API_URL = 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/detection/ismoking' + '?access_token=' \
+ self.access_token
#获取token
@staticmethod
def _get_access_token(api_key, secret_key):
api = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials' \
'&client_id={}&client_secret={}'.format(api_key, secret_key)
rp = requests.post(api)
if rp.ok:
rp_json = rp.json()
# print(rp_json['access_token'])
return rp_json['access_token']
else:
print('=> Error in get access token!')
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):
#通过创建PoolManager进行证书验证
http=urllib3.PoolManager(cert_reqs = 'CERT_REQUIRED',ca_certs = certifi.where())
f = open(img_path, 'rb')
access_token='24.1349658a1f8aecd61c3c74ef8755bc74.2592000.1558857660.282335-16115229'
url='https://aip.baidubce.com/rpc/2.0/ai_custom/v1/detection/ismoking?access_token='+access_token
strover = '识别结果:'
img_str = base64.b64encode(f.read())
#参数image:图像base64数据不需要urlencode
# print(img_str)
params={'image':''+str(img_str,'utf-8')+'','threshold':0.3}
#对数据进行json序列化
encoded_data = json.dumps(params).encode('utf-8')
# print(encoded_data)
request=http.request('POST',
url,
body=encoded_data,
headers={'Content-Type':'application/json'})
#对返回的byte字节进行处理。Python3输出位串,而不是可读的字符串,需要进行转换
result = str(request.data,'utf-8')
print(result)
if __name__ == '__main__':
recognizer = LandmarkRecognizer(api_key, secret_key)
img = 'F:\paddle\smoke\s25.jpg'
recognizer.detect(img)