1. “夢(mèng)回童年,盡享美食“-- AI 識(shí)別童年美食

        共 9783字,需瀏覽 20分鐘

         ·

        2021-06-01 08:10

        ?

        昨晚終于把憋了很久的 ModelArts + Wechaty 實(shí)現(xiàn)有趣的美食圖片識(shí)別應(yīng)用跑通了。盡管結(jié)合 Wechaty 調(diào)用 AI 相關(guān)服務(wù)在多年以前就被千人實(shí)現(xiàn)過了,不過作為小白的我能夠借助一站式AI開發(fā)平臺(tái) ModelArts 新手制作數(shù)據(jù)集、訓(xùn)練模型并部署,最終通過最好的微信開發(fā)庫(kù) Wechaty 實(shí)現(xiàn)調(diào)用 AI 服務(wù)的聊天小助手,還是十分有趣的。當(dāng)然,我也迫不及待地將我的實(shí)踐分享給大家,也希望能夠獲得各位大佬的指導(dǎo)!

        ?

        數(shù)據(jù)集制作

        我們從AI開發(fā)流程出發(fā),當(dāng)我確定了我的目的是要結(jié)合 ModelArts + Wechaty 來實(shí)現(xiàn)童年美食識(shí)別,基本上我的技術(shù)選型也就確定了,鑒于我學(xué)藝不精,零基礎(chǔ)都能上手的一站式AI開發(fā)平臺(tái)ModelArts和四行代碼就能實(shí)現(xiàn)聊天機(jī)器人的微信開發(fā)庫(kù) Wechaty,便成了我唯一的選擇。準(zhǔn)備數(shù)據(jù)的階段,我有幸遇到了前輩貢獻(xiàn)的代碼,因此能夠快速?gòu)哪扯葓D片獲取我想要的圖片,具體操作可以查看我的歷史文章《新手小白如何快速獲取數(shù)據(jù)集》。我用同樣的手法獲取到了菠蘿啤、大白兔奶糖、干脆面、果丹皮、漢堡橡皮糖、猴王丹、花生牛軋?zhí)恰⒔×?、酒心巧克力、烤紅薯、辣條、老冰棍、三色冰淇淋、沙琪瑪、跳跳糖、娃哈哈AD鈣、旺旺碎冰冰、旺仔牛奶、西瓜泡泡糖、仙貝、魚皮花生、玉米軟糖、真知棒、咪咪蝦條共24個(gè)分類,從7200張圖片中一張一張分揀,最終標(biāo)注3543張,實(shí)現(xiàn)了一個(gè)暫時(shí)看上去想那么回事的數(shù)據(jù)集--《"兒童節(jié)特輯"--8090的童年美食》。不過,目前從數(shù)據(jù)的標(biāo)簽分布來看,不太合理,被標(biāo)注最多的標(biāo)簽數(shù)量多達(dá)268個(gè),而被標(biāo)注最少的標(biāo)簽數(shù)量?jī)H23個(gè),兩者差了一個(gè)數(shù)量級(jí),因此訓(xùn)練出來的模型大概率會(huì)跑偏。

        在ModelArts上進(jìn)行數(shù)據(jù)標(biāo)注時(shí),其實(shí)也是有一定技巧的。比如,我在本地獲取到了大量的圖片,通過 OBS 的命令行工具上傳到 OBS 桶中之后,由于此次標(biāo)注是圖像分類,因此我在標(biāo)注時(shí)可以通過圖片存放的 OBS 目錄來快速篩選出當(dāng)前要分揀的標(biāo)簽以及進(jìn)行標(biāo)注。目前ModelArts數(shù)據(jù)集處理時(shí)單頁(yè)最多可顯示60張圖片,這也給我對(duì)圖片進(jìn)行精挑細(xì)選提供了強(qiáng)有力的支持。其次,在進(jìn)行圖片挑選時(shí),可以從最后一頁(yè)進(jìn)行,每次刪除圖片時(shí)順帶把源文件也從 OBS 中移除,移除往前直至處理到第一頁(yè)。最后,又可以全選當(dāng)前頁(yè)進(jìn)行標(biāo)注。整個(gè)數(shù)據(jù)集從數(shù)據(jù)獲取到數(shù)據(jù)處理再到數(shù)據(jù)集發(fā)布,花了不到2小時(shí),個(gè)人感覺對(duì)新手小白已經(jīng)很友好了!

        訓(xùn)練及評(píng)估模型

        如果您對(duì)《"兒童節(jié)特輯"--8090的童年美食》數(shù)據(jù)集感興趣,可以在 AI Gallery 進(jìn)行一鍵下載,既可以下載到 OBS 也也可直接下載到 ModelArts 數(shù)據(jù)集。

        基于數(shù)據(jù)集,在 ModelArts 平臺(tái)上除了可以自行開發(fā)算法并訓(xùn)練模型,也可以使用 AI Gallery 的訂閱算法或者直接使用 ModelArts 的自動(dòng)學(xué)習(xí)來訓(xùn)練模型。這里為了更簡(jiǎn)便的操作,本大獅就直接使用簡(jiǎn)單粗暴的自動(dòng)學(xué)習(xí)來實(shí)現(xiàn),主要想看到當(dāng)前的數(shù)據(jù)集能訓(xùn)練出怎么樣的結(jié)果(PS:其實(shí)主要是免費(fèi)「請(qǐng)把免費(fèi)打在評(píng)論區(qū)」),您期待嗎?

        在創(chuàng)建完自動(dòng)學(xué)習(xí)的任務(wù)運(yùn)行9分鐘之后,我 Get 到了一個(gè)模型,從訓(xùn)練結(jié)果來看還是非常理想的,不過究竟是騾子是馬,還得看最終部署之后的效果。

        表中是各個(gè)標(biāo)簽所對(duì)應(yīng)的參考值,其中F1值是模型精確率和召回率的加權(quán)調(diào)和平均,用于評(píng)價(jià)模型的好壞,當(dāng)F1值較高時(shí)說明模型效果較好;精確度指的是被模型預(yù)測(cè)為某個(gè)分類的所有樣本中,模型正確預(yù)測(cè)的樣本比率,反映模型對(duì)負(fù)樣本的區(qū)分能力;召回率指的是被用戶標(biāo)注為某個(gè)分類的所有樣本中,模型正確預(yù)測(cè)為該分類的樣本比率,反映模型對(duì)正樣本的識(shí)別能力。

        標(biāo)簽名F1值精確率召回率
        三色冰淇淋0.9330.8751.000
        仙貝0.9851.0000.971
        健力寶0.9571.0000.917
        咪咪蝦條0.9900.9801.000
        大白兔奶糖0.9860.9721.000
        娃哈哈AD鈣0.9770.9551.000
        干脆面0.9440.9190.971
        旺仔牛奶0.9710.9710.971
        旺旺碎冰冰1.0001.0001.000
        果丹皮0.9681.0000.938
        漢堡橡皮糖0.9711.0000.943
        沙琪瑪1.0001.0001.000
        烤紅薯0.9901.0000.981
        猴王丹1.0001.0001.000
        玉米軟糖0.9770.9561.000
        真知棒1.0001.0001.000
        老冰棍1.0001.0001.000
        花生牛軋?zhí)?/td>0.9470.9730.923
        菠蘿啤0.9871.0000.974
        西瓜泡泡糖0.9570.9171.000
        跳跳糖0.9331.0000.875
        辣條0.9690.9690.969
        酒心巧克力1.0001.0001.000
        魚皮花生0.9780.9571.000

        部署模型

        目前 ModelArts 支持一個(gè)免費(fèi)的部署服務(wù)實(shí)例,因?yàn)槲抑暗膶?shí)踐已經(jīng)占用了名額,因此當(dāng)我再次在自動(dòng)學(xué)習(xí)中部署模型時(shí)會(huì)提示以下圖中的報(bào)錯(cuò),從而我只能去到「部署在線--在線服務(wù)」手動(dòng)新建一個(gè)服務(wù)實(shí)例。

        在部署模型的時(shí)候,我們可以根據(jù)自身的需求添加一些個(gè)性化設(shè)置或者其他功能,比如數(shù)據(jù)采集、難例篩選等等。

        看到服務(wù)部署成功之后,我已經(jīng)迫不及待地想先調(diào)試一下,隨便找了一張「跳跳糖」的圖片,讓 AI 識(shí)別一下,哎呀還不錯(cuò)哦,感覺比我想象中的要好。ModelArts 的開發(fā)部分就告一段落,接著我們按照在線服務(wù)的調(diào)試指南進(jìn)行與 Wechaty 的聯(lián)合開發(fā),“Talk is cheap. Show me the code.”

        此時(shí),我們獲得的信息:AI 服務(wù)的在線地址以及file形式的輸入?yún)?shù)images。

        Wechaty 開發(fā)

        先看看我們最終的呈現(xiàn)效果,也就是像微信機(jī)器人發(fā)送指定關(guān)鍵字之后再發(fā)送圖片,微信機(jī)器人就會(huì)調(diào)用 ModelArts 的在線服務(wù)來識(shí)別圖片并將結(jié)果返回給微信端。這里我們就需要用到 Wechaty 這個(gè)強(qiáng)大的微信開發(fā)庫(kù)。關(guān)于 Wechaty 的詳細(xì)情況,您可以訪問 Wechaty 的官網(wǎng)了解--https://wechaty.js.org/。從域名來看,這個(gè)開發(fā)庫(kù)應(yīng)該和 JavaScript 有關(guān),經(jīng)過翻閱文檔,我得知,新手使用 Wechaty 僅需四行代碼:

        npm install qrcode-terminal --save
        npm install wechaty 
        npm install wechaty-puppet-wechat --save // 這個(gè)依賴是關(guān)鍵
        export WECHATY_PUPPET=wechaty-puppet-wechat // 這里也是關(guān)鍵,需要配置你使用的puppet

        我們可以新建一個(gè)文件夾,執(zhí)行npm init初始化一個(gè)項(xiàng)目,然后執(zhí)行上述代碼,接著新建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(`已開啟機(jī)器人自動(dòng)聊天模式`);
            //   }
            // 登陸后創(chuàng)建定時(shí)任務(wù)
            // await initDay();
        }

        //登出
        function onLogout(user) {
            console.log(`小助手${user} 已經(jīng)登出`);
        }

        bot.on('scan', onScan);
        bot.on('login', onLogin);
        bot.on('logout', onLogout);
        bot
            .start()
            .then(() => console.log('開始登陸微信'))
            .catch((e) => console.error(e));

        基本上就完成了 Wechaty 部分的開發(fā),執(zhí)行node index.js就能在控制臺(tái)顯示一個(gè)二維碼,其實(shí)類似我們登錄桌面端的微信,接著我們主要需要解決的問題:

        1. 監(jiān)聽微信消息 -- 可以使用 bot.on('message')來實(shí)現(xiàn);
        2. 對(duì)接 ModelArts -- 可以使用 token 鑒權(quán)方式訪問;
        3. 文件傳遞 -- 可以通過 form-data進(jìn)行數(shù)據(jù)轉(zhuǎn)換。

        基本代碼實(shí)現(xiàn)如下:


        // 獲取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
        }

        // 識(shí)別美食
        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

        如需體驗(yàn)可以添加我Hugi66并發(fā)送「food」, 也可以登錄 AI Gallery -- huaweicloud.ai聯(lián)系我,期待您的指導(dǎo)!


        點(diǎn)擊閱讀原文了解更多
        瀏覽 16
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 纲手好紧蕾丝内裤动态图小说 | 翔田千里一区二区在线 | 久久精品综合 | 麻豆国产91在线播放 | 少妇一级|