[caffe学习笔记][06][使用LeNet分类输入图片]
说明:
如果要把训练好的模型拿来测试新的图片,那么需要一个deploy.prototxt文件,这个文件和test.prototxt文件差不多。这个文件没有第一层数据输入层,最后的SoftmaxWithLoss损失率层换成了 Softmax类概率层。
使用deploy网络进行测试时,需要通过caffe.io.load_image(image_path)载入图片是需要把图片预处理成pycaffe格式。在pycaffe中的数据范围是[0,255],而caffe中数据范围是[0,1],所以caffe的数据层需要设置scale = 0.00390625。而在pycaffe中使用caffe.io.load_image(image)读出的数据范围是[0,1],所以需要设置成transformer.set_raw_scale('data', 255)。
步骤:
vim test_image.py
# -*- coding: utf-8 -*- """ yuandanfei Editor 使用LeNet网络,进行图片分类 """ import caffe import numpy as np from caffe import layers as L, params as P, to_proto #设定文件路径 root = '/home/yuandanfei/work/caffe/mnist2/' #根目录路径 deploy_proto = root + 'deploy.prototxt' #部署网络路径 caffe_model = root + 'mnist/lenet_iter_9380.caffemodel' #网络权重路径 image_path = root + 'mnist/test/5/00008.png' #分类图片路径 labels_list = root + 'mnist/test/labels.txt' #类别名称路径 #Lenet网络 def Lenet(): #卷积层1: n*20*24*24; c1=num_output;w1/h1=(w0/h0+2*pad-kernel_size)/stride+1 conv1 = L.Convolution(bottom='data' , kernel_size=5, stride=1, pad=0, num_output=20, weight_filler=dict(type='xavier')) #池化层1: n*20*12*12; c1=c0;w1/h1=(w0/h0+2*pad-kernel_size)/stride+1 pool1 = L.Pooling(conv1, pool=P.Pooling.MAX, kernel_size=2, stride=2) #卷积层2: n*50*8*8 conv2 = L.Convolution(pool1, kernel_size=5, stride=1, pad=0, num_output=50, weight_filler=dict(type='xavier')) #池化层2: n*50*4*4 pool2 = L.Pooling(conv2, pool=P.Pooling.MAX, kernel_size=2, stride=2) #全连接层3: n*500*1*1 fc3 = L.InnerProduct(pool2, num_output=500, weight_filler=dict(type='xavier')) #激活层3: n*500*1*1 relu3 = L.ReLU(fc3, in_place=True) #全连接层4: n*10*1*1 fc4 = L.InnerProduct(relu3, num_output=10, weight_filler=dict(type='xavier')) #类概率层5 prob5 = L.Softmax(fc4) return to_proto(prob5) #写入网络文件 def write_Lenet(): with open(deploy_proto, 'w') as f: f.write('name: "Lenet"\n') f.write('input: "data"\n') f.write('input_dim: 1\n') f.write('input_dim: 3\n') f.write('input_dim: 28\n') f.write('input_dim: 28\n') f.write( str(Lenet()) ) #进行图片分类 def test_image(image_path): #加载相关文件 img = caffe.io.load_image(image_path) #载入图片文件 labels = np.loadtxt(labels_list, str, delimiter='\t') #读取类别名称 net = caffe.Net(deploy_proto, caffe_model, caffe.TEST) #加载网络和权重 #预处理输入图片 transformer = caffe.io.Transformer( {'data': net.blobs['data'].data.shape} ) #设置图片格式:1*3*28*28 transformer.set_transpose('data', (2, 0, 1)) #改变图片维度:(28,28,3)到(3,28,28) transformer.set_channel_swap('data', (2, 1, 0)) #交换图片通道:RGB到BGR transformer.set_raw_scale('data', 255) #缩放图片范围:(0,255) net.blobs['data'].data[...] = transformer.preprocess('data', img) #预处理输入图片 #进行图片分类 net.forward() #网络向前传播 prob = net.blobs['Softmax1'].data[0].flatten() #取出测试结果 #显示分类结果 order = prob.argsort()[-1] #取出最大值序号 print prob print 'the class is: ' + labels[order] if __name__ == '__main__': write_Lenet() test_image(image_path)
参考资料:
https://www.cnblogs.com/denny402/p/5685909.html