caffe特征可视化的代码样例

本文介绍了一种方法,通过让神经网络正向传播,提取特定层的特征,并将其转换为图片保存。提供了实现该功能的Demo,包括必要的参数说明和使用方法。

转自:http://www.cfanz.cn/index.php?c=article&a=read&id=174766

简单来说,其实就是让神经网络正向传播一次,然后把某层的特征值给取出来,然后转换为图片保存。


下面我提供一个demo,大家可以根据自己的需求修改。


先看看我的demo的使用方法。

visualize_features.bin net_proto pretrained_net_proto iterations  [CPU/GPU]  img_list_file dstdir laydepth

visualize_features.bin是cpp编译出来的可执行文件

下面看看各参数的意义:

1 net_proto:caffe规定的一种定义网络结构的文件格式,后缀名为".prototxt"。这个文件定义了网络的输入,已经相关参数,还有就是整体的网络结构。

2 pretrained_net_proto:这个是已经训练好了的模型

3 iterations:迭代次数

4 [CPU/GPU]:cpu还是gpu模式

5 img_list_file:待测试的文件名列表。我这里需要这个主要是为了得到图片的类名。

6 dstdir:图片输出的文件夹

7 laydepth:需要输出哪一层的特征


下面是一个实例例子:

./visualize_features.bin /home/linger/linger/caffe-action/caffe-master/examples/cifar10/cifar10_full_test.prototxt /home/linger/linger/caffe-action/caffe-master/examples/cifar10/cifar10_full_iter_60000 20 GPU /home/linger/linger/testfile/skirt_test_attachment/image_filename /home/linger/linger/testfile/innerproduct/ 7


下面是源代码:

<a target=_blank href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=3346b68f66d4daf8&k=deep&k0=deep&kdi0=0&luki=1&mcpm=0&n=10&p=baidu&q=92037085_cpr&rb=0&rs=1&seller_id=1&sid=f8dad4668fb64633&ssp2=1&stid=9&t=tpclicked3_hc&td=2060332&tu=u2060332&u=http%3A%2F%2Fwww%2Ecfanz%2Ecn%2Findex%2Ephp%3Fc%3Darticle%26a%3Dread%26id%3D174766&urlid=0" target="_blank" style="margin: 0px; padding: 0px; color: rgb(51, 136, 255); text-decoration: none; outline: none;"></a>的:全局id 类名_所在类的id.jpg 0 一步裙_0.jpg 1 一步裙_1.jpg 2 一步裙_10.jpg */ void readFile() { if(fileNames.empty()) { ifstream read(filelist); //"/home/linger/linger/testfile/test_attachment/image_filename" // "/home/linger/imdata/test_files_collar.txt" // "/home/linger/linger/testfile/testfilename" <a target=_blank href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=3346b68f66d4daf8&k=deep&k0=deep&kdi0=0&luki=1&mcpm=0&n=10&p=baidu&q=92037085_cpr&rb=0&rs=1&seller_id=1&sid=f8dad4668fb64633&ssp2=1&stid=9&t=tpclicked3_hc&td=2060332&tu=u2060332&u=http%3A%2F%2Fwww%2Ecfanz%2Ecn%2Findex%2Ephp%3Fc%3Darticle%26a%3Dread%26id%3D174766&urlid=0" target="_blank" style="margin: 0px; padding: 0px; color: rgb(51, 136, 255); text-decoration: none; outline: none;"></a>if(read.is_open()) { while(!read.eof()) { string name; int id; read>>id>>name; fileNames.push_back(name); } } } }  /* * 根据图片id获取类名 */ string getClassNameById(int id) { readFile(); int index = fileNames[id].find_last_of('_') ; return fileNames[id].substr(0, index); <a target=_blank href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=3346b68f66d4daf8&k=deep&k0=deep&kdi0=0&luki=1&mcpm=0&n=10&p=baidu&q=92037085_cpr&rb=0&rs=1&seller_id=1&sid=f8dad4668fb64633&ssp2=1&stid=9&t=tpclicked3_hc&td=2060332&tu=u2060332&u=http%3A%2F%2Fwww%2Ecfanz%2Ecn%2Findex%2Ephp%3Fc%3Darticle%26a%3Dread%26id%3D174766&urlid=0" target="_blank" style="margin: 0px; padding: 0px; color: rgb(51, 136, 255); text-decoration: none; outline: none;"></a>}    void writeBatch(const float* data,int num,int channels,int width,int height,int startID,const char*dir) { for(int id = 0;id<num;id++) {="" for(int="" channel="0;channel<channels;channel++)" cv::mat="" mat(height,width,="" cv_8uc1);="" 高宽="" vector<vector<float> > vec; vec.resize(height); float<a target=_blank href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=3346b68f66d4daf8&k=deep&k0=deep&kdi0=0&luki=1&mcpm=0&n=10&p=baidu&q=92037085_cpr&rb=0&rs=1&seller_id=1&sid=f8dad4668fb64633&ssp2=1&stid=9&t=tpclicked3_hc&td=2060332&tu=u2060332&u=http%3A%2F%2Fwww%2Ecfanz%2Ecn%2Findex%2Ephp%3Fc%3Darticle%26a%3Dread%26id%3D174766&urlid=0" target="_blank" style="margin: 0px; padding: 0px; color: rgb(51, 136, 255); text-decoration: none; outline: none;"></a> max = -1; float min = 999999; for(int row=0;row<height;row++) {="" vec[row].resize(width);="" for(int="" col="0;col<width;col++)" vec[row][col]="data[id*channels*width*height+channel*width*height+row*width+col];" if(max<vec[row][col])="" max="vec[row][col];" <a target=_blank href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=3346b68f66d4daf8&k=deep&k0=deep&kdi0=0&luki=1&mcpm=0&n=10&p=baidu&q=92037085_cpr&rb=0&rs=1&seller_id=1&sid=f8dad4668fb64633&ssp2=1&stid=9&t=tpclicked3_hc&td=2060332&tu=u2060332&u=http%3A%2F%2Fwww%2Ecfanz%2Ecn%2Findex%2Ephp%3Fc%3Darticle%26a%3Dread%26id%3D174766&urlid=0" target="_blank" style="color: rgb(51, 136, 255);">	} if(min>vec[row][col]) { min = vec[row][col]; }   } }  for(int row=0;row<height row="" for="" int="" col="0;col<width;col++)" vec="" 255="" float="" -min="" max-min="" uchar="" img="mat.at<uchar">(row,col); img= vec[row][col</height></a><a target=_blank href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=3346b68f66d4daf8&k=deep&k0=deep&kdi0=0&luki=1&mcpm=0&n=10&p=baidu&q=92037085_cpr&rb=0&rs=1&seller_id=1&sid=f8dad4668fb64633&ssp2=1&stid=9&t=tpclicked3_hc&td=2060332&tu=u2060332&u=http%3A%2F%2Fwww%2Ecfanz%2Ecn%2Findex%2Ephp%3Fc%3Darticle%26a%3Dread%26id%3D174766&urlid=0" target="_blank" style="margin: 0px; padding: 0px; color: rgb(51, 136, 255); text-decoration: none; outline: none;"></a>];  } } char filename[100]; string label = getClassNameById(startID+id); string file_reg =dir; file_reg+="%s%05d_%05d.png"; snprintf(filename, 100, file_reg.c_str(), label.c_str(),startID+id,channel); //printf("%s\n",filename); cv::imwrite(filename, mat); }  } }  int m<a target=_blank href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=3346b68f66d4daf8&k=deep&k0=deep&kdi0=0&luki=1&mcpm=0&n=10&p=baidu&q=92037085_cpr&rb=0&rs=1&seller_id=1&sid=f8dad4668fb64633&ssp2=1&stid=9&t=tpclicked3_hc&td=2060332&tu=u2060332&u=http%3A%2F%2Fwww%2Ecfanz%2Ecn%2Findex%2Ephp%3Fc%3Darticle%26a%3Dread%26id%3D174766&urlid=0" target="_blank" style="margin: 0px; padding: 0px; color: rgb(51, 136, 255); text-decoration: none; outline: none;"></a>ain(int argc, char** argv) { if (argc < 4) { LOG(ERROR) << "visualize_features.bin net_proto pretrained_net_proto iterations " << "[CPU/GPU] img_list_file dstdir laydepth"; return 0; } /*  ./visualize_features.bin /home/linger/linger/caffe-action/caffee-ext/Caffe_MM/prototx<a target=_blank href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=3346b68f66d4daf8&k=deep&k0=deep&kdi0=0&luki=1&mcpm=0&n=10&p=baidu&q=92037085_cpr&rb=0&rs=1&seller_id=1&sid=f8dad4668fb64633&ssp2=1&stid=9&t=tpclicked3_hc&td=2060332&tu=u2060332&u=http%3A%2F%2Fwww%2Ecfanz%2Ecn%2Findex%2Ephp%3Fc%3Darticle%26a%3Dread%26id%3D174766&urlid=0" target="_blank" style="margin: 0px; padding: 0px; color: rgb(51, 136, 255); text-decoration: none; outline: none;"></a>t/triplet/triplet_test_simple.prototxt /home/linger/linger/caffe-action/caffee-ext/Caffe_MM/snapshorts/_iter_100000 8 GPU /home/linger/linger/testfile/test_attachment/image_filename /home/linger/linger/testfile/innerproduct/ 6  */  filelist = argv[5]; cudaSetDevice(0); Caffe::set_phase(Caffe<a target=_blank href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=3346b68f66d4daf8&k=deep&k0=deep&kdi0=0&luki=1&mcpm=0&n=10&p=baidu&q=92037085_cpr&rb=0&rs=1&seller_id=1&sid=f8dad4668fb64633&ssp2=1&stid=9&t=tpclicked3_hc&td=2060332&tu=u2060332&u=http%3A%2F%2Fwww%2Ecfanz%2Ecn%2Findex%2Ephp%3Fc%3Darticle%26a%3Dread%26id%3D174766&urlid=0" target="_blank" style="margin: 0px; padding: 0px; color: rgb(51, 136, 255); text-decoration: none; outline: none;"></a>::TEST);  if (argc == 5 && strcmp(argv[4], "GPU") == 0) { LOG(ERROR) << "Using GPU"; Caffe::set_mode(Caffe::GPU); } else { LOG(ERROR) << "Using CPU"; Caffe::set_mode(Caffe::CPU); }  NetParameter test_net_param; ReadProtoFromTextFile(argv[1], &test_net_param); Net<fl<a target=_blank href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=3346b68f66d4daf8&k=deep&k0=deep&kdi0=0&luki=1&mcpm=0&n=10&p=baidu&q=92037085_cpr&rb=0&rs=1&seller_id=1&sid=f8dad4668fb64633&ssp2=1&stid=9&t=tpclicked3_hc&td=2060332&tu=u2060332&u=http%3A%2F%2Fwww%2Ecfanz%2Ecn%2Findex%2Ephp%3Fc%3Darticle%26a%3Dread%26id%3D174766&urlid=0" target="_blank">oat> caffe_test_net(test_net_param); NetParameter trained_net_param; ReadProtoFromBinaryFile(argv[2], &trained_net_param); caffe_test_net.CopyTrainedLayersFrom(trained_net_param);  int total_iter = atoi(argv[3]); LOG(ERROR) << "Running " << total_iter << " Iterations.";  double test_accu</a><a target=_blank href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=3346b68f66d4daf8&k=deep&k0=deep&kdi0=0&luki=1&mcpm=0&n=10&p=baidu&q=92037085_cpr&rb=0&rs=1&seller_id=1&sid=f8dad4668fb64633&ssp2=1&stid=9&t=tpclicked3_hc&td=2060332&tu=u2060332&u=http%3A%2F%2Fwww%2Ecfanz%2Ecn%2Findex%2Ephp%3Fc%3Darticle%26a%3Dread%26id%3D174766&urlid=0" target="_blank" style="margin: 0px; padding: 0px; color: rgb(51, 136, 255); text-decoration: none; outline: none;"></a>racy = 0; vector<blob<float>*> dummy_blob_input_vec;  int startID = 0; int nums; int dims; int batchsize = test_net_param.layers(0).layer().batchsize();  int laynum = caffe_test_net.bottom_vecs().size(); printf("num of layers:%d\n",laynum);  for (int i = 0; i < total_iter; ++i) { <a target=_blank href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=3346b68f66d4daf8&k=deep&k0=deep&kdi0=0&luki=1&mcpm=0&n=10&p=baidu&q=92037085_cpr&rb=0&rs=1&seller_id=1&sid=f8dad4668fb64633&ssp2=1&stid=9&t=tpclicked3_hc&td=2060332&tu=u2060332&u=http%3A%2F%2Fwww%2Ecfanz%2Ecn%2Findex%2Ephp%3Fc%3Darticle%26a%3Dread%26id%3D174766&urlid=0" target="_blank" style="margin: 0px; padding: 0px; color: rgb(51, 136, 255); text-decoration: none; outline: none;"></a>const vector<blob<float>*>& result = caffe_test_net.Forward(dummy_blob_input_vec);  int laydepth = atoi(argv[7]);  Blob<float>* features = (*(caffe_test_net.bottom_vecs().begin()+laydepth))[0];//调整第几层即可  nums = features->num(); dims= features->count()/features->num();  <a target=_blank href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=3346b68f66d4daf8&k=deep&k0=deep&kdi0=0&luki=1&mcpm=0&n=10&p=baidu&q=92037085_cpr&rb=0&rs=1&seller_id=1&sid=f8dad4668fb64633&ssp2=1&stid=9&t=tpclicked3_hc&td=2060332&tu=u2060332&u=http%3A%2F%2Fwww%2Ecfanz%2Ecn%2Findex%2Ephp%3Fc%3Darticle%26a%3Dread%26id%3D174766&urlid=0" target="_blank" style="margin: 0px; padding: 0px; color: rgb(51, 136, 255); text-decoration: none; outline: none;"></a>int num = features->num(); int channels = features->channels(); int width = features->width(); int height = features->height(); printf("channels:%d,width:%d,height:%d\n",channels,width,height); writeBatch(features->cpu_data(),num,channels,width,height,startID,argv[6]); start<a target=_blank href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=0&is_app=0&jk=3346b68f66d4daf8&k=deep&k0=deep&kdi0=0&luki=1&mcpm=0&n=10&p=baidu&q=92037085_cpr&rb=0&rs=1&seller_id=1&sid=f8dad4668fb64633&ssp2=1&stid=9&t=tpclicked3_hc&td=2060332&tu=u2060332&u=http%3A%2F%2Fwww%2Ecfanz%2Ecn%2Findex%2Ephp%3Fc%3Darticle%26a%3Dread%26id%3D174766&urlid=0" target="_blank" style="margin: 0px; padding: 0px; color: rgb(51, 136, 255); text-decoration: none; outline: none;"></a>ID += nums;  }  return 0; }</float></float></float></float>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值