Pytorch-SSD目標檢測算法(Single Shot MultiBox Detector)(簡單,明瞭,易用,全中文註釋,單機多卡訓練,訓練過程可視化,視頻檢測)

SSD-Pytorch

作者爲pytorch中文網維護者之一,網站會發許多深度學習相關文章,歡迎pytorch使用者多多支持.
項目Github地址:Github 歡迎star, fork

img

一. 項目簡介

  • 項目是在實際項目上整理精簡而來,主要針對單機多卡環境實現.

  • 項目整體結構清晰明瞭,對訓練過程在不失靈活性的前提下進行了包裝.訓練,測試,檢測過程均只需簡單幾行即可實現.

  • 如需深入瞭解,可對照項目文件結構進行理解,項目整體均有詳細中文備註.

  • 完整項目地址:Github,歡迎star, fork.

  • github連接較慢的,可以去Gitee(國內的代碼託管網站),也有完整項目.

1.1 項目特點

1.結構化實現.模型各部件均分離實現,模型結構更爲清晰明瞭,便於理解以及後續修改使用.

2.針對單機多卡環境實現.簡單直觀的多GPU調用實現. 只需通過列表指明需調用的GPU序號即可實現多GPU環境下的訓練與測試.如: train_devices=[0,1,3]即可調用第1,2,4三塊GPU用於訓練.

3.全中文註釋.每部分均有詳細的中文註釋,是你學習SSD,加深理解的不二之選.

1.2 Requirements

1.pytorch

2.opencv-python

3.torchvision >= 0.3.0

4.Vizer (在代碼實現上也借鑑了lufficc大神的一些思想)

5.visdom

1.3 項目文件結構

文件夾 文件 說明
Data 數據相關
Dataloader 數據加載器類’Our_Dataloader’, ‘Our_Dataloader_test’
Dataset_VOC VOC格式數據集類
Transfroms 數據Transfroms
Transfroms_tuils Transfroms子方法
Model 模型相關
base_models/VGG 現只有vgg模型,後期會更新其他模型
structs/Anchors 默認檢測框生成器
structs/MutiBoxLoss SSD損失函數
structs/PostProcess 後處理
structs/Predictor 分類及迴歸網絡
evaler 驗證器,用於在數據集上對模型進行驗證(測試),計算ap,map
ssd_model SSD模型類
trainer 訓練器,用於在數據集上訓練模型
Utils 各種工具
boxs_op 各種框體操作,編碼解碼,IOU計算,框體格式轉換等
Weights 模型權重存放處
pretrained 預訓練模型權重存放處
trained 訓練過程中默認模型存放處
---- Configs.py 配置文件,包含了模型定義,數據以及訓練過程,測試過程等的全部參數,建議備份一份再進行修改
---- Demo_train.py 模型訓練的例子,訓練過程中的模型會保存在Weights/Our/
---- Demo_eval.py 模型測試的例子,計算模型ap,map
---- Demo_detect_one_image.py 檢測單張圖片例子
---- Demo_detect_video.py 視頻檢測例子,傳入一個視頻,進行檢測

二. Demo例子

本項目Demo均是完整的訓練,測試,檢測過程,可直接運行.

2.1 訓練train

本項目採用visdom進行訓練過程可視化

visdom安裝 及運行:


visdom安裝

pip install visdom   安裝

python -m visdom.server     運行

打開網頁`127.0.0.1:8097` 進行訓練過程可視化

(如未運行visdom,會報警告,但是不影響訓練過程.建議通過visdom進行可視化)

訓練過程通過訓練器進行配置,訓練器支持單機單卡,單機多卡訓練;不支持多機多卡以及cpu.


# 實例化模型. 模型的具體各種參數在Config文件中進行配置

net = SSD(cfg)

# 將模型移動到gpu上,cfg.DEVICE.MAINDEVICE定義了模型所使用的主GPU

# 模型的參數更新會在主GPU上進行.

net.to(cfg.DEVICE.MAINDEVICE)

# 初始化訓練器,訓練器參數已通過cfg進行配置;也可傳入參數進行配置,但不建議

trainer = Trainer(cfg, max_iter=None, batch_size=None, 
                  
                  train_devices=None, model_save_step=None, 
                  
                  model_save_root=None, vis = None, vis_step=None)

# 訓練器開始在 數據集上訓練模型
  
trainer(net, train_dataset)

2.2 測試Eval

對模型進行測試,測試器支持單機單卡,單機多卡測試,但不支持多機多卡,cpu.


net = SSD(cfg)

# 將模型移動到gpu上,cfg.DEVICE.MAINDEVICE定義了模型所使用的主GPU

net.to(cfg.DEVICE.MAINDEVICE)

# 模型從權重文件中加載權重

net.load_pretrained_weight('Weights/pretrained/vgg_ssd300_voc0712.pkl')

# 初始化驗證器,驗證器參數通過cfg進行配置;也可傳入參數進行配置,但不建議

evaler = Evaler(cfg, eval_devices=None)

# 驗證器開始在數據集上驗證模型

ap, map = evaler(model=net, test_dataset=test_dataset)

print(ap)

print(map)

2.3 檢測Detect

檢測過程本項目給出倆個例子,分別爲單張圖片檢測與視頻檢測

2.3.1 圖片檢測

單張圖片檢測,通過調用模型Detect_single_img方法實現.支持gpu與cpu,依模型運行環境而定.


# 實例化模型

net = SSD(cfg)

# 使用cpu或gpu

net.to('cuda')

# 模型從權重文件中加載權重

net.load_pretrained_weight('Weights/pretrained/vgg_ssd300_voc0712.pkl')

# 打開圖片

image = Image.open("Images/000133.jpg")

# 進行檢測, 分別返回 繪製了檢測框的圖片數據/迴歸框/標籤/分數.

drawn_image, boxes, labels, scores = net.Detect_single_img(image=image,score_threshold=0.5)
    

plt.imshow(drawn_image)

plt.show()

2.3.2 視頻檢測


# 實例化模型

net = SSD(cfg)

# 使用cpu或gpu

net.to('cuda')

# 模型從權重文件中加載權重

net.load_pretrained_weight('Weights/pretrained/vgg_ssd300_voc0712.pkl')

video_path = 'aaa.mp4'  # 現在忙於其他事,項目後期會上傳視頻檢測樣例
    
# 進行檢測,

# save_video_path=None,則不保存視頻; save_video_path=bbb.mp4 將檢測後視頻保存爲bbb.mp4

# show=True,實時顯示檢測結果

net.Detect_video(video_path=video_path, score_threshold=0.02, save_video_path=None, show=True)

說明

本項目是在實際項目上整理精簡而來,現配置文件爲在voc2007上進行訓練,如有其他需求,請自行修改.

完整項目地址:Github,歡迎star, fork.

僅限用於交流學習,如需引用,請聯繫作者.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章