windows caffe matlab 可视化

参考:
http://blog.csdn.net/zb1165048017/article/details/52643188

http://blog.csdn.net/ws_20100/article/details/50525879

%%%%%将.m文件都放在caffe的根目录下,运行下面的代码时也都是在caffe根目录下运行
addpath('matlab');%添加+caffe的路径
caffe.set_mode_cpu();%设置cpu模式
model='models/bvlc_reference_caffenet/deploy.prototxt';%模型
weights='models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel';%训练好的权值数据
%%%%下面两句用于在matlab中创建训练好的网络,即创建一个net的对象,也可以用下面一句代码代替net = caffe.Net(model, weights, 'test'); 
net=caffe.Net(model,'test');
net.copy_from(weights);
net%显示网络结构
d=load('matlab/+caffe/imagenet/ilsvrc_2012_mean.mat');%%下载均值文件
mean_data=d.mean_data;

%%%%%%%%%%%%%%%%裁剪生成10幅图片,并显示,裁剪图片过程中用到的都是matlab的基本函数,无关caffe的特定函数
im=imread('examples/images/cat.jpg');
IMAGE_DIM=256;
CROPPED_DIM=227;
im_data=im(:,:,[3,2,1]);
im_data=permute(im_data,[2,1,3]);
im_data=single(im_data);
im_data=imresize(im_data,[IMAGE_DIM,IMAGE_DIM],'bilinear');
im_data=im_data-mean_data;
crops_data=zeros(CROPPED_DIM,CROPPED_DIM,3,10,'single');
indices=[0 IMAGE_DIM-CROPPED_DIM]+1;
%裁剪生成12346789张图片
n=1;
for i=indices
for j=indices
crop_data(:,:,:,n)=im_data(i:i+CROPPED_DIM-1,j:j+CROPPED_DIM-1,:);
crop_data(:,:,:,n+5)=crop_data(end:-1:1,:,:,n);
n=n+1;
end
end
%%裁剪生成第5和第10张图片
center=floor(indices(2)/2)+1;
crop_data(:,:,:,5)=im_data(center:center+CROPPED_DIM-1,center:center+CROPPED_DIM-1,:);
crop_data(:,:,:,10)=crop_data(end:-1:1,:,:,5);
%%%%%下面的语句用于将裁剪生成的10张图片一起输出,都是matlab的一些基本操作,无关caffe的特定操作
cat_map=zeros(CROPPED_DIM*2,CROPPED_DIM*5,3);
cat_num=0;
for i=0:1
for j=0:4
cat_num=cat_num+1;
cat_map(CROPPED_DIM*i+1:CROPPED_DIM*(i+1),CROPPED_DIM*j+1:CROPPED_DIM*(j+1),:)=crop_data(:,:,:,cat_num);
end
end
imshow(uint8(cat_map));

%%%%%%%%%%%%%%%%%前向运算过程
%前向运算可用net.forward或net.forward_prefilled
%函数net.forward将一个包含输入blob(s)的cell数组作为输入,并输出一个包含输出blob(s)的cell数组。
%通过下面两句可以得到1000*10个数据,对于该结构的卷积网络,每幅图片生成1000个输出,共10幅图片,每幅图片的1000个数据代表输出1000个类别的概率
%若使用net.forward_prefilled则程序变为:
%net.blobs('data').set_data(crop_data);
%net.forward_prefilled();
%prob = net.blobs('prob').get_data();
%%%%%%%%%
res=net.forward({crop_data});
prob=res{1};
%后面这两句可用于判别哪个类别的概率最大
prob1=mean(prob,2);
[~,maxlabel]=max(prob1);


%%%%%%%%%%%%%%%%%%%可视化特征图
function[]=feature_partvisual(net,mapnum,crop_num)
names=net.blob_names;%%%%对应的是每一层的top,表示输出数据
%%访问每一个输出top的方法为net.blobs(这里面是每一个输出blob的名字).get_data();
%%mapnum是几就表示获取了第几层的特征图
featuremap=net.blobs(names{mapnum}).get_data();
%%crop_num表示第几张图片的特征图,前面已将原始图片crop成10张
%下面的代码只是用于将某张图片的某层的特征图显示出来,无关caffe特有的函数
[m_size,n_size,num,crop]=size(featuremap);
row=ceil(sqrt(num));
col=row;
feature_map=zeros(m_size*row,n_size*col);
cout_map=1;
for i=0:row-1
    for j=0:col-1
        if cout_map<=num
            feature_map(i*m_size+1:(i+1)*m_size,j*n_size+1:(j+1)*n_size)=(mapminmax(featuremap(:,:,cout_map,crop_num),0,1)*255)';
            cout_map=cout_map+1;
        end
    end
end
imshow(uint8(feature_map));
end

%%%%%%%%%%%%%%%%可视化权值
function[]=weight_partvisual(net,layer_num,channel_num)
layers=net.layer_names;%把所有层的名字列出来
covlayer=[];
%%找出所有的卷积层
for i=1:length(layers)
if strcmp(layers{i}(1:3),'con')
covlayer=[covlayer;layers{i}];
end
end
%%获取某一层的权值参数和偏置参数
w=net.layers(covlayer(layer_num,:)).params(1).get_data();
b=net.layers(covlayer(layer_num,:)).params(2).get_data();
%%%下面只是将权值显示出来
minval=min(min(min(min(w))));
maxval=max(max(max(max(w))));
w=(w-minval)/maxval*255;
weight=w(:,:,channel_num,:);
[kernel_r,kernel_c,input_num,kernel_num]=size(w);
map_row=ceil(sqrt(kernel_num));
map_col=map_row;
weight_map=zeros(kernel_r*map_row,kernel_c*map_col);
kernelcout_map=1;
for i=0:map_row-1
    for j=0:map_col-1
        if kernelcout_map<=kernel_num
            weight_map(i*kernel_r+1+i:(i+1)*kernel_r+i,j*kernel_c+1+j:(j+1)*kernel_c+j)=weight(:,:,:,kernelcout_map);
            kernelcout_map=kernelcout_map+1;
        end
    end
end
figure
imshow(uint8(weight_map));
end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值