刷劇不忘學CNN:TF+Keras識別辛普森一家人物
王小新 編譯自 Medium
量子位 出品 | 公眾號 QbitAI
Alexandre Attia是《辛普森一家》的狂熱粉絲。他看了一系列辛普森劇集,想建立一個能識別其中人物的神經網路。
接下來讓我們跟著他的文章來了解下該如何建立一個用於識別《辛普森一家》中各個角色的神經網路。
GIF/37K
要實現這個項目不是很困難,可能會比較耗時,因為需要手動標註每個人物的多張照片。
目前在網上沒有《辛普森一家》人物的訓練數據集,所以我正在標註各類圖片來構建訓練數據集。這個數據集的第一個版本已經掛在Kaggle上了,將持續進行更新,希望這個數據集能幫到大家。
在學了用TensorFlow構建不同項目後,我決定用Keras,因為它比TensorFlow更為簡單易上手,而且以TensorFlow作為後端,具有很強的兼容性。Keras是Francois Chollet用Python語言編寫的一個深度學習庫。
本文基於卷積神經網路(CNN)來完成此項目,CNN網路是一種能夠學習許多特徵的多層前饋神經網路。
準備數據集
該數據集目前有18類,有以下人物:Homer,Marge,Lisa,Bart,Burns,Grampa,Flanders,Moe,Krusty,Sideshow Bob,Skinner,Milhouse等。
我的目標是達到20類,當然類別越多越好。各類樣本的大小不一,圖片背景也不盡相同,主要是從第4至24季的劇集中提取出來的。
部分人物的圖片
在訓練集中,每個人物各大約包括1000個樣本(還在標註數據來達到這個數量)。每個人物不一定處於圖像中間,有時周圍還帶有其他人物。
人物的樣本量分布
通過label_data.py函數,我們可以從AVI電影中標註數據:得到裁剪後的圖片(左部分或右部分),或者完整版,然後僅需輸入人物名稱的一部分,如對Charles Montgomery Burns輸入burns。
添加數據時,我也使用了Keras模型。對視頻進行截圖,每一幀可轉化得到3張圖片,分別是左部分、右部分和完整版,然後通過編寫演算法來分類每張圖片。
之後,我檢查了此演算法的分類效果,雖然是手動的,但這是一個漸進的過程,速度將會不斷提升,特別是對出現頻率較低的小類別人物。
數據預處理
在預處理圖片時,第一步是調整樣本大小。為了節省數據內存,先將樣本轉換為float32類型,併除以255進行歸一化。
然後,使用Keras的自帶函數,將各類人物的標籤從名字轉換為數字,再利用one-hot編碼轉換成矢量:
進而,使用sklearn庫的train_test_split函數,將數據集分成訓練集和測試集。
構建模型
GIF/38K
現在讓我們開始進入最有趣的部分:定義網路模型。
首先,我們構建了一個前饋網路,包括4個帶有ReLU激活函數的卷積層和一個全連接的隱藏層(隨著數據量的增大,可能會進一步加深網路)。
這個模型與Keras文檔中的CIFAR示例模型比較相近,接下來還會使用更多數據對其他模型進行測試。我還在模型中加入了Dropout層來防止網路過擬合。在輸出層中,使用softmax函數來輸出各類的所屬概率。
損失函數為分類交叉熵(Categorical Cross Entropy)。優化器optimizer使用了隨機梯度下降中的RMS Prop方法,通過該權重臨近窗口的梯度平均值來確定該點的學習率。
訓練模型
這個模型在訓練集上迭代訓練了200次,其中批次大小為32。
由於目前的數據集樣本不多,我還用了數據增強操作,使用Keras庫可以很快地實現。
這實際上是對圖片進行一些隨機變化,如小角度旋轉和加雜訊等,所以輸入模型的樣本都不大相同。這有助於防止模型過擬合,提高模型的泛化能力。
在CPU上訓練模型時會耗費較長時間,所以我使用AWS EC2上的GPU資源:每次迭代需要8秒鐘,一共使用了20分鐘。在訓練深度學習模型時,這已經是較快了。
在200次迭代後,我們畫出了模型指標,可以看出性能已經較為穩定,沒有明顯的過擬合現象,且實際正確率較高。
訓練時驗證集和訓練集的損失值和正確率
評估模型
由於當前樣本量較小,所以很難得到準確的模型精度。但隨著訓練集樣本的增多,這將更貼近實際的模型性能。我們使用sklearn庫很快地輸出了各類的識別效果。
各類別的識別效果
從上圖可以看出,模型的正確率(f1-score)較高:除了Lisa,其餘各類的正確率都超過了80%。Lisa類的平均正確率為82%,可能是在樣本中Lisa與其他人物混在一起。
各類別的交叉關係圖
的確,Lisa樣本中經常帶有Bart,所以正確率較低可能受到Bart的影響。
添加閾值來提高正確率
為了提高模型正確率和減少召回率,我添加了一個閾值。
在討論閾值之前,先介紹下關於召回和正確率的關係圖。
召回和正確率的關係圖
現在統計下正確預測和錯誤預測的相關數據:最佳概率預測,兩個最相似人物的概率差和標準偏差STD。
正確預測:最大值為0.83,最優點概率差為0.773,STD值為0.21;
錯誤預測:最大值為0.27,最優點概率差為0.092,STD值為0.07。
如果人物1的預測正確率太低,預測人物2時標準偏差太高或是兩個最相似人物間的概率差太低,那麼可以認為網路沒有學習到這個人物。
因此,對兩個類別,繪製測試集的3個指標,希望找到一個超平面來分離正確預測和錯誤預測。
測試集中多個指標的散點圖
上圖中,想要通過直線或是設置閾值,來分離出正確預測和錯誤預測,這是不容易實現的。當然還可以看出,錯誤預測的樣本一般在圖表的左下方,但在這個位置也分布了很多正確預測樣本。如果設置了一個閾值(關於最相似人物間的概率差和概率),則實際召回率也會降低。
我們希望在提高準確性的同時,而不會很大程度上影響召回率,因此要為每個人物或是低正確率的人物(如Lisa Simpson)來繪製這些散點圖。
此外,對於沒有主角或是不存在人物的樣本,加入閾值後效果很好。目前我在模型中添加了一個「無人物」的類別,可以添加閾值來處理。我認為很難在最佳概率預測、概率差和標準偏差之間找到平衡點,所以我重點關注最佳預測概率。
關於最佳預測概率的召回率和正確率
在模型中,很難平衡好召回率與正確率之間的關係,同時也無法同時提高召回率和正確率。所以往往根據實際目標,來提高單個值。
對於預測類別的概率最小值,畫出F1-score、召回率和正確率來比較效果。
對於所有類別或特定類別,正確率、召回率和F1-score與預測類別概率最小值的關係
從圖10中看出,模型效果取決於不同人物。重點研究Lisa Simpson類別,為該類添加概率最小值0.2可能會提高效果,但是組合所有類別後,這個閾值並不完全適用。
所以考慮全局效果,對於預測類別的概率最小值,應該增加一個合適的閾值,且不能位於區間[0.2,0.4]內。
可視化預測人物
12個不同人物的實際類別和預測類別
在圖11中,用於分類人物的神經網路效果很好,故應用到視頻中實時預測。在實際中,每張圖片的預測時間不超過0.1s,可以做到每秒預測多幀。
※幻想AI自己打開黑箱?谷歌工程總監說:所謂解釋,全是編的
※第八冠!清華的三大超算競賽總冠軍獎盃又多了一個
※深度神經網路是否模擬了人類大腦皮層結構?
※一文看懂各種神經網路優化演算法:從梯度下降到Adam方法
※從0開始,手把手教你學會最火的神經網路
TAG:量子位 |
※東芝選用Cadence Tensilica Vision P6 DSP 提高ADAS晶元的圖像識別性能
※Adrian小哥教程:如何使用Tesseract和OpenCV執行OCR和文本識別
※西澳大學:NovelPerspective:人物視角識別
※Crunchfish & Nibiru 於MWC19發布手勢識別AR系統方案
※KITH 除了 NIKE 最近還和 Bergdorf Goodman聯名上了!識別度這麼高適合你嗎?
※iPhone Face ID與其他人臉識別技術有什麼不一樣?
※Science:南開大學曹雪濤團隊揭示hnRNPA2B1識別病毒DNA並促進IFN-α/β產生
※AI生萬物,視覺賦能:ArcSoft虹軟人臉識別SDK亮相GMIC
※12.7 VR掃描:《AstroBot Rescue Mission》獲TGA最佳VR遊戲大獎;蘋果公布AR識別新專利
※Valve 使用深度學習識別 CSGO 的作弊者;Android Studio 3.1 正式發布
※Apple Pencil 將可用在 iPhone上/OPPO 人臉識別技術或比 iPhone X 更高級
※新款iPad或搭載Face ID,採用3D人臉識別技術
※語音識別開源工具PyTorch-Kaldi:兼顧Kaldi效率與PyTorch靈活性
※IDEMIA基於生物識別和移動的CloudCard+解決方案榮獲JUNIPER research頒發的「最佳支付認證解決方案獎」
※語音識別+FaceID HomePod2有望趕超Alexa
※IBM CodePattern可創建自己的AI模型來識別對象
※Machine Learning(一):基於 TensorFlow 實現寵物血統智能識別
※遞歸皮層網路RCN識別文本CAPTCHAS的Science論文基礎知識和譯文
※Oculus CTO:在Oculus Quest探索手勢識別
※蘋果獲新 Face ID 專利,就連 MacBook 都能面部識別