這個(gè)大概折騰了三四天,反正我能想到改的地方都改了沽瘦,筆記本上試過了革骨,宿舍的電腦上也試過了,反正就是不行析恋,我也沒什么辦法了良哲,后面就轉(zhuǎn)向YoloV3了。盡管失敗了绿满,還是記錄一下臂外。
我具體怎么做的就寫在下面:
1 下載源碼框架窟扑。
地址:https://github.com/balancap/SSD-Tensorflow 下載下來解壓喇颁。
2 創(chuàng)建tfrecord_,train_model,VOC2007三個(gè)文件夾。
主目錄下創(chuàng)建嚎货,當(dāng)然名稱不一定是這樣橘霎,主要是為了減少源碼修改。分別是存儲(chǔ)tfrecord格式的訓(xùn)練數(shù)據(jù)殖属,存儲(chǔ)訓(xùn)練的模型以及存儲(chǔ)原始VOC格式的訓(xùn)練數(shù)據(jù)用的姐叁,這個(gè)時(shí)候就可以把上一篇做好的VOC格式的訓(xùn)練數(shù)據(jù)復(fù)制過來了。
3 生成.tfrecords訓(xùn)練文件。
這里面有幾個(gè)需要修改的文件:
-
datasets/pascalvoc_common.py
改掉原始的標(biāo)簽外潜,把自己的標(biāo)簽填入原环。比如我改完就是這樣。0號(hào)標(biāo)簽不要?jiǎng)哟潜尘啊?br> -
datasets/pascalvoc_to_tfrecords.py
line 67: 這里的作用主要是幾個(gè)xml文件生成一個(gè)tfrecords,這樣做的原因作者的readme文件里也說的很清楚:(雖然我并不是特別理解)嘱吗。
另外,修改滔驾,83行的讀取方式和圖片類型:
- 運(yùn)行tf_convert_data.py文件谒麦,點(diǎn)擊run,Edit_configuration,在parameters中填入預(yù)編譯命令:
--dataset_name=pascalvoc
--dataset_dir=./VOC2007/ #VOC文件夾
--output_name=voc_2007_train #輸出名稱的前綴
--output_dir=./tfrecords_ #目標(biāo)文件夾
在./tfrecords_
文件夾中生成了tcrecords文件的話就表明生成成功了。
3. 訓(xùn)練代碼調(diào)整哆致。
-
datasets/pascalvoc_2007.py
修改數(shù)據(jù)的shape:
幾個(gè)參數(shù)解釋一個(gè):TRAIN_STATISTICS中的格式是:類別:(訓(xùn)練集個(gè)數(shù)绕德,當(dāng)前類別標(biāo)簽數(shù))。
比如對(duì)于person類來說摊阀,包含其的共有100張照片耻蛇,這100張照片中一共有150個(gè)人的標(biāo)簽。就是這么個(gè)意思胞此。
TEST_STATISTICS中就不用說了城丧,照著填就可以了。
SPLIT_TO_SIZE中train就是訓(xùn)練基的個(gè)數(shù)豌鹤,Test是測試集的個(gè)數(shù)亡哄,我是全部用作訓(xùn)練了(因?yàn)閿?shù)據(jù)量很少,所以測試集就隨便寫了一個(gè)數(shù)布疙,這個(gè)在訓(xùn)練的時(shí)候是不影響的)蚊惯。
-
nets/ssd_vgg_300.py
line 96,97:修改為類別+1.
-
eval_ssd_network.py
line 66:修改類別數(shù):
-
train_ssd_network.py
有幾個(gè)要改的地方:
line27: 數(shù)據(jù)格式改成NHWC
line135: 類別個(gè)數(shù): 類別數(shù)+1
line154: 訓(xùn)練步數(shù):這個(gè)自己改了,先給的小的訓(xùn)練看下loss灵临。
4.下載預(yù)訓(xùn)練模型截型。
我們基于VGG16的預(yù)訓(xùn)練模型來訓(xùn)練,提供個(gè)網(wǎng)盤吧:
鏈接:https://pan.baidu.com/s/1nlHYtH9qUO0gBQPzmNZL-w
提取碼:jcig
下載之后解壓到checkpoint
文件夾中儒溉。
5.訓(xùn)練宦焦。
train_ssd_network.py來配置預(yù)編譯命令,點(diǎn)擊run,Edit_configuration,在parameters中填入預(yù)編譯命令:
這里比較多顿涣,主要關(guān)注下最后面的幾個(gè)波闹,我寫在注釋里。
--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 #保存模型的時(shí)間
--weight_decay=0.0005 #初始化權(quán)重
--optimizer=adam #優(yōu)化器
--learning_rate=0.001 #學(xué)習(xí)率涛碑,這個(gè)一開始可以給大一點(diǎn)看一下loss
--learning_rate_decay_factor=0.94 #學(xué)習(xí)率退火系數(shù)精堕。
--batch_size=24 #batch_size
--gpu_memory_fraction=0.9 #GPU使用率
如果出現(xiàn)GPU內(nèi)存分配的問題的話就可以把batch_size改小一點(diǎn)或者GPU使用率這個(gè)系數(shù)改小一些。
這樣的話就可以開始訓(xùn)練了蒲障。
6.總結(jié)
我最后遇到的問題就是訓(xùn)練的時(shí)候loss居高不下歹篓,最終也都是在20-100之間跳躍瘫证,這個(gè)loss太大了一些,所以也沒有用保存的模型來看一下測試結(jié)果庄撮。
我猜想了幾種可能背捌。
- 訓(xùn)練數(shù)據(jù)量太少?
按照我大量參考的博客來講洞斯,150張訓(xùn)練樣本并不算少载萌,而且為了消除這個(gè)疑慮,我用VOC的數(shù)據(jù)也訓(xùn)練了一段時(shí)間(大概四個(gè)小時(shí))巡扇,loss也是降不下來扭仁。所以基本排除了訓(xùn)練數(shù)據(jù)的問題。 - 設(shè)置有問題厅翔?
反正照著前面的設(shè)置都認(rèn)真寫了乖坠。為了避免因?yàn)槠脚_(tái)帶來的問題在不同的電腦上也試了,各個(gè)參數(shù)的意義自己問別人和看代碼也基本了解了刀闷,應(yīng)該沒有問題了熊泵。 - 訓(xùn)練的時(shí)間太少?(還沒有到極值)學(xué)習(xí)率太大甸昏?(跳過去極值)
前者我有一天打球之前開了訓(xùn)練顽分,練了20000多個(gè)step,后者我把學(xué)習(xí)率改到萬分之一訓(xùn)練了四個(gè)多小時(shí)施蜜,什么結(jié)果都沒有卒蘸。
后面我確實(shí)沒招了,整個(gè)代碼框架還是挺復(fù)雜的翻默,也沒有時(shí)間去細(xì)細(xì)看缸沃,所以我就放棄了,轉(zhuǎn)向Yolo了修械,值得欣喜的事趾牧,Yolo很快就有了不錯(cuò)的結(jié)果,除了我傻逼了把系統(tǒng)搞崩了之外肯污。