1. 程式人生 > >Caffe matlab之基於Alex network的特徵提取

Caffe matlab之基於Alex network的特徵提取

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會崩潰。