Caffe學(xué)習(xí)筆記1:用訓(xùn)練好的mnist模型進(jìn)行預(yù)測(兩種方法)

caffe的mnist訓(xùn)練起來挺方便酌媒,但是怎么進(jìn)行預(yù)測呢?

參考:

http://blog.csdn.net/l691899397/article/details/52233454
http://www.reibang.com/p/9644f7ec0a03
http://www.reibang.com/p/9e30328a0a71

理論可以參考一下第一個(gè)博客迄靠,也可以看看論文秒咨。

我認(rèn)為進(jìn)行預(yù)測兩個(gè)關(guān)鍵的步驟是:1.加載訓(xùn)練好的caffemodel和模型描述文件deploy 2.是把要預(yù)測的圖片正確的導(dǎo)入,這需要理解caffe的Blob掌挚。下面進(jìn)入正題:

一.建立模型描述文件

讀了caffe的整體框架(本新只看了整體框架雨席,對(duì)于源代碼看的不深入)了解caffe極度模塊化,便于閱讀和理解吠式,對(duì)于整個(gè)神經(jīng)網(wǎng)絡(luò)的編寫都快接近可視化了陡厘。我的代碼在我的github上下載

https://github.com/zefan7564/caffe

下面是我進(jìn)行預(yù)測的網(wǎng)絡(luò)層。

name: "LeNet"
layer {
  name: "data"
  type: "Input"
  top: "data"
  input_param { shape: { dim: 1 dim: 1 dim: 28 dim: 28 } }
}
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 20
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
layer {
  name: "conv2"
  type: "Convolution"
  bottom: "pool1"
  top: "conv2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 50
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "pool2"
  type: "Pooling"
  bottom: "conv2"
  top: "pool2"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
layer {
  name: "ip1"
  type: "InnerProduct"
  bottom: "pool2"
  top: "ip1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 500
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "ip1"
  top: "ip1"
}
layer {
  name: "ip2"
  type: "InnerProduct"
  bottom: "ip1"
  top: "ip2"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  inner_product_param {
    num_output: 10
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "prob"
  type: "Softmax"
  bottom: "ip2"
  top: "prob"
}

值得注意的是

layer {
  name: "data"
  type: "Input"
  top: "data"
  input_param { shape: { dim: 1 dim: 1 dim: 28 dim: 28 } }
}

因?yàn)閏affe的數(shù)據(jù)格式是四維數(shù)組特占,[num,channel,weight,high],因此這樣設(shè)計(jì)數(shù)據(jù)層糙置。接著是最后一個(gè)層prob,與訓(xùn)練時(shí)不同是目。它只需要前向傳播罢低,輸出數(shù)據(jù)。因此不需要loss層和accuracy層。
然后是圖像預(yù)處理減去均值网持,這樣在訓(xùn)練和預(yù)測都能提高速度宜岛。
然后是訓(xùn)練好的模型,這里就使用lenet_iter_10000.caffemodel
二.使用訓(xùn)練好的模型進(jìn)行預(yù)測功舀,這里我直接貼出兩個(gè)代碼

#coding=utf-8
#caffe and opencv test mnist
#test by yuzefan
import os
import caffe
import numpy as np 
import cv2
import sys
caffe_root='/home/ubuntu/caffe-master/'
sys.path.insert(0,caffe_root+'python') #add this python path
os.chdir(caffe_root)
MODEL_FILE=caffe_root+'mytest/my-mnist/classificat_net.prototxt'
WEIGTHS=caffe_root+'mytest/my-mnist/lenet_iter_10000.caffemodel'
net=caffe.Classifier(MODEL_FILE,WEIGTHS)
caffe.set_mode_gpu()
IMAGE_PATH=caffe_root+'mytest/smy-mnist/'
font = cv2.FONT_HERSHEY_SIMPLEX #normal size sans-serif font
for i in range(0,9):
  # astype() is a method provided by numpy to convert numpy dtype.
  input_image=cv2.imread(IMAGE_PATH+'{}.png'.format(i),cv2.IMREAD_GRAYSCALE).astype(np.float32)
  #resize Image to improve vision effect.
  resized=cv2.resize(input_image,(280,280),None,0,0,cv2.INTER_AREA)
  input_image = input_image[:, :, np.newaxis] # input_image.shape is (28, 28, 1), with dtype float32
  prediction = net.predict([input_image], oversample=False)
  cv2.putText(resized, str(prediction[0].argmax()), (200, 280), font, 4, (255,), 2)
  cv2.imshow("Prediction", resized)
  print 'predicted class:', prediction[0].argmax()
  keycode = cv2.waitKey(0) & 0xFF
  if keycode == 27:
    break
#coding=utf-8
#caffe and opencv test mnist
#test by yuzefan
import os
import caffe
import numpy as np 
import cv2
import sys

caffe_root='/home/ubuntu/caffe-master/'
sys.path.insert(0,caffe_root+'python') #add this python path
os.chdir(caffe_root)
MODEL_FILE=caffe_root+'mytest/my-mnist/classificat_net.prototxt'
WEIGTHS=caffe_root+'mytest/my-mnist/lenet_iter_10000.caffemodel'
MEAN_FILE=caffe_root+'mytest/my-mnist/mean.binaryproto'
print('Params loaded!')
cv2.waitKey(1000)
caffe.set_mode_gpu()
net=caffe.Net(MODEL_FILE,WEIGTHS,caffe.TEST)
mean_blob=caffe.proto.caffe_pb2.BlobProto()
mean_blob.ParseFromString(open(MEAN_FILE, 'rb').read())
mean_npy = caffe.io.blobproto_to_array(mean_blob)
a=mean_npy[0, :, 0, 0]
print(net.blobs['data'].data.shape)

transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
#transformer.set_transpose('data', (2, 0, 1))
##transformer.set_raw_scale('data', 255)
#transformer.set_channel_swap('data', (2, 1, 0))
for i in range(0,10):
  IMAGE_PATH=caffe_root+'mytest/my-mnist/{}.png'.format(i)

  #im = caffe.io.load_image(IMAGE_PATH)
  input_image=cv2.imread(IMAGE_PATH,cv2.IMREAD_GRAYSCALE).astype(np.float32)
  resized=cv2.resize(input_image,(280,280),None,0,0,cv2.INTER_AREA)
  net.blobs['data'].data[...] = transformer.preprocess('data', input_image)
  predict = net.forward()
  names = []
  with open('/home/ubuntu/caffe-master/mytest/my-mnist/words.txt', 'r+') as f:
    for l in f.readlines():
        names.append(l.split(' ')[1].strip())

  print(names)
  prob = net.blobs['prob'].data[0].flatten()
  print('prob: ', prob)
  print('class: ', names[np.argmax(prob)])
  cv2.imshow("Prediction", resized)
  keycode = cv2.waitKey(0) & 0xFF
  if keycode == 27:
    break

下面以代碼一和代碼二簡稱萍倡。
代碼一關(guān)鍵的地方是

net=caffe.Classifier(MODEL_FILE,WEIGTHS)
prediction = net.predict([input_image], oversample=False)

可以看出是利用opencv讀入灰度圖加入到net中進(jìn)行預(yù)測
代碼二關(guān)鍵的地方是

net=caffe.Net(MODEL_FILE,WEIGTHS,caffe.TEST)
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
#transformer.set_transpose('data', (2, 0, 1))
##transformer.set_raw_scale('data', 255)
#transformer.set_channel_swap('data', (2, 1, 0))
#img = caffe.io.load_image(IMAGE_PATH)
input_image=cv2.imread(IMAGE_PATH,cv2.IMREAD_GRAYSCALE).astype(np.float32)
net.blobs['data'].data[...] = transformer.preprocess('data', input_image)
predict = net.forward()

可以看到我注釋掉許多代碼,但是又很關(guān)鍵因此我沒有刪掉辟汰。對(duì)于transformer列敲,是對(duì)data進(jìn)行變換。但是利用caffe.io.load_image(IMAGE_PATH)讀入圖片帖汞,每次都會(huì)讀到[28,28,3]的矩陣戴而,也就是每次都會(huì)讀三個(gè)通道,于是出現(xiàn)如下錯(cuò)誤

could not broadcast input array from shape (28,28,3) into shape (1,1,28,28)

無奈之下又使用opencv,讀到的是(W,H,C)翩蘸。所意。。望高手替我解答一下催首。
但是對(duì)于彩色圖像應(yīng)該選用caffe.io.load_image(IMAGE_PATH)
下面是運(yùn)行效果

![Upload Screenshot from 2017-08-22 15:50:07.png failed. Please try again.]

對(duì)于疑問已經(jīng)解決:
cv2.imread()接口讀圖像扶踊,讀進(jìn)來直接是gray 格式and 0~255,所以不需要再縮放到[0,255]和通道變換[2,1,0]不需要

transformer.set_raw_scale('data',255)和transformer.set_channel_swap('data',(2,1,0)

是caffe.io.load_image()讀進(jìn)來是RGB格式和0~1(float)所以在進(jìn)行特征提取之前要在transformer中設(shè)置transformer.set_raw_scale('data',255)(縮放至0~255)
以及transformer.set_channel_swap('data',(2,1,0)(將RGB變換到BGR)
完畢!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末郎任,一起剝皮案震驚了整個(gè)濱河市秧耗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舶治,老刑警劉巖分井,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異霉猛,居然都是意外死亡杂抽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門韩脏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铸磅,你說我怎么就攤上這事赡矢。” “怎么了阅仔?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵吹散,是天一觀的道長。 經(jīng)常有香客問我八酒,道長空民,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮界轩,結(jié)果婚禮上画饥,老公的妹妹穿的比我還像新娘。我一直安慰自己浊猾,他們只是感情好抖甘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著葫慎,像睡著了一般衔彻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上偷办,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天艰额,我揣著相機(jī)與錄音,去河邊找鬼椒涯。 笑死柄沮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逐工。 我是一名探鬼主播铡溪,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼泪喊!你這毒婦竟也來了棕硫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤袒啼,失蹤者是張志新(化名)和其女友劉穎哈扮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚓再,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滑肉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摘仅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靶庙。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖娃属,靈堂內(nèi)的尸體忽然破棺而出六荒,到底是詐尸還是另有隱情,我是刑警寧澤矾端,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布掏击,位于F島的核電站,受9級(jí)特大地震影響秩铆,放射性物質(zhì)發(fā)生泄漏砚亭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捅膘。 院中可真熱鬧添祸,春花似錦、人聲如沸篓跛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愧沟。三九已至蔬咬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沐寺,已是汗流浹背林艘。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留混坞,地道東北人狐援。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像究孕,于是被迫代替她去往敵國和親啥酱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容