caffe生成lenet-5的deploy.prototxt文件

来源:互联网 发布:模型分析软件 编辑:程序博客网 时间:2024/06/10 21:02

接前面博客:http://blog.csdn.net/lanxuecc/article/details/52329708 我学会了用caffe训练自己的测试自己的图片,但是这里测试的是测试数据集,那么如何用训练好的caffemodel测试自己的单张图片呢。下面记录下我用训练好的lenet_iter_10000.caffemodelg来测试mnist图片的整个摸索过程::::

生成deploy.prototxt文件:

用训练好的caffemodel来测试单张图片需要一个deploy.prototxt文件来指定网络的模型构造。
事实上deploy.prototxt文件与lenet_train_test.prototxt文件类似,只是首尾有些差别。仿照博客http://www.cnblogs.com/denny402/p/5685818.html 中的教程用deploy.py文件来生成deploy.prototxt文件。

# -*- coding: utf-8 -*-caffe_root = '/home/schao/sc_tmp/caffe/caffe-master/'  import sys  sys.path.insert(0, caffe_root + 'python')  from caffe  import layers as L,params as P,to_protoroot='/home/schao/sc_tmp/caffe/caffe-master/'deploy='/home/schao/sc_tmp/caffe/caffe-master/examples/mnist/deploy.prototxt'    #文件保存路径def create_deploy():    #少了第一层,data层    conv1=L.Convolution(name='conv1',bottom='data', kernel_size=5, stride=1,num_output=20, pad=0,weight_filler=dict(type='xavier'))    pool1=L.Pooling(conv1,name='pool1',pool=P.Pooling.MAX, kernel_size=2, stride=2)    conv2=L.Convolution(pool1, name='conv2',kernel_size=5, stride=1,num_output=50, pad=0,weight_filler=dict(type='xavier'))    pool2=L.Pooling(conv2, name='pool2',top='pool2', pool=P.Pooling.MAX, kernel_size=2, stride=2)    fc3=L.InnerProduct(pool2, name='ip1',num_output=500,weight_filler=dict(type='xavier'))    relu3=L.ReLU(fc3, name='relu1',in_place=True)    fc4 = L.InnerProduct(relu3, name='ip2',num_output=10,weight_filler=dict(type='xavier'))    #最后没有accuracy层,但有一个Softmax层    prob=L.Softmax(fc4, name='prob')    return to_proto(prob)def write_deploy():     with open(deploy, 'w') as f:        f.write('name:"LeNet"\n')        f.write('layer {\n')        f.write('name:"data"\n')        f.write('type:"Input"\n')        f.write('input_param { shape : {')        f.write('dim:1 ')        f.write('dim:3 ')        f.write('dim:28 ')        f.write('dim:28 ')        f.write('} }\n\n')        f.write(str(create_deploy()))if __name__ == '__main__':    write_deploy()

生成的deploy.prototxt文件如下

name: "LeNet"/*原来训练与测试两层数据层*//*layer {  name: "mnist"  type: "Data"  top: "data"  top: "label"  include {    phase: TRAIN  }  transform_param {    scale: 0.00390625  }  data_param {    source: "examples/mnist/mnist_train_lmdb"    batch_size: 64    backend: LMDB  }}layer {  name: "mnist"  type: "Data"  top: "data"  top: "label"  include {    phase: TEST  }  transform_param {    scale: 0.00390625  }  data_param {    source: "examples/mnist/mnist_test_lmdb"    batch_size: 100    backend: LMDB  }}*//*被替换成如下*/layer {  name: "data"  type: "Input"  top: "data"  input_param { shape: { dim: 1 dim: 1 dim: 28 dim: 28 } }}/*卷积层与全连接层中的权值学习率,偏移值学习率,偏移值初始化方式,因为这些值在caffemodel文件中已经提供*/layer {  name: "conv1"  type: "Convolution"  bottom: "data"  top: "conv1"  convolution_param {    num_output: 20    kernel_size: 5    stride: 1    weight_filler {      type: "xavier"    }  }}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"  convolution_param {    num_output: 50    kernel_size: 5    stride: 1    weight_filler {      type: "xavier"    }  }}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"  inner_product_param {    num_output: 500    weight_filler {      type: "xavier"    }  }}layer {  name: "relu1"  type: "ReLU"  bottom: "ip1"  top: "ip1"}layer {  name: "ip2"  type: "InnerProduct"  bottom: "ip1"  top: "ip2"  inner_product_param {    num_output: 10    weight_filler {      type: "xavier"    }  }}/*删除了原有的测试模块的测试精度层*//*输出层的类型由SoftmaxWithLoss变成Softmax,训练是输出时是loss,应用时是prob。*/layer {  name: "prob"  type: "Softmax"  bottom: "ip2"  top: "prob"}

总得来说,deploy.prototxt就是在lenet_train_test.prototxt的基础上稍作改动,input_param { shape: { dim: 1 dim: 1 dim: 28 dim: 28 } } 这四个dim参数分别是
第一个:对待识别样本图片进行数据增广的数量,一个图片会变成10个,之后输入到网络进行识别。如果不进行数据增广,可以设置成1。
第二个:图片的通道数,一般灰度图片为单通道,则值为1,如果为非灰度图3通道图片则为3。
第三个:图片的高度,单位像素。
第四个:图片的宽度,单位像素。

对deploy.prototxt的理解来源于:
http://blog.csdn.net/ddqqfree123/article/details/52389337
http://www.cnblogs.com/daihengchen/p/5761304.html
http://caffecn.cn/?/question/431
http://blog.csdn.net/sunshine_in_moon/article/details/49472901
http://stackoverflow.com/questions/36002387/channel-swap-needs-to-have-the-same-number-of-dimensions-as-the-input-channels-e/36075282
http://blog.csdn.net/u010417185/article/details/52137825
http://www.cnblogs.com/denny402/p/5685818.html

执行

python deploy.py

生成deploy.prototxt。在生成过程中我遇到以下几个报错

报错: ImportError: No module named caffe
解决
这种情况一般是没有把caffe中的和python相关的内容的路径添加到python的编译路径中。所以在deploy.py文件开始部位加入

caffe_root = '/home/schao/sc_tmp/caffe/caffe-master/'  import sys  sys.path.insert(0, caffe_root + 'python')  

指定caffe源码所在路径。

报错:ImportError: liblapack.so.3 cannot open shared object file:No such file or directory
解决
找不到这个库,但是我在系统中能找到这个库,说明已安装但找不到库位置,那么指定该库所有位置到LD_LIBRARY_PATH共享目录去,ubuntu系统在/etc/ld.so.conf.d/目录中添加lapack.conf,指定这个库目录。这里写图片描述

报错: import numpy as npImportError: No module named numpy
解决
用下列命令安装

 apt-get install pyton-numpy

报错:libblas.so.3: cannot open shared object file: No such file or directory
解决
因为我已经安装守OpenBlas库,所以建立一个软链接指向这个库

update-alternatives --install /usr/lib/libblas.so.3 libblas.so.3 /usr/local/OpenBlas/lib/libopenblas.so 37

报错: import skimage.ioImportError: No module named skimage.io
解决
参考这个网页中方案解决:
http://www.linuxdiyf.com/linux/15537.html

0 0
原创粉丝点击