EasyDL是百度大脑推出的定制化AI训练及服务平台,支持面向各行各业有定制AI需求的企业用户及开发者使用。支持从数据管理与数据标注、模型训练、模型部署一站式AI开发流程,通过原始图片、文本、音频、视频类数据经过EasyDL加工、学习、部署可发布为公有云API、设备端SDK、本地化部署及软硬一体产品。
EasyDL产品从目标客户及应用场景的角度分为经典版、专业版、零售版两个核心产品。本文使用的是经典版。
1.首先要注册百度账号 https://ai.baidu.com/easydl/
2. 点击开始训练,进入快速开始使用界面,这里有内置的模型,本次体验选择图像分类。
3. 选择图像分类后,点击进入操作台, 点击创建模型。
5.完成模型创建后,应该添加数据集,同样点击训练也会提示创建或选择数据集
6.填写数据集基本信息,根据自己数据具体情况选择,最后上传数据压缩包,成功后如下图
7.数据集上传成功后,平台会自动进行处理,等待处理完成,提示说大约1-2个小时左右。我这里仅用了五分钟左右。
8.等待数据集出现分类数、图片数、状态为正常后可以进行下一步操作。
9. 数据标注,添加标注后,一定不要忘记点击下面的保存按钮再进行下一个图像标注
也可以参考标注示例
10. 在各分类图片之间差异明显的情况下,训练数据每类仅需20-100张,最快10分钟可训练完毕.这里,我标注了65个,每个人十几张,对于我这点数据集应该足够用了。
11.回到训练模型界面,添加标注好的数据集
12. 点击开始训练,提示少于20个训练集,因为我的数据集比较少,而且仅做测试使用,所以我继续训练,实际操作中最好按照提示去做,多增加标注训练集。
13. 等待训练完成。
鼠标放在训练中上面,会出现如下提示,选择完成后短信提醒。可以去做其他的事,等待训练完成。
14.模型训练完成后,可以查看完整评估结果,也可申请发布。
15.初次训练结果如下,结果不太好,原因是我的数据集标注不太全面,质量不高。
16. 训练完成后进行模型校验,查看训练效果。
17. 提交发布申请,提示优化,忽略,继续发布
18. 点击服务详情查看api地址
19.点击 立即使用,跳转到百度云控制台创建一个应用,填写信息创建完成后,我们需要查看API KEY 以及 Secret KEY,之后在调用在线服务的时候需要它们,至此我们完成了模型的创建训练工作,之后让我们用一些简单的客户端代码来调用这个服务
有了上一步的API KEY 以及 Secret KEY,以及第二步的数据,我们就可以写一个示例代码调用我们之前创建并训练完成的自定义图像分类模型。
20.打开AI Studio 新建项目并启动。
21. 启动项目,进入开发环境,开始编写代码进行测试。
代码参考帮助文档提供的参考,但是是基于Python 2版本的,需要进行适当的修改。具体如下:
1.获取token
# client_id 为官网获取的AK, client_secret 为官网获取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=你的id&client_secret=你的secret'
response = requests.get(host)
if response:
#print(type(response.json()))
access_token = response.json()['access_token']
#print(access_token)
2.获取图像base64编码
#获取图像base64编码
with open("18.jpg","rb") as fin:
image_data = fin.read()
#print(image_data)
base64_data = base64.b64encode(image_data)
#print(base64_data) #查看区别
3.配置参数params
#print(type(base64_data)) #查看类型,根据官方文档,image 为字符型
params = '"{\"image\":\"' + bytes.decode(base64_data) +'\",\"top_num\":\"5\"}"'
params = params.strip('"')
print(params)
# params = urllib.parse.urlencode(params).encode(encoding='UTF8')
params = bytes(params,"utf-8")
4.进行分类识别
request_url = request_url + "?access_token=" + access_token
req = urllib.request.Request(url=request_url, data=params)
req.add_header('Content-Type', 'application/json')
response = urllib.request.urlopen(req)
content = response.read()
if content:
print(content)
5. 返回内容
b'{"log_id":4198895242319019686,"results":[{"name":"wang","score":0.4345294237136841},{"name":"yu","score":0.3871498107910156},{"name":"an","score":0.12733174860477448},{"name":"xu","score":0.024309564381837845},{"name":"zhao","score":0.019421296194195747}]}\n'
因为是五分类,所以返回五个选手各自的可能性分值,其中标注为wang的选手可能性最高,为0.4345294237136841,而我测试的图像就是王承渲的图像,因此分类正确。
最后附上全部代码
# encoding:utf-8
import os
import urllib.request
import requests
import base64
import json
'''
easydl青春有你2选手图像分类
'''
#获取图像base64编码
with open("18.jpg","rb") as fin:
image_data = fin.read()
#print(image_data)
base64_data = base64.b64encode(image_data)
#print(base64_data)
# client_id 为官网获取的AK, client_secret 为官网获取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=你的ID&client_secret=你的secret'
response = requests.get(host)
if response:
#print(type(response.json()))
access_token = response.json()['access_token']
#print(access_token)
# access_token = json.load(response.json())['access_token']
#复制easyDL应用对外API地址
request_url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/classification/qingchuanyouni2001"
#拼接完整URL
request_url = request_url + "?access_token=" + access_token
#组合参数
params = '"{\"image\":\"' + bytes.decode(base64_data) +'\",\"top_num\":\"5\"}"'
params = params.strip('"') #很重要,否则提示336002 JSON不合法 json格式错误
print(params)
params = bytes(params,"utf-8")
#POST带数据请求
req = urllib.request.Request(url=request_url, data=params)
req.add_header('Content-Type', 'application/json')
response = urllib.request.urlopen(req)
content = response.read()
if content:
print(content)
遇到的问题难点:
1.POST data should be bytes, an iterable of bytes, or a file object.
not a valid non-string sequence or mapping object
params = bytes(params,"utf-8") #转换为bytes
网上有说 params = urllib.parse.urlencode(params).encode(encoding='UTF8'),经测试还是存在问题
2. 36002 json不合法错误解决
s.strip()去掉首尾字符串,多了双引号错误
3.版本问题
python3对urllib和urllib2进行了重构,拆分成了urllib.request,urllib.response, urllib.parse, urllib.error等几个子模块,这样的架构从逻辑和结构上说更加合理。urllib库无需安装,python3自带。python 3.x中将urllib库和urilib2库合并成了urllib库。 其中
urllib2.urlopen() 变成了 urllib.request.urlopen()
urllib2.Request() 变成了 urllib.request.Request()
python2中的 cookielib 改为 http.cookiejar.
import http.cookiejar 代替 import cookielib
urljoin 现在对应的函数是 urllib.parse.urljoin