Caffe(二)使用Python运用caffemodel进行mnist数据集预测

Problem Solve

caffe入门与实践-LeNet MNIST 教程
使用draw_net.py出错

出错截图

出现以上截图,经百度之后原因为Ubuntu``protobuff的版本较高,导致出错,然而并没有找到解决办法。已找到解决办法

但随即又出现'int object has no attribute '__values问题,百度Google易一通之后,依然无解。然后在Caffe GithubIssue模块中找到这个问题,原来是最新版本draw.py的Bug,下载caffe-rc4.zip替换之后成功解决问题

转换mnist ubyte3到图像

参考:使用转换mnist数据库保存为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用法参见网站 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 教程

在参考的基础上,将模型用于连续预测多张图像,并配合OpenCV给出识别效果。经过修改后的代码如下:

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

# 作者:晓雷
# 链接:https://zhuanlan.zhihu.com/p/24110318
# 来源:知乎
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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所在路径添加到环境变量
import caffe

# 指定网络结构 与 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

整体上来看,在网络模型的生成阶段(即net = caffe.Classifier(MODEL_FILE, PRETRAINED))执行比较缓慢(此句存在较多的输出语句,后期可以考虑抑制输出以提高性能),后边的前向预测可以达到很高的实时性(这还是在CPU模式下,利用妙算的GPU性能或许可以进一步提高性能,降低延迟)。但是LeNet网络模型较小,不知道AlexNet表现如何。

此外,在查看对应源代码之后,用OpenCV的接口重写了加载图像的方法。从代码里面可以看出,image对象与numpy关系紧密,单个像素点的操作直接可以用numpy的操作去做,一些需要联立像素点的操作才需要用OpenCV的函数(暂时这么理解)。不明白作者既然用了OpenCV库,为何不使用OpenCV的接口来加载图像,难道是为了提升IO性能,但是不同的库从磁盘中加载图像的差异又有多大呢?弄不明白。但是有一点很清楚,caffe的模块化程度确实很高,在自己写了加载图像之后仍然能正常的进行预测,只是在重写的过程中需要注意数组的尺寸(shape)和元素数据类型(dtype)一致,不然会出现问题。

其他

使用了Linux下面的byzanz工具配合xdotool(用于提取鼠标位置)制作动态图,效果很好。命令如下:

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的软件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容