这个大概折腾了三四天,反正我能想到改的地方都改了,笔记本上试过了,宿舍的电脑上也试过了,反正就是不行,我也没什么办法了,后面就转向YoloV3了。尽管失败了,还是记录一下。 我具体怎么做的就写在下面:
地址:https://github.com/balancap/SSD-Tensorflow 下载下来解压。
主目录下创建,当然名称不一定是这样,主要是为了减少源码修改。分别是存储tfrecord格式的训练数据,存储训练的模型以及存储原始VOC格式的训练数据用的,这个时候就可以把上一篇做好的VOC格式的训练数据复制过来了。
这里面有几个需要修改的文件:
datasets/pascalvoc_common.py
改掉原始的标签,把自己的标签填入。比如我改完就是这样。0号标签不要动,是背景。
datasets/pascalvoc_to_tfrecords.py
line 67: 这里的作用主要是几个xml文件生成一个tfrecords,这样做的原因作者的readme文件里也说的很清楚:(虽然我并不是特别理解)。
另外,修改,83行的读取方式和图片类型:
--dataset_name=pascalvoc
--dataset_dir=./VOC2007/ #VOC文件夹
--output_name=voc_2007_train #输出名称的前缀
--output_dir=./tfrecords_ #目标文件夹
在./tfrecords_
文件夹中生成了tcrecords文件的话就表明生成成功了。
datasets/pascalvoc_2007.py
修改数据的shape:几个参数解释一个:TRAIN_STATISTICS中的格式是:类别:(训练集个数,当前类别标签数)。 比如对于person类来说,包含其的共有100张照片,这100张照片中一共有150个人的标签。就是这么个意思。 TEST_STATISTICS中就不用说了,照着填就可以了。 SPLIT_TO_SIZE中train就是训练基的个数,Test是测试集的个数,我是全部用作训练了(因为数据量很少,所以测试集就随便写了一个数,这个在训练的时候是不影响的)。
nets/ssd_vgg_300.py
line 96,97:修改为类别+1.eval_ssd_network.py
line 66:修改类别数:train_ssd_network.py
有几个要改的地方:
line27: 数据格式改成 NHWC
line135: 类别个数: 类别数+1
line154: 训练步数:这个自己改了,先给的小的训练看下loss。我们基于VGG16的预训练模型来训练,提供个网盘吧:
链接:https://pan.baidu.com/s/1nlHYtH9qUO0gBQPzmNZL-w
提取码:jcig
下载之后解压到checkpoint
文件夹中。
train_ssd_network.py来配置预编译命令,点击run,Edit_configuration,在parameters中填入预编译命令: 这里比较多,主要关注下最后面的几个,我写在注释里。
--train_dir=./train_model/
--dataset_dir=./tfrecords_/
--dataset_name=pascalvoc_2007
--dataset_split_name=train
--model_name=ssd_300_vgg
--checkpoint_path=./checkpoints/vgg_16.ckpt
--checkpoint_model_scope=vgg_16
--checkpoint_exclude_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box
--trainable_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box
--save_summaries_secs=60
--save_interval_secs=600 #保存模型的时间
--weight_decay=0.0005 #初始化权重
--optimizer=adam #优化器
--learning_rate=0.001 #学习率,这个一开始可以给大一点看一下loss
--learning_rate_decay_factor=0.94 #学习率退火系数。
--batch_size=24 #batch_size
--gpu_memory_fraction=0.9 #GPU使用率
如果出现GPU内存分配的问题的话就可以把batch_size改小一点或者GPU使用率这个系数改小一些。 这样的话就可以开始训练了。
我最后遇到的问题就是训练的时候loss居高不下,最终也都是在20-100之间跳跃,这个loss太大了一些,所以也没有用保存的模型来看一下测试结果。 我猜想了几种可能。
后面我确实没招了,整个代码框架还是挺复杂的,也没有时间去细细看,所以我就放弃了,转向Yolo了,值得欣喜的事,Yolo很快就有了不错的结果,除了我傻逼了把系统搞崩了之外。