转自: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>