【caffe-windows】 caffe-master 之 classfication_demo.m 超详细分析

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!!

时间: 2024-10-10 09:34:51

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

熊猫烧香_汇编级_超详细分析

1.样本概况 1.1 应用程序信息 文件: C:\Windows\System32\drivers\spo0lsv.exe 大小: 30001 bytes 修改时间: 2007年1月17日, 12:18:40 MD5: 512301C535C88255C9A252FDF70B7A03 SHA1: CA3A1070CFF311C0BA40AB60A8FE3266CFEFE870 CRC32: E334747C 简单功能介绍: \1. 自启动 \2. 删除gho文件 \3. 全盘感染指定类型文件 \

caffe windows配置

windows+caffe+vs2013+cuda6.5配置记录 http://www.bubuko.com/infodetail-902302.html caffe+windows7+vs2013配置 http://blog.csdn.net/tjusxh/article/details/48463409 Caffe配置指南 on Windows8.1+CUDA6.5+VS2013  http://www.wtoutiao.com/p/q78qy6.html caffe windows 学习第

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

caffe windows编译成功后,就可以开始进行测试了.如果还没有编译成功的,请参考:caffe windows 学习第一步:编译和安装(vs2012+win 64) 一般第一个测试都是建议对手写字体minist进行识别.这个测试放在根目录下的 .\examples\mnist\ 文件夹内. 1.下载数据.程序本身不带测试数据,需要去下载,测试数据为leveldb格式.你可以直接双击运行“get_mnist_leveldb.bat”  这个脚本自动下载数据,但一般都不成功,可能里面的网址被墙

caffe windows编译

MicroSoft维护的caffe已经作为官方的caffe分支了,编译方式也改了,刚好最近重装了一次caffe windows, 记录一下里面的坑 https://github.com/BVLC/caffe/tree/windows 安装有两种方案: 方案一:使用vs2015,缺点要最新的win10才能安装vs2015,故不推荐该方案 1. 把build_win.cmd 中的with_ninja的1,都改为0 2.手动下载libraries_v140_x64_py27_1.0.1.tar.bz2

Windows Caffe中MNIST数据格式转换实现

Caffe源码中src/caffe/caffe/examples/mnist/convert_mnist_data.cpp提供的实现代码并不能直接在Windows下运行,这里在源码的基础上进行了改写,使其可以直接在Windows 64位上直接运行,改写代码如下: #include "stdafx.h" #include <gflags/gflags.h> #include <glog/logging.h> #include <google/protobuf

windows+caffe+vs2013+cuda6.5配置记录

隔了大半年,因为论文的需要,又重新开始研究caffe.感谢niuzhiheng’s GitHub大神的贡献,caffe已经可以在Windows下使用了.参考了很多大神的博客,成功的在自己的笔记本配置好了Windows版本的caffe.现将自己的配置过程和配置中遇到的问题记录下来,希望能对大家有所帮助. 1.配置环境 我在自己的笔记本配置的caffe,配置的环境为:Windows 7 64位 + cuda6.5 + Opencv2.49 + VS2013.假设在配置caffe之前,你已经准备好这些

Ubuntu14.04(估计16.04也可以用,参照的就是16.04)+opencv + caffe(GPU版) + cuDnn超详细包括报错

lalalalala~ 经过一星期的折磨,总算把caffe配置好,感谢网上大神们的助攻. 查看了好多的博客,多多少少存在着坑.然后不停的在查找与修改,终于把caffe装进自己的碗里.在成功运行caffe后两天,特意分享一下caffe的配置过程,帮助后来有需要配置的人. 配置过程参考了https://www.cnblogs.com/go-better/p/7161006.html博文,对这次的配置提供了很大的帮助,感谢. 1. 安装相关依赖项 sudo apt-get update sudo ap

Windows Server 2016 新功能HCI(超融合基础架构) By S2D

超融合基础架构(Hyper-Converged Infrastructure,或简称"HCI")也被称为超融合架构,是指在同一套单元设备(x86服务器)中不仅仅具备计算.网络.存储和服务器虚拟化等资源和技术,而且还包括缓存加速.重复数据删除.在线数据压缩.备份软件.快照技术等元素,而多节点可以通过网络聚合起来,实现模块化的无缝横向扩展(scale-out),形成统一的资源池.超融合架构(Hyperconvergence Infrastructure, HCI)将虚拟化计算和存储整合到同

Windows 2016 无域故障转移群集部署方法 超详细图文教程

转自:https://blog.csdn.net/demonson/article/details/81708809 Windows 2016 无域故障转移群集部署方法 超详细图文教程 故障转移群集是一个很实用的功能,而windows在2016版本开始,终于支持不用域做故障转移群集.在群集中,我们可以设定一个"群集IP"而客户端只需要根据这个"群集IP"就能连接当前群集的主服务器.而不必关心群集服务器之间的替换.而更棒的是,它是"去中心"的,它没