此篇讲述在matlab中,如何将训练好的model用于图像分类。将以mnist为例,主要用到caffe-master\matlab\demo 下的classification_demo.m ,可参考我之前的博客 【caffe-windows】 caffe-master 之 classfication_demo.m 超详细分析 ()
首先贴大神的博客:
我的实验是参考了他的步骤,相比之前的mnist分类,这里增加了减均值操作,所以需要对配置文件做出相应的更改,同时也可以学习一下如何求取训练集的均值文件,以及减均值操作。
前期准备: 下载测试图片(链接:密码:bead 源自:),放到文件夹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数据获取此处不再重复,请参照我之前的博客:)
需要注意的是,当将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如下: