zoukankan      html  css  js  c++  java
  • 【caffe-windows】 caffe-master 之Matlab中model的分类应用

    此篇讲述在matlab中,如何将训练好的model用于图像分类。将以mnist为例,主要用到caffe-mastermatlabdemo 下的classification_demo.m ,可参考我之前的博客 【caffe-windows】 caffe-master 之 classfication_demo.m 超详细分析 (http://blog.csdn.net/u011995719/article/details/54135189)

    首先贴大神的博客:http://blog.csdn.net/zb1165048017/article/details/52447109

    我的实验是参考了他的步骤,相比之前的mnist分类,这里增加了减均值操作,所以需要对配置文件做出相应的更改,同时也可以学习一下如何求取训练集的均值文件,以及减均值操作。

    前期准备: 下载测试图片(链接:http://pan.baidu.com/s/1o7NySMu密码:bead 源自:http://blog.csdn.net/zb1165048017/article/details/52217772),放到文件夹caffe-mastermatlabdemo 下

    第一步: 算出均值,得到均值文件mean.binaryproto

     在caffe-masterexamplesmnist下创建 文本文档,后缀更改为 .bat 复制以下code:

    ....Buildx64Releasecompute_image_mean.exe-backend=lmdb ../../examplesmnistmnist_train_lmdb mean.binaryproto

    Pause

    如图:

     

    双击运行,则在caffe-masterexamplesmnist下会得到 mean.binaryproto

    (PS: 至于mnist数据获取此处不再重复,请参照我之前的博客:http://blog.csdn.net/u011995719/article/details/54023085)

    需要注意的是,当将mnist数据转换成leveldb的时候,需要对应的更改以上code(imdb改为leveldb)

    第二步:训练model ,需要改动3个文件lenet.prototxt 、lenet_solver.prototxt、lenet_train_test.prototxt

     因为要做减均值操作,所以要对lenet_solver.prototxt和lenet_train_test.prototxt进行更改,为了避免和之前的冲突,这里复制了一份,然后分别重命名为lenet_solver_mean.prototxt 和lenet_train_test_mean.prototxt

    lenet_solver_mean.prototxt较lenet_solver.prototxt更改处如下:

    net:"../../examples/mnist/lenet_train_test_mean.prototxt"

    如图:

      

    lenet_train_test_mean.prototxt较lenet_train_test.prototxt 更改处如下:

        phase: TRAIN

      }

      transform_param {

           mean_file:"../../examples/mnist/mean.binaryproto"

        scale: 0.00390625

      }

        phase: TEST

      }

      transform_param {

           mean_file:"../../examples/mnist/mean.binaryproto"

        scale: 0.00390625

      }

    如图:

     

     请注意自己数据的格式,是LMDB还是LEVELDB 。

    最后更改lenet.prototxt,更改处如下:

      input_param { shape: { dim:1  dim: 1 dim: 28 dim: 28 } }

    这里存在一个问题就是为什么是64,是bug?还是什么? 没搞没明白

     更改好了以上三个文件,就可以在caffe-masterexamplesmnist下创建 .bat 文件训练了,具体如图:

     

    训练好之后会有lenet_iter_10000.caffemodel,这个就是后面在matlab里要用到的模型了

    第三步:创建标签文件 mnist_synset_words.txt

           在caffe-mastermatlabdemo下创建文本文档复制以下代码:

    9

    保存,为了区别不同的标签文件,此处更改了文件名为mnist_synset_words,因此在后面的matlab程序中读取时候需要做相应更改

    如图:

     

    第四步:编辑两个matlab文件,一个是classification_demo.m的修改,一个是调用classification_demo的主函数

           在caffe-mastermatlabdemo下创建m文件,保存为mnist_test.m 具体code如下:

    clear  
    clc  
    close all  
    im=imread(['binarybmp/5.bmp']);   % 读取图片
    figure;imshow(im);  %显示图片  
    [scores, maxlabel] = mnist_CF(im', 1);   %获取得分 第二个参数0为CPU,1为GPU  
    scores   ;
    maxlabel  ;
      
    figure;plot(scores);    % 画出得分情况  
    axis([0, 10, -0.1, 0.5]);   % 坐标轴范围  
    grid on % 有网格  
      
    fid = fopen('mnist_synset_words.txt', 'r');  
    i=0;  
    while ~feof(fid)   % while ~feof 表示 若 未读到文件末尾 则 继续 循环
        i=i+1;   
        lin = fgetl(fid);   % fgetl 从已经打开的文件中读取一行,并且丢掉末尾的换行符
        lin = strtrim(lin); % strtrim 从字符串或cell开头去掉空格
        if(i==maxlabel)  
            fprintf('The maxlabel of %d in label txt is %s ',i,lin)  
            break  
        end  
    end  

    在caffe-mastermatlabdemo下创建m文件,保存为mnist_CF.m

    具体code如下:

     function [scores, maxlabel] = mnist_CF(im, use_gpu)
    %此处为添加路径,确保能找到caffe-mastermatlab+caffe
    if exist('../+caffe', 'dir')
      addpath('../..');
    else
      error('Please run this demo from caffe/matlab/demo');
    end
    % 设置CPU or GPU
    if exist('use_gpu', 'var') && use_gpu
      caffe.set_mode_gpu();
      gpu_id = 0;  % we will use the first gpu in this demo
      caffe.set_device(gpu_id);
    else
      caffe.set_mode_cpu();
    end


    model_dir = '../../examples/mnist/';  
    net_model = [model_dir 'lenet.prototxt'];  
    net_weights = [model_dir 'lenet_iter_10000.caffemodel'];  
    phase = 'test'; % 指出网络状态为test,防止使用dropout
    if ~exist(net_weights, 'file')% 检测模型是否存在,不存在则报错提醒
      error('Please download CaffeNet from Model Zoo before you run this demo');
    end


     
    net = caffe.Net(net_model, net_weights, phase); % 初始化网络
    %  oversample
        mean_data = caffe.io.read_mean('../../examples/mnist/mean.binaryproto'); %
        scale = 0.00390625;
        im = double(im);
        im =  (im-mean_data)*scale;
        input_data = {im};


    scores = net.forward(input_data);   % 将数据输入到网络,进行前向传播,得出分数,scores是一个细胞元组


    scores = scores{1};         % scores 是 1000*10 的矩阵 10是对应了10个crop图片
    scores = mean(scores, 2);   % 对10个crop进行求平均 
    [~, maxlabel] = max(scores); % 再找出最大的那一个 


    % 重置 caffe
    caffe.reset_all();

    第五步 : 运行mnist_test.m即可 

    PS:很容易出现路径不正确的问题,出错先看看是否路径不正确。其次就是这里我更改了好多文件名,所以相应的文件里面也要做修改,最好用ctrl+c ctrl+v的方法,免得书写错误。 

  • 相关阅读:
    POJ3667 Hotel 题解
    POJ1417 True Liars 题解
    POJ2482 Stars in Your Window 题解
    POJ1704 Georgia and Bob 题解
    矩阵运算
    P4778 Counting Swaps 题解
    poi解析office文档内容的工具类
    VMware安装Centos7超详细过程(图文)
    java后端树形菜单结构
    vue点击事件的修饰符
  • 原文地址:https://www.cnblogs.com/TensorSense/p/6260297.html
Copyright © 2011-2022 走看看