[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

 

posted @ 2020-04-24 17:08  盛夏夜  阅读(286)  评论(0编辑  收藏  举报