此篇讲述在matlab中,如何将训练好的model用于图像分类。将以mnist为例,主要用到caffe-master\matlab\demo 下的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-master\matlab\demo 下

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

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

..\..\Build\x64\Release\compute_image_mean.exe-backend=lmdb ../../examples\mnist\mnist_train_lmdb mean.binaryproto

Pause

如图:

双击运行,则在caffe-master\examples\mnist下会得到 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-master\examples\mnist下创建 .bat 文件训练了,具体如图:

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

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

在caffe-master\matlab\demo下创建文本文档复制以下代码:

0

1

2

3

4

5

6

7

8

9

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

如图:

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

在caffe-master\matlab\demo下创建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\n',i,lin)  
        break  
    end  
end

在caffe-master\matlab\demo下创建m文件,保存为mnist_CF.m

具体code如下:

function [scores, maxlabel] = mnist_CF(im, use_gpu)
%此处为添加路径,确保能找到caffe-master\matlab\+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的方法,免得书写错误。

【caffe-windows】 caffe-master 之Matlab中model的分类应用的更多相关文章

  1. caffe windows编译

    MicroSoft维护的caffe已经作为官方的caffe分支了,编译方式也改了,刚好最近重装了一次caffe windows, 记录一下里面的坑 https://github.com/BVLC/ca ...

  2. caffe windows 学习第一步:编译和安装(vs2012+win 64)

    没有GPU,没有linux, 只好装caffe的windows版本了. 我的系统是win10(64位),vs 2012版本,其它什么都没有装,因此会需要一切的依赖库. 其实操作系统只要是64位就行了, ...

  3. Caffe windows下安装攻略

    Caffe 是一个高效的深度学习框架,鉴于不想折腾装个双系统,最近鼓捣了下用caffe源码在windows进行编译.非常感谢Yangqing Jia博士的caffe开源代码.Neil Z.Shao's ...

  4. caffe windows学习:第一个测试程序

    caffe windows编译成功后,就可以开始进行测试了.如果还没有编译成功的,请参考:caffe windows 学习第一步:编译和安装(vs2012+win 64) 一般第一个测试都是建议对手写 ...

  5. 【caffe】Caffe的Python接口-官方教程-00-classification-详细说明(含代码)

    00-classification 主要讲的是如何利用caffenet(与Alex-net稍稍不同的模型)对一张图片进行分类(基于imagenet的1000个类别) 先说说教程到底在哪(反正我是找了半 ...

  6. 【caffe】Caffe的Python接口-官方教程-01-learning-Lenet-详细说明(含代码)

    01-learning-Lenet, 主要讲的是 如何用python写一个Lenet,以及用来对手写体数据进行分类(Mnist).从此教程可以知道如何用python写prototxt,知道如何单步训练 ...

  7. 在Matlab中安装使用libsvm详细步骤(附图)

    今天自己在matlab中安装libsvm,下面是详细的步骤 1.首先下载libsvmhttp://www.csie.ntu.edu.tw/~cjlin/libsvm/我的matlab版本 R2016a ...

  8. Matlab中配置VLFeat

    在VLFeat官网上是这么介绍VLFeat的:VLFeat开源库实现了很多著名的机器视觉算法,如HOG, SIFT, MSER, k-means, hierarchical k-means, aggl ...

  9. Matlab中的一些小技巧

    (转于它处,仅供参考) 1.. Ctrl+C 中断正在执行的操作 如果程序不小心进入死循环,或者计算时间太长,可以在命令窗口中使用Ctrl+c来中断.MATLAB这时可能正疲于应付,响应会有些滞后. ...

随机推荐

  1. jsoncpp用法通俗易懂之解析

    刚工作不久,最近遇到一个要解析一个web服务器发过来的json格式的文件,文件如下: { "global": { "renew": "true&quo ...

  2. c# 中的多线程和异步

    前言: 1.异步和多线程有区别吗? 答案:多线程可以说是实现异步的一种方法方法,两者的共同目的:使主线程保持对用户操作的实时响应,如点击.拖拽.输入字符等.使主程序看起来实时都保持着等待用户响应的状态 ...

  3. Nexus私服使Maven更加强大

    前边简单介绍了Maven,而Maven默认提供的中央仓库是在远程网络服务Appache提供的,这对于我们开发时不合理的.如果我们没网了或者什么情况,我们怎么办?也就是说我们队中央仓库的依赖性太大.而N ...

  4. QT5中的信号与槽与C++ 11的function的配合

    最近将公司的界面开发库从WX转换到了QT,有了信号和槽,原本我们在使用WX的时候,为了使用信号,我们是使用BOOST的signal2库,到了QT有了信号槽,这个就没什么必要了 但是前段时间使用QT发现 ...

  5. [系统开发] Postfix 邮件管理系统

    一.简介 开发时间:2012年 开发工具:Perl CGI 这是我开发的 Postfix 邮件管理系统,通过它可以安全.方便的对邮件域名.用户.权限.组.邮箱容量.安全等进行各种设置:界面样式借鉴了 ...

  6. angularjs中$http、$location、$watch及双向数据绑定学习实现简单登陆验证

    使用$http.$location.$watch及双向数据绑定等实现简单的用户登陆验证,记录备忘: 1.$http模拟从后台获取json格式的数据: 2.$watch实时监控数据变化: 3.$loca ...

  7. TMS320C54x系列DSP的CPU与外设——第2章 TMS320C54x DSP体系结构总体介绍

    第2章 TMS320C54x DSP体系结构总体介绍 本章介绍TMS320C54x DSP体系结构的概况,包括中央处理单元(CPU).存在器和片内外设. C54x DSP采用了高级的改进哈佛结构,用8 ...

  8. 重新认识Entity Framework

    什么是Entity Framework Entity Framework是一个对象关系映射O/RM框架. Entity Framework让开发者可以像操作领域对象(domain-specific o ...

  9. cf519D . A and B and Interesting Substrings 数据结构map

    题意: 已知26个小写字母有各自的权值(正,负,或0) 现在给出一个字符串,长度<=1e5 问这个字符串有多少个子串满足: 开头的字母和结尾的字母一样 字符串除了开头和结尾的字母外,其余的字母的 ...

  10. NeHe OpenGL教程 第一课:OpenGL窗口

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...