caffe提取特征用svm进行分类
2016-09-15 22:31
549 查看
caffe c++批量抽取特征的方法在[1],但是该方法使用中有几个疑问:
1. 如何转换levelDB 格式为libsvm格式。
2. ./build/tools/extract_features mini-batch 是代表什么意思,和imagenet_val.prototxt中的batch_size的关系是什么?
本文主要解决如上两个问题,具体extract_features源代码还需要进一步分析。
第一个问题,
[plain] view
plain copy
./build/tools/extract_features models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel examples/_temp/imagenet_val.prototxt fc7 examples/_temp/features 10
其中,10 是mini-batch, 假设imagenet_val.prototxt的batches size是128, 那么程序将抽取128 * 10个图片的特征。如果你有100张图片, 你可以设置mini-batch = 1, batches size = 100.
如果你的image个数是1283, 那么如上数值的设置会是的leveldb多出3个无用的feature,这个需要注意, 我测试过好像是会重复之前的图片,具体需要研究源代码。
第二个问题, 特征保存的格式为leveldb,如果需要用libsvm的格式访问特征,可以用python 进行转换, 程序如下, 这里感谢bean的程序[1]:
[python] view
plain copy
import numpy as np
import caffe
import sys
from caffe.proto import caffe_pb2
#parse argument
dbName = sys.argv[1]
featureFile = sys.argv[2]
output = open(featureFile, 'w')
[python] view
plain copy
# open leveldb files
db = leveldb.LevelDB(dbName)
# get db iterator
it = db.RangeIter()
count = 0
for key,value in it:
# convert string to datum
datum = caffe_pb2.Datum.FromString(db.Get(key))
# convert datum to numpy string
arr = caffe.io.datum_to_array(datum)[0]
i = 0
tmpS = ''
# convert to svm format
for i in range(0, len(arr)):
tmpS += str(i+1) + ':' + str(arr[i].tolist()[0]) + ' '
#print tmpS
output.write(tmpS.strip() + "\n")
count+=1
print count
output.close()
但是这个程序有个巨大的bug,db.RangeIter()返回的key 顺序是按照 字母 进行排序的,和levelDB的排序方式是不一样的。具体参见[3]:
The problem is most likely caused by re-ordering of training/test examples since the
order while
Hence, you get an order like
Parse the key value in python and put the extracted feature vector at that position.
在这里,我们也只能说fuck了。修改后代码如下 :
[python] view
plain copy
# get db iterator
it = db.RangeIter()
features = {}
for key,value in it:
# convert string to datum
datum = caffe_pb2.Datum.FromString(value)
# convert datum to numpy string
arr = caffe.io.datum_to_array(datum)[0]
features[int(key)] = arr
#write to file, since the key in it is sorted by alpha_number default, while leveldb is sorted by number, we must sort the key again.
sort_features = collections.OrderedDict(sorted(features.items()))
for k, arr in sort_features.iteritems():
if(k > imageCount - 1):
break
line = ""
for i in range(0, len(arr)):
line += str(i+1) + ':' + str(arr[i].tolist()[0]) + ' '
output.write(line.strip() + "\n")
output.close()
通过对比c++和python提取的feature, 大部分是一致的,但是还是有会细微的差别,可能是浮点数的精度问题吧。
参考文章:
1. http://caffe.berkeleyvision.org/gathered/examples/feature_extraction.html
2. http://bean.logdown.com/posts/211192-caffe-use-caffe-to-extract-features-of-each-layer
3. https://github.com/BVLC/caffe/issues/1158
1. 如何转换levelDB 格式为libsvm格式。
2. ./build/tools/extract_features mini-batch 是代表什么意思,和imagenet_val.prototxt中的batch_size的关系是什么?
本文主要解决如上两个问题,具体extract_features源代码还需要进一步分析。
第一个问题,
[plain] view
plain copy
./build/tools/extract_features models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel examples/_temp/imagenet_val.prototxt fc7 examples/_temp/features 10
其中,10 是mini-batch, 假设imagenet_val.prototxt的batches size是128, 那么程序将抽取128 * 10个图片的特征。如果你有100张图片, 你可以设置mini-batch = 1, batches size = 100.
如果你的image个数是1283, 那么如上数值的设置会是的leveldb多出3个无用的feature,这个需要注意, 我测试过好像是会重复之前的图片,具体需要研究源代码。
第二个问题, 特征保存的格式为leveldb,如果需要用libsvm的格式访问特征,可以用python 进行转换, 程序如下, 这里感谢bean的程序[1]:
[python] view
plain copy
import numpy as np
import caffe
import sys
from caffe.proto import caffe_pb2
#parse argument
dbName = sys.argv[1]
featureFile = sys.argv[2]
output = open(featureFile, 'w')
[python] view
plain copy
# open leveldb files
db = leveldb.LevelDB(dbName)
# get db iterator
it = db.RangeIter()
count = 0
for key,value in it:
# convert string to datum
datum = caffe_pb2.Datum.FromString(db.Get(key))
# convert datum to numpy string
arr = caffe.io.datum_to_array(datum)[0]
i = 0
tmpS = ''
# convert to svm format
for i in range(0, len(arr)):
tmpS += str(i+1) + ':' + str(arr[i].tolist()[0]) + ' '
#print tmpS
output.write(tmpS.strip() + "\n")
count+=1
print count
output.close()
但是这个程序有个巨大的bug,db.RangeIter()返回的key 顺序是按照 字母 进行排序的,和levelDB的排序方式是不一样的。具体参见[3]:
The problem is most likely caused by re-ordering of training/test examples since the
db.RangeIter()iterates over keys in alphabetical
order while
extract_featurescreates keys from index values without leading zeros (unlike
convert_imageset).
Hence, you get an order like
0, 1, 10, 100, ...
Parse the key value in python and put the extracted feature vector at that position.
在这里,我们也只能说fuck了。修改后代码如下 :
[python] view
plain copy
# get db iterator
it = db.RangeIter()
features = {}
for key,value in it:
# convert string to datum
datum = caffe_pb2.Datum.FromString(value)
# convert datum to numpy string
arr = caffe.io.datum_to_array(datum)[0]
features[int(key)] = arr
#write to file, since the key in it is sorted by alpha_number default, while leveldb is sorted by number, we must sort the key again.
sort_features = collections.OrderedDict(sorted(features.items()))
for k, arr in sort_features.iteritems():
if(k > imageCount - 1):
break
line = ""
for i in range(0, len(arr)):
line += str(i+1) + ':' + str(arr[i].tolist()[0]) + ' '
output.write(line.strip() + "\n")
output.close()
通过对比c++和python提取的feature, 大部分是一致的,但是还是有会细微的差别,可能是浮点数的精度问题吧。
参考文章:
1. http://caffe.berkeleyvision.org/gathered/examples/feature_extraction.html
2. http://bean.logdown.com/posts/211192-caffe-use-caffe-to-extract-features-of-each-layer
3. https://github.com/BVLC/caffe/issues/1158
相关文章推荐
- 深度学习之Caffe(一) 用c++接口提取特征后用SVM分类
- 使用opensmile提取音频的特征,得到特征向量,并扔进libsvm中进行分类训练测试
- caffe通过python(pycaffe)在已有模型上进行批量预测,批量提取特征
- 利用Python-caffe进行图像分类,卷积核的显示,激活值特征图的显示以及全连接层直方图显示
- [置顶] 使用SIFT特征提取和K-Means方法对图片进行分类
- Caffe提取任意层特征并进行可视化
- Caffe提取任意层特征并进行可视化
- Caffe入门实验九:caffe提取特征并进行可视化
- 对于caffemodel中的参数以及特征进行提取
- 基于caffe特征可视化 以及 用训练好的模型进行分类 2
- Caffe提取任意层特征并进行可视化
- 深度学习-采用caffe提供的工具extract_features.bin进行特征提取
- 数据挖掘—LDA,PCA特征提取降维与SVM多分类在人脸识别中的应用-数据集ORL
- 使用caffe的python接口进行特征提取和人脸验证
- 基于caffe特征可视化 以及 用训练好的模型进行分类
- NLP用CNN分类Mnist,提取出来的特征训练SVM及Keras的使用(demo)
- caffe提取某层特征进行人脸识别源码
- Windows+caffe对自己的样本进行特征提取
- 深度学习-采用caffe提供的工具extract_features.bin进行特征提取
- 基于sklearn的文本特征提取与分类