tensorflow/model库源码Deeplabv3+ 实现(二)之在PASCAL VOC2012数据集上训练


deeplabv3+ 环境配置看上篇教程: 环境配置 环境配置好后可以进行模型训练,我选择在PASCAL VOC2012数据集上训练

1.下载数据集

在ubuntu上运行命令:

#From the tensorflow/models/research/deeplab/datasets directory.
  sh download_and_convert_voc2012.sh

这个命令可以下载并转换成tfrecord形式。在models/research/deeplab/datasets目录下创建pascal_voc_seg文件夹,文件夹结构如下:
在这里插入图片描述

2.下载预训练模型

如果不知道下载哪个预训练模型,打开local_test_mobilenetv2.sh脚本看看。我开始用错了预训练模型,导致一直训练出错。

mobilenetv2_coco_voc_trainaug

下载后解压,我保存到本地目录:/home/hy/software/models/research/deeplab/datasets/pascal_voc_seg/init_models(需要手动创建)

3.训练

参考在local_test_mobilenetv2.sh脚本中给出训练指令:

NUM_ITERATIONS=10
python "${WORK_DIR}"/train.py \
  --logtostderr \
  --train_split="trainval" \
  --model_variant="mobilenet_v2" \
  --output_stride=16 \
  --train_crop_size="513,513" \
  --train_batch_size=4 \
  --training_number_of_steps="${NUM_ITERATIONS}" \
  --fine_tune_batch_norm=true \
  --tf_initial_checkpoint="${INIT_FOLDER}/${CKPT_NAME}/model.ckpt-30000" \
  --train_logdir="${TRAIN_LOGDIR}" \
  --dataset_dir="${PASCAL_DATASET}"

实际训练的参数格式:

# from models/research directory
python deeplab/train.py \
--logtostderr \
--train_split="train" \
--model_variant="mobilenet_v2" \
--output_stride=16 \
--train_crop_size="513,513" \ # 网上说内存不够时可调小为321,我没调也能正常训练完成
--train_batch_size=1 \
--training_number_of_steps=1000 \
--fine_tune_batch_norm=False \
--tf_initial_checkpoint="/home/hy/software/models/research/deeplab/datasets/pascal_voc_seg/init_models/deeplabv3_mnv2_pascal_train_aug/model.ckpt-30000" \
--train_logdir="/home/hy/software/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_train_set/train" \
--dataset_dir="/home/hy/software/models/research/deeplab/datasets/pascal_voc_seg/tfrecord"

参数理解

  • training_number_of_steps: 训练迭代次数,这里只是验证,故设置较小为1000
  • train_crop_size:训练图片的裁剪大小,没有改动,在这篇文章中提到改动的规则https://www.jianshu.com/p/1a07990705ee
    crop_size = output_stride * k + 1
  • train_batch_size: 训练的batchsize,因为硬件条件,故设为1 fine_tune_batch_norm=False:是否使用batch_norm,因为batchsize为1,故设置为False
  • tf_initial_checkpoint:预训练的初始checkpoint
  • train_logdir: 保存训练权重的目录,注意在开始的创建工程目录的时候就创建了
  • dataset_dir:数据集的地址,前面创建的TFRecords目录

ERROR1

ValueError: Total size of new array must be unchanged for MobilenetV2/Conv/weights lh_shape: [(3, 3, 3, 16)], rh_shape: [(3, 3, 3, 32)]

是由于预训练模型下载的不对,换成正确的后就可以了。
训练结果
在这里插入图片描述train文件夹中已经保存好训练好的模型文件,文件夹里有:

  • checkpoint
  • graph.pbtxt
  • model.ckpt-0.data-00000-of-00002

4.运行eval.py

同tran.py一样,参数参考官方的。我使用的参数如下:

python deeplab/eval.py \
--logtostderr \
--eval_split="val" \
--model_variant="mobilenet_v2" \
--eval_crop_size="513,513" \
--checkpoint_dir='/home/hy/software/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_train_set/train' \
--eval_logdir='/home/hy/software/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_train_set/eval' \
--dataset_dir='/home/hy/software/models/research/deeplab/datasets/pascal_voc_seg/tfrecord' \
--max_number_of_evaluations=1

ERROR2
在这里插入图片描述显示内存不够,用ps aux查看,该程序占用CPU达到330%…用kill -9 PID杀死。把eval_crop_size改为321,321,出错了。。。猜想是不是train_crop_size与eval_crop_size得相同(待验证)。因为train时没有改,没办法只能保持513,然后没有出错但是也没有给我mIOU结果。先继续下一步吧。

5.运行vis.py,可视化结果

我的参数:

python deeplab/vis.py \
--logtostderr \
--vis_split="val" \
--model_variant="mobilenet_v2" \
--vis_crop_size="513,513" \
--checkpoint_dir="/home/hy/software/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_train_set/train" \
--vis_logdir="/home/hy/software/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_train_set/vis" \
--dataset_dir="/home/hy/software/models/research/deeplab/datasets/pascal_voc_seg/tfrecord" \
--max_number_of_iterations=1

还好可以运行,运行结束后显示:
在这里插入图片描述在vis文件夹中可以看到结果。

  • 先看官网给出的效果图:
    在这里插入图片描述
  • 我跑出来的效果图:
    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

6.运行export_model.py

我的参数设置:

# export_model
python deeplab/export_model.py \
--logtostderr \
--checkpoint_path="/home/hy/software/models/research/deeplab/datasets/pascal_voc_seg/init_models/deeplabv3_mnv2_pascal_train_aug/model.ckpt-30000" \
--export_path="/home/hy/software/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_train_set/export/frozen_inference_graph.pb" \
--model_variant="mobilenet_v2" \
--num_classes=21 \
--crop_size=513 \
--crop_size=513 \
--inference_scales=1.0

这一步应该是导出参数的(待查证)

猜你喜欢

转载自blog.csdn.net/qq_43265072/article/details/105477047