caffe python lmdb中怎么生成自己的lmdb文件

&&国之画&&&& &&
版权所有 京ICP备号-2
迷上了代码!1289人阅读
caffe(4)
1-1 以example_mnist为例,如何加载属于自己的测试集?
首先抛出一个问题:在example_mnist这个例子中,测试集是人家给好了的。那么如果我们想自己试着手写几个数字然后验证识别效果又当如何呢?
观察CAFFE_ROOT/examples/mnist/下的lenet_train_test.prototxt文件,发现里面既给出了训练集的路径,又给出了测试集的路径。因此答案很显然了,我们可以把自己的测试集做成leveldb(或lmdb)格式的,然后在lenet_train_test.prototxt中给出它的路径,然后按照上一次博客说的那样做即可。
1-2 如何将自己数据转成leveldb/lmdb格式?几个参考资料
如何将自己的训练集和测试集(比方说一些写着我们自己写的数字的图像)做成leveldb格式?
之所以需要转格式,是因为我之后有一个想做的小实验《用简单的神经网络来实现二元二次函数的拟合》,如此一来输入的数据就得是leveldb或者lmdb格式,需要把这一点搞清楚才能获取训练集和测试集。这个问题我还没有尝试过,不过网上有很多博客有相关的说明,现在列几个我觉得可以研读一下的:
[1]CSDN博客《caffe神经网络框架的辅助工具(将图片转为leveldb格式)》(该博客里面附有C++源码,但是非常难懂);
[2]知乎问题《caffe下如何把自己的数据转成lmdb或者leveldb-beanfrog的回答》(里面有python代码,但牵扯到更多不熟悉的问题,还要先研究一下caffe怎么在python中用,比如被import的caffe包如何生成?)。
[3]薛开宇《学习笔记3用自己的数据训练和测试“CaffeNet”》(本次博客我就是参考他的内容,他的这个博客是[4]的详细版,写的很好)。
[4]caffe官网《Caffe|ImageNet tutorial》(其开头有这么一段话:This guide is meant to get you ready to train your own model on your own data.)
2 动手将自己的图像数据转成lmdb格式
2-1 获取一个文件夹内全部图像的名称
(1)首先新建一个文件夹叫“批量名称”,然后在里面放上若干图片:
(2)接下来开始菜单→cmd,一路cd索引路径直到目录“批量名称”下:
(3)输入命令“dir/s/on/b&d:/train.txt”,则会在D盘生成一个名为train的文本文件,里面存放着“批量名称”中全部图像的路径。
(4)可以使用查找与替换功能,使得上面的内容被修改为“文件名 label”的形式:
①索引“C:\Users\LJJ\Desktop\测试图\caffe实验\批量名称\”替换成空。
相当于把这些路径去掉,只保留文件名;
②索引“jpg”替换成“jpg 1”。这里1是label,指代了图像的类别。
一个小技巧就是先不要把所有的训练数据都混合放,而是分门别类放在各自的文件夹中。比如对于手写数字,我们应该建立10个文件夹,然后把0全部放在一个文件夹“0”,1全部放在一个文件夹“1”……
接下来用刚才(3)中的指令给每个文件夹中的图像都分别建立一个txt文件用于存放图像名,最后建立好后将得到train0.txt~train9.txt十个文件。对每一个txt文件,按照其所属类别,然后查找与替换的时候替换成的内容也是不一样的。比如对于train3.txt,我们就要查找“jpg”替换成“jpg 3”,对于train5.txt,我们就要查找“jpg”替换成“jpg 5”。
当所有的train0.txt~train9.txt全部查找与替换完毕后,再将它们整合到一个txt文档中命名为train.txt即可。
<h2 id="2-2-将任意大小的图像resize成-2 将任意大小的图像resize成256*256
官网和薛开宇的笔记都给出了一段代码,说可以通过把它做成sh文件并运行就可以将图像转成256*256的,但是我试了好久都没成功。
为了达到目的,我决定曲线救国,用opencv里提供的cvResize函数来完成这一项。之所以选择opencv是因为之前我的毕业设计用的是opencv所以比较熟悉,看网上更多人用的是matlab,有机会也可以一试。
由于这里详细写起来也是一篇博客的篇幅,所以我另外开了一个博客专门讲这个问题,请移步《》。
2-3 生成convert_imageset.exe
在CAFFE_ROOT目录下有一个文件夹叫tools,里面有一个cpp文件叫convert_imageset.cpp,利用这个cpp文件生成一个exe文件convert_imageset.exe。具体的做法请移步《》。
2-4 生成lmdb文件
在data目录下创建一个文件夹叫myself,这里把杂七杂八跟本次活动有关的文件全部放进来,有:训练集train(一个放了所有训练图片的文件夹),测试集val(一个放了所有测试图片的文件夹),train.txt,val.txt,test.txt。其中后两者的文件名完全相同,只不过val.txt带标签,而test.txt不带标签。
将CAFFE_ROOT\examples\imagenet下一个叫create_imagenet.sh的文件拷贝到myself下,然后对里面的路径进行设定。
这里用到的思想跟之前在《OpenCV玩耍(一)批量resize一个文件夹里的所有图像》中说过的一样,都是字符串拼接。其中DATA、TOOLS皆为路径头,得和后面的文件名组合起来才是完全路径。说白了,就是在GLOG下分别给训练集和测试集填写三个绝对路径+一个将要生成的文件夹名,这三个绝对路径分别为:
(1)convert_imageset.exe的绝对路径;
(2)train.txt/val.txt的绝对路径;
(3)存放着图片的训练集train文件夹/测试集val文件夹的绝对路径。
而上面关于resize的那段代码实际上可以去掉不要了,因为事先我们已经resize过图像了。一个简化版的create_imagenet.sh可按如下来写,其跑出的效果是一模一样的:
完成路径设定之后,双击该sh文件,即可在myself文件夹下生成imagenet_train_lmdb与 imagenet_val_lmdb文件夹。
3 尚未解决的问题
3-1 生成lmdb文件时报check failure
在生成lmdb文件的时候,其日志如下:
Creating train lmdb...
*** Check failure stack trace: ***
I0512 16:23:45.290897
1184 convert_imageset.cpp:83] Shuffling data
I0512 16:23:45.290897
1184 common.cpp:32] System entropy source not available, using fallback algorithm to generate seed instead.
I0512 16:23:45.290897
1184 convert_imageset.cpp:86] A total of 12 images.
F0512 16:23:45.306498
1184 db_lmdb.hpp:14] Check failed: mdb_status == 0 (112 vs. 0)
Creating val lmdb...
*** Check failure stack trace: ***
I0512 16:23:45.509299
3544 convert_imageset.cpp:83] Shuffling data
I0512 16:23:45.509299
3544 common.cpp:32] System entropy source not available, using fallback algorithm to generate seed instead.
I0512 16:23:45.509299
3544 convert_imageset.cpp:86] A total of 4 images.
F0512 16:23:45.509299
3544 db_lmdb.hpp:14] Check failed: mdb_status == 0 (112 vs. 0)
说是有“check failed”,那么这种检查失败是否会对生成的lmdb文件有影响?这种错误的出现是否跟之前配置时我把“在db.cpp中作如下修改…CHECK_EQ”这一步都去掉了有关?又如何能消除这个错误呢?
3-2 拿训练好的lenet网络测试该lmdb文件,失败
尝试用这种方法生成了一批手写数字(含标签)的lmdb文件,然后用caffe第二次博客中说的方法拿训练好的网络lenet_iter_10000.caffemodel对该lmdb文件进行测试,一看结果就是失败的,其日志如下:
(前面的日志一切正常,我从打开lmdb开始截)
I0512 17:13:10.089304
188 db_lmdb.cpp:38] Opened lmdb
D:/MachineLearning/CAFFE_ROOT/data/myself/imagenet_train_lmdb
I0512 17:13:10.089304
188 data_reader.cpp:114] Restarting data prefetching from start.
F0512 17:13:10.089304
2492 data_transformer.cpp:465] Check failed: datum_channels & 0 (0 vs. 0)
I0512 17:13:10.089304
188 data_reader.cpp:114] Restarting data prefetching from start.
I0512 17:13:10.089304
188 data_reader.cpp:114] Restarting data prefetching from start.
重点是不知道测试数据是怎么做的,带标签还是不带标签?val.txt与test.txt分别用在何处?为什么在生成lmdb文件时只使用了val.txt而没有用到test.txt?那test.txt又该用到什么地方呢?这些问题先悬挂在这里,我准备老老实实跟着薛开宇的第三次笔记做一遍再说。
3-3 如何生成leveldb文件?
本次试验生成的是lmdb文件,但是就leveldb文件如何生成,在配置文件create_imagenet.sh中并没有相应的选项。那答案是否能在convert_imageset.cpp中找到呢?
希望在后续学习中能解决以上这三个问题。
by 悠望南山
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:13338次
排名:千里之外
原创:19篇
评论:15条
(1)(1)(1)(4)(13)caffe使用python创建lmdb
caffe使用python创建lmdb
1 import numpy as np
2 import sys
3 from PIL import Image
4 import lmdb
5 import random
6 import os
8 sys.path.append('../caffe/python/')
10 import caffe
12 if __name__ == '__main__' :
train_list_file = './trainlist.txt'
train_images_root = './train/images/'
f = open(train_list_file, 'r')
trainlist = f.readlines()
random.shuffle(trainlist)
# creating images lmdb
in_db = lmdb.open('my-train-data-lmdb', map_size=int(1e12))
with in_db.begin(write=True) as in_txn :
for in_idx, in_ in enumerate(trainlist) :
fid = in_.strip()
fn = os.path.join(train_images_root, fid)
im = np.array(Image.open(fn))
im = im[:,:,::-1]
im = im.transpose((2, 0, 1))
im_dat = caffe.io.array_to_datum(im)
in_txn.put('{:0&10d}'.format(in_idx), im_dat.SerializeToString())
in_db.close()
发表评论:
TA的最新馆藏当前位置: >
Caffe 实例测试一: MNIST
时间: 19:21
参考:原笔记在印象笔记中,复制过来格式就乱了,原笔记地址:/l/AARGaZ2rlLdEn7ikhvPcGA7hd7_EnB2OlIo/caffe安装目录:home/user/caffe-mastercd caffe-masterdownload MNIST dataset注意:新版caffe都需要从根目录上执行,不然可能会遇到这个错误:./create_mnist.sh: 16: ./create_mnist.sh: build/examples/mnist/convert_mnist_data.bin: not found./data/mnist/get_mnist.sh生成mnist-train-leveldb/ 和 mnist-test-leveldb/文件夹,这里包含了LDB格式的数据集./examples/mnist/create_mnist.shLeNet:caffe中用的模型结构是非常著名的手写体识别模型LeNet,唯一的区别是把其中的sigmoid激活函数换成了ReLU,整个结构中包含两个convolution layer、两个pooling layer和两个fully connected layer。结构定义在$caffe-master/examples/mnist/lenet_train_test.prototxt中。定义MNIST Network:该结构定义在lenet_train_test.prototxt中,需要对google protobuf有一定了解并且看过Caffe中protobuf的定义,其定义在$caffe-master/src/caffe/proto/caffe.proto。protobuf简介:protobuf是google公司的一个开源项目,主要功能是把某种数据结构的信息以某种格式保存及传递,类似微软的XML,但是效率较高。目前提供C++、java和python的API。protobuf简介:/jiang_tao_2010/blog/static//使用实例
:/developerworks/cn/linux/l-cn-gpb/编写LeNet的protobuf:1、首先给定一个名字name: LeNet2、数据层从生成的lmdb文件中读取MNIST数据,定义数据层如下:layers { name: mnist type: DATA data_param {
source: mnist_train_lmdb
backend: LMDB
batch_size: 64
//归一化到[0,1) } top: data top: label}3、卷积层layers { name: conv1 type: CONVOLUTION blobs_lr: 1.
// weight learning rate, same as learning rate
blobs_lr: 2.
// bias learning rate, twice as learning rate convolution_param {
num_output: 20
// 20 channels
kernelsize: 5
weight_filler {
type: xavier
// xavier algorithm, automatically initialize weight filler
bias_filler {
type: constant // initialize bias filler as constant, default value 0
} } bottom: data top: conv1
4、pooling层layers { name: pool1 type: POOLING pooling_param {
kernel_size: 2
pool: MAX } bottom: conv1 top: pool1}5、全连接层1layers { name: ip1 type: INNER_PRODUCT
// caffe calls it an innerprodect layer blobs_lr: 1. blobs_lr: 2. inner_product_param {
num_output: 500
// 500 outputs
weight_filler {
type: xavier
bias_filler {
type: constant
} } bottom: pool2 top: ip1}6、ReLU层layers { name: relu1 type: RELU bottom: ip1 top: ip1}layers {7、全连接层2layers { name: ip2 type: INNER_PRODUCT blobs_lr: 1. blobs_lr: 2. inner_product_param {
num_output: 10
// 10 outputs
weight_filler {
type: xavier
bias_filler {
type: constant
} } bottom: ip1 top: ip2}8、loss层(softmax_loss layer)这一层实现了softmax和多项式回归误差计算。layers { name: loss type: SOFTMAX_LOSS bottom: ip2 bottom: label}9、additional notes还可以在网络定义中添加规则,如下:layers { // ...layer definition... include: { phase: TRAIN }}另外还有一个accuracy layer,用来在测试阶段每100次迭代报告模型准确率。更多的配置和规则可以在$caffe-master/src/caffe/proto/caffe.proto中查看。可以在$caffe-master/examples/mnist/lenet_solver.prototxt中查看查看protobuf的解释:# The train/test net protocol buffer definitionnet: examples/mnist/lenet_train_test.prototxt# test_iter specifies how many forward passes the test should carry out.# In the case of MNIST, we have test batch size 100 and 100 test iterations,# covering the full 10,000 testing images.test_iter: 100# Carry out testing every 500 training iterations.test_interval: 500# The base learning rate, momentum and the weight decay of the network.base_lr: 0.01momentum: 0.9weight_decay: 0.0005# The learning rate policylr_policy: invgamma: 0.0001power: 0.75# Display every 100 iterationsdisplay: 100# The maximum number of iterationsmax_iter: 10000# snapshot intermediate resultssnapshot: 5000snapshot_prefix: examples/mnist/lenet# solver mode: CPU or GPUsolver_mode: GPU接下来就是训练和测试LeNet模型:cd $caffe-master./examples/mnist/train_lenet.sh出现这样的结果:I1203 net.cpp:66] Creating Layer conv1I1203 net.cpp:76] conv1 - dataI1203 net.cpp:101] conv1 - conv1I1203 net.cpp:116] Top shape: 20 24 24I1203 net.cpp:127] conv1 needs backward computation.
// 显示连接信息和输出信息I1203 net.cpp:142] Network initialization done.I1203 solver.cpp:36] Solver scaffolding done.I1203 solver.cpp:44] Solving LeNetI1203 solver.cpp:204] Iteration 100, lr = 0.
// learning rate printed every 100 iterationsI1203 solver.cpp:66] Iteration 100, loss = 0.26044
// loss function ...I1203 solver.cpp:84] Testing netI1203 solver.cpp:111] Test score #0: 0.9785
// test accuracy every 1000 iterations I1203 solver.cpp:111] Test score #1: 0.0606671
// test loss functionI1203 solver.cpp:84] Testing netI1203 solver.cpp:111] Test score #0: 0. solver.cpp:111] Test score #1: 0.3 solver.cpp:126] Snapshotting to lenet_iter_ solver.cpp:133] Snapshotting solver state to lenet_iter_10000.solverstateI1203 solver.cpp:78] Optimization Done.最终训练完的模型存储为一个二进制的protobuf文件:lenet_iter_10000Caffe默认的训练是在GPU上的,但是如果想改为CPU上,只需要在lenet_solver.prototxt中修改一行:# solver mode: CPU or GPUsolver_mode: CPU
下一篇:没有了

我要回帖

更多关于 caffe lmdb 转换 的文章

 

随机推荐