人工智慧離前端並不遠 一步步教你開發一個機器學習APP(附原始碼)

lucas_580e331d326b4發表於2017-05-23

最近HBO電視網推出的美劇《矽谷Silicon Valley》席捲全球,裡面有一個橋段介紹了超級有趣的iOS app- Not Hotdog。你甚至可以在APP Store上下載到它。

是不是熱狗?

受啟發於此,我打算開發一個實現同樣功能的“機器人”:使用者只需要上傳任何一張圖片,馬上就可以得到反饋,告訴你這張圖片的內容是不是一個熱狗。最重要的是,我的程式碼全部以JS實現,是時候讓前端工程師們在人工智慧/機器學習領域大展身手了。

實現細節

這個APP以Twitter為宿主,基於Twitter Bot機器人:任何Twitter使用者都可以釋出一張圖片,並且在上傳描述文字中加入“@IsItAHotdog”,就能立即得到回覆。就像大陸常用的微博加入”#”描述符一樣簡單。

熱狗探測APP

千萬不要被表象所困擾,更不要被“人工智慧/機器學習”的標籤所迷惑。其實實現方式和原理非常簡單。

首先,我forked @BryanEBraun’s 的開源作品Twitter bot,它基於NodeJS,Twitter Bot譯為機器人:會定時發推,或隨機回覆。

官方介紹內容也非常簡潔明瞭:

This is a simple twitter bot, designed to retweet the contents of a twitter list.

藉助這個工具,接下來我的工作就是對提到”IsItAHotdog”的推文(即含有IsItAHotdog標籤),作出回應。

在安裝 tuiter NPM包之後,程式碼中引入依賴,並加入:

 var tu = require(`tuiter`)(config.keys);
 function listen() {    
    tu.filter({        
        track: `isitahotdog`    
    }, function(stream) {        
        console.log("listening to stream");
        stream.on(`tweet`, onTweet);
    })
}

當然,我們只對含有圖片的推文進行處理:

  if(tweet.entities.hasOwnProperty(`media`) && tweet.entities.media.length > 0)

最後,我們把結果寫進推文回覆中:

tu.update({
    status: "@" + tweet.user.screen_name + message,        
    in_reply_to_status_id: tweet.id_str    
}, onReTweet);

訓練模型

以上只是介紹了劫持推文,釋出回覆的內容。那麼回覆的結果應該怎麼獲得呢?我們怎麼知道圖片是不是熱狗呢?這就到了最重要的一步。

熟悉深度學習的朋友可能會了解,接下來我們可能需要收集圖片,並用Keras搭建CNN常用神經網路。其中Keras是一個相容Theano和Tensorflow的神經網路高階包, 高度模組化,用他來組建一個神經網路非常快速便捷。

這些內容可能中文資料並不多,僅有的一些如果大家感興趣的話,我推薦:

但是這些深度學習的內容,可能很多前端工程師並不是太瞭解,那麼我們就得重新修煉才能玩轉這一切嗎?

別急,現在就可以開始!這裡我給大家安利一下AWS Rekognition,我們的APP也是基於AWS Rekognition來完成。

Amazon Rekognition 是一種讓您能夠輕鬆為應用程式新增影像分析功能的服務。利用 Rekognition,您可以檢測物件、場景和麵孔,可以搜尋和比較面孔,還可以識別影像中的不當內容。藉助 Rekognition 的 API,您可以快速為應用程式新增基於深度學習的複雜視覺搜尋和影像分類功能。

換句話說,“不瞭解機器學習,簡單的呼叫幾個API都應該會吧。”

Amazon Rekognition基於同樣由Amazon計算機視覺科學家開發的成熟且高度可擴充套件的深度學習技術,每天能夠分析數十億張 Prime Photos 影像。

說到這裡可能有些繞,其實來看下程式碼,非常的簡單:

 var params = {
     Image: { 
         Bytes: body
     },
     MaxLabels: 20,
     MinConfidence: 70
 };
  
 rekognition.detectLabels(params, function(err, data) {
    if (err) console.log(err, err.stack); // an error occurred
    else {
        console.log(data);           // successful response
        var isItAHotdog = false;
        for (var label_index in data.Labels) {
            var label = data.Labels[label_index];
            if(label[`Name`] == "Hot Dog") {
               if(label[`Confidence`] > 85) {
                    isItAHotdog = true;
                    tweetBasedOnCategorization(tweet, true);
                }
            }
        }
        if(isItAHotdog == false) {
            tweetBasedOnCategorization(tweet, false);
        }
    }
});

我把推文附帶的圖片下載到自己的伺服器機器上,然後通過AWS Node SDK傳遞給Rekognition,並設定相應的引數,包括置信區間等。
最後,在回撥中獲得最終結果。

最終結果

讓我們來看一組測試結果吧:

測試

測試

這一切的開發過程都是非常的簡單,如果你想看到原始碼,我fork了一份,並加入了中文註解。請點選這裡檢視原始碼。

本文翻譯自Building Silicon Valley’s Hot Dog App in One Night,對於原文進行了部分擴充套件。

Happy Coding!

最後,可恥地做一波廣告:

受到gitChat的邀請,我要開分享了。形式類似知乎Live,但是這個平臺我感覺少了浮躁而更加專業。
主題內容為:面對前端六年曆史程式碼,如何接入並應用ES6解放開發效率

我邀請了資深前端專家,社群網紅@顏海鏡同我一起,詳情介紹點選這裡。

微信掃描下方二維碼,即可參加:

掃描此二維碼

內容介紹

PS: 作者Github倉庫,歡迎通過程式碼各種形式交流。

相關文章