【邊緣人福音】10 分鐘訓練 AI 圖像辨識,讓電腦陪你玩猜拳

【為什麼我們要挑選這篇文章】從小玩到大的猜拳遊戲,現在也能自己玩了!透過 TensorFlow.js  就能在 10 分鐘以內訓練你的電腦識別猜拳手勢 。(責任編輯:蕭信隆)

「《科技報橘》徵才中!跟我們一起定位台灣產業創新力 >> 詳細職缺訊息
快將你的履歷自傳寄至   [email protected]

「剪刀石頭布」是我們小時候經常玩的遊戲,日常生活中做一些糾結的決策,有時候也常常使用這種規則得出最後的選擇,我們人眼能很輕鬆地辨認這些手勢,「石頭」呈握拳狀,「布」掌心攤開,「剪刀」是伸出食指和中指,那如何讓機器識別這些手勢呢?

在沒有使用 TensorFlow.js 庫之前,如果讓我寫一個算法,要求可以根據手勢的圖像來確定它代表剪刀、石頭、布中的哪一個?這是電腦視覺領域(CV)典型的圖像分類任務,我可能需要經過謹慎思考,並花費很長的時間來完成算法編寫,其中包括數據圖像的採集、模型的訓練、參數的調整。

最終結果可能得經過分類模型(如:VGG、ResNet、ShuffleNet 等)的捲積層、全連結層,最終以機率的方式呈現,預期效果是達到了,在時間的花銷上有點大。

現在,給我 10 分鐘,還你一個訓練好的識別模型!在瀏覽器上使用 TensorFlow.js 可以很快完成這項需求。

鏡頭將通過快照功能將拍攝圖像轉換為 64×64 圖像並顯示辨別結果。

在線演示連結

完整代碼地址

基於 TensorFlow.js 實現的算法與正常的機器學習算法有什麼不同?又在哪些方面節省了時間?下面教學時間正式開始。

利用好這個網站

首先進入一個網站,可以節省很多時間,減輕一部分工作量。這個網站可以在自己電腦上使用瀏覽器訪問,它的運行速度取決於你所使用的電腦性能,與此同時,由於它使用了 TensorFlow.js 庫,這使得所有繁重的工作都可以在瀏覽器中用 JavaScript 來實現。

網站 連結

針對數據的操作

機器學習需要數據及用於訓練數據的模型架構, 經過一段時間的訓練後,模型可以智慧識別出新的代表剪刀、石頭、布手勢的圖像,基於 TensorFlow.js 庫的方法也需要數據做訓練,有了網站這個「利器」,數據從哪來呢?

數據從哪來?

這裡我們也需要一些代表剪刀、石頭、布手勢的圖像作為訓練數據,Laurence Moroney 提供了大量的優秀數據,我們只需要選擇其中一部分數據,不需要所有數據,使用它我們可以訓練一個基本模型。

資料庫連結地址

破解瀏覽器加載圖像的難題

在正常的機器學習工作流程中,我們只需要訪問文件可以實現提供數據的流程,也可以使用簡單的 glob 模組抓取文件夾,相比之下,如果在瀏覽器中加載一個 10 MB 大小的手勢圖像就會很困難。

幸好我們可以使用經典技巧將一組圖像傳輸到瀏覽器,那就是使用精靈表單(spritesheet):將一組圖像黏合成一個圖像,此時,圖像中每個像素都變成 1 像素高清圖像,我們將它們堆疊創建一個保存所有圖像的 10 MB 大小的大圖像。

將 2D 圖像放大為 1D 高清圖像的視覺化效果

Python 源代碼保存在對應項目的 spritemaker(精靈編輯器)文件夾中,因此,如果數據集不同而操作類似,則可以創建各自的精靈表單。

此時所有內容都合併為一個圖像,我們可以將圖像切片進行訓練和驗證。

在編寫完自己的精靈表單生成器並在「剪刀石頭布」數據集上運行,實現過程展示如下:

可以看到生成結果十分符合預期,經過轉換後的採集結果如下:

圖像收縮為 64*64 大小每個,共有 2520 個圖像,即成像為 4096*2520 像素

獲取瀏覽器訓練樣本

圖像數據集的處理到此已經完成,按下網站上的按鈕,信息將填充到 TFVIS 即 TensorFlow ,它基本上是一個小的投影片選單,可以幫助我們顯示訓練訊息。

歷時一秒鐘加載生成的大圖像並解析

通過使用 TensorFlow Visor,我們可以隨機展示來自資料庫的 42 個手勢圖像,並將其作為測試數據。數據雖然是 RGB 格式,但是通過使用 constants.js 模塊,可以將通道數減少到 1 並且選擇黑白顯示。

TensorFlow Visor 中隨機顯示的 42 個手勢圖像

選擇模型開始訓練

此外,側選單還顯示了模型層、未經訓練樣本的結果、訓練樣本的統計數據和訓練樣本的結果。接下來的兩個按鈕,你可以選擇建立模型的類型了,建立簡單模型還是複雜模型?

簡單還是複雜?

正如「To be or not to be?」這個哲學問題一樣,模型的選擇也是一大難題,你可能會想:「應該優先選擇最先進的模型」,這是一個常見陷阱。

如果選擇高級模型,首先,它需要花更長的時間訓練樣本甚至結果也沒有預想的那麼好用。此外,如果訓練時間過長,高級模型會出現過擬合數據的問題。(編按:過擬合(又稱過適)是模型在對訓練數據進行預測時變得非常完美,由於模型對於訓練數據過於符合,因此對於新數據而言反而並不適用)

一個好的機器學習模型可以概括為下圖:

使用一個複雜方程進行過擬合

我選擇建立了一個非常適合簡單數據的簡單模型,以及另一個對於來自多角度和復雜背景的手勢真實照片更有用的高級模型。

訓練過程

在訓練模型時,我們會獲得每批次更新的圖表,包括 512 個圖像,以及每個時期更新的另一張圖表,包括所有的 2100 個訓練圖像,一個健康的訓練迭代應具有損失減少,準確性提高等特徵。

精度圖中的橘色線表示驗證數據的準確度,即用訓練模型去預測剩餘的 420 個未訓練圖像時的準確度。我發現代表驗證數據的橘色線與訓練數據精度幾乎重合,這說明建立的模型可以廣泛推廣(只要新圖像的複雜性和風格與已知圖像相似)。

訓練結果

點擊「檢查訓練模型」,可以得到與預期相符結果如下:

上表顯示,代表剪刀手勢圖像的辨別十分準確,辨別準確性最低的是代表布的手勢圖像,其準確度只有 95 %,你的結果可能和本文結果略有不同,這是由初始訓練數據的隨機性導致的。

為進一步挖掘具體原因,我做出如下混淆矩陣:

與預期相符的混淆矩陣

從圖中我們可以發現代表布的手勢被錯誤地辨別為代表剪刀的手勢 6 次,這種錯誤很容易理解,因為代表布的手勢有時候看起來與代表剪刀的手勢很像,我們可以選擇接受這種錯誤或訓練更多樣本來改進錯誤,上述混淆矩陣可以幫助我們找出需要改進的錯誤所在。

模型測試

現在終於可以在現實世界中測試我們的模型了,我們使用網絡鏡頭檢查自己做出的代表石頭剪刀布的手勢圖像。需要注意的是我們的手勢圖像應與訓練圖像類似,沒有旋轉角度且背景為白色,便於模型進行識別。

到這你已經可以在瀏覽器中訓練模型並進行了驗證,並進一步實現了現場測試,現在你可以給自己拍拍手了,恭喜你完成了所有的步驟。

(本文經合作夥伴 大數據文摘 授權轉載,並同意 TechOrange 編寫導讀與修訂標題,原文標題為 〈10 分钟,用 TensorFlow.js 库,训练一个没有感情的“剪刀石头布”识别器  〉。首圖來源: pexels

延伸閱讀

【機器學習懶人包】從數據分析到模型整合,各種好用的演算法全都整理給你啦!博士生教你用機器學習挑西瓜!130 頁論文讀完就能選到好瓜嗎? 給自學機器學習的工程師:沒有學歷光環卻想找到工作,千萬注意履歷十大雷區!

我們正在找夥伴!

2019 年我們的團隊正在大舉擴張,需要你的加入跟我們一起找出台灣創新原動力! 我們正在徵 《採訪社群編輯》、《助理編輯》,詳細職缺與應徵辦法 請點我

點關鍵字看更多相關文章: