ssd pytorch轉 libtorch c++實現 (nms採用cuda並行實現)

背景:

  1. 因爲所裏面大多數同學在研究論文時用的比較多的還是pytorch,所以考慮在pc端的部署採用libtorch ,當然
    libtorch比較新,所以還是要謹慎地採用,因爲看到官方只用resnet等簡單的網絡做例子時就要有被坑的心裏準備,但是,,項目緊急,不管了。。
  2. 只要懂得其中一些規則,尤其是jit 的規則還是挺好弄的,但是本人也是第一次真正接觸到jit,所以也踩了很多坑
  3. 如果熟悉了裏面的python和torch script的轉換規則,那麼就會輕鬆很多
  4. 本文是以SSD(single shot multibox object detector)的python版本爲原型,轉換成torch script c++版本調用,這是原文的鏈接https://github.com/amdegroot/ssd.pytorch

note !:

  1. 本文采用的是Annotation方式,不是trace

  2. 因爲上面gayhub的ssd 裏面有些python操作是torch script 不支持的,所以我把最後一步的操作分解了,同時原文的nms操作好像是直接python操作的,沒有cuda並行版本(可能本人沒找到),所以本文結合該ssd修改https://github.com/gdlg/pytorch_nms的把nms變成多圖多類的nms並行化操作

  3. 關於速度問題,如果只是單張圖片且只有一類,那麼推薦nms在cpu上操作,那樣nms會比在gpu上nms操作快,可能論單核的話還是gpu強一些
     

本文涉及到的一些知識:

  1. 一些ssd的知識,但是沒有上篇講mask rcnn的仔細。因爲ssd稍微簡單一些,可能是比mask rcnn 更‘端到端化一些’
  2. libtorch c++一些常規操作
  3. nms的並行算法原理(這個可能有點難理解)
  4. cuda的一些常規操作(因爲本人也是剛接觸cuda,所以可能修改後的nms並不是常規操作)

環境配置:

  1. 系統: windows 10
  2. libtorch 版本: libtorch-win-shared-with-deps-1.2.0.zip
  3. IDE : QT creator  5.8.0  編譯器:Qt 5.8 64-bit for Desktop (MSVC 2015) 
  4. GPU: nvidia 1080ti(11G)

1 pytorch模型轉libtorch(script)模型

  • 先下載pytorch ssd代碼https://github.com/amdegroot/ssd.pytorch

  • 因爲我們是對訓練好的pytorch模型進行轉換,所以我們可以只要測試的代碼就行了,所以我們可以直接對SSD文件夾主目錄下的test.py進行修改就行了,修改前先進行備份(以後涉及到修改的文件都可以備份),假設命名爲convert2libtorch.py,之後我們對該文件進行修改,

  • 修改開始(按照官網的教程來https://pytorch.org/tutorials/advanced/cpp_export.html,主要是annotation方式,實際上很多複雜點的網絡好多control flow):

    • 1.  我們主要對convert2libtorch.py 的test_voc函數進行修改,

      • 先添加torch script用到的包,同時可以添加cv2包(因爲測試時可能會用到)

      • 其他包比如

        因爲我這裏沒有下載voc,所以裏面很多路徑是沒有的,但是這樣運行會出錯,所以我這邊的文件改成如下

        如果你是下載過數據集並且完整跑過這些代碼,那麼上面的可以不改

 

to be continued...

 

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