Skip to content

Commit

Permalink
add code compatible with cudnn2.0
Browse files Browse the repository at this point in the history
  • Loading branch information
wanglimin committed Aug 7, 2015
1 parent 549e93b commit 8ae2c24
Show file tree
Hide file tree
Showing 8 changed files with 848 additions and 19 deletions.
60 changes: 60 additions & 0 deletions ExtractVideoCNNFeature_ucf.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
function ExtractVideoCNNFeature_ucf(layer,scale,gpu_id, tag, ind)
addpath /home/lmwang/code/caffe_data_parallel/caffe/matlab
sizes =[480,640; 340,454; 240,320; 170,227; 120,160];
path_org = '/nfs/lmwang/lmwang/Data/UCF101/ucf101_org/';
folderlist = dir(path_org);
foldername = {folderlist(:).name};
foldername = setdiff(foldername,{'.','..'});

% FLOW
if strcmp(tag,'flow')
path2 = ['/media/RAID0/lmwang/data/UCF/ucf101_tvl1_flow_conv5_scale_',num2str(scale),'/'];
path3 = ['/media/RAID0/lmwang/data/UCF/ucf101_tvl1_flow_conv4_scale_',num2str(scale),'/'];
path4 = ['/media/RAID0/lmwang/data/UCF/ucf101_tvl1_flow_conv3_scale_',num2str(scale),'/'];
path5 = ['/media/RAID0/lmwang/data/UCF/ucf101_tvl1_flow_pool2_scale_',num2str(scale),'/'];
path_flow = '/media/RAID0/lmwang/data/UCF/ucf101_flow_img_tvl1_gpu/';

model_def_file = [ 'models/flow_',layer,'_scale_',num2str(scale),'_new.prototxt'];
model_file = '10_flow_iter_90000_new.caffemodel';
caffe.reset_all();
caffe.set_mode_gpu();
caffe.set_device(gpu_id);
net = caffe.Net(model_def_file, model_file, 'test');

for i = ind
if ~exist([path2,foldername{i}],'dir')
mkdir([path2,foldername{i}]);
end
if ~exist([path3,foldername{i}],'dir')
mkdir([path3,foldername{i}]);
end
if ~exist([path4,foldername{i}],'dir')
mkdir([path4,foldername{i}]);
end
if ~exist([path5,foldername{i}],'dir')
mkdir([path5,foldername{i}]);
end
filelist = dir([path_org,foldername{i},'/*.avi']);
for j = 1:length(filelist)
filename = [path_flow,foldername{i},'/',filelist(j).name(1:end-4),'/'];
if ~exist([path5,foldername{i},'/',filelist(j).name(1:end-4),'.mat'],'file')
tic;
[feature_c5, feature_c4, feature_c3, feature_p2] = TemporalCNNFeature(filename, net, sizes(scale,1), sizes(scale,2));
toc;
tic;
feature = feature_c5;
save([path2,foldername{i},'/',filelist(j).name(1:end-4),'.mat'],'feature','-v7.3');
feature = feature_c4;
save([path3,foldername{i},'/',filelist(j).name(1:end-4),'.mat'],'feature','-v7.3');
feature = feature_c3;
save([path4,foldername{i},'/',filelist(j).name(1:end-4),'.mat'],'feature','-v7.3');
feature = feature_p2;
save([path5,foldername{i},'/',filelist(j).name(1:end-4),'.mat'],'feature','-v7.3');
toc;
end
end
i
end
caffe.reset_all();
end

61 changes: 42 additions & 19 deletions FlowCNNFeature.m
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
function FCNNFeature = FlowCNNFeature(vid_name, use_gpu, NUM_HEIGHT, NUM_WIDTH, model_def_file, model_file, gpu_id)

function [FCNNFeature_c5, FCNNFeature_c4, FCNNFeature_c3, FCNNFeature_p2, FCNNFeature_c2, FCNNFeature_p1, FCNNFeature_c1]...
= FlowCNNFeature(vid_name, use_gpu, NUM_HEIGHT, NUM_WIDTH, model_def_file, model_file, gpu_id)
L = 10;
% Input video
filelist =dir([vid_name,'*_x*.jpg']);
if length(filelist) > 30 *60
video = zeros(NUM_HEIGHT,NUM_WIDTH,L*2,30*60,'single');
else
video = zeros(NUM_HEIGHT,NUM_WIDTH,L*2,length(filelist),'single');
end

for i = 1:size(video,4)
video = zeros(NUM_HEIGHT,NUM_WIDTH,L*2,length(filelist));
for i = 1: length(filelist)
flow_x = imread(sprintf('%s_%04d.jpg',[vid_name,'flow_x'],i));
flow_y = imread(sprintf('%s_%04d.jpg',[vid_name,'flow_y'],i));
video(:,:,1,i) = imresize(flow_x,[NUM_HEIGHT,NUM_WIDTH],'bilinear');
Expand All @@ -21,6 +16,7 @@
video(:,:,i*2+1:i*2+2,:) = tmp;
end


% Initialize ConvNet
if caffe('is_initialized') == 0
if exist('use_gpu', 'var')
Expand All @@ -35,26 +31,53 @@
d = load('flow_mean');
FLOW_MEAN = d.image_mean;
FLOW_MEAN = imresize(FLOW_MEAN,[NUM_HEIGHT,NUM_WIDTH]);
video = bsxfun(@minus,video,FLOW_MEAN);
video = permute(video,[2,1,3,4]);

batch_size = 40;
num_images = size(video,4);
num_batches = ceil(num_images/batch_size);
FCNNFeature = [];
FCNNFeature_c5 = [];
FCNNFeature_c4 = [];
FCNNFeature_c3 = [];
FCNNFeature_p2 = [];
FCNNFeature_c2 = [];
FCNNFeature_p1 = [];
FCNNFeature_c1 = [];

images = zeros(NUM_WIDTH, NUM_HEIGHT, L*2, batch_size, 'single');
for bb = 1 : num_batches
range = 1 + batch_size*(bb-1): min(num_images,batch_size*bb);
images = zeros(NUM_WIDTH, NUM_HEIGHT, L*2, batch_size, 'single');
tmp = video(:,:,:,range);
images(:,:,:,1:size(tmp,4)) = tmp;

feature = caffe('forward',{images});
feature = permute(feature{1},[2,1,3,4]);
if isempty(FCNNFeature)
FCNNFeature = zeros(size(feature,1), size(feature,2), size(feature,3), num_images, 'single');
for ii = 1 : size(tmp,4)
img = single(tmp(:,:,:,ii));
images(:,:,:,ii) = permute(img -FLOW_MEAN,[2,1,3]);
end

caffe('forward',{images});
feature_map = caffe('get_feature_maps');
feature_c5 = permute(feature_map(14).feature_maps{1}, [2,1,3,4]);
feature_c4 = permute(feature_map(12).feature_maps{1}, [2,1,3,4]);
feature_c3 = permute(feature_map(10).feature_maps{1}, [2,1,3,4]);
feature_p2 = permute(feature_map(8).feature_maps{1}, [2,1,3,4]);
% feature_c2 = permute(feature_map(7).feature_maps{1}, [2,1,3,4]);
% feature_p1 = permute(feature_map(4).feature_maps{1}, [2,1,3,4]);
% feature_c1 = permute(feature_map(3).feature_maps{1}, [2,1,3,4]);
if isempty(FCNNFeature_c5)
FCNNFeature_c5 = zeros(size(feature_c5,1), size(feature_c5,2), size(feature_c5,3), num_images, 'single');
FCNNFeature_c4 = zeros(size(feature_c4,1), size(feature_c4,2), size(feature_c4,3), num_images, 'single');
FCNNFeature_c3 = zeros(size(feature_c3,1), size(feature_c3,2), size(feature_c3,3), num_images, 'single');
FCNNFeature_p2 = zeros(size(feature_p2,1), size(feature_p2,2), size(feature_p2,3), num_images, 'single');
% FCNNFeature_c2 = zeros(size(feature_c2,1), size(feature_c2,2), size(feature_c2,3), num_images, 'single');
% FCNNFeature_p1 = zeros(size(feature_p1,1), size(feature_p1,2), size(feature_p1,3), num_images, 'single');
% FCNNFeature_c1 = zeros(size(feature_c1,1), size(feature_c1,2), size(feature_c1,3), num_images, 'single');
end
FCNNFeature(:,:,:,range) = feature(:,:,:,mod(range-1,batch_size)+1);
FCNNFeature_c5(:,:,:,range) = feature_c5(:,:,:,mod(range-1,batch_size)+1);
FCNNFeature_c4(:,:,:,range) = feature_c4(:,:,:,mod(range-1,batch_size)+1);
FCNNFeature_c3(:,:,:,range) = feature_c3(:,:,:,mod(range-1,batch_size)+1);
FCNNFeature_p2(:,:,:,range) = feature_p2(:,:,:,mod(range-1,batch_size)+1);
% FCNNFeature_c2(:,:,:,range) = feature_c2(:,:,:,mod(range-1,batch_size)+1);
% FCNNFeature_p1(:,:,:,range) = feature_p1(:,:,:,mod(range-1,batch_size)+1);
% FCNNFeature_c1(:,:,:,range) = feature_c1(:,:,:,mod(range-1,batch_size)+1);
end

end
61 changes: 61 additions & 0 deletions TemporalCNNFeature.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
function [FCNNFeature_c5, FCNNFeature_c4, FCNNFeature_c3, FCNNFeature_p2] = TemporalCNNFeature(vid_name, net, NUM_HEIGHT, NUM_WIDTH)

L = 10;
% Input video
filelist =dir([vid_name,'*_x*.jpg']);
video = zeros(NUM_HEIGHT,NUM_WIDTH,L*2,length(filelist));
for i = 1: length(filelist)
flow_x = imread(sprintf('%s_%04d.jpg',[vid_name,'flow_x'],i));
flow_y = imread(sprintf('%s_%04d.jpg',[vid_name,'flow_y'],i));
video(:,:,1,i) = imresize(flow_x,[NUM_HEIGHT,NUM_WIDTH],'bilinear');
video(:,:,2,i) = imresize(flow_y,[NUM_HEIGHT,NUM_WIDTH],'bilinear');
end

for i = 1:L-1
tmp = cat(4, video(:,:,(i-1)*2+1:i*2,2:end),video(:,:,(i-1)*2+1:i*2,end));
video(:,:,i*2+1:i*2+2,:) = tmp;
end

d = load('flow_mean');
FLOW_MEAN = d.image_mean;
FLOW_MEAN = imresize(FLOW_MEAN,[NUM_HEIGHT,NUM_WIDTH]);

batch_size = 40;
num_images = size(video,4);
num_batches = ceil(num_images/batch_size);

FCNNFeature_c5 = [];
FCNNFeature_c4 = [];
FCNNFeature_c3 = [];
FCNNFeature_p2 = [];

for bb = 1 : num_batches
range = 1 + batch_size*(bb-1): min(num_images,batch_size*bb);
images = zeros(NUM_WIDTH, NUM_HEIGHT, L*2, batch_size, 'single');
tmp = video(:,:,:,range);

for ii = 1 : size(tmp,4)
img = single(tmp(:,:,:,ii));
images(:,:,:,ii) = permute(img -FLOW_MEAN,[2,1,3]);
end

net.blobs('data').set_data(images);
net.forward_prefilled();
feature_c5 = permute(net.blobs('conv5').get_data(),[2,1,3,4]);
feature_c4 = permute(net.blobs('conv4').get_data(),[2,1,3,4]);
feature_c3 = permute(net.blobs('conv3').get_data(),[2,1,3,4]);
feature_p2 = permute(net.blobs('pool2').get_data(),[2,1,3,4]);

if isempty(FCNNFeature_c5)
FCNNFeature_c5 = zeros(size(feature_c5,1), size(feature_c5,2), size(feature_c5,3), num_images, 'single');
FCNNFeature_c4 = zeros(size(feature_c4,1), size(feature_c4,2), size(feature_c4,3), num_images, 'single');
FCNNFeature_c3 = zeros(size(feature_c3,1), size(feature_c3,2), size(feature_c3,3), num_images, 'single');
FCNNFeature_p2 = zeros(size(feature_p2,1), size(feature_p2,2), size(feature_p2,3), num_images, 'single');
end
FCNNFeature_c5(:,:,:,range) = feature_c5(:,:,:,mod(range-1,batch_size)+1);
FCNNFeature_c4(:,:,:,range) = feature_c4(:,:,:,mod(range-1,batch_size)+1);
FCNNFeature_c3(:,:,:,range) = feature_c3(:,:,:,mod(range-1,batch_size)+1);
FCNNFeature_p2(:,:,:,range) = feature_p2(:,:,:,mod(range-1,batch_size)+1);
end

end
137 changes: 137 additions & 0 deletions models/flow_conv5_scale_1_new.prototxt
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
name: "VGG_CNN_M_2048"
input: "data"
input_dim: 40
input_dim: 20
input_dim: 480
input_dim: 640
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
convolution_param {
num_output: 96
pad: 3
kernel_size: 7
stride: 2
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "conv1"
top: "conv1"
}
layer {
name: "norm1"
type: "LRN"
bottom: "conv1"
top: "norm1"
lrn_param {
local_size: 5
alpha: 0.0005
beta: 0.75
}
}
layer {
name: "pool1"
type: "Pooling"
bottom: "norm1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "conv2"
type: "Convolution"
bottom: "pool1"
top: "conv2"
convolution_param {
num_output: 256
pad: 2
kernel_size: 5
stride: 2
}
}
layer {
name: "relu2"
type: "ReLU"
bottom: "conv2"
top: "conv2"
}
layer {
name: "norm2"
type: "LRN"
bottom: "conv2"
top: "norm2"
lrn_param {
local_size: 5
alpha: 0.0005
beta: 0.75
}
}
layer {
name: "pool2"
type: "Pooling"
bottom: "norm2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layer {
name: "conv3"
type: "Convolution"
bottom: "pool2"
top: "conv3"
convolution_param {
num_output: 512
pad: 1
kernel_size: 3
}
}
layer {
name: "relu3"
type: "ReLU"
bottom: "conv3"
top: "conv3"
}
layer {
name: "conv4"
type: "Convolution"
bottom: "conv3"
top: "conv4"
convolution_param {
num_output: 512
pad: 1
kernel_size: 3
}
}
layer {
name: "relu4"
type: "ReLU"
bottom: "conv4"
top: "conv4"
}
layer {
name: "conv5"
type: "Convolution"
bottom: "conv4"
top: "conv5"
convolution_param {
num_output: 512
pad: 1
kernel_size: 3
}
}
layer {
name: "relu5"
type: "ReLU"
bottom: "conv5"
top: "conv5"
}
Loading

0 comments on commit 8ae2c24

Please sign in to comment.