zoukankan      html  css  js  c++  java
  • [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"
    ')
            f.write('input: "data"
    ')
            f.write('input_dim: 1
    ')
            f.write('input_dim: 3
    ')
            f.write('input_dim: 28
    ')
            f.write('input_dim: 28
    ')
            f.write( str(Lenet()) )
            
    #进行图片分类
    def test_image(image_path):
        #加载相关文件
        img = caffe.io.load_image(image_path)                  #载入图片文件
        labels = np.loadtxt(labels_list, str, delimiter='	')  #读取类别名称
        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

     

  • 相关阅读:
    Golang 版本 支付宝支付SDK app支付接口2.0
    用 Certbot-auto 在 letsencrypt.org申请免费 SSL 证书实现 HTTPS
    Go类型断言demo
    签名算法
    golang cron定时任务简单实现
    Chapter Zero 0.2.2 内存
    Linux-系统目录结构
    Linux-关于Bash
    Chapter Zero 0.2.1 执行运算与判断的CPU
    Chapter Zero 0.1.4 计算机上常用的计算单位
  • 原文地址:https://www.cnblogs.com/d442130165/p/12768709.html
Copyright © 2011-2022 走看看