【本期推薦】 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 的相關風險請自行評估。
1. 使用這種方式登錄微信存在被微信官方風控的可能性,嚴重者可封號;
2. 非所有賬號可使用此方案進行登錄/操作,如果您的賬號無法通過 Wechaty 提供的接口登錄,則無法使用。
獲取更多 AI 相關數據、算法、模型等 AI 資產,請點擊“瞭解更多”,AI Gallery等您!