【本期推荐】 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就能在控制台显示一个二维码,其实类似我们登录桌面端的微信,接着我们主要需要解决的问题:

  1. 监听微信消息 -- 可以使用 bot.on('message')来实现;
  2. 对接 ModelArts -- 可以使用 token 鉴权方式访问;
  3. 文件传递 -- 可以通过 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 的相关风险请自行评估。

1. 使用这种方式登录微信存在被微信官方风控的可能性,严重者可封号;

2. 非所有账号可使用此方案进行登录/操作,如果您的账号无法通过 Wechaty 提供的接口登录,则无法使用。

获取更多 AI 相关数据、算法、模型等 AI 资产,请点击“了解更多”,AI Gallery等您!

点击关注,第一时间了解华为云新鲜技术~

六一儿童节,看我用ModelArts让8090梦回童年相关推荐

  1. (六一儿童节篇)渐行渐远的儿时游戏

     渐行渐远的儿时游戏 又是六一儿童节,偶想起了曾经美好的童年,儿时的游戏. 这是曾经乡村孩子们的儿童游戏. 1.滚铁环 一个大大铁丝绕成的圈子,还有带手柄钩子,用他滚着铁环去上学,放学归来. 2.弹弓 ...

  2. 2015年 六·一 儿童节——我

    现是2015年的六一儿童节.按说儿童节对于一个己20岁的成年女生来讲已毫无渊渊,于是乎,我花费了将近半个下午的时间来解析自己:是否真的已经成人?     首先在外形上,毋庸置疑,已长成了大人的样子.1 ...

  3. 六一儿童节特辑|哪部“奥特曼”才是90后的心中最爱??数据分析师来告诉你...

    点击上方"蓝字",发现更多精彩. 六一儿童节快到了,现如今的儿童节已经不再是单纯的属于小孩子的节日了,大人们也纷纷过起了该节日,或许是因为我们这些大人们依然童心未泯,也或许是因为来 ...

  4. 简单分享六一儿童节怎么做微信营销活动策划方案

    我们在使用微信营销活动的时候要注意选活动的模版,比如马上到的六一儿童节,我们准备做一个微信营销活动,那么如何使用微信活动模版呢?使用开发好的微信小游戏和微信投票活动来做六一相关的微信营销活动,并且我们 ...

  5. 回忆杀--致敬八零后的六一儿童节

    今天就是六一儿童节了,小朋友们在这一天都是特别开心,因为今天属于他们是充满欢乐的日子.八零后的我们曾经也像他们一样,可是当时的生活条件和现在小朋友对比真是天壤之别.八零后的我们都曾童真过,顽皮过,也被 ...

  6. 【六一儿童节】回忆一下“童年的记忆”

    文章目录 @[TOC](文章目录) 前言 一.EasyX带我们步入了童话的世界 1.1绘画哆啦A梦 2.2绘画出来喜羊羊 二.我的六一故事 总结 前言 我们都有过童年,并且从现在看来,童年是我们最希望 ...

  7. 七上八下猜数字_六一儿童节游园活动的项目和游戏规则.doc

    "六一儿童节"游园活动的项目及游戏规则 在纸上画一个人头,游戏者蒙上双眼,原地转五圈,而后让游戏者走向指定的位置,把"鼻子"贴到人头上,贴中者得奖. 二.夹珠 ...

  8. 庆祝“六一儿童节”C++代码

    六一儿童节来了,在这个充满欢声笑语的节日里,让我们一起用C++来做一个庆祝"六一"的代码吧! 其实,这只是最基本的输出操作,加一个while或者for变成死循环就可以了. 注:由于 ...

  9. 童年记忆中的六一儿童节

    童年记忆中的六一儿童节 我的童年是在农村长大的,在这里我度过了快乐的无忧无虑的童年时光,这里给我留下了许多美好回忆.童年有很多值得怀念和留恋的回忆,其中六一儿童节是我童年记忆中最美好的节日.在六一儿童 ...

最新文章

  1. 关于JavaScript的闭包(closure)
  2. 盘点|最实用的机器学习算法优缺点分析,没有比这篇说得更好了
  3. java 分布式服务器通信,Pigeon是大众点评的一个分布式服务通信框架RPC
  4. 若依部署上线之后验证码不显示的解决方法之一
  5. 数据库建表练习(10.11作业)
  6. Android系统兼容性问题(持续更新)
  7. 参加东方道迩2010用户大会的归来总结
  8. atitit.提升软件开发的效率and 质量的那些强大概念and方法总结
  9. java实习日志_Java毕业生校外实习日记
  10. Android之QQ登录
  11. CDN在前端开发中的作用
  12. 关于sqoop抽取数据时显示ERROR :/QueryResult.java‘ already exists 解读
  13. linux的翻译系统开发,Linux下类似金山词霸的翻译软件
  14. 基于Lucas-Kanade算法的三维光流提取matlab仿真
  15. vmware安装vsp
  16. 进制在c语言中的作用,C语言中的进制关系
  17. java计算机毕业设计Vue框架龙猫宠物交易平台MyBatis+系统+LW文档+源码+调试部署
  18. 中国光伏建筑一体化(BIPV)行业发展趋势前瞻与四五战略规划研究报告2022-2028年
  19. 苹果原壁纸高清_2020苹果11月发布会邀请函壁纸-2020苹果11月发布会邀请函壁纸高清无水印预约 v1.0...
  20. Windows 10 企业版远程桌面连接CredSSP 加密数据库修正问题解决

热门文章

  1. Bootstrap3 源代码样式
  2. Bootstrap 标签和徽章
  3. Bootstrap 如何使用字体图标
  4. 计算机基础知识教程职称怎么计算,2017年职称计算机考试基础知识教程详解(二十一)...
  5. 计算机太卡了怎么解决,电脑太慢太卡怎么办,电脑太慢太卡解决方法
  6. 第二十二课php注入,php第二十三节课
  7. 【剑指offer】35、复杂链表的复制
  8. python 批量处理文件
  9. [Robot Framework] SikuliLibrary的关键字执行依赖java进程,但是上次的java进程如果没有杀掉,robot framework控制台的日志出不来,怎么办?...
  10. 关于使用rem单位,calc()进行自适应布局