SSD-Tensorflow 从工程角度进行配置

目录
  • SSD-Tensorflow 工程角度配置
    • Download from the github
    • 数据集转化tfrecords格式
    • 训练模型(pre-train)
      • 训练方案一
      • 训练方案二
      • 训练方案3
    • 验证
    • Reference
  • SSD-Tensorflow 工程角度配置Download from the githubsudo apt-get install git git clone https://github.com/balancap/SSD-Tensorflow.git 完成以后查看tree -L 2

    .
    ├── caffe_to_tensorflow.py
    ├── checkpoints
    │   ├── ssd_300_vgg.ckpt.data-00000-of-00001
    │   └── ssd_300_vgg.ckpt.index
    ├── COMMANDS.md
    ├── datasets
    │   ├── cifar10.py
    │   ├── dataset_factory.py
    │   ├── dataset_utils.py
    │   ├── imagenet.py
    │   ├── init.py
    │   ├── pascalvoc_2007.py
    │   ├── pascalvoc_2012.py
    │   ├── pascalvoc_common.py
    │   ├── pascalvoc_to_tfrecords.py
    │   └── pycache
    ├── demo
    │   ├── 000001.jpg
    │   ├── 000002.jpg
    │   ├── 000003.jpg
    │   ├── 000004.jpg
    │   ├── 000006.jpg
    │   ├── 000008.jpg
    │   ├── 000010.jpg
    │   ├── 000022.jpg
    │   ├── dog.jpg
    │   ├── eagle.jpg
    │   ├── horses.jpg
    │   ├── person.jpg
    │   └── street.jpg
    ├── deployment
    │   ├── init.py
    │   └── model_deploy.py
    ├── eval_ssd_network.py
    ├── inspect_checkpoint.py
    ├── nets
    │   ├── caffe_scope.py
    │   ├── custom_layers.py
    │   ├── inception.py
    │   ├── inception_resnet_v2.py
    │   ├── inception_v3.py
    │   ├── init.py
    │   ├── nets_factory.py
    │   ├── np_methods.py
    │   ├── ssd_common.py
    │   ├── ssd_vgg_300.py
    │   ├── ssd_vgg_512.py
    │   ├── vgg.py
    │   └── xception.py
    ├── notebooks
    │   ├── ssd_notebook.ipynb
    │   ├── ssd_tests.ipynb
    │   └── visualization.py
    ├── pictures
    │   ├── ex1.png
    │   └── ex2.png
    ├── preprocessing
    │   ├── inception_preprocessing.py
    │   ├── init.py
    │   ├── preprocessing_factory.py
    │   ├── ssd_vgg_preprocessing.py
    │   ├── tf_image.py
    │   └── vgg_preprocessing.py
    ├── README.md
    ├── tf_convert_data.py
    ├── tf_extended
    │   ├── bboxes.py
    │   ├── image.py
    │   ├── init.py
    │   ├── math.py
    │   ├── metrics.py
    │   └── tensors.py
    ├── tf_utils.py
    ├── train_ssd_network.py

  • 新建tfrecordsmkdir tfrecords
  • 解压ssd.zipunzip ./checkpoint/ssd_300_vgg.ckpt.zip
  • 数据集转化tfrecords格式首先你要有VOC2007格式的文件,具体怎么制作可以看我以前的博客Faster Rcnn中的说明。
  • 准备转化,需要使用tf_convert_cata.py
  • ./VOC2007/ └── test ├── Annotations ├── ImageSets ├── JPEGImages ├── SegmentationClass └── SegmentationObject
  • 将datasets中的pascalvoc_2007.py中的类别将20改为你自己的类别
  • 使用(路径可以改变)
  • DATASET_DIR=./VOC2007/test/ OUTPUT_DIR=./tfrecords python tf_convert_data.py --dataset_name=pascalvoc --dataset_dir=${DATASET_DIR} --output_name=voc_2007_train --output_dir=${OUTPUT_DIR}
  • 遇到的问题1
  • UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte处理:

    SSD-Tensorflow/datasets/pascaovoc_to_tfrecords.py

    File "/home/learner/github/SSD-Tensorflow/datasets/pascalvoc_to_tfrecords.py", line 83, in _process_image image_data = tf.gfile.FastGFile(filename, 'r').read()r改为rb就可以解决
  • 遇到的问题2
  • 类别没有改为自己的类别:pascalvoc_common.py中记录了所有的种类

    SSD-Tensorflow/datasets/pascalvoc_common.py

    将该文件中VOC_LABELS中的label改成你的label就好了,其中none需要保留,其他的根据样子都可以改变。
  • 修改图片读取类型
  • image_format =b'JPEG'

  • filename = directory + DIRECTORY_IMAGES + name + '.jpg'中 jpg 可以修改读取图片的类型

  • datasets文件夹下`pascalvoc_to_tfrecords.pySAMPLES_PER_FILES = 1,这里可以修改每个tfrecords中有几个图片

  • 编写脚本(位于SSD-Tensorflow下),批量测试
  • #!/bin/bash #this is a shell script to convert pascal VOC datasets into tf-records only #directory where the original dataset is stored DATASET_DIR=./VOC2007/test/ #VOC数据保存的文件夹(VOC的目录格式未改变) #output directory where to store TFRecords files OUTPUT_DIR=./tfrecords #自己建立的保存tfrecords数据的文件夹 python3 ./tf_convert_data.py --dataset_name=pascalvoc --dataset_dir=${DATASET_DIR} --output_name=voc_2007_train --output_dir=${OUTPUT_DIR}训练模型(pre-train)首先必须有预训练模型,上边我们解压的那个就是预训练模型。
  • 修改train_ssd_network.py中154行最大训练步数,将None修改为合适的步长
  • mkdir logsDATASET_DIR=./tfrecords TRAIN_DIR=./logs/ CHECKPOINT_PATH=./checkpoints/ssd_300_vgg.ckpt python train_ssd_network.py --train_dir=${TRAIN_DIR} --dataset_dir=${DATASET_DIR} --dataset_name=pascalvoc_2007 --dataset_split_name=train --model_name=ssd_300_vgg --checkpoint_path=${CHECKPOINT_PATH} --save_summaries_secs=60 --save_interval_secs=600 --weight_decay=0.0005 --optimizer=adam --learning_rate=0.001 --batch_size=32train_ssd_network.py,网络参数配置,若需要改,再此文件中进行修改修改如下边中的数字600,可以改变训练多长时间保存一次模型tf.app.flags.DEFINE_integer( 'save_summaries_secs', 600, 'The frequency with which summaries are saved, in seconds.') tf.app.flags.DEFINE_integer( 'save_interval_secs', 600, 'The frequency with which the model is saved, in seconds.')
  • nets/ssd_vgg_300.py (因为使用此网络结构) ,修改87 和88行的类别
  • default_params = SSDParams( img_shape=(300, 300), num_classes=21, #根据自己的数据修改为类别+1 no_annotation_label=21, #根据自己的数据修改为类别+1 feat_layers=['block4', 'block7', 'block8', 'block9', 'block10', 'block11'], feat_shapes=[(38, 38), (19, 19), (10, 10), (5, 5), (3, 3), (1, 1)], anchor_size_bounds=[0.15, 0.90], # anchor_size_bounds=[0.20, 0.90],
  • train_ssd_network.py,修改类别120行,GPU占用量,学习率,batch_size等
  • tf.app.flags.DEFINE_integer( 'num_classes', 21, 'Number of classes to use in the dataset.') #根据自己的数据修改为类别+1
  • eval_ssd_network.py 修改类别,66行
  • # =========================================================================== # # Main evaluation flags. # =========================================================================== # tf.app.flags.DEFINE_integer( 'num_classes', 21, 'Number of classes to use in the dataset.') #根据自己的数据修改为类别+1
  • datasets/pascalvoc_2007.py 根据自己的训练数据修改整个文件
  • TRAIN_STATISTICS = { 'none': (0, 0), 'aeroplane': (238, 306), #238图片书, 306目标总数 'bicycle': (243, 353), 'bird': (330, 486), 'boat': (181, 290), 'bottle': (244, 505), 'bus': (186, 229), 'car': (713, 1250), 'cat': (337, 376), 'chair': (445, 798), 'cow': (141, 259), 'diningtable': (200, 215), 'dog': (421, 510), 'horse': (287, 362), 'motorbike': (245, 339), 'person': (2008, 4690), 'pottedplant': (245, 514), 'sheep': (96, 257), 'sofa': (229, 248), 'train': (261, 297), 'tvmonitor': (256, 324), 'total': (5011, 12608), //5011 为训练的图片书,12608为目标总数 } TEST_STATISTICS = { 'none': (0, 0), 'aeroplane': (1, 1), 'bicycle': (1, 1), 'bird': (1, 1), 'boat': (1, 1), 'bottle': (1, 1), 'bus': (1, 1), 'car': (1, 1), 'cat': (1, 1), 'chair': (1, 1), 'cow': (1, 1), 'diningtable': (1, 1), 'dog': (1, 1), 'horse': (1, 1), 'motorbike': (1, 1), 'person': (1, 1), 'pottedplant': (1, 1), 'sheep': (1, 1), 'sofa': (1, 1), 'train': (1, 1), 'tvmonitor': (1, 1), 'total': (20, 20), } SPLITS_TO_SIZES = { 'train': 5011, #训练数据量 'test': 4952, #测试数据量 } SPLITS_TO_STATISTICS = { 'train': TRAIN_STATISTICS, 'test': TEST_STATISTICS, } NUM_CLASSES = 20 #类别,根据自己数据的实际类别修改(不包含背景)训练方案一从vgg开始训练其中某些层的参数# 通过加载预训练好的vgg16模型,对“voc07trainval+voc2012”进行训练 # 通过checkpoint_exclude_scopes指定哪些层的参数不需要从vgg16模型里面加载进来 # 通过trainable_scopes指定哪些层的参数是需要训练的,未指定的参数保持不变,若注释掉此命令,所有的参数均需要训练 DATASET_DIR=/home/doctorimage/kindlehe/common/dataset/VOC0712/ TRAIN_DIR=.././log_files/log_finetune/train_voc0712_20170816_1654_VGG16/ CHECKPOINT_PATH=../checkpoints/vgg_16.ckpt python3 ../train_ssd_network.py --train_dir=${TRAIN_DIR} #训练生成模型的存放路径 --dataset_dir=${DATASET_DIR} #数据存放路径 --dataset_name=pascalvoc_2007 #数据名的前缀 --dataset_split_name=train --model_name=ssd_300_vgg #加载的模型的名字 --checkpoint_path=${CHECKPOINT_PATH} #所加载模型的路径 --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 #每60s保存一下日志 --save_interval_secs=600 #每600s保存一下模型 --weight_decay=0.0005 #正则化的权值衰减的系数 --optimizer=adam #选取的最优化函数 --learning_rate=0.001 #学习率 --learning_rate_decay_factor=0.94 #学习率的衰减因子 --batch_size=24 --gpu_memory_fraction=0.9 #指定占用gpu内存的百分比训练方案二从自己预训练好的模型开始训练(依然可以指定要训练哪些层)(当你的模型通过vgg训练的模型收敛到大概o.5mAP的时候,可以进行这一步的fine-tune) # 通过加载预训练好的vgg16模型,对“voc07trainval+voc2012”进行训练 # 通过checkpoint_exclude_scopes指定哪些层的参数不需要从vgg16模型里面加载进来 # 通过trainable_scopes指定哪些层的参数是需要训练的,未指定的参数保持不变 DATASET_DIR=/home/doctorimage/kindlehe/common/dataset/VOC0712/ TRAIN_DIR=.././log_files/log_finetune/train_voc0712_20170816_1654_VGG16/ CHECKPOINT_PATH=./log_files/log_finetune/train_voc0712_20170712_1741_VGG16/model.ckpt-253287 python3 ../train_ssd_network.py --train_dir=${TRAIN_DIR} #训练生成模型的存放路径 --dataset_dir=${DATASET_DIR} #数据存放路径 --dataset_name=pascalvoc_2007 #数据名的前缀 --dataset_split_name=train --model_name=ssd_300_vgg #加载的模型的名字 --checkpoint_path=${CHECKPOINT_PATH} #所加载模型的路径 --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 #每60s保存一下日志 --save_interval_secs=600 #每600s保存一下模型 --weight_decay=0.0005 #正则化的权值衰减的系数 --optimizer=adam #选取的最优化函数 --learning_rate=0.001 #学习率 --learning_rate_decay_factor=0.94 #学习率的衰减因子 --batch_size=24 --gpu_memory_fraction=0.9 #指定占用gpu内存的百分比从自己训练的ssd_300_vgg模型开始训练ssd_512_vgg的模型 因此ssd_300_vgg中没有block12,又因为block7,block8,block9,block10,block11,中的参数张量两个网络模型中不匹配,因此ssd_512_vgg中这几个模块的参数不从ssd_300_vgg模型中继承,因此使用checkpoint_exclude_scopes命令指出。 因为所有的参数均需要训练,因此不使用命令--trainable_scopes #/bin/bash DATASET_DIR=/home/data/xxx/imagedata/xing_tf/train_tf/ TRAIN_DIR=/home/data/xxx/model/xing300512_model/ CHECKPOINT_PATH=/home/data/xxx/model/xing300_model/model.ckpt-60000 #加载的ssd_300_vgg模型 python3 ./train_ssd_network.py --train_dir=${TRAIN_DIR} --dataset_dir=${DATASET_DIR} --dataset_name=pascalvoc_2007 --dataset_split_name=train --model_name=ssd_512_vgg --checkpoint_path=${CHECKPOINT_PATH} --checkpoint_model_scope=ssd_300_vgg --checkpoint_exclude_scopes=ssd_512_vgg/block7,ssd_512_vgg/block7_box,ssd_512_vgg/block8,ssd_512_vgg/block8_box, ssd_512_vgg/block9,ssd_512_vgg/block9_box,ssd_512_vgg/block10,ssd_512_vgg/block10_box,ssd_512_vgg/block11,ssd_512_vgg/b lock11_box,ssd_512_vgg/block12,ssd_512_vgg/block12_box #--trainable_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block1 0,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_3 00_vgg/block10_box,ssd_300_vgg/block11_box --save_summaries_secs=28800 --save_interval_secs=28800 --weight_decay=0.0005 --optimizer=adam --learning_rate_decay_factor=0.94 --batch_size=16 --num_classes=4 -gpu_memory_fraction=0.8 训练方案3# 注释掉CHECKPOINT_PATH,不提供初始化模型,让模型自己随机初始化权重,从头训练 # 删除checkpoint_exclude_scopes和trainable_scopes,因为是从头开始训练 # CHECKPOINT_PATH=./log_files/log_finetune/train_voc0712_20170712_1741_VGG16/model.ckpt-253287 python3 ../train_ssd_network.py --train_dir=${TRAIN_DIR} #训练生成模型的存放路径 --dataset_dir=${DATASET_DIR} #数据存放路径 --dataset_name=pascalvoc_2007 #数据名的前缀 --dataset_split_name=train --model_name=ssd_300_vgg #加载的模型的名字 #--checkpoint_path=${CHECKPOINT_PATH} #所加载模型的路径,这里注释掉 #--checkpoint_model_scope=vgg_16 #所加载模型里面的作用域名 --save_summaries_secs=60 #每60s保存一下日志 --save_interval_secs=600 #每600s保存一下模型 --weight_decay=0.0005 #正则化的权值衰减的系数 --optimizer=adam #选取的最优化函数 --learning_rate=0.00001 #学习率 --learning_rate_decay_factor=0.94 #学习率的衰减因子 --batch_size=32 验证首先将测试数据转换为tfrecords #!/bin/bash DATASET_DIR=./VOC2007/test #VOC数据保存的文件夹(VOC的目录格式未改变) #output directory where to store TFRecords files OUTPUT_DIR=/home/xxx/imagedata/xingshizheng_tf #自己建立的保存tfrecords数据的文件夹 python ./tf_convert_data.py --dataset_name=pascalvoc --dataset_dir=${DATASET_DIR} --output_name=voc_2007_test #注意修改为test --output_dir=${OUTPUT_DIR} 建立一个sh,用于验证的信息存储 #!/bin/bash DATASET_DIR=./tfrecords/ #保存的转换为tfrcodes格式的数据 EVAL_DIR=./logs/ # Directory where the results are saved to CHECKPOINT_PATH=./checkpoints/ssd_vgg_300.ckpt #换为自己训练的模型 python3 ./eval_ssd_network.py --eval_dir=${EVAL_DIR} --dataset_dir=${DATASET_DIR} --dataset_name=pascalvoc_2007 --dataset_split_name=test --model_name=ssd_300_vgg --checkpoint_path=${CHECKPOINT_PATH} --batch_size=1利用ssd_notebook.ipynb显示训练测试模型的结果# Restore SSD model将ckpt_filename=‘ ’路径进行修改# Test on some demo image and visualize output将path=‘ ’路径进行修改为自己的Reference

    相关内容推荐