参看caffe中三通道彩色图像的卷积过程

E:\caffe-windows-lib\matlab\hdf5creation\predict_label_testdata_for_analysis.m

代码:



clearvars;close all;

if ~exist('ttest_data','var')||~exist('means','var')
    test_data = load('ttest_data.mat'); % load ttest_data
    test_data = test_data.ttest_data;
    means = load('mean_file.mat');
    means = means.means;
end

n = length(test_data);
% rand_ind = randperm(n);
rand_ind = 1:n;
ttest_data = test_data(rand_ind(1:1));
ntest = length(ttest_data);
ttest_label = zeros(1,1,2,ntest);
face_size = [100 100]; % height width
% width height  channels nsamples
ttest_feature = zeros(face_size(1),face_size(2),3,ntest);
isShow = false;
tic;
for i = 1:ntest
    img = imread( ttest_data(i).imgPath);
    bbox = ttest_data(i).bbox;
    face_img = img(bbox(2):bbox(2)+bbox(4),bbox(1):bbox(1)+bbox(3),:);
    res_img = imresize(face_img,face_size);
    if isShow
        figure;
        imshow(face_img);
        pause;
    end
    ttest_label(:,:,1,i) = ttest_data(i).poseId + 2; % 0 1 2 3 4
    ttest_label(:,:,2,i) = ttest_data(i).smile ;
    ttest_feature(:,:,:,i) = res_img;

end
f_time = toc;
disp(['feature_time :' num2str(f_time)]);
% change rgb to bgr
ttest_feature = ttest_feature(:,:,[3 2 1],:);
% permute width height
ttest_feature = permute(ttest_feature,[2 1 3 4]);
% subtract mean_file
ttest_feature = ttest_feature - means;
ttest_feature = ttest_feature ./ 255;


net_model = 'deploy_1.prototxt';
net_weights = 'lenet_iter_10000.caffemodel';
phase = 'test';

if exist('../+caffe', 'dir')
    addpath('..');
else
    error('Please run this demo from caffe/matlab/demo');
end

net = caffe.Net(net_model, net_weights, phase);

% input_feature must be a cell
scores = net.forward({ttest_feature});

%% 获取网络中的blob
input_img = net.blobs('data').get_data();
conv1 = net.blobs('conv_all').get_data();

% input_image : w * h * c * n :255 * 255 * 3
% conv1: w * h * c * n  :96 * 96 *50,
% change w*h*c to h*w*c 即rows * cols * c
input_img = permute(input_img,[2 1 3]);
% change bgr to rgb
input_img = input_img(:,:,[3 2 1]);

ind1 = 6;

ind2 = 2;
conv11 = conv1(:,:,ind1);
conv11_img = permute(conv11,[2,1,3]);

%%
conv12 = conv1(:,:,ind2);
conv12_img = permute(conv12,[2,1,3]);
figure;
subplot(221);
imshow(res_img);
title('原图像');
subplot(222);
imshow(input_img,[]);
title('输入图像(减去均值)');
subplot(223);
imshow(conv11_img,[]);
title('响应map1');
subplot(224);
imshow(conv12_img,[]);
title('响应map2');

%% 权重的可视化
w = net.layers('conv_all').params(1).get_data();
disp(size(w));
b = net.layers('conv_all').params(2).get_data();
disp(size(b));
% change width and height
w = permute(w,[2 1 3 4]);
% change bgr to rgb
w = w(:,:,[3 2 1],:);

w11 = w(:,:,1,ind1);
w12 = w(:,:,2,ind1);
w13 = w(:,:,3,ind1);
figure(2);
% red channel
subplot(221);
imshow(w11,[]);
title('第一个滤波器的R通道');
% green channel
subplot(222);
imshow(w12,[]);
title('第一个滤波器的G通道');
% blue channel
subplot(223);
imshow(w13,[]);
title('第一个滤波器的B通道');

%% 参看是如何计算的

% using: input_img ,w11 w12 w13 ,conv11_img
% figure(4);
% imshow(input_img,[]);
figure(3);
% mean_img
subplot(441);
imshow(input_img(:,:,1),[]);
title({['大小为:' num2str(size(input_img(:,:,1)))];'均值图像的R通道'});
subplot(445);
imshow(input_img(:,:,2),[]);
title('均值图像的G通道');
subplot(449);
imshow(input_img(:,:,3),[]);
title('均值图像的B通道');
% filter
subplot(442);
imshow(w11,[]);
title({['大小为:' num2str(size(w11))];'滤波器的R通道'});
subplot(446);
imshow(w12,[]);
title('滤波器的G通道');
subplot(4,4,10);
imshow(w13,[]);
title('滤波器的B通道');

% map1

subplot(447);
imshow(conv11_img,[]);
title({['大小为:' num2str(size(conv11_img))];'响应map'});

%% check 计算过程:

% using: input_img ,w11 w12 w13 ,conv11_img
% 因为matlab卷积进行了旋转180度。
w11 = rot90(w11,2);
w12 = rot90(w12,2);
w13 = rot90(w13,2);
mapr = conv2(input_img(:,:,1),w11,'valid');%valid 只取有效部分
mapg = conv2(input_img(:,:,2),w12,'valid');
mapb = conv2(input_img(:,:,3),w13,'valid');

map = mapr + mapg + mapb;
map = map + b(ind1);

%因为代码中带了个relu层
map(find(map<0)) = 0;

subplot(448)
imshow(map,[]);
title({['大小为:' num2str(size(map))];'计算的map'});

运行结果:
这里写图片描述
图中,左边三张图像是输入单个图像的三个通道(已经减去均值的图像),从左第2栏是三个通道对应的学习的滤波器权重(额外的一个偏置,不能画出来),第三栏是Caffe给出的卷积层+relu的结果(因为我们卷积层后面跟着一个in place relu操作),最后一栏是模拟caffe操作形成的同样的结果。

在caffe中的卷积层的训练参数为如下,我们没有设置卷积层的group参数,默认为1,即将所有通道看成一组。因此操作为:

conv_oper= w11 * img_r + w12 * img_g+w13 * img__b + bias

img_r,img_g,img_b是img的三个通道图像,bias是偏置。

layer {
  name: "conv_all"
  type: "Convolution"
  bottom: "data"
  top: "conv_all"
  convolution_param {
    num_output: 50
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}
layer {
  name: "relu_all"
  type: "ReLU"
  bottom: "conv_all"
  top: "conv_all"
}

实验代码2:



clearvars;close all;

if ~exist('ttest_data','var')||~exist('means','var')
    test_data = load('ttest_data.mat'); % load ttest_data
    test_data = test_data.ttest_data;
    means = load('mean_file.mat');
    means = means.means;
end

n = length(test_data);
% rand_ind = randperm(n);
rand_ind = 1:n;
ttest_data = test_data(rand_ind(1:1));
ntest = length(ttest_data);
ttest_label = zeros(1,1,2,ntest);
face_size = [100 100]; % height width
% width height  channels nsamples
ttest_feature = zeros(face_size(1),face_size(2),3,ntest);
isShow = false;
tic;
for i = 1:ntest
    img = imread( ttest_data(i).imgPath);
    bbox = ttest_data(i).bbox;
    face_img = img(bbox(2):bbox(2)+bbox(4),bbox(1):bbox(1)+bbox(3),:);
    res_img = imresize(face_img,face_size);
    if isShow
        figure;
        imshow(face_img);
        pause;
    end
    ttest_label(:,:,1,i) = ttest_data(i).poseId + 2; % 0 1 2 3 4
    ttest_label(:,:,2,i) = ttest_data(i).smile ;
    ttest_feature(:,:,:,i) = res_img;

end
f_time = toc;
disp(['feature_time :' num2str(f_time)]);
% change rgb to bgr
ttest_feature = ttest_feature(:,:,[3 2 1],:);
% permute width height
ttest_feature = permute(ttest_feature,[2 1 3 4]);
% subtract mean_file
ttest_feature = ttest_feature - means;
ttest_feature = ttest_feature ./ 255;


net_model = 'deploy.prototxt';
net_weights = 'lenet_iter_10000.caffemodel';
phase = 'test';

if exist('../+caffe', 'dir')
    addpath('..');
else
    error('Please run this demo from caffe/matlab/demo');
end

net = caffe.Net(net_model, net_weights, phase);

% input_feature must be a cell
scores = net.forward({ttest_feature});

%% 获取网络中的blob
input_img = net.blobs('data').get_data();
conv1 = net.blobs('conv_all').get_data();

% input_image : w * h * c * n :255 * 255 * 3
% conv1: w * h * c * n  :96 * 96 *60,
% change w*h*c to h*w*c 即rows * cols * c
input_img = permute(input_img,[2 1 3]);
% change bgr to rgb
input_img = input_img(:,:,[3 2 1]);

ind1 = 6;

% change width to height
conv1 = permute(conv1,[2,1,3,4]);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% point1 
conv1b = conv1(:,:,1); % blue
conv1g = conv1(:,:,21); % green
conv1r = conv1(:,:,41); % red

figure;
subplot(121);
imshow(res_img);
title('原图像');
subplot(122);
imshow(input_img,[]);
title('输入图像(减去均值)');

%% 权重的可视化
w = net.layers('conv_all').params(1).get_data();% 5 * 5 * 1 * 60
disp(size(w));
b = net.layers('conv_all').params(2).get_data(); % 60 * 1
disp(size(b));
% change width and height
w = permute(w,[2 1 3 4]);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% point 2
w1b = w(:,:,1,1);
w1g = w(:,:,1,21);
w1r = w(:,:,1,41);

figure(2);
% red channel
subplot(221);
imshow(w1b,[]);
title('第一个滤波器的b通道');
% green channel
subplot(222);
imshow(w1g,[]);
title('第一个滤波器的G通道');
% blue channel
subplot(223);
imshow(w1r,[]);
title('第一个滤波器的r通道');

%% 参看是如何计算的

% using: input_img ,w11 w12 w13 ,conv11_img
% figure(4);
% imshow(input_img,[]);
figure(3);
% mean_img
subplot(441);
imshow(input_img(:,:,1),[]);
title({['大小为:' num2str(size(input_img(:,:,1)))];'均值图像的R通道'});
subplot(445);
imshow(input_img(:,:,2),[]);
title('均值图像的G通道');
subplot(449);
imshow(input_img(:,:,3),[]);
title('均值图像的B通道');
% filter
subplot(442);
imshow(w1r,[]);
title({['大小为:' num2str(size(w1b))];'滤波器的r通道:41'});
subplot(446);
imshow(w1g,[]);
title('滤波器的G通道:21');
subplot(4,4,10);
imshow(w1b,[]);
title('滤波器的b通道:1');

% map1

subplot(443);
imshow(conv1r,[]);
title({['大小为:' num2str(size(conv1b))];'conv1r'});
subplot(447);
imshow(conv1g,[]);
title('conv1g');
subplot(4,4,11);
imshow(conv1b,[]);
title('conv1b');

%% check 计算过程:

% using: input_img ,w11 w12 w13 ,conv11_img
% 因为matlab卷积进行了旋转180度。
w1b = rot90(w1b,2);
w1g = rot90(w1g,2);
w1r = rot90(w1r,2);
mapr = conv2(input_img(:,:,1),w1r,'valid');%valid 只取有效部分
mapg = conv2(input_img(:,:,2),w1g,'valid');
mapb = conv2(input_img(:,:,3),w1b,'valid');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% point 3
mapb = mapb + b(1);
mapg = mapg + b(21);
mapr = mapr + b(41);


%因为代码中带了个relu层
mapb(find(mapb<0)) = 0;
mapg(find(mapg<0)) = 0;
mapr(find(mapr<0)) = 0;

subplot(444)
imshow(mapr,[]);
title({['大小为:' num2str(size(mapb))];'计算的mapr'});

subplot(448)
imshow(mapg,[]);
title('计算的mapg');

subplot(4,4,12)
imshow(mapb,[]);
title('计算的mapb');

%%% 我们可以检查数据: mapb == conv1b? mapr == conv1r? mapg == conv1g?

实验中,我们将第一个conv1层的group设置为3,输入数据为三通道的彩色图像(采用测试时跟踪数据的流向).
部分deploy.prototxt协议如下:

# 数据输入
layer
{
 name:"data"
 type:"Input"
 top:"data"
 input_param{shape:{dim:1 dim:3 dim:100 dim:100}}
}
# 第一个卷积层
layer {
  name: "conv_all"
  type: "Convolution"
  bottom: "data"
  top: "conv_all"
  convolution_param {
    num_output: 60
    kernel_size: 5
    stride: 1
    group: 3
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
    }
  }
}

结果图像:

这里写图片描述

执行过程如下图:
这里写图片描述

说明,对于单图像的预测,首先将输入图像减去均值图像,然后分离出三个通道b,g,r,然后首先将b通道图像与20个滤波器卷积,然后将g通道与20个滤波器卷积,r亦如此。所以为了演示三个通道的卷积过程,会采用下标1,21,41的访问形式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值