神经网络:caffe特征可视化的代码样例"/>
神经网络:caffe特征可视化的代码样例
caffe特征可视化的代码样例
不少读者看了我前面两篇文章
总结一下用caffe跑图片数据的研究流程
deep learning实践经验总结2--准确率再次提升,到达0.8,再来总结一下
之后,想知道我是怎么实现特征可视化的。
简单来说,其实就是让神经网络正向传播一次,然后把某层的特征值给取出来,然后转换为图片保存。
下面我提供一个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
下面是源代码:
[cpp] view plain copy- // Copyright 2013 Yangqing Jia
- //
- // This is a simple script that allows one to quickly test a network whose
- // structure is specified by text format protocol buffers, and whose parameter
- // are loaded from a pre-trained network.
- // Usage:
- // test_net net_proto pretrained_net_proto iterations [CPU/GPU]
- #include <cuda_runtime.h>
- #include <fstream>
- #include <iostream>
- #include <cstring>
- #include <cstdlib>
- #include <algorithm>
- #include <vector>
- #include <utility>
- #include "caffe/caffe.hpp"
- #include <opencv2/highgui/highgui.hpp>
- #include <opencv2/highgui/highgui_c.h>
- #include <opencv2/imgproc/imgproc.hpp>
- using std::make_pair;
- using std::pair;
- using namespace caffe; // NOLINT(build/namespaces)
- using namespace std;
- vector<string> fileNames;
- char * filelist;
- /*
- * 读入的文件的内容格式类似这样子的:全局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"
- 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);
- }
- 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 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];
- }
- if(min>vec[row][col])
- {
- min = vec[row][col];
- }
- }
- }
- for(int row=0;row<height;row++)
- {
- for(int col=0;col<width;col++)
- {
- vec[row][col] = 255*((float)(vec[row][col]-min))/(max-min);
- uchar& img = mat.at<uchar>(row,col);
- img= vec[row][col];
- }
- }
- 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 main(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/prototxt/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::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<float> 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_accuracy = 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)
- {
- 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();
- 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]);
- startID += nums;
- }
- return 0;
- }
版权声明:本文为博主原创文章,未经博主允许不得转载。
- 顶
- 5
- 踩
- 0
- 猜你在找
- 13楼 caszhao 2015-05-29 11:29发表 [回复]
- 请教一下博主这个怎么编译?需要配合caffe什么库吗?能否请博主指点一下编译的方法。多谢
g++ xxx.cpp -p xxx
貌似缺少指定很多库,如:
fatal error: cuda_runtime.h: No such file or directory
- 12楼 nel2009 2015-04-21 15:31发表 [回复]
- 博主你好,非常感谢你的博客,学到很多,有几个问题希望给指导下哈。有参数你说的是待测试的文件名列表具体是指什么呢?是要训练的图片转成levelDB格式的文件夹吗?最后那个参数层数,什么怎么算的层数呢,卷积一层,pooling一层,全连接算一层吗?
- 11楼 NAME 2015-01-20 15:41发表 [回复]
- 看了楼主上面的代码,实现过后有很多张图像(32张),也是第七层,不知道怎么回事
- 10楼 大脸的帅松松 2015-01-05 19:06发表 [回复]
- 你好,你的visualize_feature.bin 是caffe自带的吗?
- Re: lingerlanlan 2015-01-13 23:59发表 [回复]
- 回复u011547448:不是,这个我自己写的
- 9楼 qinhuafengfeng 2015-01-04 18:15发表 [回复]
- 非常谢谢博主。我的测试集包含在Val文件夹,其下又含有objectio和background两个子文件夹,每个文件夹有1.bmp到100.bmp共100幅。两类标签分别为0和1。img_list_file格式为0 objection_1.bmp,请问是不是提取的objection下面的第一幅的特征啊?我检查了一下感觉不对头啊?
- Re: nel2009 2015-04-21 17:00发表 [回复]
- 回复qinhuafengfeng:你好,你这个解决了吗?那个第5个参数待训练的文件名列表是啥啊?谢谢了
- Re: lingerlanlan 2015-01-14 00:03发表 [回复]
- 回复qinhuafengfeng:我的命名规则跟你的不一样。你根据你的需求修改一下吧
- 8楼 qinhuafengfeng 2014-12-29 03:12发表 [回复]
- SET GLOG_logtostderr=1
extract_features_my.exe D:\Caffe\examples\cifar10\cifar10_quick_test.prototxt D:\Caffe\examples\cifar10\cifar10_quick_iter_4000 20 GPU D:\Caffe\examples\cifar10\tmp\1.bmp D:\Caffe\examples\cifar10\output 7
pause
当我运行上面的bat文件后,就一直运行,等了很长时间,最后都死机了还是没有得到1.bmp的特征,请问博主这是怎回事啊,谢谢你。- Re: lingerlanlan 2015-01-01 16:01发表 [回复]
- 回复qinhuafengfeng:你这里第5个参数跟我的不同。
5 img_list_file:待测试的文件名列表。
最好读懂代码,灵活使用。我实现的功能并不一定刚好符合你的需求。- Re: 大脸的帅松松 2015-01-06 16:35发表 [回复]
- 回复linger2012liu:你好,你的visualize_feature.bin 是caffe自带的吗? caffe 下面没有这个bin啊
- 7楼 qinhuafengfeng 2014-12-29 03:11发表 [回复]
- 博主你好!经常关注你的帖子,最近准备用你的方法提取个卷积层的特征。我编译的你上面的这个p文件生成了extract_features_my.exe 文件。然后,我写了如下一个bat文件以提取1.bmp图像第7层的特征。我用的框架就是caffe的cifar的demo。
- 6楼 fengye607 2014-11-26 02:21发表 [回复]
- 博主,我想实现双GPU的并行,请问可以交流一下吗,我的QQ是492545607
- Re: lingerlanlan 2015-01-14 00:01发表 [回复]
- 回复fengye607:双GPU和集群我也没实践过。只知道,多GPU时,一个CPU的一个线程来调度一个GPU。
- 5楼 u010445738 2014-11-22 17:59发表 [回复]
- 请问卷积核怎么可视化吖?
- Re: lingerlanlan 2014-11-22 18:19发表 [回复]
- 回复u010445738:从layer里取出weight就可以了
- 4楼 u010445738 2014-11-19 22:36发表 [回复]
- vector<Blob<float>*> dummy_blob_input_vec 直接是空的进去吗?
- Re: lingerlanlan 2014-11-20 00:49发表 [回复]
- 回复u010445738:是的
- Re: u010445738 2014-11-20 09:59发表 [回复]
- 回复linger2012liu:但是我输出的图片都是黑乎乎一片啵,请大师指点
- Re: u010445738 2014-11-20 10:13发表 [回复]
- 回复u010445738:已成功画出图例,谢谢楼主分享
- Re: qinhuafengfeng 2015-01-04 18:23发表 [回复]
- 你好,你的file_list.txt格式怎么弄的啊,能交流一下吗
我qq271107933
- Re: zhangvvok 2014-12-12 10:56发表 [回复]
- 回复u010445738:我画出来也是全黑乎乎的,请问你是如何解决的?
- 3楼 man5610652 2014-11-08 11:47发表 [回复] [引用] [举报]
- fatal error: cuda_runtime.h: 没有那个文件或目录 亲,我在编译的时候报错。请问是怎么回事呢?
- 2楼 鼬花园 2014-08-20 10:45发表 [回复]
- 博主你好,看了你很多文章,想问一下如何应用我们训练好的网络(准确率99%)呢?比如说在mnist中,我们有一张数字3的图片,我们应该怎么操作才能输入图片3(leveldb格式)然后用网络返回3这个数字呢?
- Re: lingerlanlan 2014-08-20 17:31发表 [回复]
- 回复jjff46:参考test_net.cpp。让你的图片正向传播一次就得出就结果了。
- Re: 鼬花园 2014-08-20 18:46发表 [回复]
- 回复linger2012liu:谢谢博主!
- 1楼 bawangflower 2014-08-12 16:03发表 [回复]
- 我试了一下总是出这个错误:terminate called after throwing an instance of 'std::bad_alloc',好像是内存溢出,您是否遇到过类似的问题
- Re: lingerlanlan 2014-08-13 14:23发表 [回复]
- 回复u010301494:试试把batchsize调小一
更多推荐
神经网络:caffe特征可视化的代码样例
发布评论