當前位置:
首頁 > 科技 > 目標識別很難?對於Google卷積神經網路不過是小case

目標識別很難?對於Google卷積神經網路不過是小case

GIF/1.7M

原文來源:medium

作者:William Koehrsen

「機器人圈」編譯:嗯~阿童木呀

使用Google預訓練的Inception CNN模型進行圖像分類

現如今,可以說卷積神經網路是應用於圖像識別領域最先進的一種技術,即識別圖像中的人或汽車等目標。對於人類來說,可以很輕鬆地完成目標識別的任務,但是想要使用機器演算法實現這一過程卻是十分困難的,直到卷積神經網路的出現(從1998年開始開發LeNet-5),這一由來已久的狀況開始有所好轉。但在這看似具有挑戰性的任務中,即使最好的計算機也並不是適用於所有人的。而從CNN設計的最新進展中可以看到,尤其是得益於廉價計算能力和諸如初始模塊和跳過連接等增強技術的可用性,具有更多層的更具深度的模型已經創建了在目標識別中能夠與人類準確性相抗衡的模型。此外,CNN已隨時準備要在自動駕駛以至醫學成像評估(這是一個電腦已經超越人類的領域)等領域產生具有實際價值的影響。然而,訓練卷積神經網路,特別是實現用於更新模型參數的反向傳播方法(backpropagation method),代價是非常昂貴的。一般來說,訓練數據(標記圖像)的數量越多,網路越深,訓練時間就越長。降低網路深度或減少訓練數據量都是不可取的,因為任何機器學習系統的性能與高質量訓練樣本的數量是直接相關的,而不是說網路越深(達到某一上限)表現就更好。而諸如dropout或批量歸一化等附加的性能增強技術,在提高性能的同時也增加了計算時間。可以說,用一台個人計算機在數以萬計的標籤圖像上適當地訓練有用的圖像識別網路可能需要花費幾個月或更長的時間。此外,如果想要開發正確的架構並選擇最佳超參數則需要對網路進行數百或數千次的訓練,這就意味著如果我們將自己限於只用筆記本電腦來進行項目運行的話,我們最好準備:這個項目可能會需要幾十年的時間。幸運的是,Google不僅開發了一系列圖像分類理想架構的迭代(在2014年,GoogLeNet贏得了Imagenet大型視覺識別挑戰(Imagenet Large Scale Visual Recognition Challenge),其中模型必須識別1000個不同類別的目標),而且還發布了在跨越1000個類別的120萬張圖像中進行訓練的模型。這意味著,我們可以使用Google預先訓練的模型來進行高精度的目標識別,而不用在訓練周期之後建立自己的網路,且不用等待遙遙無期的訓練周期。

Inception神經網路

Google擁有大量可用於TensorFlow的神經網路模型。在這裡我們將使用的兩個模型是Inception-v3和Inception-v4。

基本inception CNN架構

它們都使用了inception模塊,這些模塊採用不同大小的卷積內核,並在深度維度上疊加它們的輸出,以捕獲不同尺度上的特性。

Inception模塊

兩個網路還借用了一個帶有跳過連接的殘差網路(residual network)的概念,即將輸入添加到輸出中,使得模型被強制地預測殘差而不是目標本身。

通常用於殘差網路的跳過連接操作

使用該架構,incepv4能夠在Imagenet數據集上實現80.2%的最高精度和95.2%的前5精度,或者換句話說,該網路只需要原時間的4/5就可以在圖像中確定目標,且能夠在前五名的概率輸出中將正確預測率提高19/20倍。Google開發的其他模型(特別是Inception-ResNet-v2)的運行效果更好,但Inception-v3和-v4網路仍然處於領先地位。

檢索預訓練模型

如果你想要獲取適當的Python庫,請訪問tensorflow / models GitHub資源庫並下載或複製相關的代碼資源。我們將要做的所有工作都應該在the slim library中運行,所以你需要導航到該文件夾,並在其中創建一個新的Python腳本或Jupyter Notebook。下一步是下載Inception網路的最新檢查點。模型列表可以在tensorflow /models Git Hub上找到。如果想要下載不同的模型,只需用你選擇的架構替換「inception_v3_2016_08_28.tar.gz」(其他代碼可能也需要做相應的修改)。

用於處理圖像

既然現在我們已經下載了這些模型,我們需要一種方法來確保這些用於網路中的圖像具有正確的配置。Imagenet圖像全部為299像素×299像素(高x寬)×3色通道(紅-綠-藍)。因此,我們通過網路發送的任何圖像都必須使用相同的格式。Inception網路也期望將圖像縮放在0和1之間,這意味著像素值需要除以255(顏色的最大強度值)。雖然這是相對簡單的,但在我們正在工作的the slim library中,預處理目錄中的inception_preprocessing.py腳本中已經含有一個內置的圖片處理函數。此函數將圖像作為像素值的一個三維數組,並返回正確格式化的數組以供Inception網路進行評估。它還具有許多其他功能用於訓練,例如移動或改變圖像,使得網路能夠維持圖像各個方面的不變性(例如方向),從而不影響圖像中的目標。該技術也可以用於增加一個小的數據集,其中涵蓋那些已經被移位,縮放或旋轉的每個圖像的副本。我們將通過is_training = False傳入,從而使圖像將被處理用於評估,且只能調整其大小。

我們應該將要進行分類的圖像應放置在一個新的圖像目錄中,該文件夾位於slim文件夾(或更改上述代碼中的root_dir)。現在,我們將堅持使用jpg和png圖像,儘管其他格式也可以進行處理。為了生成正確的圖像,我們創建一個TensorFlow會話來運行TensorFlow操作。我們返回的是原始圖像以便我們可以對其進行相關繪製,以及那些格式為[batch_size,height,width,color_channels]的已處理圖像。

顯示示例圖像

我們可以下載我們想要的任何圖像,並將其放在images目錄中。但是,為了使網路能夠有更正以至正確的機會,我們將需要ImageNet數據集中所包含的圖像。可以在這裡找到包含1000個類的完整列表。(當網路用於is_training = False評估時,它將有1001個類,因為它添加了一個額外的「背景」類別。)選擇幾個圖像並將其下載到images目錄。當然,如果圖像是閉合的,並在中心顯示目標,那將再好不過了。我們可以先編寫一個小函數,使用matplotlib.pyplot繪製圖形,然後使用%matplotlib內置magic函數在Jupyter Notebook中顯示繪製圖。

野牛的原始形象

我們還可以檢查原始圖像和已處理圖像的大小:

在面對類似於該圖像的情況下,由於原始尺寸太小,預處理函數通過在現有像素值之間進行插值來增加額外的像素。而結果就是,這將導致一個不明顯影響CNN性能的模糊圖像。

還有一個有趣的圖像:

帽子的原始形象

圖像識別

這個項目的核心是預測圖片的類別。既然現在我們已有幾個圖像(當然,你可以隨意收集你想要的圖像數量),其實,觀察CNN對那些在訓練過程中看不到的圖像類別進行「猜想」是很有趣的。我們將會編寫一個函數,用圖像和要使用的CNN的版本(目前僅限於Inception架構,「V3」或「V4」)進行命名,繪製原始圖像,並顯示圖形下方的前10個預測。

代碼相對簡單。我們課根據模型來應用正確的參數範圍和函數。(請注意,我們需要將類的數量設置為1001,is_training = False。)在使用inception_v3函數(或inception_v4)構建TensorFlow計算圖之後,我們需創建一個TensorFlow會話,以通過網路填充圖像。我們使用一個保護程序恢復我們之前下載的模型權重。該圖返回了來自網路的未分級輸出的邏輯,以及通過softmax激活函數傳遞邏輯的結果以及概率。在我們得到預測之後,我們創建一個具有預測索引和相關概率的元組列表。然後,我們按概率對這些元組進行排序,並根據網路概率排名列印出前10名的類別名稱。

預測結果

這裡有幾個典型的結果。

Inception_v3的預測結果非常好!我們來看看v4預測:

可以看到,兩個模型是一致的。我會給模型一些更容易的圖片。

有趣的是,CNN不僅要做出正確的預測,還要注意其他潛在的備選。這裡的第二個選擇至少是有意義的,但其他的一些似乎已經已經過於偏離(概率非常小,並且使用的是小數點後兩位數)。

這些結果印象深刻。我認為,我所選擇的所有圖像都比較容易識別,並且突出顯示那些有趣的對象,而這兩個條件都不可能在現實世界中進行複製。在現實中,時間不會停留,一個場景中可能會有成千上百個的不同對象需要識別(且認為我們是連續進行此操作,沒有中斷)。儘管如此,卻不得不承認,這個網路是一個很好的開端,即使是面對的是一個複雜的圖像,我們也可以獲得準確的結果:

我們對該網路進行設計和訓練,以便能夠識別每個圖像中的一個圖像類別,這是它是非常適合的任務。但是,如果我們在一張圖片中引入更多的元素,那麼預測就會開始崩潰。

在組合中有一些很好的預測,但總體而言,該模型已淹沒於雜訊之中。神經網路也可以應用於多標籤分類,例如上面的示例,在許多不同類中存在對象。

該模型也含有局限性,因為它只接受了1000個類的訓練。如果圖像不在這些類中,那麼我們就不那麼走運了。它會給出最好的猜測,但是我們需要自己來訓練,以擴展其能力。

就網路而言,它以前從未見過長頸鹿,所以一定不會對有這樣的事情有印象。但是,我們要向網路展示許多標記長頸鹿的樣本圖像,那麼很快該網路就會擅長識別它們。

下一步

目前,我們僅限於網路所學習的1000個類別。如果我們想擴大圖片的範圍,那麼我們將需要更多的數據。特別是,如果我們希望網路能夠學習如何識別一個對象,那麼我們需要數百個標有這個類的圖像。CNN是最先進的技術,但最終,它們依靠數以百萬計的圖像,而這些圖像需要花費數千個小時的人工手工標註。幸運的是,這個訓練數據只需要準備一次,然後就可以重新使用了。也許我們很快就能在沒有任何人類參與的情況下,在那些已經被更強大的網路標記的圖像上進行更弱的CNN訓練(儘管我們可能還要擔心Nick Bostrom所討論的超智能AI)。為了在我們自己的數據上訓練模型,我們將在輸出之前至少解凍一層(為了調整模型與我們的數據相均衡),並添加一個具有正確類數量的新輸出層。在這個例子中,我們可以採取一些額外的步驟,例如在圖像上繪製標籤框,或使用TensorBoard可視化一些模型,從而加深對模型的了解與認知。這個演示可能沒有任何實際效用,但它表明了DRY的基本編程原則:不要重複自己。當你想建立自己的目標識別系統時,你的第一句話不應該是「我將如何開始」,而是「是誰開發了一個我可以對其進行改進的模型」?在這種思維方式下,你可以自由地使用,傳播,分享,最重要的是改進代碼!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器人圈 的精彩文章:

強化學習的福音!自然語言幫助互動式機器學習演算法提高效率
fastText、TextCNN這有一套NLP文本分類方法庫
2017中國增材製造大會暨展覽會在杭州開幕
突破機器學習計算瓶頸,看神經元硬體如何提高神經網路魯棒性!
那個懟小扎的「鋼鐵俠」,到底懂不懂AI?

TAG:機器人圈 |

您可能感興趣

使用Google Colaboratory訓練神經網路
人人都能讀懂卷積神經網路:Convolutional Networks for everyone
Google論文解讀:輕量化卷積神經網路MobileNetV2
壟斷者:Google、Salesforce們的網路效應
Ian Goodfellow 最新論文:神經網路也能 Debug
由Facebook/Cambridge Analytica 醜聞看網路風險
用Tensorflow搭建卷積神經網路
自動給神經網路找bug,Google發布TensorFuzz
神經網路在客戶分層上的應用—Autoencoder
Kubernetes中Node的網路重啟後,所有Pod無法訪問的調查過程
You Are Wanted網路尋凶
AdaptiveMobile在五大洲都檢測到針對信令網路的複雜攻擊
簡單組網,輕鬆消滅家庭網路死角,Linksys Velop雙頻Mesh路由器測評
Facebook透露內部Fabric Aggregator分散式網路系統設計
網路專家解讀YouTube,Twitter或Reddit的盈利模式
Google Cast功能導致路由器網路連接中斷是真的嗎
押注側鏈與閃電網路,「Blockstream」想改善比特幣的未來
比特幣閃電網路第一個Android用戶手機錢包應用程序在Google Play推出
來自Google DeepMind神經網路具有驚人的場景渲染技巧
Ian Goodfellow等人提出對抗重編程,讓神經網路執行其他任務