caffe编译完成后在build/tools/目录下会生成一个convert_imageset工具,用来把图像数据转化成lmdb或者leveldb数据
convert_imageset的使用方法
第一步:创建图片文件列表清单
列表清单一般为一个txt文件,一行一张图片
第二步:执行convert_imageset
convert_imageset [FLAGS] [ROOTFOLDER/] [LISTFILE] [DB_NAME]
需要带四个参数:
FLAGS: 图片参数组,包括:
- -gray: 是否以灰度图的方式打开图片。程序调用opencv库中的imread()函数来打开图片,默认为false
- -shuffle: 是否随机打乱图片顺序。默认为false
- -backend:需要转换成的db文件格式,可选为leveldb或lmdb,默认为lmdb
- -resize_width/resize_height: 改变图片的大小。在运行中,要求所有图片的尺寸一致,因此需要改变图片大小。 程序调用opencv库的resize()函数来对图片放大缩小,默认为0,不改变
- -check_size: 检查所有的数据是否有相同的尺寸。默认为false,不检查
- -encoded: 是否将原图片编码放入最终的数据中,默认为false
- -encode_type: 与前一个参数对应,将图片编码为哪一个格式:‘png’,’jpg’……
ROOTFOLDER/: 图片存放的绝对路径,从linux系统根目录开始
LISTFILE: 图片文件列表清单,一般为一个txt文件,一行一张图片
DB_NAME: 最终生成的db文件存放目录
使用举例
这里我要生成两个LMDB数据,分别用来存储训练数据和测试数据。
步骤1:生成列表清单
初始数据为jpg格式图片,label分两类female和male,female用0表示,male用1表示。train目录存放训练数据,test目录存放测试数据。文档结构如下:
使用shell命令把每个图像数据按照“相对路径+图像文件名称+空格+label”的格式生成清单文件,命令如下:
ls train/female | sed "s:^:female/:" | sed "s:$: 0:" >> t_train.txt
ls train/male | sed "s:^:male/:" | sed "s:$: 1:" >> t_train.txt
ls test/female | sed "s:^:female/:" | sed "s:$: 0:" >> t_test.txt
ls test/male | sed "s:^:male/:" | sed "s:$: 1:" >> t_test.txt
生成的训练清单文件t_train.txt如下:
female/2017030201.jpg 0
female/2017030202.jpg 0
female/2017030203.jpg 0
female/2017030204.jpg 0
female/2017030205.jpg 0
male/2017030206.jpg 1
male/2017030207.jpg 1
male/2017030208.jpg 1
male/2017030209.jpg 1
male/2017030210.jpg 1
生成的训练清单文件t_test.txt如下:
female/2017030211.jpg 0
female/2017030212.jpg 0
female/2017030213.jpg 0
female/2017030214.jpg 0
female/2017030215.jpg 0
male/2017030216.jpg 1
male/2017030217.jpg 1
male/2017030218.jpg 1
male/2017030219.jpg 1
male/2017030220.jpg 1
**注意:清单中的文件路径是相对地址,相对的是convert_imageset命令的参数ROOTFOLDER。**ROOTFOLDER是个绝对地址。
步骤2:转化成LMDB
convert_imageset --resize_width=40 --resize_height=40 /home/chuwanxing/test_samples/caffe/data/train/ ./t_train.txt ./t_train_lmdb
这里指定了ROOTFOLDER为/home/chuwanxing/test_samples/caffe/data/train/,清单文件t_train.txt,生成的lmdb文件t_train_lmdb。通过–resize调用opencv把数据大小统一成40×40。
这样就完成了训练数据的转化,训练数据同样的操作,不赘述。