mxnet
本人使用的是pip工具提供的mxnet-cu90
MXnet的设计结构是C++做后端运算,python、R等做前端来使用
一、MXnet数据预处理
整个数据预处理的代码都集成在了toosl/im2rec.py中了,这个首先要造出一个list文件,lst文件有三列,分别是index label 图片路径。如下图所示:
我这个label是瞎填的,所以都是0。另外最新的MXnet上面的im2rec是有问题的,它生成的list所有的index都是0,不过据说这个index没什么用.....但我还是改了一下。把yield生成器换成直接append即可。
生成lst文件,其实这里格式各不相同,由于lst版本不一样导致的,可以参见文件im2rec 中的函数,或者python im2rec.py --help 来查看具体参数帮助(--train-ratio则表示train和val在数据集中的比例)
生成lst:
python im2rec.py --recursive --list /home/chenyu/Documents/train /home/chenyu/Documents/image
这里的recursive和list都是调用参数,一个是递归查看文件夹,一个是将默认关闭的生成lst文件的函数打开
后面参数:第一地址是欲写入.lst文件夹的地址,一定要确保.lst文件夹已经存在(我在这里躺了很久的坑~~~!!!)
第二个地址是你的数据集的地址~!!!
生成rec:
python im2rec.py --recursive --pack-label /home/chenyu/Documents/train /home/chenyu/Documents/image
1.使用im2rec制作lst文件
调用make_list()方法获得的,其中涉及四个参数:
recursive:是否递归访问子目录,如果存在多个目录可以设置该参数
list::脚本默认为False,所以制作lst时应设置为True
prefix:需要生成的lst文件的前缀
root:指定数据集的根目录,其子目录为图片或进一步的子目录
示例: python im2rec.py 71 --recursive=True --list=True test data/images
坑: 不管是相对路径还是绝对路径,路径的格式错误后都会导致生成的lst文件为空。
2.使用im2rec制作rec文件
此时一般需要将–list设置为False(此时使用已经创建好的list进行rec制作),使用已经生成的lst文件生成rec文件。
涉及参数:
–list 是否创建list文件,默认为False
–exts 所能接受的图片后缀,默认为jpg和jpeg
–chunks 分块数量,默认为1
–train-ratio 训练集所占的比例,默认为1.0
–test-ratio 测试集所占的比例,默认为0
–recursive 是否递归的对root下的文件夹进行遍历
–shuffle 是否打乱list中的图片顺序,默认为True
–pass-through 是否跳过transform,默认为False
–resize 是否将短边缩放至设定尺寸,默认为0
–center-crop 是否进行中心剪裁,默认为False
–quality 图片解码质量(0-100),默认为95
–num-thread 编码的线程数,默认为1
–color 色彩解码模式[-1,0,1],-1为彩色模式,0为灰度模式,1为alpha模式,默认为1
–encoding 解码模式(jpeg,png),默认为jpeg
–pack-label 是否读入多维度标签数据,默认为False (重要,如果进行多标签数据制作或者目标检测的数据制作,那么就必须将其设置为True)
示例: python im2rec.py 71 --recursive=True --pack-label=True test data/images
坑: 一开始的时候以为要在前头加入lst文件的名称,即写成了python im2rec.py 71 test.lst --recursive=True --pack-label=True test data/images
结果程序就报错提示unrecognized arguments
坑: 更正上述错误后,再次尝试,生成了rec文件,但是报错:lst should at least has three parts, but only has 1 parts for [’’]
回头去看了一下自己的lst文件和im2rec的代码,发现生成的lst文件在尾部多了一个空白行,所以最后报错,去除后报错消失。
附录:目标识别相关lst的格式说明
0 4 5 640 480
1 0.1 0.2 0.8 0.9
2 0.5 0.3 0.6 0.8
data/xxx.jpg
(以上为一行中的数据,数据间使用 /t 分割)
index A B [extra header]
(object0),
(object1) …
image_path
index:图片序号
A:头字段宽度(minimum2,大小为2+extra header的宽度
extra header:附加字段部分,可选,多为输入图片的width&height
B:label字段的宽度,通常情况下为5(一个label+四个坐标数值)
object:标记字段,由一个label+四个坐标数值组成
mxnet.image.ImageIter是一个非常重要的类。在MXNet中,当你要读入图像数据时,可以用im2rec.py生成lst和rec文件,然后用mxnet.io.ImageRecordIter类来读取rec文件或者用这个mxnet.image.ImageIter类来读取rec文件,但是这个函数和前者相比还能直接读取图像文件,这样就可以不用生成占内存的rec文件了,只需要原图像文件和lst文件即可.另外,在mxnet.io.ImageRecordIter中对于数据的预处理操作都是固定的,不好修改,但是mxnet.image.ImageIter却可以非常灵活地添加各种预处理操作.
mxnet.image.ImageIter(batch_size, data_shape, label_width=1, path_imgrec=None, path_imglist=None,
path_root=None, path_imgidx=None, shuffle=False, part_index=0, num_parts=1, aug_list=None, imglist=None,
data_name='data', label_name='softmax_label', **kwargs)
- 1
- 2
- 3
参数:
● batch_size (int) – Number of examples per batch.
● data_shape (tuple) – Data shape in (channels, height, width) format. For now, only RGB image with 3 channels is supported.
● label_width (int, optional) – Number of labels per example. The default label width is 1.
● path_imgrec (str) – Path to image record file (.rec). Created with tools/im2rec.py or bin/im2rec.
● path_imglist (str) – Path to image list (.lst). Created with tools/im2rec.py or with custom script. Format: Tab separated record of index, one or more labels and relative_path_from_root.
● imglist (list) – A list of images with the label(s). Each item is a list [imagelabel: float or list of float, imgpath].
● path_root (str) – Root folder of image files.
● path_imgidx (str) – Path to image index file. Needed for partition and shuffling when using .rec source.
● shuffle (bool) – Whether to shuffle all images at the start of each iteration or not. Can be slow for HDD.
● part_index (int) – Partition index.
● num_parts (int) – Total number of partitions.
● data_name (str) – Data name for provided symbols.
● label_name (str) – Label name for provided symbols.
● kwargs – More arguments for creating augmenter. See mx.image.CreateAugmenter.
https://blog.csdn.net/u014380165/article/details/74906061
在MXNet框架下,如果要在一个预训练的模型上用你的数据fine-tune一个模型(或者叫迁移学习,即你的模型的参数的初始化不再是随机初始化,而是用别人的在大数据集上训练过的模型的参数来初始化你的模型参数),可以采用MXNet项目自带的fine-tune.py脚本,路径是~/mxnet/example/image-classification/fine-tune.py
fine-tune.py这个脚本是MxNet官方写好的,默认的数据读入方式是.rec,类似Caffe里面的LMDB
fine-tune.py的内容,总的流程就是:解析参数,导入预训练的模型,修改预训练模型的最后分类层,开始训练。
https://blog.csdn.net/u014380165/article/details/73864457