classification_demo.m 是个很好的学习资料,了解这个代码之后,就能在matlab里用训练好的model对输入图像进行分类了,而且我在里边还学到了oversample的实例,终于了解数据增强是个怎么回事。

caffe-master\matlab\demo\classification_demo.m这个demo是针对  ImageNet图像分类的(1000个类), 主要是调用训练好model,对输入的图像进行分类,输出分类结果。

要想运行此demo,需要的东西有:

1. 模型描述文件:deploy.prototxt(这个文件本来就有,不用管)

2. 模型本身:bvlc_reference_caffenet.caffemodel

3. 标签文件:用来描述1000个类分别是什么

4. 均值文件:即训练样本的均值文件(没看过相关资料,暂时认为是训练样本的均值文件),ilsvrc_2012_mean.mat,文件已经存在于caffe-master\matlab\+caffe\imagenet之中

从以上可以知道,当我们想将classification运用于自己的数据集的时候就要对应的更改以上4点。

Matalb接口的配置以及demo的运行请看之前的博客:【caffe-windows】 caffe-master 之 matlab接口配置 (http://blog.csdn.net/u011995719/article/details/53994570

现在来分析 classification_demo.m,方便之后应用于自己的项目中。

首先我们来看看输入输出:

input

im       color image as uint8HxWx3

use_gpu   1 to use the GPU, 0 touse the CPU

output

scores   1000-dimensional ILSVRCscore vector

maxlabel the label of the highest score

输入有两个参数,一个是图片,为单张图(若要测试多张,用for解决),另外一个则是CPU和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 = '../../models/bvlc_reference_caffenet/';% 模型所在文件夹路径
net_model = [model_dir 'deploy.prototxt'];          % 模型描述文件的路径
net_weights = [model_dir 'bvlc_reference_caffenet.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); % 初始化网络

 % 若classification_demo这个函数的输入参数小于1,即无输入参数,则默认使用 caffe/examples/images/cat.jpg 这张图片
if nargin < 1   
  fprintf('using caffe/examples/images/cat.jpg as input image\n');
  im = imread('../../examples/images/cat.jpg');
end

% 重点来了! 由于caffe里的数据是 BGR的顺序,而matlab是RGB的顺序,因此需要对输入图片进行变换
%  这里用一个prepare_image函数将RGB转成BGR,而且对输入图片进行了resize操作,crop操作以及减均值
%   跑到最下面去看看  prepare_image函数
tic;
input_data = {prepare_image(im)};
toc;

tic;

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

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

% 重置 caffe
caffe.reset_all();

% ------------------------------------------------------------------------
function crops_data = prepare_image(im) 
% ------------------------------------------------------------------------
% caffe/matlab/+caffe/imagenet/ilsvrc_2012_mean.mat contains mean_data that
% is already in W x H x C with BGR channels
d = load('../+caffe/imagenet/ilsvrc_2012_mean.mat');    % 读取均值文件通道顺序已经是BGR
mean_data = d.mean_data;
IMAGE_DIM = 256;            %  resize的大小
CROPPED_DIM = 227;          % crop的大小,因为模型的输入就是 227*227的,所以最终要得到一个227*227的

% Convert an image returned by Matlab's imread to im_data in caffe's data
% format: W x H x C with BGR channels
im_data = im(:, :, [3, 2, 1]);  % RGB 转成了 BGR ,im_data通道顺序已经是 BGR
im_data = permute(im_data, [2, 1, 3]);  % 对输入图像进行了转置, 长和宽换一换     
im_data = single(im_data);  %  数据格式转成uint8类型
im_data = imresize(im_data, [IMAGE_DIM IMAGE_DIM], 'bilinear');  % 采取双线性插值法,对输入图片进行resize至 IMAGE_DIM 大小
im_data = im_data - mean_data;  % 再减去均值

% oversample (4 corners, center, and their x-axis flips)
% oversample 就是 数据增强 2012年Alex等人提出的一个技术,这里是在图片(此处256*256的)的4个角以及正中心截取出5张
% 227*227的图片,然后将这5张图片在x轴上进行镜像,总共获得10张 227*227的图片作为模型的输入
crops_data = zeros(CROPPED_DIM, CROPPED_DIM, 3, 10, 'single');
indices = [0 IMAGE_DIM-CROPPED_DIM] + 1;
n = 1;
for i = indices     % for循环只是截取了4个角的
  for j = indices
    crops_data(:, :, :, n) = im_data(i:i+CROPPED_DIM-1, j:j+CROPPED_DIM-1, :);  % 截取一个角的 227*227的图片
    crops_data(:, :, :, n+5) = crops_data(end:-1:1, :, :, n);                   % 将该图片在x轴上作镜像,+5是因为共截取5张227*227
    n = n + 1;                                                                  % 截取5张,再分别镜像,一张图片变成了10张图片进行输入
  end                                                                           
end
center = floor(indices(2) / 2) + 1;     % 截取中心的图片,再进行镜像
crops_data(:,:,:,5) = ...
  im_data(center:center+CROPPED_DIM-1,center:center+CROPPED_DIM-1,:);
crops_data(:,:,:,10) = crops_data(end:-1:1, :, :, 5);

PS:

1. 大家可以看以下模型描述文件, deploy.prototxt ,里的这行   “input_param { shape: { dim: 10 dim: 3 dim: 227 dim: 227 } } ”    为什么输入是 10*3*227*227。一开始我还以为这个10是batch数,但是看完了 classification_demo后终于明白这个10是怎么来的了!

有兴趣的同学可以打开caffe-master\examples\mnist 下的 lenet.prototxt , 看这行  input_param { shape: { dim: 64 dim: 1 dim: 28 dim: 28 } },为什么是64??求解答

为了做参考,caffe-master\examples\cifar10 下的 cifar10_quick.prototxt 是  input_param { shape: { dim: 1 dim: 3 dim: 32 dim: 32 } }

2. 发现求scores的时候是有 1000*10的矩阵,也就是每一张crop图片是独立的input,输入并不是 一个10*3*227*227的一个数据,而是 10个 3*227*227的数据,然后得到10组得分,然后再求平均! (怎么老感觉有种作弊的嫌疑!!)     所以要运用此代码到自己的数据集时候,请记得留意 scores!!

【caffe-windows】 caffe-master 之 classfication_demo.m 超详细分析的更多相关文章

  1. 【C#】C#中使用GDAL3(二):Windows下读写Shape文件及超详细解决中文乱码问题

    转载请注明原文地址:https://www.cnblogs.com/litou/p/15035790.html 本文为<C#中使用GDAL3>的第二篇,总目录地址:https://www. ...

  2. windows的消息传递--消息盒子(超详细EM_UNDO等消息)

    使用delphi的消息机制可以方便操作后台,其中重要的就是sendmessage()函数.下面讲解一下这个函数 function SendMessage(hWnd: HWND; Msg: UINT;  ...

  3. windows环境下elasticsearch安装教程(超详细)

    一.安装jdk ElasticSearch是基于lucence开发的,也就是运行需要java jdk支持.所以要先安装JAVA环境. 由于ElasticSearch 5.x 往后依赖于JDK 1.8的 ...

  4. windows环境下node安装教程(超详细)

    安装node.js 1.下载node: 下载地址:http://nodejs.cn/download/ node.js的zip包安装时是直接解压缩后就可以了, node.js的msi包是傻瓜式一路ne ...

  5. 超详细分析Bootloader到内核的启动流程(万字长文)

    @ 目录 Bootloader启动流程分析 Bootloader第一阶段的功能 硬件设备初始化 为加载 Bootloader的第二阶段代码准备RAM空间(初始化内存空间) 复制 Bootloader的 ...

  6. JWT 超详细分析

    请参考以下链接 https://learnku.com/articles/17883

  7. 第9章 Linux进程和信号超详细分析

    9.1 进程简单说明 进程是一个非常复杂的概念,涉及的内容也非常非常多.在这一小节所列出内容,已经是我极度简化后的内容了,应该尽可能都理解下来,我觉得这些理论比如何使用命令来查看状态更重要,而且不明白 ...

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

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

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

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

随机推荐

  1. 程序员书单_J2EE专题

    Enterprise JavaBeans 3.0中文版(第5版) http://download.csdn.net/detail/shenzhq1980/9104015 J2EE设计模式 http:/ ...

  2. 【宋红康学习日记1】关于环境变量设置出现的问题——找不到或无法加载主类 java

    忙活了一整天,最后被自己的小愚蠢所拜倒,不过也是学习到了很多,知道了出现问题怎样去解决. 问题是在cmd运行环境中编译我的第一个小程序HelloWorld时,javac命令可以运行,但是java命令后 ...

  3. LVS包转发模型和调度算法(转)

    LVS简介 Internet的快速增长使多媒体网络服务器面对的访问数量快速增加,服务器需要具备提供大量并发访问服务的能力,因此对于大负载的服务器来 讲, CPU.I/O处理能力很快会成为瓶颈.由于单台 ...

  4. 如何重装air

    参考这里 很多年没有装过系统了,手贱用xxcleaner清理了下,好吧,我觉得只能重装了,直接贴过程吧 ,开机同时command+R,进入菜单 ,抹掉磁盘 ,重启,等在线更新(看各位运气了,网速好的话 ...

  5. 重复ID的记录,只显示其中1条

    --重复ID的记录,只显示其中1条 --生成原始表 select * into #tempTable from ( select '1' as id ,'a' as name union all se ...

  6. hdu 5437 Alisha’s Party 模拟 优先队列

    Problem Description Princess Alisha invites her friends to come to her birthday party. Each of her f ...

  7. Standing on Shouder of Giants

    Zachary_Fan 如何一步一步用DDD设计一个电商网站(二)-- 项目架构 http://www.cnblogs.com/Zachary-Fan/p/6012454.html HTTP 权威指南 ...

  8. [复变函数]第11堂课 3.3 Cauchy 积分定理及其推论

    0. 引言 (1) Cauchy 积分定理: 设 $D$ 为 $(n+1)$ 连通区域, $f$ 在 $D$ 内解析且连续到边界 $C$, 则 $\dps{\int_C f(\zeta)\rd \ze ...

  9. JS常用各种正则表达式

    1.非负整数         /^\d+$/ 2.正整数            /^[0-9]*[1-9][0-9]*$/ 3.非正整数        /^((-\d+)|(0+))$/ 4.负整数  ...

  10. mysql给日期增减

    有个需求就是判断过期的供求信息,如果用户刷新了则判断过期日期是否小于现在,如果是则自动推迟7天. IF(expire<NOW(),DATE_ADD(NOW(), INTERVAL 7 DAY), ...