目的:用caffe提供的C++函数,批量抽取图像特征
官网链接:http://caffe.berkeleyvision.org/gathered/examples/feature_extraction.html
方法:
在caffe安装的根目录下执行:
./build/tools/extract_features.bin models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel examples/_temp/imagenet_val.prototxt fc7 examples/_temp/features 10 lmdb
1 函数使用说明:
extract_features.bin
./build/tools/extract_features.bin
是作者写的一个函数,输入相应的参数,可以提取特征;
参数说明:
1 .caffemodel 文件:训练好的网络参数
2 train_val.prototxt文件:网络结构
3 fc7:提取fc7层的特征,imageNet网络有 很多层(data conv1 conv2 conv3 conv4 conv5 fc6 fc7 fc8 prob),我们可以选取任意一层;fc7是最后一层特征,fc8输出的就是softmax的输出了,所以我们提取fc7层
4 10:输入的包的数量,我们test时的batchsize是50,这里输入10,表示会提取50*10=500张图片的特征
5 lmdb:输出的数据格式是lmdb,还可以是leveldb,我现在用的就是leveldb格式
针对我的路径,我更改为:你的根据你的改
./build/tools/extract_features.bin /home/a216/caffe-master/sloanqin/data/godpool/txt/caffenet_train_iter_5000.caffemodel /home/a216/caffe-master/sloanqin/data/godpool/txt/train_val.prototxt fc7 /home/a216/caffe-master/sloanqin/examples/features 4 lmdb
2 函数的源码:
caffe是开源的,所有的源码我们都是可以看到的。
extract_features.bin其实就是一个编译过的cpp函数,源文件在~/tools/extract_features.cpp 下;
这里我贴出作者对此函数的使用说明,读者可以使用notepad自己打开这个cpp文件分析下;
"This program takes in a trained network and an input data layer, and then" " extract features of the input data produced by the net.\n" "Usage: extract_features pretrained_net_param" " feature_extraction_proto_file extract_feature_blob_name1[,name2,...]" " save_feature_dataset_name1[,name2,...] num_mini_batches db_type" " [CPU/GPU] [DEVICE_ID=0]\n" "Note: you can extract multiple features in one pass by specifying" " multiple feature blob names and dataset names seperated by ','." " The names cannot contain white space characters and the number of blobs" " and datasets must be equal.";