Caffe(二)使用Python運用caffemodel進行mnist數(shù)據(jù)集預測

Problem Solve

caffe入門與實踐-LeNet MNIST 教程
使用draw_net.py出錯

出錯截圖

出現(xiàn)以上截圖绘证,經(jīng)百度之后原因為Ubuntu``protobuff的版本較高,導致出錯嚷那,然而并沒有找到解決辦法魏宽。已找到解決辦法

但隨即又出現(xiàn)'int object has no attribute '__values問題,百度Google易一通之后队询,依然無解。然后在Caffe GithubIssue模塊中找到這個問題铆惑,原來是最新版本draw.py的Bug,下載caffe-rc4.zip替換之后成功解決問題丑蛤。

轉換mnist ubyte3到圖像

參考:使用轉換mnist數(shù)據(jù)庫保存為bmp圖片

代碼如下

# -*- coding:utf-8 -*-

import struct
import numpy as np
import matplotlib.pyplot as plt
# import Image
from PIL import Image  # import Image seems not work. 
#二進制的形式讀入
filename='train-images-idx3-ubyte'
binfile=open(filename,'rb')
buf=binfile.read()
#大端法讀入4個unsigned int32
#struct用法參見網(wǎng)站 http://www.cnblogs.com/gala/archive/2011/09/22/2184801.html

index=0
magic,numImages,numRows,numColumns=struct.unpack_from('>IIII',buf,index)
index+=struct.calcsize('>IIII')
numImages = 200  # 200 images is enough!
#將每張圖片按照格式存儲到對應位置
for image in range(0,numImages):
    im=struct.unpack_from('>784B',buf,index)
    index+=struct.calcsize('>784B')
   #這里注意 Image對象的dtype是uint8撕阎,需要轉換
    im=np.array(im,dtype='uint8')
    im=im.reshape(28,28)
   # fig=plt.figure()
   # plotwindow=fig.add_subplot(111)
   # plt.imshow(im,cmap='gray')
   # plt.show()
    im=Image.fromarray(im)
    im.save('train/train_%s.bmp'%image,'bmp')

使用模型配合OpenCV進行預測

參考:caffe入門與實踐-LeNet MNIST 教程

在參考的基礎上,將模型用于連續(xù)預測多張圖像棉饶,并配合OpenCV給出識別效果镇匀。經(jīng)過修改后的代碼如下:

# -*- coding:utf-8 -*-
# Modified by NoneLand

# 作者:曉雷
# 鏈接:https://zhuanlan.zhihu.com/p/24110318
# 來源:知乎
# 著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權岩梳,非商業(yè)轉載請注明出處晃择。

import sys
import numpy as np
import cv2

caffe_root = '/home/noneland/Software/caffe-master/'
# This place must use full-path instead of ~. Otherwise netfile can't be open.
sys.path.insert(0, caffe_root + 'python')  # 把pycaffe所在路徑添加到環(huán)境變量
import caffe

# 指定網(wǎng)絡結構 與 lenet_train_test.prototxt不同
MODEL_FILE = caffe_root + '/examples/mnist/lenet.prototxt'
PRETRAINED = caffe_root + '/examples/mnist/lenet_iter_10000.caffemodel'
net = caffe.Classifier(MODEL_FILE, PRETRAINED)
caffe.set_mode_cpu()

IMAGE_PATH = '/home/noneland/WorkSpace/mnist_opencv_union/train/'
font = cv2.FONT_HERSHEY_SIMPLEX

for i in range(0, 200):
    # input_image = caffe.io.load_image(IMAG‵E_PATH + 'train_{}.bmp'.format(i), color=False)
    # astype() is a method provided by numpy to convert numpy dtype.
    input_image = cv2.imread(IMAGE_PATH + 'train_{}.bmp'.format(i), cv2.IMREAD_GRAYSCALE).astype(np.float32)
    resized = cv2.resize(input_image, (280, 280), None, 0, 0, cv2.INTER_AREA)
    # resize Image to improve vision effect.
    input_image = input_image[:, :, np.newaxis] # input_image.shape is (28, 28, 1), with dtype float32
    # The previous two lines(exclude resized line) is the same as what caffe.io.load_iamge() do.
    # According to the source code, caffe load_image uses skiamge library to load image from disk.

    # for debug
    # print type(input_image), input_image.shape, input_image.dtype
    # print input_image

    prediction = net.predict([input_image], oversample=False)
    cv2.putText(resized, str(prediction[0].argmax()), (200, 280), font, 4, (255,), 2, cv2.LINE_AA)
    cv2.imshow("Prediction", resized)
    print 'predicted class:', prediction[0].argmax()
    keycode = cv2.waitKey(0) & 0xFF
    if keycode == 27:
        break

識別效果如下:

mnist prediction

整體上來看宫屠,在網(wǎng)絡模型的生成階段(即net = caffe.Classifier(MODEL_FILE, PRETRAINED))執(zhí)行比較緩慢(此句存在較多的輸出語句滑蚯,后期可以考慮抑制輸出以提高性能),后邊的前向預測可以達到很高的實時性(這還是在CPU模式下坤次,利用妙算的GPU性能或許可以進一步提高性能斥赋,降低延遲)。但是LeNet網(wǎng)絡模型較小疤剑,不知道AlexNet表現(xiàn)如何。

此外疑故,在查看對應源代碼之后弯菊,用OpenCV的接口重寫了加載圖像的方法。從代碼里面可以看出,image對象與numpy關系緊密软舌,單個像素點的操作直接可以用numpy的操作去做育瓜,一些需要聯(lián)立像素點的操作才需要用OpenCV的函數(shù)(暫時這么理解)。不明白作者既然用了OpenCV庫躏仇,為何不使用OpenCV的接口來加載圖像,難道是為了提升IO性能糟描,但是不同的庫從磁盤中加載圖像的差異又有多大呢书妻?弄不明白。但是有一點很清楚见间,caffe的模塊化程度確實很高工猜,在自己寫了加載圖像之后仍然能正常的進行預測,只是在重寫的過程中需要注意數(shù)組的尺寸(shape)和元素數(shù)據(jù)類型(dtype)一致篷帅,不然會出現(xiàn)問題。

其他

使用了Linux下面的byzanz工具配合xdotool(用于提取鼠標位置)制作動態(tài)圖惊橱,效果很好箭昵。命令如下:

noneland@NoneLand4DL:~$ xdotool getmouselocation
noneland@NoneLand4DL:~$ sudo byzanz-record -d 30 --delay 5 -c -x 0 -y 0 -w 1280 -h 1080 lenet.gif

`byzanz`使用截圖

另外,開源錄屏軟件OBS也很好用掉房,很多直播就是用的基于OBS的軟件慰丛。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市哪亿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝇棉,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钝吮,死亡現(xiàn)場離奇詭異板辽,居然都是意外死亡,警方通過查閱死者的電腦和手機耳标,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門邑跪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人砸琅,你說我怎么就攤上這事轴踱。” “怎么了寇僧?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵嘁傀,是天一觀的道長视粮。 經(jīng)常有香客問我,道長蕾殴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任茴肥,我火速辦了婚禮荡灾,結果婚禮上瞬铸,老公的妹妹穿的比我還像新娘础锐。我一直安慰自己,他們只是感情好拦宣,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布信姓。 她就那樣靜靜地躺著,像睡著了一般掰派。 火紅的嫁衣襯著肌膚如雪左痢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天略步,我揣著相機與錄音定页,去河邊找鬼趟薄。 笑死典徊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的羡铲。 我是一名探鬼主播儡毕,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雷恃!你這毒婦竟也來了费坊?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤导犹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谎痢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡票从,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年峰鄙,在試婚紗的時候發(fā)現(xiàn)自己被綠了太雨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡吩翻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狭瞎,到底是詐尸還是另有隱情搏予,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布碗殷,位于F島的核電站速缨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鸟廓。R本人自食惡果不足惜襟己,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望员咽。 院中可真熱鬧贮预,春花似錦契讲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至彤避,卻和暖如春夯辖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒿褂。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留榨咐,地道東北人谴供。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像数焊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子佩耳,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

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