1. 概括
EasyDL是百度AI中一个自动化的深度学习模型训练和服务平台
使用EasyDL训练得到模型,在python下调用对应模型的api,可以实现对图片上传至云端进行识别,并接收返回的识别结果,再使用opencv通过返回的结果在图片上进行绘制,框出目标物体,还可以得到其中心坐标值
进一步,其提供了多种部署方式,后面还可以将模型部署到私有云或者本地,可以更方便的拓展使用
2. 使用EasyDL训练模型
使用EasyDL的链接,使用之前需要先注册或登录百度账号,使用百度网盘账号登录也可以,都需要实名才能使用
点击开始训练,使用经典版,这里以物体检测为例
先进入我的模型,然后创建模型,填写相关信息即可,下一步,然后就可以可到新的模型已经创建
需要新创建一个数据集,选择下面的选项之后上传照片,要求图片命名不要有中文名,并且图片的场景最好和后面要识别的场景一样,多个角度,多个光线,25+张照片就可以,不过最好有40+,上传完成之后,点击确认并返回
可以看到数据集的状态还在处理中,等待处理完成即可;然后点击后面的标注,对需要训练的图片进行标注需要识别的目标物体;先添加标签,不能使用中文名,然后将目标物体框起来,再点击对应的便签即可
通过多个标签可以做到识别多个目标的目的,然后按下面的保存;接着需要手动点上方图片进行选择下一张需要标注的图片,以此方法对所有图片进行标注即可,完成后回到我的模型页面
回到我的模型页面,选择下面的训练,选择需要训练的模型,这里以公有云部署为例,添加数据集,开始训练之后,可以在我的模型页面看到训练的状态,还可以设置短信提醒,40张照片的训练预计30分钟左右
训练完成之后,可以对模型进行检验,然后进行申请上线,这个过程可能也有点久,快的话当天可以完成,最慢就是第二天,可能会有百度云的客服打电话过来询问(类似于推广告吧),最好接一下,说明你是在学习,测试一下,准备做项目,如果她继续问更深入信息,你就说不方便透露,如果有需要再和你们联系就好了
3.在python调用EasyDL的api
审核结束,然后在我的模型页面,点击服务详情,就可以看到模型的url(后面会用到),然后点击立即使用
在EasyDL经典版控制台创建应用,填写相关信息即可,然后在应用详情页获取AK和SK
接着需要获取access_token,使用到上文的AK和SK,及应用详情里的API Key和Secret Key,复制以下链接,将AK和SK修改成自己的(注意是没有【】的),然后用浏览器打开该链接,即可得到access_token,获取access_token这部分也可以在代码中实现
https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【百度云应用的AK】&client_secret=【百度云应用的SK】
以下是官方提供的python示例,需要注意的是python3中使用的不是urllib2
# encoding:utf-8
import urllib2
'''
easydl物体检测
'''
request_url = "【接口地址】"
params = "{\"image\":\"sfasq35sadvsvqwr5q...\"}"
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/json')
response = urllib2.urlopen(request)
content = response.read()
if content:
print content
按照服务API的说明,针对V1版(YOLOV3)的服务,编写调用代码(Python3)。需要注意的是与其他图像识别服务不同的是定制化图像识别服务以json方式请求。
下面是我的代码,仅供参考,如有错误,还望指正!
import time
import base64
import urllib3,json
import cv2
test_img_path = "E:/study/python/test4.jpg"
save_img_path = "E:/study/python/resule.jpg"
#access_token = "24.ee098060f9d444677770e289b6d8780b.*****************" #自己的access_token
#module_url = 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/d********' #当审核通过后,可以在我的模型页面,进入服务详情可以查看到
def img_show(name,img_path):
img = cv2.imread(img_path)
print('shape:',img.shape)
img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_NEAREST)
cv2.imshow(name ,img)
cv2.waitKey(0)
def draw_result_img(originfilename,results,resultfilename):
from PIL import Image, ImageDraw,ImageFont
image_origin = Image.open(originfilename)
draw = ImageDraw.Draw(image_origin)
setFont = ImageFont.truetype('C:/windows/fonts/simhei.ttf', 66)
for result in results:
location = result['location']
top_x,top_y = location['left'],location['top']
button_x,button_y = (location['left']+location['width']),(location['top']+location['height'])
center_x,cenrer_y = int(top_x+(location['width']/2)),int(top_y+(location['height']/2))
print('目标物体中心坐标:',center_x,cenrer_y)
draw.rectangle((top_x,top_y,button_x,button_y),outline = "red")
draw.ellipse((center_x-10,cenrer_y-10, center_x+10,cenrer_y+10), fill = (255, 0, 0))
draw.text((top_x,top_y), result['name']+', Score:'+str(round(result['score'],3)),"yellow",font=setFont)
image_origin.save(resultfilename, "JPEG")
img_show('result',save_img_path)
def get_test_img():
img_show('test_img',test_img_path)
with open(test_img_path, 'rb') as f:
img = base64.b64encode(f.read())
#img参数进行一下str转换
params={'image':''+str(img,'utf-8')+''}
#对参数params数据进行json处理
encoded_data = json.dumps(params).encode('utf-8')
return encoded_data
def get_result():
encoded_data = get_test_img()
url = "{}?access_token={}".format(module_url,access_token)
begin = time.perf_counter()
request = urllib3.PoolManager().request('POST',
url,
body = encoded_data,
headers={'Content-Type':'application/json'})
#对返回的byte字节进行处理。Python3输出位串,而不是可读的字符串,需要进行转换
content = str(request.data,'utf-8')
end = time.perf_counter()
if content:
data = json.loads(content)
utime = end - begin
return data,utime
else:
return False
data,utime = get_result()
results = data['results']
print(results)
print('处理时长:'+'%.2f'%(utime)+'秒')
draw_result_img(test_img_path,results,save_img_path)
原文链接:https://blog.csdn.net/fengge2018/article/details/105048268