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来提取特征,现在将提取程序记录如下:




    
    
  1. % %读取网络配置文件
  2. opts.net_def_file = ‘./model-defs/rcnn_batch_256_output_pool5.prototxt’;
  3. % %读取存储网络权值的文件
  4. opts.net_file = ‘./data/caffe_nets/finetune_voc_2012_train_iter_70k’;
  5. %载入网络,设置为cpu模式
  6. rcnn_model = rcnn_create_model(opts.net_def_file, opts.net_file);
  7. rcnn_model = rcnn_load_model(rcnn_model,0); %第二个参数为0意味着CPU模式,1则是GPU模式
  8. %读取图片
  9. img_path = ‘./examples/images/000084.jpg’;
  10. tmp_image = imread(img_path); %im是227*227的RGB图片
  11. tmp_image=single(tmp_image(:,:,[3 2 1]));%转换成BGR形式
  12. tmp_image = tmp_image-image_mean;%减去图像均值,这里的image_mean是R-CNN中提供的均值文件
  13. [features] = rcnn_box_features(im,rcnn_model);

    
    
  1. function [feature] = rcnn_box_features(im,rcnn_model)
  2. %把cnn模型当做一个提取特征的黑匣子
  3. %im:源图像
  4. %rcnn_model:rcnn模型结构体
  5. % make sure that caffe has been initialized for this model
  6. if rcnn_model.cnn.init_key ~= caffe('get_init_key')
  7. error('You probably need to call rcnn_load_model');
  8. end
  9. %准备操作
  10. crop_size=227;
  11. ims = zeros(crop_size, crop_size, 3, 1, 'single');
  12. window = zeros(crop_size, crop_size, 3, 'single');
  13. window=im;
  14. ims(:,:,:,1) =permute(window, [2 1 3]);
  15. batch{1}=ims;
  16. %利用caffe提取特征
  17. feat = caffe('forward', batch(1));
  18. feat=feat{1};
  19. 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会崩溃。


            </div>

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来提取特征,现在将提取程序记录如下:




  
  
  1. % %读取网络配置文件
  2. opts.net_def_file = ‘./model-defs/rcnn_batch_256_output_pool5.prototxt’;
  3. % %读取存储网络权值的文件
  4. opts.net_file = ‘./data/caffe_nets/finetune_voc_2012_train_iter_70k’;
  5. %载入网络,设置为cpu模式
  6. rcnn_model = rcnn_create_model(opts.net_def_file, opts.net_file);
  7. rcnn_model = rcnn_load_model(rcnn_model,0); %第二个参数为0意味着CPU模式,1则是GPU模式
  8. %读取图片
  9. img_path = ‘./examples/images/000084.jpg’;
  10. tmp_image = imread(img_path); %im是227*227的RGB图片
  11. tmp_image=single(tmp_image(:,:,[3 2 1]));%转换成BGR形式
  12. tmp_image = tmp_image-image_mean;%减去图像均值,这里的image_mean是R-CNN中提供的均值文件
  13. [features] = rcnn_box_features(im,rcnn_model);

  
  
  1. function [feature] = rcnn_box_features(im,rcnn_model)
  2. %把cnn模型当做一个提取特征的黑匣子
  3. %im:源图像
  4. %rcnn_model:rcnn模型结构体
  5. % make sure that caffe has been initialized for this model
  6. if rcnn_model.cnn.init_key ~= caffe('get_init_key')
  7. error('You probably need to call rcnn_load_model');
  8. end
  9. %准备操作
  10. crop_size=227;
  11. ims = zeros(crop_size, crop_size, 3, 1, 'single');
  12. window = zeros(crop_size, crop_size, 3, 'single');
  13. window=im;
  14. ims(:,:,:,1) =permute(window, [2 1 3]);
  15. batch{1}=ims;
  16. %利用caffe提取特征
  17. feat = caffe('forward', batch(1));
  18. feat=feat{1};
  19. 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会崩溃。


            </div>

猜你喜欢

转载自blog.csdn.net/qq_42708383/article/details/81066368
今日推荐