【目標(biāo)檢測(cè)實(shí)戰(zhàn)】Pytorch—SSD模型訓(xùn)練(VOC數(shù)據(jù)集

20.jpg

原文發(fā)表在:語雀文檔

0.說明

SSD:Single Shot MultiBox Detector 和Yolo系列一樣,他們都是one-stage系列的目標(biāo)檢測(cè)模型,SSD算法的官方實(shí)現(xiàn)是用的Caffe框架,源碼在↓。有人將其改造成了Pytorch實(shí)現(xiàn)版,所以此代碼可稱為SSD算法的非官方Pytorch實(shí)現(xiàn)。

這里,需要說明:

  • 1.目前只支持Python3.X版本
  • 2.高度推薦通過支持CUDA的GPU來訓(xùn)練,用CPU也可以訓(xùn)練,不過非常非常慢
  • 3.目前只支持VOC2007/VOC2012 、COCO數(shù)據(jù)集、對(duì)ImageNet數(shù)據(jù)集還不能夠支持
  • 4.本文的訓(xùn)練在windows10/ubuntu18.04都可正常跑通

推薦按照github首頁給出的步驟一步步來:

image

整體來說,比較簡單。不過,還是會(huì)遇到比較坑的地方,主要是visdom那里,這里直接跳過Visdom安裝的步驟,因?yàn)榧词拱擦?,?huì)發(fā)現(xiàn)代碼也有報(bào)錯(cuò),且visdom只是用于訓(xùn)練過程中可視化loss的頁面,沒有也不影響正常訓(xùn)練。


1.安裝Pytorch

如果已安裝Pytorch,可以直接跳過此步。由于我裝了anaconda,所以直接用的conda安裝,安裝過程見pytorch官網(wǎng)

image

如果不翻墻,conda安裝pytorch會(huì)比較慢,經(jīng)常卡住,建議配置國內(nèi)清華源,再下載速度會(huì)快很多

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/

win10和ubuntu系統(tǒng)都建議直接用conda安裝,步驟類似。安裝完成在conda環(huán)境中輸入python,進(jìn)入python后如果import torch不報(bào)錯(cuò)則證明pytorch安裝成功

2.資源準(zhǔn)備

2.1 源碼下載

git clone[https://github.com/amdegroot/ssd.pytorch.git](https://link.zhihu.com/?target=https%3A//github.com/amdegroot/ssd.pytorch.git)

或者下載zip包直接下載都可以ssd.pytorch-master.zip

2.2 VOC數(shù)據(jù)集下載

目前只支持COCO和VOC數(shù)據(jù)集,鑒于COCO數(shù)據(jù)集規(guī)模太大,這里僅準(zhǔn)備VOC數(shù)據(jù)集。如果已下載好VOC數(shù)據(jù)集,可跳過此步。

VOC2007

訓(xùn)練集+測(cè)試集

http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar

VOC2012

訓(xùn)練集+測(cè)試集

http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar 將下載后的文件解壓,將VOC2007和VOC2012文件夾共同放入VOCdevkit下,此文件夾路徑即為后面代碼中需要用到的VOC_ROOT。

例: VOC_ROOT='D:\personalProject\AI\pytorch\dataset\VOC\VOCdevkit' VOC_ROOT = '/home/lyon/AI/DeepLearning/ssd/dataset/VOCdevkit/'

2.3 模型文件下載

下載好的模型文件放入源碼包weights文件夾下 vgg16_reducedfc.rar https://s3.amazonaws.com/amdegroot-models/vgg16_reducedfc.pth

3.安裝visdom
visdom主要用于訓(xùn)練過程中,可通過瀏覽器可視化地觀察loss情況和訓(xùn)練細(xì)節(jié),如果不需要可視化地看訓(xùn)練過程,可跳過此步驟。
3.1安裝visdom
pip install visdom
3.2修改源碼
下載下來的visdom,如果直接用 python -m visdom.server 啟動(dòng),瀏覽器訪問http://localhost:8097/會(huì)發(fā)現(xiàn)頁面什么都沒有,因?yàn)樵谄湓创aserver.py的1916行,會(huì)通過download_scripts()方法動(dòng)態(tài)下載一些css、font、js等靜態(tài)文件,如果不翻墻下載會(huì)失敗導(dǎo)致文件缺失,進(jìn)入頁面后什么都沒有....

image

解決辦法: - 注釋掉visdom包下server,py源碼1917行的:download_scripts() - 手動(dòng)將下載好的靜態(tài)文件,放入visdom的static文件夾下
3.3增加靜態(tài)文件
如果是conda安裝的環(huán)境,可用conda env list查看各個(gè)環(huán)境的路徑,然后找到visdom路徑 visdom文件夾路徑:conda環(huán)境路徑/lib/site-packages/visdom

image

這里,可直接用我下載好的static.rar,替換掉原static文件,然后即可通過python -m visdom.server 正常啟動(dòng),并訪問http://localhost:8097/

4.模型訓(xùn)練

4.1設(shè)置模型參數(shù)

主要是在train.py中設(shè)置默認(rèn)數(shù)據(jù)集,算法模型路徑,batch-size,是否啟動(dòng)CUDA加速等等。這里源碼默認(rèn)的batch-size是32,根據(jù)自己GPU能力調(diào)節(jié)大小,我用GTX1060 6G的GPU發(fā)現(xiàn)32會(huì)崩,可以修改成16,RTX2060 SUPER下可以設(shè)置到32。詳細(xì)配置如下:

# 加載模型初始參數(shù)
parser = argparse.ArgumentParser(
    description='Single Shot MultiBox Detector Training With Pytorch')
train_set = parser.add_mutually_exclusive_group()
# 默認(rèn)加載VOC數(shù)據(jù)集
parser.add_argument('--dataset', default='VOC', choices=['VOC', 'COCO'],
                    type=str, help='VOC or COCO')
# 設(shè)置VOC數(shù)據(jù)集根路徑
parser.add_argument('--dataset_root', default=VOC_ROOT,
                    help='Dataset root directory path')
# 設(shè)置預(yù)訓(xùn)練模型vgg16_reducedfc.pth
parser.add_argument('--basenet', default='vgg16_reducedfc.pth',
                    help='Pretrained base model')
# 設(shè)置批大小,根據(jù)自己顯卡能力設(shè)置,默認(rèn)為32,此處我改為16
parser.add_argument('--batch_size', default=16, type=int,
                    help='Batch size for training')
# 是否恢復(fù)中斷的訓(xùn)練,默認(rèn)不恢復(fù)
parser.add_argument('--resume', default=None, type=str,
                    help='Checkpoint state_dict file to resume training from')
# 恢復(fù)訓(xùn)練iter數(shù),默認(rèn)從第0次迭代開始
parser.add_argument('--start_iter', default=0, type=int,
                    help='Resume training at this iter')
# 數(shù)據(jù)加載線程數(shù),根據(jù)自己CPU個(gè)數(shù)設(shè)置,默認(rèn)為4
parser.add_argument('--num_workers', default=4, type=int,
                    help='Number of workers used in dataloading')
# 是否使用CUDA加速訓(xùn)練,默認(rèn)開啟,如果沒有GPU,可改成False直接用CPU訓(xùn)練
parser.add_argument('--cuda', default=True, type=str2bool,
                    help='Use CUDA to train model')
# 學(xué)習(xí)率,默認(rèn)0.001
parser.add_argument('--lr', '--learning-rate', default=1e-3, type=float,
                    help='initial learning rate')
# 最佳動(dòng)量值,默認(rèn)0.9(動(dòng)量是梯度下降法中一種常用的加速技術(shù),用于加速梯度下降,減少收斂耗時(shí))
parser.add_argument('--momentum', default=0.9, type=float,
                    help='Momentum value for optim')
# 權(quán)重衰減,即正則化項(xiàng)前面的系數(shù),用于防止過擬合;SGD,即隨機(jī)梯度下降,多指mini-batch梯度下降
parser.add_argument('--weight_decay', default=5e-4, type=float,
                    help='Weight decay for SGD')
# gamma更新,默認(rèn)值0.1
parser.add_argument('--gamma', default=0.1, type=float,
                    help='Gamma update for SGD')
# 使用visdom將訓(xùn)練過程loss圖像可視化
parser.add_argument('--visdom', default=False, type=str2bool,
                    help='Use visdom for loss visualization')
# 權(quán)重保存位置,默認(rèn)存在weights/下
parser.add_argument('--save_folder', default='weights/',
                    help='Directory for saving checkpoint models')
args = parser.parse_args()

設(shè)置好參數(shù)后,需要配置數(shù)據(jù)集加載路徑,在源碼包/data/voc0712.py中注釋掉第28行,將VOC數(shù)據(jù)集路徑替換為自己的路徑:

image

4.2修改源碼

由于Pytorch版本不同,較新版的代碼直接運(yùn)行會(huì)報(bào)錯(cuò),需要修改部分代碼,主要是將.data[0]的部分改成.item()

修改train.py

修改源碼183.184兩行

loc_loss += loss_l.data[0]
conf_loss += loss_c.data[0]

改為:

loc_loss += loss_l.item()
conf_loss += loss_c.item()

修改源碼188行

print('iter ' + repr(iteration) + ' || Loss: %.4f ||' % (loss.data[0]), end=' ')

改為:

print('iter ' + repr(iteration) + ' || Loss: %.4f ||' % (loss.item()), end=' ')

修改源碼165行

# load train data
images, targets = next(batch_iterator)

改為:

try:
    images, targets = next(batch_iterator)
except StopIteration as e:
    batch_iterator = iter(data_loader)
    images, targets = next(batch_iterator)

修改mutibox_loss.py

修改:源碼包/layers/modules/mutibox_loss.py 調(diào)換第97,98行:

loss_c = loss_c.view(num, -1)
loss_c[pos] = 0 # filter out pos boxes for now

修改第114行為:

N = num_pos.data.sum().double()
loss_l /= N
loss_c /= N

參考:
https://blog.csdn.net/qq_39571318/article/details/89788687 https://blog.csdn.net/dingkm666/article/details/88775428

修改coco.py

由于train.py會(huì)from data import ,而data初始化時(shí)會(huì)加載coco_labels.txt,這個(gè)文件在源碼包中data/下,無論你是否下載了coco數(shù)據(jù)集都不影響其加載,加載時(shí)需要用到COCO_ROOT這個(gè)參數(shù),需要修改COCO_ROOT為你的coco_labels.txt所在的父文件夾目錄*。

4.3開始訓(xùn)練

訓(xùn)練方式以下兩種都可以:

  • 1.Pycharm中直接訓(xùn)練
  • 2.cmd中進(jìn)入conda的pytorch環(huán)境,python train.py
image

5.模型驗(yàn)證

5.1修改模型路徑

第5步訓(xùn)練的模型,默認(rèn)每迭代5000輪會(huì)在weights/下生成.pth模型文件,我這里訓(xùn)練了幾個(gè)小時(shí),迭代到25000輪。模型驗(yàn)證前,需要修改eval.py第39行,替換為你自己訓(xùn)練好的模型文件l路徑。 生成的模型文件ssd300_COCO_25000.zip

image

5.2修改eval.py

運(yùn)行eval.py,會(huì)對(duì)測(cè)試集中所有圖片進(jìn)行檢測(cè),并輸出結(jié)果。這里實(shí)際運(yùn)行發(fā)現(xiàn)windows系統(tǒng)下會(huì)有問題,需要做一點(diǎn)修改。 源碼71行注釋,改成如下形式:

#imgsetpath = os.path.join(args.voc_root, 'VOC2007', 'ImageSets','Main', '{:s}.txt')
imgsetpath = os.path.join(args.voc_root, 'VOC2007', 'ImageSets', 'Main') + os.sep + '{:s}.txt'

如不修改,則imgsetpath 不能正常拼接出來,導(dǎo)致報(bào)錯(cuò)

5.3運(yùn)行eval.py驗(yàn)證模型

訓(xùn)練了幾個(gè)小時(shí),得到模型ssd300_COCO_25000.pth 驗(yàn)證結(jié)果如下:

Evaluating detections
Writing aeroplane VOC results file
Writing bicycle VOC results file
Writing bird VOC results file
Writing boat VOC results file
Writing bottle VOC results file
Writing bus VOC results file
Writing car VOC results file
Writing cat VOC results file
Writing chair VOC results file
Writing cow VOC results file
Writing diningtable VOC results file
Writing dog VOC results file
Writing horse VOC results file
Writing motorbike VOC results file
Writing person VOC results file
Writing pottedplant VOC results file
Writing sheep VOC results file
Writing sofa VOC results file
Writing train VOC results file
Writing tvmonitor VOC results file
VOC07 metric? Yes
Reading annotation for 1/4952
Reading annotation for 101/4952
Reading annotation for 201/4952
Reading annotation for 301/4952
......
......
Reading annotation for 4901/4952
Saving cached annotations to /home/lyon/AI/DeepLearning/ssd/dataset/VOCdevkit/VOC2007/annotations_cache/annots.pkl
AP for aeroplane = 0.7428
AP for bicycle = 0.8042
AP for bird = 0.6725
AP for boat = 0.6337
AP for bottle = 0.4359
AP for bus = 0.8039
AP for car = 0.8236
AP for cat = 0.8543
AP for chair = 0.5490
AP for cow = 0.7241
AP for diningtable = 0.6796
AP for dog = 0.8046
AP for horse = 0.8268
AP for motorbike = 0.7855
AP for person = 0.7249
AP for pottedplant = 0.4448
AP for sheep = 0.7060
AP for sofa = 0.7563
AP for train = 0.8028
AP for tvmonitor = 0.7311
Mean AP = 0.7153
~~~~~~~~
Results:
0.743
0.804
0.672
0.634
0.436
0.804
0.824
0.854
0.549
0.724
0.680
0.805
0.827
0.785
0.725
0.445
0.706
0.756
0.803
0.731
0.715
~~~~~~~~

--------------------------------------------------------------
Results computed with the **unofficial** Python eval code.
Results should be very close to the official MATLAB eval code.
--------------------------------------------------------------

Process finished with exit code 0

得到的mAP:0.7153

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容