【本期举荐】 8岁小朋友的儿童节,有点硬核,一起来意识这些小小程序员,看他们如何coding出一个不同凡响的童年。
摘要: 如果还能再过一次儿童节……
本文分享自华为云社区《“梦回童年,尽享美食“--ModelArts + Wechaty 辨认童年美食》,原文作者:华为云EI专家胡琦。
大家好,我是Copy攻城狮胡琦,昨晚终于把憋了很久的 ModelArts + Wechaty 实现乏味的美食图片辨认利用跑通了。只管联合 Wechaty 调用 AI 相干服务在多年以前就被千人实现过了,不过作为小白的我可能借助一站式AI开发平台 ModelArts 老手制作数据集、训练模型并部署,最终通过最好的微信开发库 Wechaty 实现调用 AI 服务的聊天小助手,还是非常乏味的。当然,我也急不可待地将我的实际分享给大家,也心愿可能取得各位大佬的领导!
数据集制作
咱们从AI开发流程登程,当我确定了我的目标是要联合 ModelArts + Wechaty 来实现童年美食辨认,基本上我的技术选型也就确定了,鉴于我学艺不精,零根底都能上手的一站式AI开发平台ModelArts和四行代码就能实现聊天机器人的微信开发库 Wechaty,便成了我惟一的抉择。筹备数据的阶段,我有幸遇到了前辈奉献的代码,因而可能疾速从某度图片获取我想要的图片,具体操作能够查看我的历史文章《老手小白如何疾速获取数据集》。我用同样的手法获取到了菠萝啤、大白兔奶糖、罗唆面、果丹皮、汉堡橡皮糖、猴王丹、花生牛轧糖、健力宝、酒心巧克力、烤红薯、辣条、老冰棍、三色冰淇淋、沙琪玛、跳跳糖、娃哈哈AD钙、旺旺碎冰冰、旺仔牛奶、西瓜泡泡糖、仙贝、鱼皮花生、玉米软糖、真知棒、咪咪虾条共24个分类,从7200张图片中一张一张分拣,最终标注3543张,实现了一个临时看上去想那么回事的数据集--《"儿童节特辑"--8090的童年美食》。
不过,目前从数据的标签散布来看,不太正当,被标注最多的标签数量多达268个,而被标注起码的标签数量仅23个,两者差了一个数量级,因而训练进去的模型大概率会跑偏。
在ModelArts上进行数据标注时,其实也是有肯定技巧的。比方,我在本地获取到了大量的图片,通过 OBS 的命令行工具上传到 OBS 桶中之后,因为此次标注是图像分类,因而我在标注时能够通过图片寄存的 OBS 目录来疾速筛选出以后要分拣的标签以及进行标注。目前ModelArts数据集解决时单页最多可显示60张图片,这也给我对图片进行精挑细选提供了强有力的反对。其次,在进行图片筛选时,能够从最初一页进行,每次删除图片时顺带把源文件也从 OBS 中移除,移除往前直至解决到第一页。最初,又能够全选当前页进行标注。整个数据集从数据获取到数据处理再到数据集公布,花了不到2小时,个人感觉对老手小白曾经很敌对了!
训练及评估模型
如果您对《"儿童节特辑"--8090的童年美食》数据集感兴趣,能够在 AI Gallery 进行一键下载,既能够下载到 OBS 也也可间接下载到 ModelArts 数据集。
基于数据集,在 ModelArts 平台上除了能够自行开发算法并训练模型,也能够应用 AI Gallery 的订阅算法或者间接应用 ModelArts 的主动学习来训练模型。这里为了更简便的操作,本大狮就间接应用简略粗犷的主动学习来实现,次要想看到以后的数据集能训练出怎么样的后果(PS:其实次要是收费,「请把免费打在评论区」),您期待吗?
在创立完主动学习的工作运行9分钟之后,我 Get 到了一个模型,从训练后果来看还是十分现实的,不过到底是骡子是马,还得看最终部署之后的成果。
表中是各个标签所对应的参考值,其中F1值是模型准确率和召回率的加权和谐均匀,用于评估模型的好坏,当F1值较高时阐明模型成果较好;精确度指的是被模型预测为某个分类的所有样本中,模型正确预测的样本比率,反映模型对负样本的辨别能力;召回率指的是被用户标注为某个分类的所有样本中,模型正确预测为该分类的样本比率,反映模型对正样本的辨认能力。
部署模型
目前 ModelArts 反对一个收费的部署服务实例,因为我之前的实际曾经占用了名额,因而当我再次在主动学习中部署模型时会提醒以下图中的报错,从而我只能去到「部署在线--在线服务」手动新建一个服务实例。
在部署模型的时候,咱们能够依据本身的需要增加一些个性化设置或者其余性能,比方数据采集、难例筛选等等。
看到服务部署胜利之后,我曾经急不可待地想先调试一下,轻易找了一张「跳跳糖」的图片,让 AI 辨认一下,哎呀还不错哦,感觉比我设想中的要好。ModelArts 的开发局部就告一段落,接着咱们依照在线服务的调试指南进行与 Wechaty 的联合开发,“Talk is cheap. Show me the code.”
此时,咱们取得的信息: AI 服务的在线地址以及file模式的输出参数images。
Wechaty 开发
先看看咱们最终的出现成果,也就是像微信机器人发送指定关键字之后再发送图片,微信机器人就会调用 ModelArts 的在线服务来辨认图片并将后果返回给微信端。这里咱们就须要用到 Wechaty 这个弱小的微信开发库。对于 Wechaty 的详细情况,您能够拜访 Wechaty 的官网理解--https://wechaty.js.org/。 从域名来看,这个开发库应该和 JavaScript 无关,通过翻阅文档,我得悉,老手应用 Wechaty 仅需四行代码:
npm install qrcode-terminal --savenpm install wechaty npm install wechaty-puppet-wechat --save // 这个依赖是要害export WECHATY_PUPPET=wechaty-puppet-wechat // 这里也是要害,须要配置你应用的puppet
咱们能够新建一个文件夹,执行npm init初始化一个我的项目,而后执行上述代码,接着新建index.js,写入:
const { Wechaty } = require('wechaty');const name = 'wechat-puppet-wechat';let bot = '';bot = new Wechaty({ name, // generate xxxx.memory-card.json and save login data for the next login});// 二维码生成function onScan(qrcode, status) { require('qrcode-terminal').generate(qrcode); // 在console端显示二维码 const qrcodeImageUrl = [ 'https://wechaty.js.org/qrcode/', encodeURIComponent(qrcode), ].join(''); console.log(qrcodeImageUrl);}// 登录async function onLogin(user) { console.log(`贴心小助理${user}登录了`); // if (config.AUTOREPLY) { // console.log(`已开启机器人主动聊天模式`); // } // 登陆后创立定时工作 // await initDay();}//登出function onLogout(user) { console.log(`小助手${user} 曾经登出`);}bot.on('scan', onScan);bot.on('login', onLogin);bot.on('logout', onLogout);bot .start() .then(() => console.log('开始登陆微信')) .catch((e) => console.error(e));
基本上就实现了 Wechaty 局部的开发,执行node index.js就能在控制台显示一个二维码,其实相似咱们登录桌面端的微信,接着咱们次要须要解决的问题:
- 监听微信音讯 -- 能够应用 bot.on('message')来实现;
- 对接 ModelArts -- 能够应用 token 鉴权形式拜访;
- 文件传递 -- 能够通过 form-data进行数据转换。
根本代码实现如下:
// 获取Tokenasync function getToken() { let token = '' const data = { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "domain": { "name": config.IAMDomain }, "name": config.IAMUser, "password": config.IAMPassword } } }, "scope": { "project": { "name": config.IAMProject } } } } await axios.post(config.TokenURL, data).then(res => { token = res.headers['x-subject-token'] }).catch(err => { console.log(err) token = '' }); return token}// 辨认美食async function sendImage(fileName) { let resp = {} await getToken().then(async res => { // console.log(res) const form = new FormData(); form.append('images', fs.createReadStream(fileName)); console.log(form.getHeaders()) await axios.post(config.URL, form, { headers: Object.assign(form.getHeaders(), { "X-Auth-Token": res }) }).then(res => { console.log(res.data) resp = res.data }).catch(err => { console.log(err) if (err.response && err.response.data) { resp = err.response.data } }) }).catch(err => { console.log(err) resp = err.data }) return resp}
残缺代码参见: https://github.com/hu-qi/modelarts-wechaty
舒适提醒:应用 Wechaty 的相干危险请自行评估。
- 应用这种形式登录微信存在被微信官网风控的可能性,严重者可封号;
- 非所有账号可应用此计划进行登录/操作,如果您的账号无奈通过 Wechaty 提供的接口登录,则无奈应用。
获取更多 AI 相干数据、算法、模型等 AI 资产,请点击“理解更多”,AI Gallery等您!
点击关注,第一工夫理解华为云陈腐技术~