共计 4423 个字符,预计需要花费 12 分钟才能阅读完成。
【本期举荐】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 --save
npm 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 进行数据转换。
根本代码实现如下:
// 获取 Token
async 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 等您!
点击关注,第一工夫理解华为云陈腐技术~