00 caffe-学习笔记

Caffe

博客原文
本文是我刚刚开始学习caffe时参考caffe的官网的教程时所作的个人笔记,初步接触,理解不是很透彻,如果有误希望指出。windows10+VS2013—Matab2016+python2.7
windows用户爱好者:
BVLC和Microsoft提供了windows下caff的配置,非常方便。
BVLC版,
Microsoft版。本人是用的BVLC版的,具体CommonSettings.props配置自行看对应网页下面说明。

Caffe is a deep learning framework made with expression, speed, and modularity in mind. It is developed by the Berkeley Vision and Learning Center (BVLC) and by community contributors. Yangqing Jia created the project during his PhD at UC Berkeley. Caffe is released under the BSD 2-Clause license.

1 数据集:Caff下提供了四种数据集

  1. 第一种是cifar10:

    Cifar-10是由Hinton的两个大弟子Alex Krizhevsky、Ilya Sutskever收集的一个用于普适物体识别的数据集。Cifar是加拿大政府牵头投资的一个先进科学项目研究所。Cifar-10由60000张32*32的RGB彩色图片构成,共10个分类。50000张训练,10000张测试(交叉验证)。这个数据集最大的特点在于将识别迁移到了普适物体,而且应用于多分类(姊妹数据集Cifar-100达到100类,ILSVRC比赛则是1000类)。
  2. 第二种是mnist

    minst是手写字体库,CNN的LeNet的广泛应用于美国的支票手写字体识别。
  3. 第三种是imagenet

    (ilsvrc12)Large Scale Visual Recognition Challenge 2012 (ILSVRC2012),ImageNet 是一个超级大的数据库,每年会有对应的图像识别的挑战赛。例如ilsvrc12是一个挑战赛对应的数据集,有1000类图像。
  4. 第四种是 flickr_style

    paper:Recognizing Image Style,Datasets:http://vislab.berkeleyvision.org/datasets.html“>Datasets;运行 assemble_data.py 即可下载到对应data下会产生一个image 和train.txt test.txt,格式与imagenet类似。
  5. 数据格式转换
    Caffe提供了很多模型,因为mnist和cifar10数据量不是很大,可以按照程序里面提供的链接直接获得,因为caffe最终输入的数据格式为lmdb,因此都需要进行数据格式转换。

    Caffe 提供了convert_cifar_data.exe 对应cifar10数据的转换。

    Caffe 提供了convert_mnist_data.exe 对应mnist 数据的转换。

    Caffe 提供了convert_imageset.exe 对应着标准的数据格式转换(数据目录 标签)。

2 Examples

Caffe工程下面有很多例子,下面拿几个依次简介:

1 mnist

mnist 同理与cifar10 相似,只是数据集不同。caffe工程里面,对convert_mnist_data进行编译生成convert_mnist_data.exe,这个生成的exe对应.sh文件里面convert_mnist_data.bin。

  1. 第一步:下载mnist数据集

    训练数据及对应的标签,测试文件及对应的标签
  2. 第二步:将数据转化为lmdb格式,根据convert_cifar_data.cpp 可以知道有四个参数

    第一个为对应的.exe path/ convert_mnist_data.exe

    第二个为训练数据对应的文件名 path / train-images.idx3-ubyte

    第三个为训练数据对应的标签的文件名 path/ train-labels.idx1-ubyte

    第四个为转化后对应数据的文件夹 path/traindb

    PS:第四个参数不要提前去创建这个traindb文件夹,即使重新执行程序时,应该删除它。
  3. 第三步:计算数据的均值(训练文件和测试文件的),根据compute_image_mean.cpp 可以知道需要三个参数 。

    第一个为对应的.exe path/ compute_image_mean.exe

    第二个为.mdb文件对应的文件夹名(第一步的第四个参数) path/traindb

    第三个为计算后生成的均值文件名 path/ train_mean.binaryproto
  4. 第四步:编辑用于训练和测试的模型描述文件,lenet_train_test.prototxt 文件里面为对应的网络模型结构,我们可以根据相应的要求进行修改网络结构,并修正相应的数据源目录。
  5. 指定对应的训练超参数,通过训练超参数文件lenet.prototxt指定对应的网络模型描述文件以及对相应的参数进行设定。
  6. 对训练超参数文件进行相应的数据训练,caffe.exe –help 查看对应的参数类型,当对数据进行训练时:

    第一个为对应的.exe path/ caffe.exe

    第二个为参数指令类型 train

    第三个为指定的训练超参数文 solver=path/ lenet_train_test.prototxt

    Eg:caffe.exe train –solver=F:/Caffdata/caff/testcaffenet/ lenet_train_test.prototxt
2 cifar10

此文件夹里面.sh文件为linux下面对应的指令文件,但是我们是在windows下面,所以运行window下面caffe工程,对convert_cifar_data进行编译生成的convert_cifar_data.exe,这个生成的exe对应.sh文件里面convert_cifar_data.bin。

  1. 第一步:下载cifar10数据集

    CIFAR-10 数据集,选择CIFAR-10 binary version。
  2. 第二步:将数据转化为lmdb格式

    根据convert_cifar_data.cpp 可以知道有四个参数:(可选参数暂时不考虑)

    第一个为对应的.exe path/convert_cifar_data.exe

    第二个为.bin文件对应的文件夹 path / cifar-10-batches-bin

    第三个为转化后对应数据的文件夹 path/ cifar-10-binary

    第四个为转化后对应的数据类型 lmdb

    (PS 最后转化后对应数据的文件夹为cifar10_train_lmdb,后面_lmdb是代码中补上去的)
    (PS 为啥这个数据转换时没有对应的标签文件,这是因为标签存储在cifar-10-batches-bin文件的第一个字节里面,所以相当于标签数据与原训练数据存储在一个文件里面)
  3. 第三步:计算数据的均值(训练文件和测试文件的)

    根据compute_image_mean.cpp 可以知道需要三个参数。

    第一个为对应的.exe path/ compute_image_mean.exe

    第二个为.mdb文件对应的文件夹 path / cifar10_train_lmdb

    第三个为计算后生成的均值文件名 path/ train_mean.binaryproto
  4. 第四步:编辑用于训练和测试的模型描述文件

    cifar10_quick_train_test.prototxt 文件里面为对应的网络模型结构,我们可以根据相应的要求进行修改网络结构,并修正相应的数据源目录。
  5. 指定对应的训练超参数

    通过训练超参数文件solver.prototxt指定对应的网络模型描述文件以及对相应的参数进行设定。
  6. 对训练超参数文件进行相应的数据训练

    caffe.exe –help 查看对应的参数类型

    当对数据进行训练时:

    第一个为对应的.exe path/ caffe.exe

    第二个为参数指令类型 train

    第三个为指定的训练超参数文 solver=path/solver.prototxt

    Eg:caffe.exe train –solver=F:/Caffdata/caff/testcaffenet/lenet_solver.prototxt
3 imagenet

这个例子是当你想要训练自己的图库时可模仿一下,里面.sh文件为linux下面对应的指令文件,但是我们是在windows下面,所以运行window下面caffe工程,对convert_cifar_data进行编译生成convert_cifar_data.exe,这个生成的exe对应.sh文件里面convert_cifar_data.bin。

  1. 第一步:下载ilsvrc12数据集
    ImageNet 太大了,所以我自己弄一个简单图库示例。用一个文件夹包含10类图像,10类图像放在10个不同的文件夹里面。
  2. 第二步:将数据转化为lmdb格式

    根据convert_imageset.cpp 可以知道有四个参数:(可选参数暂时不考虑)
    convert_imageset.exe –resize_height=256 –resize_width=256 \train.txt \traindb,参考(create_imagenet.sh), 因为需要保证图像的大小一样,因为这个例子的网络描述层采用的的数据格式为data,而不是image的时候,需要通过指令提前完成图像的大小统一。

    第一个为对应的.exe path/convert_imageset.exe

    第二个为样本文件对应的根目录文件夹 path/rootdir

    第三个为样本对应的标签文件(相对路径,标签) path/ label.txt

    DF11\DF110024\00052_000.jpg_0.bmp 1

    DF8B\DF8B0027\00064_000.jpg_0.bmp 2

    第四个为.mdb文件对应的文件夹 path / plate_train
  3. 第三步:计算数据的均值(训练文件和测试文件的)

    根据compute_image_mean.cpp 可以知道需要三个参数

    第一个为对应的.exe path/ compute_image_mean.exe

    第二个为.mdb文件对应的文件夹 path / plate_train

    第三个为计算后生成的均值文件名 path/ train_mean.binaryproto
  4. 编辑用于训练和测试的模型描述文件

    图像分类的模型可以在models里面选一个,例如train_val.prototxt,我们可以根据相应的要求进行修改网络结构,并修正相应的数据源目录。(可以选择多个模型对比分析)。
  5. 指定对应的训练超参数

    通过训练超参数文件solver.prototxt指定对应的网络模型描述文件以及对相应的参数进行设定。
  6. 第六步:对训练超参数文件进行相应的数据训练
    caffe.exe –help 查看对应的参数类型

    当对数据进行训练时:

    第一个为对应的.exe path/ caffe.exe

    第二个为参数指令类型 train

    第三个为指定的训练超参数文 solver=path/solver.prototxt

    Eg:caffe.exe train –solver=F:/Caffdata/caff/testcaffenet/lenet_solver.prototxt
4 classification

直接使用已有的模型进行测试,Caffe Model Zoo 提供了一个分享模型的平台,世界各地的研究员都可以把自己的训练成果共享到社区中供更多人使用,节省人力和物力。
1. 第一步运行 classification.cpp 对应的工程生成classification.exe
2. 相应图库的均值文件,图像类别标签

例如我们获取caffe_ilsvrc12 对应需要的文件data
3. 模型描述文件和对应训练好的模型(Caffe Model Zoo上瞅瞅)
因为模型的好坏跟调参有关,因此对于同一个图库,世界各地大神训练出了好多模型。这里我们选择bvlc_reference_caffenet 网络模型。注意模型的版本以及所对应的训练数据。好多model
4. 第四步对待测图像进行预测

查看CPP文件,这里可以传入6个参数

第一个为对应的.exe path/ classification.exe

第二个为模型描述文件 path/ deploy.prototxt

第三个为对应的模型文件 path/ bvlc_reference_caffenet.caffemodel

第四个为对应训练数据的均值文件 path/ imagenet_mean.binaryproto

第五个为图像类别标签信息 path/ synset_words.txt

第六个为待测图像 path/image.jpg
5. 查看结果:top-5 top-1

5 finetune_flickr_style

微调是基于已经学习好的模型的,通过修改结构,从已学习好的模型权重中继续训练。下面就在另一个数据集Flickr Style上面微调CaffeNet模型,来预测图像风格,而不再是目标类别。

Flickr Style图像数据集在视觉上和训练了bvlc_reference_caffenet的ImageNet数据集很像,由于这个模型在目标分类上用得很好,我们就想把它也用在风格分类器中。因为只有80,000个图像可用于训练,所以从用了1,000,000个图像的ImageNet学到的参数开始训练,再根据需要进行微调。如果给出caffe train命令的weights参数,预训练的权重就会载入模型中,通过名字来匹配层。

因为我们现在只预测20个类而不再是1,000个,所以需要修改模型中的最后一层,把prototxt最后一层的名字由fc8改为fc8_flickr。bvlc_reference_caffenet中没有层名叫fc8_flickr,因此该层将从随机权重开始训练。同理,可以多改几个其它层的名字,被修改的层都会从随机权重开始训练。

此外,减少solver prototxt中的总体学习率base_lr(0.01 变为 0.001),但是增加新引进层的lr_mult(由2变成10,它是总体学习率的倍乘因子)。主要原因是新数据让新加的层学习很快,模型中剩下的层改变很慢,在solver中设置stepsize为更低的值,希望学习率下降快一些。我们也可以通过设置lr_mult为0来阻止除fc8_flickr外的所有层微调。

BVLC 提供了一个关于Flickr Style模型,基于80K的该数据集训练的模型,识别率为39%. 大家可以对比分析。

  1. 第一步:下载Flickr Style 数据集

    运行:caffe-master\examples\finetune_flickr_style\assemble_data.py数据自动下载到caffe-master\data\flickr_style 文件夹下出现一个image 文件夹和两个txt文档(trian.txt test.txt)。
  2. 第二步: 获取ilsvrc12 数据集对应的均值文件

    运行data/ilsvrc12/ get_ilsvrc_aux.sh 可以获取相应的均值文件。
  3. 第三步:获取基于ilsvrc12 数据集训练的模型

    运行./scripts/download_model_binary.py models/bvlc_reference_caffenet 可以获得。
  4. 修改模型描述文件和超参数

    我们需要基于bvlc_reference_caffene的模型描述文件上修改一下获得我们为新的数据集任务设计的网络。根据上面分析的,Flickr Style是一个20类的分类问题,而我们已经有一个1000类的模型,因此我们其实不必大费周张的重新训练一个20类的模型,其实两个模型只有最后一层不一样,即一个的输出为1000维,另一个为20维。那么我们完全可以将1000类模型除最后一层的其余层拿过来使用,然后再使用现有数据对原模型执行fine-tuning操作,这样可以大大提高训练速度。因此按照上面说的我们在bvlc_reference_caffene的模型描述文件上修改一下获得我们新的模型描述文件和超参数训练文件。
  5. 第五步:根据自己的模型文件,数据文件位置,均值文件位置调整模型描述文件和超参数文件里面的一些参数。
  6. 开始添加我们的数据重新训练部分权值

    完成上面五个步骤我们就具有了新数据集和相应的标签,已有模型和已有模型对应的均值文件。 现在我们可以训练了,微调的关键是对于指令中权值参数的声明,因为它将告诉Caffe我们想从已经训练好的模型中直接获取相应的权值。
    啥也不说,上指令:
    F:\02visualstudio2013Projects\caffe-master\caffe-master\Build\x64\Release\caffe.exe train –solver=F:/02visualstudio2013Projects/caffe-master/caffe-master/models/finetune_flickr_style/solver.prototxt -weights F:\02visualstudio2013Projects\caffe-master\caffe-master\models\bvlc_reference_caffenet\bvlc_reference_caffenet.caffemodel -gpu 0
6 feature_extraction

这个例子是利用已经训练好的模型进行特征提取,相当于用模型对某个图像进行预测,在前向反馈时,突然截取某层的数据保存下来,就成为特征了。

  1. 第一步:选择数据去进行特征提取

    创建一个临时文件夹和一个temp.txt,temp.txt 其实只需要把文件夹里面对应的图像path按照一行行的存储起来,形成一个文件列表,但是因为我们的网络存在数据层那里需要每一个文件对应的标签信息,因此我们需要在文件列表中每行文件path 后空一个添加一个标签,例如都添加一个0。caffe-master\data\flickr_style 里面的数据就很符合这个要求。
  2. 第二步:定义特征提取网络结构

    还是选择bvlc_reference_caffene对应的网络结构吧,另外在训练时,数据减去平均值有利于最后的模型识别率,因此我们还得再使用一下imagenet_mean.binaryproto
    另外因为我们新的图片数据的大小与bvlc_reference_caffene网络当时训练时使用的图像的大小不一样,因此需要注意将图像的大小调整与被使用的模型需要的图像大小一样。

  3. 第三步:提取特征

    当测试图像和对应的网络都弄好了,我们就可以开始进行特征提取,其实就是进行网络前向反馈,截取某层的数据,就是传说中的特征,每一层截取的特征不一样,那么现在主要就是看如何截取某一层的数据并且保存下来,美之名曰特征。例如bvlc_reference_caffene网络的fc7 层为图像的最高级别的特征,我们要提取他。

    第一个为对应的.exe path/ extract_features.exe

    第二个为对应的模型文件 path/bvlc_reference_caffenet.caffemodel

    第三个为模型描述文件 path/imagenet_val.prototxt

    第四个为网络某层的名字 fc7

    第五个为特征将放置的文件夹 path/ feature

    第六个为数据迭代的批次数 10

    第七个为特征存放时的格式 leveldb

    PS:第五个参数进行二次运行前需要删除否则里面makedir出错,最后一个格式问题。

7 matlab

如何利用MAtlab作为接口完成Caffe可以参考caffe-master\matlab\demo,配置CommonSettings.props时
<MatlabSupport>true</MatlabSupport>

<PropertyGroup Condition="'$(MatlabSupport)'=='true'">
<MatlabDir>E:\Program Files\MATLAB\R2016a</MatlabDir>
<LibraryPath>$(MatlabDir)\extern\lib\win64\microsoft;$(LibraryPath)
</LibraryPath>
<IncludePath>$(MatlabDir)\extern\include;$(IncludePath)</IncludePath>
</PropertyGroup>

另外matcaffe 添加库
E:\Program Files\MATLAB\R2016a\toolbox\distcomp\gpu\extern\include

运行完成后生成caffe-master\Build\x64\Release\matcaffe+caffe\private\caffe_.mexw64

8Python

微软官方caffe之 Python接口配置及图片生成实例

Caffe for Python 官方教程(翻译)

以上均为自己试验完成,存在描述错误的,望指出,谢谢。
博客原文

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值