Caffe 執行python實例並可視化


. 配置python

  安裝的python需要是 Anaconda2,啟動命令行執行如下安裝。

1.1.安裝 jupyter

pip install jupyter

1.2.安裝ipython ipython-notebook

conda install ipython ipython-notebook
  conda install python-matplotlib python-scipy python-pandas python-sympy python-nose

安裝完成后執行

jupyter notebook

1.3 重新編譯 pycaffe 庫,把編譯好的 build\x64\Release\pycaffe\caffe 拷貝到 C:\Anaconda2\Lib\site-packages即可,執行如下語句測試安裝是否通過

python

import caffe

2. 運行caffe的python版並可視化

2.1 獲取CaffeNet網絡並儲存到models/bvlc_reference_caffenet目錄下

cd caffe_windows
python ./scripts/download_model_binary.py models/bvlc_reference_caffenet

2.2 啟動ipython

cd ./python
ipython notebook

若啟動成功的話,將會彈出如下的窗口:

 

隨后單機“New” -> 選擇 “Python2”

會彈出如下所示的新建tab頁:

在輸入框中輸入如下python腳本:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# Make sure that caffe is on the python path:
caffe_root = '../'  
# this file is expected to be in {caffe_root}/examples
#這里注意路徑一定要設置正確,記得前后可能都有“/”,路徑的使用是
#{caffe_root}/examples,記得 caffe-root 中的 python 文件夾需要包括 caffe 文件夾。

#caffe_root = '/home/bids/caffer-root/' #為何設置為具體路徑反而不能運行呢

import sys
sys.path.insert(0, caffe_root + 'python')
import caffe #把 ipython 的路徑改到指定的地方(這里是說剛開始在終端輸入ipython notebook命令時,一定要確保是在包含caffe的python文件夾,這就是上面代碼(×)),以便可以調入 caffe 模塊,如果不改路徑,import 這個指令只會在當前目錄查找,是找不到 caffe 的。

plt.rcParams['figure.figsize'] = (10, 10)
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'
#顯示的圖表大小為 10,圖形的插值是以最近為原則,圖像顏色是灰色

import os
if not os.path.isfile(caffe_root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel'):
    print("Downloading pre-trained CaffeNet model...")
    !../scripts/download_model_binary.py ../models/bvlc_reference_caffenet

#設置網絡為測試階段,並加載網絡模型prototxt和數據平均值mean_npy

caffe.set_mode_cpu()# 采用CPU運算
net = caffe.Net(caffe_root + 'models/bvlc_reference_caffenet/deploy.prototxt',caffe_root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel',caffe.TEST)

# input preprocessing: 'data' is the name of the input blob == net.inputs[0]
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2,0,1))
transformer.set_mean('data', np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1)) 
# mean pixel,ImageNet的均值
transformer.set_raw_scale('data', 255) 
# the reference model operates on images in [0,255] range instead of [0,1]。參考模型運行在【0,255】的灰度,而不是【0,1】

transformer.set_channel_swap('data', (2,1,0))  

# the reference model has channels in BGR order instead of RGB,因為參考模型本來頻道是 BGR,所以要將RGB轉換

# set net to batch size of 50
net.blobs['data'].reshape(50,3,227,227)

#加載測試圖片,並預測分類結果。

net.blobs['data'].data[...] = transformer.preprocess('data', caffe.io.load_image(caffe_root + 'examples/images/cat.jpg'))
out = net.forward()
print("Predicted class is #{}.".format(out['prob'][0].argmax()))

plt.imshow(transformer.deprocess('data', net.blobs['data'].data[0]))
#plt.show()

# load labels,加載標簽,並輸出top_k
imagenet_labels_filename = caffe_root + 'data/ilsvrc12/synset_words.txt'
try:
    labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t')
except:
    !../data/ilsvrc12/get_ilsvrc_aux.sh
    labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t')
# sort top k predictions from softmax output

top_k = net.blobs['prob'].data[0].flatten().argsort()[-1:-6:-1]
print labels[top_k]


# CPU 與 GPU 比較運算時間
# CPU mode

net.forward()  # call once for allocation
%timeit net.forward()

# GPU mode
caffe.set_device(0)
caffe.set_mode_gpu()
net.forward()  # call once for allocation
%timeit net.forward()

#****提取特征並可視化****

# for each layer, show the output shape
for layer_name, blob in net.blobs.iteritems():
    print layer_name + '\t' + str(blob.data.shape)

#網絡的特征存儲在net.blobs,參數和bias存儲在net.params,以下代碼輸出每一層的名稱和大小。這里亦可手動把它們存儲下來。

[(k, v.data.shape) for k, v in net.blobs.items()]

#顯示出各層的參數和形狀,第一個是批次,第二個 feature map 數目,第三和第四是每個神經元中圖片的長和寬,可以看出,輸入是 227*227 的圖片,三個頻道,卷積是 32 個卷積核卷三個頻道,因此有 96 個 feature map

[(k, v[0].data.shape) for k, v in net.params.items()]
#輸出:一些網絡的參數

#**可視化的輔助函數**
# take an array of shape (n, height, width) or (n, height, width, channels)用一個格式是(數量,高,寬)或(數量,高,寬,頻道)的陣列
# and visualize each (height, width) thing in a grid of size approx. sqrt(n) by sqrt(n)每個可視化的都是在一個由一個個網格組成

def vis_square(data, padsize=1, padval=0):
    data -= data.min()
    data /= data.max()

    # force the number of filters to be square
    n = int(np.ceil(np.sqrt(data.shape[0])))
    padding = ((0, n ** 2 - data.shape[0]), (0, padsize), (0, padsize)) + ((0, 0),) * (data.ndim - 3)
    data = np.pad(data, padding, mode='constant', constant_values=(padval, padval))

    # tile the filters into an image
    data = 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)


#根據每一層的名稱,選擇需要可視化的層,可以可視化filter(參數)和output(特征)
# the parameters are a list of [weights, biases],各層的特征,第一個卷積層,共96個過濾器
filters = net.params['conv1'][0].data
vis_square(filters.transpose(0, 2, 3, 1))
#使用 ipt.show()觀看圖像
plt.show()
#顯示特征
filters_b = net.params['conv1'][1].data
print filters_b

#過濾后的輸出,96 張 featuremap
feat = net.blobs['conv1'].data[4, :96]
vis_square(feat, padval=1)
#使用 ipt.show()觀看圖像:
plt.show()
#顯示特征
filters_b = net.params['conv1'][1].data
print filters_b

feat = net.blobs['conv1'].data[0, :36]
vis_square(feat, padval=1)


#第二個卷積層:有 128 個濾波器,每個尺寸為 5X5X48。我們只顯示前面 48 個濾波器,每一個濾波器為一行。輸入:
filters = net.params['conv2'][0].data
vis_square(filters[:48].reshape(48**2, 5, 5))
#使用 ipt.show()觀看圖像:
plt.show()
#顯示特征
filters_b = net.params['conv2'][1].data
print filters_b

#第二層輸出 256 張 feature,這里顯示 36 張。輸入:
feat = net.blobs['conv2'].data[4, :36]
vis_square(feat, padval=1)
#使用 ipt.show()觀看圖像
plt.show()
#顯示特征
filters_b = net.params['conv2'][1].data
print filters_b

feat = net.blobs['conv2'].data[0, :36]
vis_square(feat, padval=1)

#第三個卷積層:全部 384 個 feature map,輸入:
feat = net.blobs['conv3'].data[4]
vis_square(feat, padval=0.5)
#使用 ipt.show()觀看圖像:
plt.show()

#第四個卷積層:全部 384 個 feature map,輸入:
feat = net.blobs['conv4'].data[4]
vis_square(feat, padval=0.5)
#使用 ipt.show()觀看圖像:
plt.show()

#第五個卷積層:全部 256 個 feature map,輸入:
feat = net.blobs['conv5'].data[4]
vis_square(feat, padval=0.5)
#使用 ipt.show()觀看圖像:
plt.show()

#第五個 pooling 層:我們也可以觀察 pooling 層,輸入:
feat = net.blobs['pool5'].data[4]
vis_square(feat, padval=1)
#使用 ipt.show()觀看圖像:
plt.show()

#用caffe 的python接口提取和保存特征比較方便。
features = net.blobs['conv5'].data  # 提取卷積層 5 的特征
np.savetxt('conv5_feature.txt', features, fmt='%s') # 將特征存儲到本文文件中


#然后我們看看第六層(第一個全連接層)輸出后的直方分布:
feat = net.blobs['fc6'].data[4]
plt.subplot(2, 1, 1)
plt.plot(feat.flat)
plt.subplot(2, 1, 2)
_ = plt.hist(feat.flat[feat.flat > 0], bins=100)
#使用 ipt.show()觀看圖像:
plt.show()

#第七層(第二個全連接層)輸出后的直方分布:可以看出值的分布沒有這么平均了。
feat = net.blobs['fc7'].data[4]
plt.subplot(2, 1, 1)
plt.plot(feat.flat)
plt.subplot(2, 1, 2)
_ = plt.hist(feat.flat[feat.flat > 0], bins=100)
#使用 ipt.show()觀看圖像:
plt.show()

#The final probability output, prob
feat = net.blobs['prob'].data[0]
plt.plot(feat.flat)


#最后看看標簽:Let's see the top 5 predicted labels.
# load labels
imagenet_labels_filename = caffe_root + 'data/ilsvrc12/synset_words.txt'
try:
    labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t')
except:
    !../data/ilsvrc12/get_ilsvrc_aux.sh
    labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t')

# sort top k predictions from softmax output
top_k = net.blobs['prob'].data[0].flatten().argsort()[-1:-6:-1]
print labels[top_k]

隨后點擊如下按鈕執行腳本:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2024 CODEPRJ.COM