SSD框架训练自己的数据集(一)
在这里声明一下,我是在windows系统上安装数据标注助手对图片进行标注,没有在Ubuntu下安装labelImg,亲测这方法是可行的。
数据集的转换
caffe训练使用LMDB格式的数据,ssd框架中提供了voc数据格式转换成LMDB格式的脚本.
(一) VOC数据格式
用到三个文件夹:
-
Annotations:保存的是xml格式的lable信息,删除路径标签,修改folder标签值。
-
ImageSet目录下的Main目录(自己建立的)存放的是用来表示训练的图片集和训练集。共四个文件:
—train.txt 用来训练的图片文件的文件列表(一般来说比测试集多,其实就是将图片的后缀名去掉,根据比重随机生成的一定数量的数据集信息)
—val.txt:用来验证图片文件的文件名列表
— trianval.txt是用来训练和验证的图片文件的文件名列表
—test.txt 是用来测试的图片文件的文件名列表
我们可以写个python程序,直接生成这四个文件,具体的代码网上很多(你可以根据自己数据集的实际情况修改训练和测试集的比例),就不累述了。 -
JPEGImages目录下存放所有图片集
(二) 将VOC数据转换为LMDB数据
SSD提供了VOC数据到LMDB数据的转换脚本。./data/VOC0712/create_list.sh 和 ./data/VOC0712/create_data.sh,这两个脚本是完全针对VOC0712目录下的数据进行的转换。
将放置数据集的文件夹名称改为freckles,则pwd全路径为: $HOME/data/VOCdevkit
根据自己的数据集,对应修改上述的两个脚本文件内容,可以采用gedit打开,或者在目录上打开终端输入gedit命令打开。修改的内容如下:
[create_list.sh]
for name in VOC2007 VOC2012 --> for name in freckles[create_data.sh]
由于我的是无法获取当前文件夹所在的根目录,即出现该文件中的第一行无法编译,以至于找不到.py文件运行。我使用的了绝对路径的方式进行修改,大家遇到此类问题,也可以采用此方法及逆行解决。[labelmap_voc.prototxt]
将该文件中的类别修改成和自己的数据集相匹配
完成上面步骤的修改后,可以开始LMDB数据数据的制作,在 C A F F E R O O T 目 录 下 分 别 运 行 : . / d a t a / i n d o o r / c r e a t e l i s t i n d o o r . s h . / d a t a / i n d o o r / c r e a t e d a t a i n d o o r . s h 命 令 执 行 完 毕 后 , 可 以 在 CAFFE_ROOT目录下分别运行: ./data/indoor/create_list_indoor.sh ./data/indoor/create_data_indoor.sh 命令执行完毕后,可以在 CAFFEROOT目录下分别运行:./data/indoor/createlistindoor.sh./data/indoor/createdataindoor.sh命令执行完毕后,可以在CAFFE_ROOT/indoor目录下查看转换完成的LMDB数据数据。
(三) 使用SSD进行自己数据集的训练
训练时使用ssd models中提供的预训练好的VGGnet model : VGG_ILSVRC_16_layers_fc_reduced.caffemodel
将该模型保存到$CAFFE_ROOT/models/VGGNet下。
将ssd_pascal.py复制一份,根据自己的数据集修改副本
主要修改点:
(1)train_data和test_data修改成指向自己的数据集LMDB
train_data = “examples/VOC0712/trainval_lmdb”
test_data = “examples/VOC0712/test_lmdb”
注意:如果文件或者文件夹上面有锁头的标志,说明没有访问权限,要使用sudo chmod -R 777 路径(文件夹或文件)获取权限。
(2) num_test_image该变量修改成自己数据集中测试数据的数量
(3)num_classes 该变量修改成自己数据集中 标签类别数量数 + 1
训练命令:
python examples/ssd/ssd_pascal_indoor.py
后续我会整理下,在训练过程中出现的问题以及相应的解决方法。大家也可以参考以下链接:https://blog.csdn.net/a8039974/article/details/79836564