前言
为了实现菜品图片的识别功能,曾经尝试过通过百度智能云的图像识别功能中的果蔬识别API来实现。后面发现百度智能云果蔬识别功能无法满足识别其他菜品品类的要求,因此需要自建图像识别模型,进行图像模型的训练。
EasyDL平台登录
- 进入EasyDL定制化训练与服务平台,即这个页面
https://console.bce.baidu.com/ai/#/ai/easydl/overview/index - 如果没有登录帐号的话可以先注册,注册个人帐号或者是公司帐号
- 注册完登录进去之后,找到EasyDL定制化训练与服务平台 —> 在EasyDl总览里找到EasyDL图像 —> 选择训练模型 —> 点击立即使用 —> 选择图像分类或者是物体检测(图像分类适用于图片内容单一、需要给整张图片进行分类的场景;物体检测适用于图中有多个主体要识别或者识别主体位置和数量的场景)
- 这里选择图像分类进行演示,进入图像分类模型页面,即这个页面https://ai.baidu.com/easydl/app/1/100/models
- EasyDL图像使用参考:https://ai.baidu.com/ai-doc/EASYDL/ok38n2w9h
创建及训练模型
- 在我的模型里,选择创建模型,设置模型名称和功能描述
- 创建模型数据集,设置数据集名称
- 往数据集中导入需要分类的图片数据,图片要求见地址:https://ai.baidu.com/easydl/app/dataset/1/100/202246/import。上传无标注信息的本地导入方式,直接选择图片进行导入即可。上传有标注信息的本地导入方式,选择上传压缩包,图片的命名方式如下图所示
- 导入成功后则开始进行图片的标注,在左侧选择在线标注选项,对每个图片进行菜品品类的标注
- 标注完之后,就开始对数据模型进行训练,在左侧选择训练模型,添加训练数据,选择训练环境后点击开始训练。训练过程会有一段时间,可以查看训练进度和配置训练完成后发送短信通知
校验及发布模型
- 训练完成后就可以校验模型,通过添加图片可以查看校验结果以及纠正识别结果
- 校验完成后就可以点击发布模型,申请上线。配置服务名称和接口地址,点击提交申请,即可等待申请结果
创建应用使用模型
- 图像分类模型服务发布成功后,点击服务详情可查看接口地址。点击立即使用即可创建应用生成API Key和Secret Key,供代码调用使用
- EasyDL图像分类API调用文档参考:https://ai.baidu.com/ai-doc/EASYDL/Sk38n3baq
- 代码调用的时候需要注意,上传图片接口自定义识别跟果蔬识别方式不同,果蔬识别调用的时候传递的是application/x-www-form-urlencoded 表单格式数据,自定义识别的时候传递的是 application/json 格式数据。调用的时候报的如下错误 “error_code”: 100,“error_msg”: “Invalid parameter”,也是这个原因。
部分调用的代码如下:
// ApiService 部分
@Headers({"Domain-Name: domainUrl3"})
// 自定义模型识别
@POST("/rpc/2.0/ai_custom/v1/classification/weishengzhi")
Observable<UploadImageBackBean2> uploadImage2(@Query("access_token") String accessToke, @Body RequestBody requestBody);
// Presenter 部分
String base64 = Base64.encodeToString(bytes, Base64.DEFAULT);
int topNum = 5;
Map<String, Object> map = new HashMap<>();
map.put("image", base64);
map.put("top_num", topNum);
String params = GsonUtils.toJson(map);
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), params);
mModel.uploadImage2(asscessToken, requestBody)
- 实施的时候注意要花功夫的部分是图片拍取(人工)、图片上传及标记(人工)、图片训练(云端服务器)、接口发布审批(云端服务器)