一、修改pascalvoc_2007.py
生成自己的tfrecord文件后,修改訓練數據shape——打開datasets
文件夾中的pascalvoc_2007.py
文件,
根據自己訓練數據修改:NUM_CLASSES
= 類別數(不包含背景);
# TRAIN_STATISTICS = { # 'none': (0, 0), # 'aeroplane': (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), # } # 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 TRAIN_STATISTICS = { 'none': (0, 0), 'flower': (35,35), 'total': (35, 35), } TEST_STATISTICS = { 'none': (0, 0), 'flower': (15,15) } SPLITS_TO_SIZES = { 'train': 35, 'test': 15 } SPLITS_TO_STATISTICS = { 'train': TRAIN_STATISTICS, 'test': TEST_STATISTICS, } NUM_CLASSES = 1 #類別,不包含背景
二、修改ssd_vgg_300.py
根據自己訓練類別數修改96 和97行:等於類別數+1
三、修改eval_ssd_network.py
修改類別數和batchsize
四、修改train_ssd_network.py
數據格式改為 NHWC:
numclasses改為類別數加1:
batch_size該為自己設置的:
修改訓練步數(None代表無限訓練下去):
可以更改模型保存的參數:
五:加載VGG_16,重新訓練模型
將VGG_16放在checkpoint文件夾下面:
從VGG16開始訓練其中某些層的參數
1 # 通過加載預訓練好的vgg16模型,對“voc07trainval+voc2012”進行訓練 2 # 通過checkpoint_exclude_scopes指定哪些層的參數不需要從vgg16模型里面加載進來 3 # 通過trainable_scopes指定哪些層的參數是需要訓練的,未指定的參數保持不變,若注釋掉此命令,所有的參數均需要訓練 4 DATASET_DIR=/home/doctorimage/kindlehe/common/dataset/VOC0712/ 5 TRAIN_DIR=.././log_files/log_finetune/train_voc0712_20170816_1654_VGG16/ 6 CHECKPOINT_PATH=../checkpoints/vgg_16.ckpt 7 8 python3 ../train_ssd_network.py \ 9 --train_dir=${TRAIN_DIR} \ #訓練生成模型的存放路徑 10 --dataset_dir=${DATASET_DIR} \ #數據存放路徑 11 --dataset_name=pascalvoc_2007 \ #數據名的前綴 12 --dataset_split_name=train \ 13 --model_name=ssd_300_vgg \ #加載的模型的名字 14 --checkpoint_path=${CHECKPOINT_PATH} \ #所加載模型的路徑 15 --checkpoint_model_scope=vgg_16 \ #所加載模型里面的作用域名 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 \ 17 --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 \ 18 --save_summaries_secs=60 \ #每60s保存一下日志 19 --save_interval_secs=600 \ #每600s保存一下模型 20 --weight_decay=0.0005 \ #正則化的權值衰減的系數 21 --optimizer=adam \ #選取的最優化函數 22 --learning_rate=0.001 \ #學習率 23 --learning_rate_decay_factor=0.94 \ #學習率的衰減因子 24 --batch_size=24 \ 25 --gpu_memory_fraction=0.9 #指定占用gpu內存的百分比
接下來可以進行fine-tunning
1 (當你的模型通過vgg訓練的模型收斂到大概o.5mAP的時候,可以進行這一步的fine-tune) 2 3 4 # 通過加載預訓練好的vgg16模型,對“voc07trainval+voc2012”進行訓練 5 # 通過checkpoint_exclude_scopes指定哪些層的參數不需要從vgg16模型里面加載進來 6 # 通過trainable_scopes指定哪些層的參數是需要訓練的,未指定的參數保持不變 7 DATASET_DIR=/home/doctorimage/kindlehe/common/dataset/VOC0712/ 8 TRAIN_DIR=.././log_files/log_finetune/train_voc0712_20170816_1654_VGG16/ 9 CHECKPOINT_PATH=./log_files/log_finetune/train_voc0712_20170712_1741_VGG16/model.ckpt-253287 10 11 python3 ../train_ssd_network.py \ 12 --train_dir=${TRAIN_DIR} \ #訓練生成模型的存放路徑 13 --dataset_dir=${DATASET_DIR} \ #數據存放路徑 14 --dataset_name=pascalvoc_2007 \ #數據名的前綴 15 --dataset_split_name=train \ 16 --model_name=ssd_300_vgg \ #加載的模型的名字 17 --checkpoint_path=${CHECKPOINT_PATH} \ #所加載模型的路徑 18 --checkpoint_model_scope=vgg_16 \ #所加載模型里面的作用域名 19 --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 \ 20 --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 \ 21 --save_summaries_secs=60 \ #每60s保存一下日志 22 --save_interval_secs=600 \ #每600s保存一下模型 23 --weight_decay=0.0005 \ #正則化的權值衰減的系數 24 --optimizer=adam \ #選取的最優化函數 25 --learning_rate=0.001 \ #學習率 26 --learning_rate_decay_factor=0.94 \ #學習率的衰減因子 27 --batch_size=24 \ 28 --gpu_memory_fraction=0.9 #指定占用gpu內存的百分比
補充:還可以拿來訓練vgg512
從自己訓練的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。
1 1 #/bin/bash 2 2 DATASET_DIR=/home/data/xxx/imagedata/xing_tf/train_tf/ 3 3 TRAIN_DIR=/home/data/xxx/model/xing300512_model/ 4 4 CHECKPOINT_PATH=/home/data/xxx/model/xing300_model/model.ckpt-60000 #加載的ssd_300_vgg模型 5 5 python3 ./train_ssd_network.py \ 6 6 --train_dir=${TRAIN_DIR} \ 7 7 --dataset_dir=${DATASET_DIR} \ 8 8 --dataset_name=pascalvoc_2007 \ 9 9 --dataset_split_name=train \ 10 10 --model_name=ssd_512_vgg \ 11 11 --checkpoint_path=${CHECKPOINT_PATH} \ 12 12 --checkpoint_model_scope=ssd_300_vgg \ 13 13 --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 \ 14 14 #--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 \ 15 15 --save_summaries_secs=28800 \ 16 16 --save_interval_secs=28800 \ 17 17 --weight_decay=0.0005 \ 18 18 --optimizer=adam \ 19 19 --learning_rate_decay_factor=0.94 \ 20 20 --batch_size=16 \ 21 21 --num_classes=4 \ 22 22 -gpu_memory_fraction=0.8 \ 23 23
六、全部從頭開始訓練自己的模型
1 # 注釋掉CHECKPOINT_PATH,不提供初始化模型,讓模型自己隨機初始化權重,從頭訓練 2 # 刪除checkpoint_exclude_scopes和trainable_scopes,因為是從頭開始訓練 3 # CHECKPOINT_PATH=./log_files/log_finetune/train_voc0712_20170712_1741_VGG16/model.ckpt-253287 4 5 python3 ../train_ssd_network.py \ 6 --train_dir=${TRAIN_DIR} \ #訓練生成模型的存放路徑 7 --dataset_dir=${DATASET_DIR} \ #數據存放路徑 8 --dataset_name=pascalvoc_2007 \ #數據名的前綴 9 --dataset_split_name=train \ 10 --model_name=ssd_300_vgg \ #加載的模型的名字 11 #--checkpoint_path=${CHECKPOINT_PATH} \ #所加載模型的路徑,這里注釋掉 12 #--checkpoint_model_scope=vgg_16 \ #所加載模型里面的作用域名 13 --save_summaries_secs=60 \ #每60s保存一下日志 14 --save_interval_secs=600 \ #每600s保存一下模型 15 --weight_decay=0.0005 \ #正則化的權值衰減的系數 16 --optimizer=adam \ #選取的最優化函數 17 --learning_rate=0.00001 \ #學習率 18 --learning_rate_decay_factor=0.94 \ #學習率的衰減因子 19 --batch_size=32