【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!!
【caffe-windows】 caffe-master 之 classfication_demo.m 超详细分析的更多相关文章
- 【C#】C#中使用GDAL3(二):Windows下读写Shape文件及超详细解决中文乱码问题
转载请注明原文地址:https://www.cnblogs.com/litou/p/15035790.html 本文为<C#中使用GDAL3>的第二篇,总目录地址:https://www. ...
- windows的消息传递--消息盒子(超详细EM_UNDO等消息)
使用delphi的消息机制可以方便操作后台,其中重要的就是sendmessage()函数.下面讲解一下这个函数 function SendMessage(hWnd: HWND; Msg: UINT; ...
- windows环境下elasticsearch安装教程(超详细)
一.安装jdk ElasticSearch是基于lucence开发的,也就是运行需要java jdk支持.所以要先安装JAVA环境. 由于ElasticSearch 5.x 往后依赖于JDK 1.8的 ...
- windows环境下node安装教程(超详细)
安装node.js 1.下载node: 下载地址:http://nodejs.cn/download/ node.js的zip包安装时是直接解压缩后就可以了, node.js的msi包是傻瓜式一路ne ...
- 超详细分析Bootloader到内核的启动流程(万字长文)
@ 目录 Bootloader启动流程分析 Bootloader第一阶段的功能 硬件设备初始化 为加载 Bootloader的第二阶段代码准备RAM空间(初始化内存空间) 复制 Bootloader的 ...
- JWT 超详细分析
请参考以下链接 https://learnku.com/articles/17883
- 第9章 Linux进程和信号超详细分析
9.1 进程简单说明 进程是一个非常复杂的概念,涉及的内容也非常非常多.在这一小节所列出内容,已经是我极度简化后的内容了,应该尽可能都理解下来,我觉得这些理论比如何使用命令来查看状态更重要,而且不明白 ...
- caffe windows学习:第一个测试程序
caffe windows编译成功后,就可以开始进行测试了.如果还没有编译成功的,请参考:caffe windows 学习第一步:编译和安装(vs2012+win 64) 一般第一个测试都是建议对手写 ...
- caffe windows 学习第一步:编译和安装(vs2012+win 64)
没有GPU,没有linux, 只好装caffe的windows版本了. 我的系统是win10(64位),vs 2012版本,其它什么都没有装,因此会需要一切的依赖库. 其实操作系统只要是64位就行了, ...
随机推荐
- android外包公司——最新案例铁血军事手机客户端(IOS & Android)
<铁血军事>Android手机客户端由铁血网开发和运营,为网友提供铁血论坛和铁血读书两大产品.使用Android手机客户端,您不仅可以阅读到最新军事资讯,随时参与精彩话题讨论,还可以在线阅 ...
- IntelliJ IDEA修改Output输出缓存区大小【应对:too much output to process】
IntelliJ IDEA默认的Output输出缓存区大小只有1024KB,超过大小限制的就会被清除,而且还会显示[too much output to process],可通过如下配置界面进行修改O ...
- AngularJS PhoneCat代码分析
转载自:http://www.tuicool.com/articles/ym6Jfen AngularJS 官方网站提供了一个用于学习的示例项目:PhoneCat.这是一个Web应用,用户可以浏览一些 ...
- PHP多线程
#### 方案一: PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程.多线程在处理重复性的循环任务,能够大大缩短程序执行时间.我之前的文章中说过,大多数网站的性 ...
- ssh整合随笔(注解方式,Spring 管理action)
Web.xml<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=" ...
- [JavaWebService-axis]-环境搭建
一.准备 1.下载环境需要的zip包 JDK Eclipse axis(http://axis.apache.org/axis2/java/core/download.html)(axis2-1.7. ...
- Kmeans算法学习与SparkMlLib Kmeans算法尝试
K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一.K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的方法,逐次更新各聚类中心的 ...
- NeHe OpenGL教程 第三十八课:资源文件
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 7.4 gcd
# include<stdio.h>int main(){ int gcd(int a,int b); int n,i,x,y,c; scanf("%d",&n ...
- Android开发者需要面对的8大挑战
移动开发变得越来越受欢迎,但移动开发者正面临着一系列挑战.本文将介绍的是Android开发者需要面对的8个不利因素,例如缺乏硬件标准化,以及软件碎片.为Android OS开发app,给予了开发人员极 ...