在上个笔记中,已经学会了如何使用Caffe利用作者给的脚本训练CIFAR-10数据集,得到训练好的CNN模型。但是在上个笔记中,使用的都是作者提供好的脚本文件,完全就是按照教程跑了一下提供的demo。对于自己手里的一些图片数据集,如何转换图片格式、如何计算图片数据的均值、如何编写prototxt配置文件是接下来笔记的主要内容。本篇笔记主要记录如何将图片数据转换成db文件,图片均值的计算、prototxt配置文件的编写会后续进行讲解。
一、Caffe训练学习步骤回顾
1.准备数据集(训练集和测试集)
2.图片数据转换成db(leveldb/lmdb)文件
3.计算图片数据的均值
4.prototxt配置文件
5.训练模型
注意:还有一种不需要db文件和计算图片数据的均值的训练方法,而是只需要一个txt列表清单,另一种训练步骤在讲完此种学习方法后进行讲解。
二、图片数据转换成db(leveldb/lmdb)文件
1.概述
在深度学习的实际应用中,我们经常用到的原始数据是图片文件,如jpg,jpeg,png,tif等格式的,而且有可能图片的大小还不一致。而在caffe中经常使用的数据类型是lmdb或leveldb,因此就产生了这样的一个问题:如何从原始图片文件转换成caffe中能够运行的db(leveldb/lmdb)文件?
在caffe中,作者为我们提供了这样一个文件:convert_imageset.cpp,存放在caffe根目录下的tools目录下。编译好caffe之后,会生成对应的可执行文件放在 build/tools/目录下,这个可执行文件convert_imageset的作用就是用于将图片文件转换成caffe框架中能直接使用的db文件。
该文件的使用格式如下所示:
convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
- 1
我们可以使用这两图片学习如何制作图片文件列表清单txt文件。这个图片列表清单txt文件 格式如下:
图片文件名 标签
以cat.jpg和fish-bike.jpg为例,那么这两个图片的列表清单txt文件即为:
cat.jpg 1
fish-bike.jpg 2
依此类推,一行一张图片标签。我们定义1标签是猫的标签,2标签是自行车的标签。很显然,如果就这么两个图片我们手写一个图片列表清单txt文件即可,但是如果是很多图片,我们又该如何处理呢?
显然,我们可以使用脚本,有很多方法可供选择shell脚本,python脚本等。而我采用的方式是使用python脚本处理这些文件,生成最终的图片列表清单txt文件。
2.利用python脚本编写图片列表清单txt文件
(1)在caffe根目录下创建一个我们的工程目录my-caffe-project,使用如下指令:
cd /home/Jack-Cui/caffe-master && mkdir my-caffe-project
- 1
(2)创建并编辑create_db.py文件,使用如下指令:
vim create_db.py
- 1
文件编辑内容如下:
# -*- coding: UTF-8 -*-
import os
import re""" 函数说明:生成图片列表清单txt文件Parameters:images_path - 图片存放目录txt_save_path - 图片列表清单txt文件的保存目录 Returns:无 Author:Jack Cui Modify:2017-03-29 """
def createFileList(images_path, txt_save_path):#打开图片列表清单txt文件fw = open(txt_save_path,"w")#查看图片目录下的文件,相当于shell指令lsimages_name = os.listdir(images_path)#遍历所有文件名for eachname in images_name:#正则表达式这里可以根据情况进行更改#正则表达式规则:找以cat开头,紧跟0到10个数字,并以jpg结尾的图片文件pattern_cat = r'(^cat\d{0,10}.jpg$)'#正则表达式规则:找以fish-bike开头,紧跟0到10个数字,以jpg结尾的图片文件pattern_bike = r'(^fish-bike\d{0,10}.jpg$)'#正则表达式匹配cat_name = re.search(pattern_cat, eachname)bike_name = re.search(pattern_bike, eachname)#按照规则将内容写入txt文件中if cat_name != None:fw.write(cat_name.group(0) + ' 1\n')if bike_name != None:fw.write(bike_name.group(0) + ' 2\n')#打印成功信息print "生成txt文件成功"#关闭fwfw.close()if __name__ == '__main__':#caffe_root目录caffe_root = '/home/Jack-Cui/caffe-master/'#my-caffe-project目录my_caffe_project = caffe_root + 'my-caffe-project/'#图片存放目录images_path = caffe_root + 'examples/images/'#生成的图片列表清单txt文件名txt_name = 'filelist.txt'#生成的图片列表清单txt文件的保存目录txt_save_path = my_caffe_project + txt_name#生成txt文件createFileList(images_path, txt_save_path)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
(3)运行create_db.py脚本文件,使用如下指令:
python create_db.py
- 1
(4)使用指令cat create_filelist.py,查看结果如下:
3.利用python脚本执行convert_imageset文件生成db文件
生成的这个filelist.txt文件,就可以作为第三个参数,直接使用了。
接下来,我们来了解一下FLAGS这个参数组,有些什么内容:
gray: 是否以灰度图的方式打开图片。程序调用opencv库中的imread()函数来打开图片,默认为false
backend:需要转换成的db文件格式,可选为leveldb或lmdb,默认为lmdb
resize_width/resize_height: 改变图片的大小。在运行中,要求所有图片的尺寸一致,因此需要改变图片大小。 程序调用opencv库的resize()函数来对图片放大缩小,默认为0,不改变
check_size: 检查所有的数据是否有相同的尺寸。默认为false,不检查
encoded: 是否将原图片编码放入最终的数据中,默认为false
encode_type: 与前一个参数对应,将图片编码为哪一个格式:‘png’,’jpg’……
好了,知道这些参数后,我们就可以调用命令来生成最终的lmdb格式数据了。
(1)继续编写create_db.py文件,使用如下指令:
vim create_db.py
- 1
文件添加内容如下:
# -*- coding: UTF-8 -*-
import commands
import os
import re""" 函数说明:生成图片列表清单txt文件Parameters:images_path - 图片存放目录txt_save_path - 图片列表清单txt文件的保存目录 Returns:无 Author:Jack Cui Modify:2017-03-29 """
def createFileList(images_path, txt_save_path):#打开图片列表清单txt文件fw = open(txt_save_path,"w")#查看图片目录下的文件,相当于shell指令lsimages_name = os.listdir(images_path)#遍历所有文件名for eachname in images_name:#正则表达式这里可以根据情况进行更改#正则表达式规则:找以cat开头,紧跟0到10个数字,并以jpg结尾的图片文件pattern_cat = r'(^cat\d{0,10}.jpg$)'#正则表达式规则:找以fish-bike开头,紧跟0到10个数字,以jpg结尾的图片文件pattern_bike = r'(^fish-bike\d{0,10}.jpg$)'#正则表达式匹配cat_name = re.search(pattern_cat, eachname)bike_name = re.search(pattern_bike, eachname)#按照规则将内容写入txt文件中if cat_name != None:fw.write(cat_name.group(0) + ' 1\n')if bike_name != None:fw.write(bike_name.group(0) + ' 2\n')#打印成功信息print "生成txt文件成功"#关闭fwfw.close()""" 函数说明:生成lmdb文件Parameters:caffe_root - caffe根目录images_path - 图片存放目录txt_save_path - 图片列表清单txt文件的保存目录 Returns:无 Author:Jack Cui Modify:2017-03-29 """
def create_db(caffe_root, images_path, txt_save_path):#lmdb文件名字lmdb_name = 'img_train.lmdb'#生成的db文件的保存目录lmdb_save_path = caffe_root + 'my-caffe-project/' + lmdb_name#convert_imageset工具路径convert_imageset_path = caffe_root + 'build/tools/convert_imageset'cmd = """%s --shuffle --resize_height=256 --resize_width=256 %s %s %s"""status, output = commands.getstatusoutput(cmd % (convert_imageset_path, images_path, txt_save_path, lmdb_save_path))print outputif(status == 0):print "lmbd文件生成成功"if __name__ == '__main__':#caffe_root目录caffe_root = '/home/Jack-Cui/caffe-master/'#my-caffe-project目录my_caffe_project = caffe_root + 'my-caffe-project/'#图片存放目录images_path = caffe_root + 'examples/images/'#生成的图片列表清单txt文件名txt_name = 'filelist.txt'#生成的图片列表清单txt文件的保存目录txt_save_path = my_caffe_project + txt_name#生成txt文件createFileList(images_path, txt_save_path)#生成lmdb文件create_db(caffe_root, images_path, txt_save_path)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
设置参数-shuffle,打乱图片顺序。设置参数-resize_height和-resize_width将所有图片尺寸都变为256*256。
./home/xxx/caffe-master/examples/images/ 为图片保存的绝对路径,我的caffe放在了/home/Jack-Cui目录下。
最终结果运行如下,大功告成!
一颗行走的大白菜
参考博客:http://www.cnblogs.com/denny402/