Caffe官方教程翻译(5):Classification: Instant Recognition with Caffe
前言
最近打算重新跟著官方教程學習一下caffe,順便也自己翻譯了一下官方的文檔。自己也做了一些標注,都用斜體標記出來了。中間可能額外還加了自己遇到的問題或是運行結果之類的。歡迎交流指正,拒絕噴子!
官方教程的原文鏈接:http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/00-classification.ipynb
Classification: Instant Recognition with Caffe
在這個例子中我們將會使用由官方提供的CaffeNet(該網絡結構由Krizhevsky提出)模型來進行圖片分類。后面我們會比對其在CPU和GPU模式下的性能,然后再深入剖析一下網絡的一些特征和輸出結果。
1.準備工作
- 首先要裝好python、numpy、matplotlib。
- 導入Caffe
- 如果有必要,請到網上下載我們要用到的模型(CaffeNet,AlexNet的一種變形)
2.導入網絡并設置預處理的輸入
- 把Caffe設置為CPU模式并從硬盤中導入網絡
- 設置輸入預處理。(我們要用到Caffe的caffe.io.Transformer,但是這一步與Caffe的其他部分是相互獨立的,所以任何浴池里代碼都可以適用)。
我們的CaffeNet默認獲取的圖像格式是BGR格式的。各像素的灰度值范圍是[0,255][0,255],并且每個像素都減去了IMageNet圖像的均值。另外,通道維數等于第一維(outermost)的大小。
由于matplotlib加載圖像的灰度值范圍是[0,1][0,1],而且是以RGB格式讀取圖像,通道維數等于innermost的維數,所以我們需要在這里對圖像格式做一下轉換。
補充:可能有人不太清楚innermost和outermost那段是什么意思。舉個例子會好理解一點:outermost:【3,255,255】;innermost:【255,255,3】,通道數是3,長和寬都是255。
# 導入ImageNet圖像的軍直觀,并減掉它 mu = np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy') mu = mu.mean(1).mean(1)# 求出對應BGR三個通道的像素均值 print 'mean-subtracted values:', zip('BGR', mu)# 對輸入數據進行轉換 transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})transformer.set_transpose('data', (2,0,1)) # 將通道置換,從innermost轉換成outermost transformer.set_mean('data', mu) # 在每個通道中減去數據集圖片的均值 transformer.set_raw_scale('data', 255) # 將圖像灰度值范圍從[0,1]轉換到[0,255] transformer.set_channel_swap('data', (2,1,0))# 交換通道,從RGB轉到BGR mean-subtracted values: [('B', 104.0069879317889), ('G', 116.66876761696767), ('R', 122.6789143406786)]3.使用CP模式行分類
- 現在我們已經準備好進行分類了。盡管我們一次只能分類一張圖片,我們會將batch_size設置為50,來進行演示。
- 加載一幅圖像(使用CaffeNet自帶的接口),并按照前面設置的方式進行圖像預處理。
補充:這里我們不妨停下來想想,讀入的圖像image和轉換的圖像transformed_image分別是BGR格式還是RGB格式?很簡單,讀入圖像image是RGB格式,轉換的圖像transformed_image是BGR格式。
- 卡哇伊!!!接下來開始分類。
- 這個網絡的結果輸出的是一堆概率值組成的向量;這里去的是其中概率最大的那個,也就是預測最有可能是第281類。但是這個真的是正確的嘛?讓我們看看ImageNet中的標簽…
- “Tabby cat”是正確的!但是讓我再看看其他的比較高概率的可能結果(盡管概率不是最高的)
- 好的,我們可以看出來,哪怕取那幾個概率較低的結果,也還是有一定的合理性的。
切換到GPU模式
- 讓我們看看分類花了多少時間,并將其與GPU模式下的用時對比。
- 嘛,還是要花一段時間的,即使batch只有50張圖片。讓我們切換到GPU模式。
- 快了很多!
測試中間層的輸出
- 這個網絡不只是一個黑盒子;讓我們看看這個網絡中的一些參數和中間輸出。
首先我們要看看如何根據每層的激活函數和參數的維數得到網絡的結構。 - 對于每一層來說,我們可以看看激活層的結構:[batch_size, channel_dim, height, width)。
激活層都由OrderedDict,net.blobs類型定義。
- 現在再來看看參數的shape。這些參數都是OrderedDict,net.params類型。我們需要根據索引來獲得參數:[0]對應權重,1對應偏置。
這些參數參數的shape為:(output_channels, input_channels, filter_height, filter_width)(權重參數),和只有1維的(output_channels,)(偏置參數)。
- 既然我們這里要處理的是四維的數據,那么我們可以定義一個幫助函數來可視化矩形熱圖。
- 首先我們看看第一層的濾波器,conv1
- 第一層的輸出,conv1(使用上面的濾波器提取特征后的結果,只取前36個)。
- 第五個卷積層再經過池化層的結果,pool5
- 第一個全連接層,fc6.
我們使用輸出值和正值的直方圖來顯示結果。
- 最后的概率輸出值,prob
注意到,預測的概率值比較高的幾個類都聚集在一起;標簽是根據語義進行劃分的。正如上圖所示,峰值對應這預測的最可能的結果。
使用自己的圖片進行測試
現在我們從網上下載一張圖片,并參照上面的步驟預測。
- 試著設置my_image_url為任何JPEG圖像的URL。
總結
以上是生活随笔為你收集整理的Caffe官方教程翻译(5):Classification: Instant Recognition with Caffe的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Caffe官方教程翻译(4):CIFAR
- 下一篇: Caffe官方教程翻译(6):Learn