花了一个多星期准备的数据终于要在caffe上跑,选择了imagenet,用的工具为convert_imageset.exe(要自己先编译),搭环境太复杂太辛苦就不说了。
1.
准备数据,在你的caffe文件夹下新建文件目录,在目录下新建两个文件train和val
train和val里面分别放准备好的jpg训练集和验证集,还有分别有train.txt和val.txt
可以写批处理文件将train和val里面的图片数据读到这两个txt文件里面,同时加上标签,如果是两类的,可以在一类后标上1,一类标上2。
2.
编译转换工具convert_imageset.exe,写批处理文件
我这里是
SET GLOG_logtostderr=1
bin\convert_image.exe data/train/ data/train/train.txt data/trainlmdb 0
pause
然后双击,数据就转好了
3
计算均值
编译计算图像均值的工具compute_image_mean.cpp
再写一个批处理文件
SET GLOG_logtostderr=1
bin\compute_image_mean.exe data/trainlmdb data/image_mean.binaryproto
pause
4.
imagenet_solver.prototxt,imagenet_train.prototxt和imagenet_val.prototxt文件修改
首先是imagenet_solver,prototxt
改train_net和test_net的路径
然后imagenet_train.prototxt里面source改为数据的路径,mean_file改为图像均值路径
imagenet_val.prototxt也一样。
5.
训练
前提是已经编译好caffe.exe
写一个批处理文件
.\bin\caffe.exe train --solver=data/image_solver.prototxt --gpu=all
pause
前提是imagenet_solver.prototxt,imagenet_train.prototxt和imagenet_val.prototxt都已经修改好。
6.
遇到的问题
failed to open leveldb 问题
准备好数据之后就是转成leveldb或者lmdb,在这里我遇到了一个问题,当你出现failed to open leveldb ...的时候,有可能是你想用leveldb,可是你转换的数据却是lmdb,这个时候应该在网络文件imagenet_train.prototxt里面的数据结构里改成backend:lmdb,如果没有的话就加上这一行。那么实际上你的网络用的是你默认转的lmdb格式。
数据转换后大小1TB或者提示磁盘不足的问题
数据转好了,却遇到另一个头疼的问题,就是数据占用了1TB,试了其它的不同大小的数据依然是1TB,而且是标准的1TB,所以怀疑在程序里面设定了开辟1TB的磁盘来存储,因为自己用的服务器有1.9TB所以开辟第一次的时候成功了,第二次说磁盘不足,所以问题还是在程序里面。在github上有人也出现了这样的情况,但是他们很多是在convert_mnist.cpp文件里出现的,
CHECK_EQ(mdb_env_set_mapsize(mdb_env,1099511627776),MDB_SUCCESS) //1TB
改成
CHECK_EQ(mdb_env_set_mapsize(mdb_env,1073741824),MDB_SUCCESS) //1GB
但是我在convert_imageset.cpp里面没有找到相关代码,最后发现是在db_lmdb.cpp里面namespace caffe{
namespace db{
const size_t LMDB_MAP_SIZE = 1099511627776; 改成
const size_t LMDB_MAP_SIZE = 1073741824; //1GB
}
}
然后编译
好了,执行批处理文件,转出来的数据就是1GB啦!
转载:http://blog.sina.com.cn/s/blog_721a75e50102w5kq.html