Caffe matlab之基於Alex network的特徵提取
阿新 • • 發佈:2018-12-30
R-CNN是第一篇成功得將CNN用於object detection並取得優異效果的文章,是學習CNN for object detection的必讀文章。R-CNN中提到Alex network可以用作一個“黑匣子”來提取特徵,CV中的很多問題都需要尋找特徵,如果直接試試利用Alex network去做特徵提取,往往也是大有裨益的。最近研讀了一下R-CNN的原始碼,然後將其中基於Alex network提取特徵的程式抽取了出來,現在任意輸入一副227*227的RGB圖片,都可以直接利用基於Alex network來提取特徵,現在將提取程式記錄如下:
% %讀取網路配置檔案
opts.net_def_file = './model-defs/rcnn_batch_256_output_pool5.prototxt';
% %讀取儲存網路權值的檔案
opts.net_file = './data/caffe_nets/finetune_voc_2012_train_iter_70k';
%載入網路,設定為cpu模式
rcnn_model = rcnn_create_model(opts.net_def_file, opts.net_file);
rcnn_model = rcnn_load_model(rcnn_model,0); %第二個引數為0意味著CPU模式,1則是GPU模式
%讀取圖片
img_path = './examples/images/000084.jpg';
tmp_image = imread(img_path); %im是227*227的RGB圖片
tmp_image=single(tmp_image(:,:,[3 2 1]));%轉換成BGR形式
tmp_image = tmp_image-image_mean;%減去影象均值,這裡的image_mean是R-CNN中提供的均值檔案
[features] = rcnn_box_features(im,rcnn_model);
function [feature] = rcnn_box_features(im,rcnn_model)
%把cnn模型當做一個提取特徵的黑匣子
%im:源影象
%rcnn_model:rcnn模型結構體
% make sure that caffe has been initialized for this model
if rcnn_model.cnn.init_key ~= caffe('get_init_key')
error('You probably need to call rcnn_load_model');
end
%準備操作
crop_size=227;
ims = zeros(crop_size, crop_size, 3, 1, 'single');
window = zeros(crop_size, crop_size, 3, 'single');
window=im;
ims(:,:,:,1) =permute(window, [2 1 3]);
batch{1}=ims;
%利用caffe提取特徵
feat = caffe('forward', batch(1));
feat=feat{1};
end
之前的部落格《Windows下R-CNN 配置與demo執行》講過如何配置R-CNN的執行環境,在配置好R-CNN的執行環境之後,按照上述的原始碼即可直接利用Alex 網路來提取特徵。
rcnn_batch_256_output_pool5.prototxt中描述的網路的結構,當前提取的是pool5層的特徵,而pool5層是由256個6*6的feature map構成,因此輸出的feat的size為為[6,6,256]。將其轉成6*6*256=9612的特徵向量,後續就可以根據需求送入SVM訓練等等。
注:當我們只對一副227*227的圖片提取特徵的時候,需要修改rcnn_batch_256_output_pool5.prototxt,將batchsize改為1(預設是256),否則matlab會崩潰。