DL 之 Caffe 使用(1) 特征提取

本文介绍如何使用Caffe框架提取CaffeNet模型的FC7层特征,并提供了详细的步骤指导,包括训练数据集、调整网络参数、提取特征的具体命令及注意事项。

提取caffenet的fc7层特征

1,Markdown编辑器是基于StackEdit修改而来,用它写博客,将会带来全新的体验哦!指导性的文章见链接等,详细语法参考帮助。

Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— [ 维基百科 ]

2,本文参考了用Caffe提取深度特征这篇博文,如果下文中关于提取特征 有重复的地方,就是引用这篇博文中的内容。

3,本文参考了caffe的lmdbpython lmdb使用博文,如果下文中关于LMDB 有重复的地方,就是引用这两篇博文中的内容。


在已有的网络架构上训练自己的数据

参照caffe学习系列:训练自己的图片集(超详细教程)就可以了。
步骤:

1, 准备数据集(包括训练数据和测试数据)
2, 计算数据集的均值文件
3, 修改网络最后一层的输出类别数,以及最后一层网络的名称,加大最后一层的参数学习速率
4, 调整solver的配置参数
5, 加载预训练模型的参数,启动训练。

展示网络结构
在caffe-master目录下的python下执行命令

python draw_net.py ../examples/myGeoimage1/train_val.prototxt ../examples/myGeoimage1/caffenet_train_val.png

执行命令,下载训练好的模型参数文件

./scripts/download_model_binary.py models/bvlc_reference_caffenet

执行命令,训练

./build/tools/caffe train -solver examples/myGeoimage1/solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel -gpu 0 > /home/linbiyuan/log/blogimgtrain.log 2>&1

> /home/linbiyuan/log/blogimgtrain.log 2>&1是将控制台输出重定向到日志中,以便查看。可以不写,直接在控制台输出就行。

提取特征

在实际操作中提取特征的命令如下(在caffe安装路径下进行):
这里写图片描述

./build/tools/extract_features models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel examples/myGeoimage1/train_val.prototxt fc7 examples/myGeoimage1/features 27  

原始命令:

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]

参数分析:
1,./build/tools/feature_extraction.bin:caffe提供的提取图像特征的cpp文件
2,extract_features pretrained_net_param:已经训练好的模型(*.caffemodel)文件的路径
3,feature_extraction_proto_file:描述网络结构的prototxt文件的路径,程序会从参数2的*.caffemodel文件里找对应名称的layer读取参数。
4,extract_feature_blob_name1[,name2,…]:需要提取的blob名称,对应网络结构prototxt里的名称。blob名称可以有多个,用逗号分隔。每个blob提取出的特征会分开保存。
5,save_feature_dataset_name1[,name2,…]:保存提取出来的特征的数据库路径,可以有多个,和blob一一对应,以逗号分隔。如果用LMDB的话,路径必须是不存在的(已经存在的话要改名或者删除)
6,num_mini_batches:这个参数比较重要,它控制了提取多少图像的特征,具体说明在文后。
7,db_type:保存特征使用的数据库类型,支持lmdb和leveldb两种(小写)。推荐使用lmdb,因为lmdb的访问速度更快,还支持多进程同时读取。
8,[CPU/GPU]:决定使用GPU还是CPU,直接写对应的三个大写字母就行。省略不写的话默认是CPU。
9,[DEVICE_ID=0]:决定使用哪个GPU,在多GPU的机器上跑的时候需要指定。省略不写的话默认使用0号GPU。

注意细节

  1. 提取特征时,网络是对test数据集进行操作:
    1,特征提取命令中的num_mini_batches 参数的大小,它与*.prototxt文件中在Test模块数据层中设置的batch_size相乘的结果就是最终提取多少图片的特征。(也就是测试数据集大小
    2,有些网络定义文件是将Train和Test的参数写在同一个Prototxt里,这时候修改参数,注意不要改错地方,因为会有两个数据层模块,分别被包含在train和test中。
    3,Dropout层在Test模式下不起作用,不必担心dropout影响结果。
  2. 减去均值图像
    1,在训练、测试及提取特征时,输入的图像要减去均值。
    2,应该减去的是train数据集的均值。
  3. 可以提取任意一层的特征
    1. 我提取的是caffenet的fc7层。
    2. 最后一层是fc8,定义num_out为分类数,一般不用这一层作为特征。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值