日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > Caffe >内容正文

Caffe

Caffe官方教程翻译(5):Classification: Instant Recognition with Caffe

發布時間:2025/3/21 Caffe 72 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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。
# 安裝好Python環境:numpy用于數值計算用途,matplotlib用于畫圖 import numpy as np import matplotlib.pyplot as plt # display plots in this notebook %matplotlib inline# 設置默認顯示參數 plt.rcParams['figure.figsize'] = (10,10) # large images plt.rcParams['image.interpolation'] = 'nearest' # don't interpolate: show square pixels plt.rcParams['image.cmap'] = 'gray' # use grayscale output rather than a (potentially misleading) color heatmap
  • 導入Caffe
# Caffe需要保證在Python路徑中,這里我們直接將它添加進Python路徑 import sys# caffe_root = '../' # 這個文件應該從{caffe_root}/examples運行(也可自行修改這一行代碼) caffe_root = '/home/xhb/caffe/caffe/' sys.path.insert(0, caffe_root + 'python')import caffe # 如果你遇到報錯:"No module named _caffe",要不就是沒有編譯pycaffe,要不就是路徑寫錯了
  • 如果有必要,請到網上下載我們要用到的模型(CaffeNetAlexNet的一種變形)
import os if os.path.isfile(caffe_root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel'):print 'CaffeNet found.' else:print 'Downloading pre-trained CaffeNet model...'!../scripts/download_model_binary.py ../models/bvlc_reference_caffenet CaffeNet found.

2.導入網絡并設置預處理的輸入

  • 把Caffe設置為CPU模式并從硬盤中導入網絡
caffe.set_mode_cpu()model_def = caffe_root + 'models/bvlc_reference_caffenet/deploy.prototxt' model_weights = caffe_root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel'net = caffe.Net(model_def, # 定義了整個模型的結構model_weights, # 包含了訓練好的權重參數caffe.TEST) # 使用測試模式 (舉例來說, 不執行dropout)
  • 設置輸入預處理。(我們要用到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,來進行演示。
# 設置輸入圖像的大小(如果覺得默認設置就可以,完全可以跳過這一步;當然也可以等會再改它,比如修改成不同的batch_size) net.blobs['data'].reshape(50, # batch size3, # 3-channels(BGR)227, 227) # 圖像大小:227 × 227
  • 加載一幅圖像(使用CaffeNet自帶的接口),并按照前面設置的方式進行圖像預處理。
image = caffe.io.load_image(caffe_root + 'examples/images/cat.jpg') transformed_image = transformer.preprocess('data', image) plt.imshow(image) <matplotlib.image.AxesImage at 0x7fa1301c4350>

補充:這里我們不妨停下來想想,讀入的圖像image和轉換的圖像transformed_image分別是BGR格式還是RGB格式?很簡單,讀入圖像image是RGB格式,轉換的圖像transformed_image是BGR格式。

  • 卡哇伊!!!接下來開始分類。
# 把圖像數據拷貝到為net分配好的內存當中 net.blobs['data'].data[...] = transformed_image# 進行分類 output = net.forward()output_prob = output['prob'][0] # batch中第一張圖像的輸出概率向量 print 'predicted class is:', output_prob.argmax() predicted class is: 281
  • 這個網絡的結果輸出的是一堆概率值組成的向量;這里去的是其中概率最大的那個,也就是預測最有可能是第281類。但是這個真的是正確的嘛?讓我們看看ImageNet中的標簽…
# 導入ImageNet的標簽 labels_file = caffe_root + 'data/ilsvrc12/synset_words.txt' if not os.path.exists(labels_file):!../data/ilsvrc12/get_ilsvrc_aux.shlabels = np.loadtxt(labels_file, str, delimiter='\t')print 'output label:', labels[output_prob.argmax()] output label: n02123045 tabby, tabby cat
  • “Tabby cat”是正確的!但是讓我再看看其他的比較高概率的可能結果(盡管概率不是最高的)
# 從softmax輸出取出概率值最高的前五項 top_inds = output_prob.argsort()[::-1][:5] # 顛倒sort后的結果,并取最大的5個print 'probabilities and labels:' zip(output_prob[top_inds], labels[top_inds]) probabilities and labels: [(0.31243622, 'n02123045 tabby, tabby cat'),(0.23797178, 'n02123159 tiger cat'),(0.12387244, 'n02124075 Egyptian cat'),(0.10075705, 'n02119022 red fox, Vulpes vulpes'),(0.070957385, 'n02127052 lynx, catamount')]
  • 好的,我們可以看出來,哪怕取那幾個概率較低的結果,也還是有一定的合理性的。

切換到GPU模式

  • 讓我們看看分類花了多少時間,并將其與GPU模式下的用時對比。
%timeit net.forward() 1 loop, best of 3: 5.24 s per loop
  • 嘛,還是要花一段時間的,即使batch只有50張圖片。讓我們切換到GPU模式。
caffe.set_device(0) # 如果我們有多個GPU,選取第一個 caffe.set_mode_gpu() net.forward() # 在開始計時前先跑一次 %timeit net.forward() 10 loops, best of 3: 30.4 ms per loop
  • 快了很多!

測試中間層的輸出

  • 這個網絡不只是一個黑盒子;讓我們看看這個網絡中的一些參數和中間輸出。
    首先我們要看看如何根據每層的激活函數和參數的維數得到網絡的結構。
  • 對于每一層來說,我們可以看看激活層的結構:[batch_size, channel_dim, height, width)。
    激活層都由OrderedDict,net.blobs類型定義。
# 每一層都打印出輸出的shape for layer_name, blob in net.blobs.iteritems():print layer_name + '\t' + str(blob.data.shape) data (50, 3, 227, 227) conv1 (50, 96, 55, 55) pool1 (50, 96, 27, 27) norm1 (50, 96, 27, 27) conv2 (50, 256, 27, 27) pool2 (50, 256, 13, 13) norm2 (50, 256, 13, 13) conv3 (50, 384, 13, 13) conv4 (50, 384, 13, 13) conv5 (50, 256, 13, 13) pool5 (50, 256, 6, 6) fc6 (50, 4096) fc7 (50, 4096) fc8 (50, 1000) prob (50, 1000)
  • 現在再來看看參數的shape。這些參數都是OrderedDict,net.params類型。我們需要根據索引來獲得參數:[0]對應權重,1對應偏置。
    這些參數參數的shape為:(output_channels, input_channels, filter_height, filter_width)(權重參數),和只有1維的(output_channels,)(偏置參數)。
for layer_name, param in net.params.iteritems():print layer_name + '\t' + str(param[0].data.shape), str(param[1].data.shape) conv1 (96, 3, 11, 11) (96,) conv2 (256, 48, 5, 5) (256,) conv3 (384, 256, 3, 3) (384,) conv4 (384, 192, 3, 3) (384,) conv5 (256, 192, 3, 3) (256,) fc6 (4096, 9216) (4096,) fc7 (4096, 4096) (4096,) fc8 (1000, 4096) (1000,)
  • 既然我們這里要處理的是四維的數據,那么我們可以定義一個幫助函數來可視化矩形熱圖。
def vis_square(data):"""Take an array of shape (n, height, width) or (n, height, width, 3)and visualize each (height, width) thing in a grid of size approx. sqrt(n) by sqrt(n)"""# 歸一化data = (data - data.min()) / (data.max() - data.min())# 將濾波器的核轉變為正方形n = int(np.ceil(np.sqrt(data.shape[0])))padding = (((0, n ** 2 - data.shape[0]),(0, 1), (0, 1)) # add some space between filters+ ((0, 0),) * (data.ndim - 3)) # don't pad the last dimension (if there is one)data = np.pad(data, padding, mode='constant', constant_values=1) # pad with ones (white)# tile the filters into an imagedata = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1)))data = data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:])plt.imshow(data); plt.axis('off')
  • 首先我們看看第一層的濾波器,conv1
# 參數列表是:[wights, bias] filters = net.params['conv1'][0].data vis_square(filters.transpose(0,2,3,1))

  • 第一層的輸出,conv1(使用上面的濾波器提取特征后的結果,只取前36個)。
feat = net.blobs['conv1'].data[0, :36] vis_square(feat)

  • 第五個卷積層再經過池化層的結果,pool5
feat = net.blobs['pool5'].data[0] vis_square(feat)

  • 第一個全連接層,fc6.
    我們使用輸出值和正值的直方圖來顯示結果。
feat = net.blobs['fc6'].data[0] plt.subplot(2,1,1) plt.plot(feat.flat) plt.subplot(2,1,2) _ = plt.hist(feat.flat[feat.flat>0], bins=100)

  • 最后的概率輸出值,prob
feat = net.blobs['prob'].data[0] plt.figure(figsize=(15, 3)) plt.plot(feat.flat) [<matplotlib.lines.Line2D at 0x7fa12c7b5450>]

注意到,預測的概率值比較高的幾個類都聚集在一起;標簽是根據語義進行劃分的。正如上圖所示,峰值對應這預測的最可能的結果。

使用自己的圖片進行測試

現在我們從網上下載一張圖片,并參照上面的步驟預測。
- 試著設置my_image_url為任何JPEG圖像的URL。

# my_image_url = 'https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1519724702&di=786bcee6e93db5cd810cd62ec68ce058&src=http://imgsrc.baidu.com/imgad/pic/item/29381f30e924b899024e2a0265061d950a7bf69e.jpg' # !wget -O image.jpg $my_image_url# 注:這里我是直接下載好了圖片,再導入的。換湯不換藥。 image = caffe.io.load_image('cat.jpg') net.blobs['data'].data[...] = transformer.preprocess('data', image)net.forward()output_prob = net.blobs['prob'].data[0]top_inds = output_prob.argsort()[::-1][:5]plt.imshow(image)print 'probabilities and labels:' zip(output_prob[top_inds], labels[top_inds]) probabilities and labels: [(0.52841139, 'n02124075 Egyptian cat'),(0.20741074, 'n02123045 tabby, tabby cat'),(0.20226726, 'n02123159 tiger cat'),(0.055884782, 'n02127052 lynx, catamount'),(0.0017415404,'n02125311 cougar, puma, catamount, mountain lion, painter, panther, Felis concolor')]

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Caffe官方教程翻译(5):Classification: Instant Recognition with Caffe的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。