利用caffecaffe cnn 提取特征征时维度不匹配怎么解决

1588人阅读
Caffe(8)
最近做对比实验,要比较非深度的方法加上deep feature之后的效果。于是就用Caffe提了一把特征,过程不困难但是有点繁琐,姑且记录下来,留个参考。
用Caffe提取深度特征,需要以下几样东西:
能够运行的Caffe环境提取特征的深度网络定义(prototxt)这个网络的参数(caffemodel)需要提取特征的数据
配好环境是必须的,不用多说。网络定义和网络参数,可以用自己学的网络,也可以用公开发表的经典网络,比如AlexNet, VGG之类的。Caffe官网提供了一些经典网络,可以参考。被提特征的数据需要处理成能被DataLayer或者ImageDatalayer读取的格式。
做好准备工作之后,就运行build/tools/feature_extraction.bin提取特征,命令行参数如下:
extract_features pretrained_net_param
feature_extraction_proto_file \
extract_feature_blob_name1[,name2,...]
save_feature_dataset_name1[,name2,...] \
num_mini_batches
[CPU/GPU] [DEVICE_ID=0]
参数1是模型参数(.caffemodel)文件的路径。
参数2是描述网络结构的prototxt文件。程序会从参数1的caffemodel文件里找对应名称的layer读取参数。
参数3是需要提取的blob名称,对应网络结构prototxt里的名称。blob名称可以有多个,用逗号分隔。每个blob提取出的特征会分开保存。
参数4是保存提取出来的特征的数据库路径,可以有多个,和参数3中一一对应,以逗号分隔。如果用LMDB的话,路径必须是不存在的(已经存在的话要改名或者删除)。
参数5是提取特征所需要执行的batch数量。这个数值和prototxt里DataLayer中的Caffe的DataLayer(或者ImageDataLayer)中的batch_size参数相乘,就是会被输入网络的总样本数。设置参数时需要确保batch_size
* num_mini_batches等于需要提取特征的样本总数,否则提取的特征就会不够数或者是多了。
参数6是保存特征使用的数据库类型,支持lmdb和leveldb两种(小写)。推荐使用lmdb,因为lmdb的访问速度更快,还支持多进程同时读取。
参数7决定使用GPU还是CPU,直接写对应的三个大写字母就行。省略不写的话默认是CPU。
参数8决定使用哪个GPU,在多GPU的机器上跑的时候需要指定。省略不写的话默认使用0号GPU。
使用extract_feature.bin提取的特征是保存在数据库里的。在使用特征时需要读取数据库。这里介绍如何在Python环境中读取LMDB中的特征数据。
首先,需要安装Python的LMDB接口库:
pip install lmdb
需要管理员权限安装的在命令前加sudo。
然后需要编译caffe.proto的Python版,我们需要它来访问Datum这个数据结构。跟随配置好Python环境,运行make
pycaffe编译成功的话,$CAFFE_ROOT/python/目录里就会有编译好的代码。
安装好LMDB库和之后,在代码中引用该库:
import lmdb
from caffe.proto import caffe_pb2
打开LMDB数据库:
fea_lmdb = lmdb.open(lmdb_name)
txn = img_lmdb.begin()
extract_feature.bin在保存数据的时候,以从0开始递增的整数作为数据库条目的key。按照key的顺序遍历数据库:
for idx in xrange(feature_num):
value = txn.get(str(idx))
datum = caffe_pb2.Datum()
datum.ParseFromString(value)
需要注意的是,数据库中的key固定是字符串格式,所以要先转换。数据库里的value是Datum对象序列化成的字符串,用ParseFromString()方法进行反序列化。
caffe.proto中对Datum类的定义如下。data和float_data分别保存字节型和浮点型的数据,channels,height,width描述了数据的维度与形状。
message Datum {
optional int32 channels = 1;
optional int32 height = 2;
optional int32 width = 3;
optional bytes data = 4;
optional int32 label = 5;
repeated float float_data = 6;
optional bool encoded = 7 [default = false];
因为提取的特征向量是实数,所以我们从float_data属性中获取数据。repeated类型的float_data在Python中作为一个list处理,所以可以用列表推导式(list
comprehension)进行操作。数据的输出格式根据实际需要定义就好,关键是能获取到原始数据。这里我们把每个向量转换成一个字符串,相邻两维之间用空格分隔。
data_str = ' '.join([str(dim) for dim in datum.float_data]) + &\n&
提取特征时,网络运行在Test模式下
Dropout层在Test模式下不起作用,不必担心dropout影响结果Train和Test的参数写在同一个Prototxt里的时候,改参数的时候注意不要改错地方(比如有两个DataLayer的情况下)
减去均值图像
提取特征时,输入的图像要减去均值应该减去训练数据集的均值
提取哪一层
不要提取Softmax网络的最后一层(如AlexNet的fc8),因为最后一层已经是分类任务的输出,作为特征的可推广性不够好
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:123517次
积分:2496
积分:2496
排名:第11590名
原创:106篇
转载:169篇
文章:12篇
阅读:5673
文章:12篇
阅读:6424
(2)(2)(3)(2)(1)(1)(4)(9)(18)(1)(6)(4)(7)(1)(1)(1)(3)(19)(6)(8)(8)(2)(3)(14)(5)(19)(28)(35)(20)(5)(8)(18)(3)(2)(5)深度学习(17)
本文主要介绍:Windows下Caffe框架的Matlab接口,即Matlab如何调用Caffe框架中的函数,进行分类、提取特征以及训练。
1 官网说明
2 相关说明
2.1 图像预处理
classification.m中,在图像输入CNN网络之前,经过了一个预处理过程:
RGB图像转成BGR;BGR每个通道进行转置,即 M*N 变成 N*M;调整图像大小,转化为IMAGE_DIM*IMAGE_DIM*3,IMAGE_DIM默认为256;减去训练图像均值;数据扩展,即对图像裁剪和翻折处理,使一张图像扩展成10张图像,裁剪后图像大小为CROPPED_DIM*CROPPED_DIM*3,CROPPED_DIM默认为227,扩展方法为:分别取图像左上、右上、左下、右下、中心,如下图,共得到5张图像,然后每张图像上下翻折,又得到5张,最后共扩展得到10张图像;10张图像放在一起构成输入数据,维度为:CROPPED_DIM *&CROPPED_DIM * 3 * 10
预处理过程图:
扩充图像:
2.2 CNN输入数据维度
& & & &(1)CNN网络输入数据的默认维度为[227 227 3 10],即classification.m中图像预处理结果,输入数据必须为4维,即&[图像高度 图像宽度 &通道数 图像个数](注:[图像高度 = 图像宽度),其中预处理把一张图像扩展为10张,每张图像都会得到一个分类结果,即每张图像属于每类的概率(共1000类),然后把10张图属于每类的概率求和,最后把图像划分为概率最大的那一类。
& & &(2)网络输入数据的维度是可以调整的,通过以下程序设置:
如果四维输入中的图像个数为1,即输入为[图像高度 图像宽度 通道数 1](注:[图像高度 = 图像宽度),此时图像高度可以不为227,但不能相差太大
& & &(3)可以一次对多张图像进行处理,只需要调整输入的维度即可,网络运行结果&scores = net.forward(input_data) 中的scores维度为:1000*图像个数,即每列对应一张图像,表示该图像属于每类的概率(共1000类);
2.3 简单应用
& & 比较简单的应用是,可以直接利用以训练好的权值,对图像分类和提取特征:分类得到的不是目标的类别名称,而是一个类别号,具体类别可以查表得到,下面为类别号对应目标名称;提取特征,可以获取各层特征具体函数见。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:15382次
排名:千里之外
原创:13篇
转载:24篇
(18)(2)(4)(13)(1)错题本(36)
caffe(37)
&&&& 在使用CNN提取特征时,到底使用哪一层的输出作为特征呢?很多人会说:“当然是最后一个全连接层了!,这有什么问题?”
&&& 这还真有问题!我相信有很多人和我一样走入了一个误区,认为最后一个全连接层的输出连接最后的分类器,那么最后一个全连接层的输出当然是最后提取的特征了。知道昨天我读了一篇论文才恍然大悟,原来这样是错的!正确的答案是倒数第二个全连接层的输出才是最后要提取的特征。
&& 原因:最后一个全连接层的输出维度,在设计时是和训练样本的类别数一致的,比如你的训练要本有2622类,那么在设计最后的分类器时要有2622个输入,则最后一个全连接层的输出也是2622维的。这样最后一个全连接层的输出维度就和训练样本有了密切的关系,因此把它作为最后的特征显然不合适。
&& 注意:以上只是我的个人理解,如有不对之处,感谢指正!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:206073次
积分:3308
积分:3308
排名:第7941名
原创:88篇
转载:240篇
评论:133条
(3)(5)(3)(3)(17)(26)(4)(2)(8)(38)(13)(7)(18)(11)(5)(61)(56)(48)siamese 网络 对比损失函数
siamese 网络 对比损失函数
[摘要:siamese 收集, 是05年Yann Lecun提出去的。 ,它的特色是它吸收两个图片做为输进,而没有是一张图片做为输进。
文献材料:
戴抄自caffe github的issue697
Siamese nets ]
siamese 网络, 是05年Yann Lecun提出来的。&,它的特点是它接收两个图片作为输入,而不是一张图片作为输入。
文献资料:
摘抄自caffe github的issue697
Siamese&nets are supervised models for metric learning [1].
[1] S. Chopra, R. Hadsell, and Y. LeCun. Learning a similarity metric discriminatively, with application to face verification. In Computer Vision and Pattern Recognition, 2005. CVPR 2005. IEEE Computer Society
Conference on, volume 1, pages 539–546. IEEE, 2005.&/exdb/publis/pdf/chopra-05.pdf
Speaking of metric learning, I remember that&@norouzi&had proposed and&open
sourced&a method&that learned a Hamming distance metric to distinguish similar and dissimilar
images [2].
[2] Mohammad Norouzi, David J. Fleet, Ruslan Salakhutdinov,&Hamming
Distance Metric Learning, Neural Information Processing Systems (NIPS), 2012.
其中有一篇文章和这个网络差不多
& 文章:《&&Learning&Deep
Face Representation&》
人脸的表示,易于实施,&叫做Pyramid
CNN&,采用了greedy-filter-and-down-sample&的操作,使得训练非常快,而且高效,并且PyramidCNN可以和多尺度人脸特征结合。97.3%&的LFW。
传统的人脸表示特征方法:
而文章中,作者采用深度神经网络,DCNN来提取特征,其网络结构图:
注意文章的基本的网络结构不是传统上的CNN结构,而是“Siamese”网络【2005
Lecun&组的一篇文章。】,它的特点是它接收两个图片作为输入,而不是一张图片作为输入。
网络的主要特点:它们是由多个金字塔组成,分为不同个level级别的特征,每一个level的网络由两部分组成,一部分是共享的层,它由它的前一个level的网络层组成;另一部分是一个非共享层,在每一层中训练只需要训练非共享层就可以,而共享层是由前一个level的的网络层共享过来,每一个神经网络中,非共享层用来进行数据的预处理,比如卷积下采样等。(由于网络的共享层,使得每一个level的训练速度不会随着网络层数的增多而急剧提高的训练时间,说白了也就是说每次只需要训练网络的最后一层就可以了,前面的层可以保持固定。)
采用金字塔的原因在于:1.加快网络的训练速度;2.&可以提取多尺度人脸结构特征;
注意每一个level有多个神经网络,分别对应于每个输入图像的patch。每个网络的训练目标函数都是下面的损失函数;
网络训练的损失函数表示为
其表示的意思就是同一个人的距离要相互接近,而非同一个人的表示要相互远离。利用这个损失函数来进行网络的训练。
训练方法:
最终的特征:它由所有的level所有的patch特征级联而成,而patch的选择则依赖于人脸特征点的检测和aligment。最终形成的特征其实是过完全的,也就是说有很多的冗余,但是很多文章都表明这种冗余性对于识别来说具有重要性。应该来说每一个level的所有的patch特征连接起来之后的向量就是一个人脸在这个level的特征了,多个level的特征再连接起来就形成了多尺度的特征表示。
文章还说了,Pyramid&CNN方法提取的特征可以很稀疏,最少可以在8d,而在这么低纬度的特征下,其识别率还不低。通过相同的维度特征的情况下进行识别率比较:其中LBP特征是通过了PCA降维到相对应的维度。
可以看出,Pyramid&CNN提取的特征,在维度低的情况下的识别率明显好于LBP,并且随着维度的降低它的识别率也不会像LBP那样子明显的下降。
新的评判标准:因为在LFW数据库上面的识别率已经达到了99%以上了,所以作者他自己提出了一个新的评判标准,在人脸verification中,正确的匹配可能会比错误的匹配少(在安全接入方面,希望false&positive&要尽可能的小,已防止非法进入)。新的评判标准就是在固定一个错误的接受率(false
positive rate FPR&)阈值下,评判各个算法的性能,如识别率等。
感谢关注 Ithao123精品文库频道,是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
产品设计是互联网产品经理的核心能力,一个好的产品经理一定在产品设计方面有扎实的功底,本专题将从互联网产品设计的几个方面谈谈产品设计
随着国内互联网的发展,产品经理岗位需求大幅增加,在国内,从事产品工作的大部分岗位为产品经理,其实现实中,很多从事产品工作的岗位是不能称为产品经理,主要原因是对产品经理的职责不明确,那产品经理的职责有哪些,本专题将详细介绍产品经理的主要职责
IThao123周刊

我要回帖

更多关于 caffe 提取图像特征 的文章

 

随机推荐