專案地址:https://github.com/TuSimple/simpledet
SimpleDet 是一套簡單通用的目標檢測與物體識別的框架。整套框架基於 MXNet 的原生 API 完成。這篇文章不僅僅想介紹一下這樣一個新的框架有什麼與眾不同的 feature,更想去介紹一下我們為什麼決定做這麼一件事情以及我們的初衷是什麼。
為什麼還要再造一次錘子?
這個問題其實也是我們在開始這個專案之前自問了很多次的問題。如果大家有心留意下的話,Ross 在產出 RCNN 和 Fast RCNN 的那兩三年,每年都會去參加一下 ImageNet 比賽。其實當初很不解,為什麼要去這麼做,尤其是基本都是很裸的方法,一定不可能拿到好的名次。後來有機會去抓住 Kaiming 問了一下這個問題,Kaiming 給我的答案是,Ross 其實並不關係這個名次,Ross 關心的是借這個機會宣傳他更好用的錘子給大家。
其實不同於很多人認為的那樣,模型 fancy,結果好才是一個好工作的體現。恰恰相反,簡單可靠,越多的 paper 願意以這個方法作為 baseline,就越說明這個方法的經典。其實對我自己而言,我從讀 PhD 開始就一直願意去做這樣的 baseline 和這樣的錘子。從當年用 HOG+LR 超越絕大多數 paper 的 Tracking 到參與 MXNet 專案再到後來用 5 行程式碼做 domain adaptation 的 AdaBN。雖然開始的時候都遭受了很多人包括 reviewer 的質疑,但是時間都證明了這些工作的價值。
對於目標檢測和識別領域,今天我們發現了同樣的問題。雖有很多開源的程式碼和框架,但是目前看下來仍有很大進步的空間。一方面現有的開源框架雖有各種冠軍頭銜加持,但因為各種各樣的原因,復現出真正 SOTA 的結果仍然不是一件輕鬆的事情;另一方面,一些效能還不錯的開原始碼(如 SNIP 和 SNIPER)卻難以擴充和維護。所導致的結果就是目前仍然有很多論文仍然在一個很低的 baseline 上進行改進,就算取得了效能的提升也很難說明方法的有效性。我們建立 SimpleDet 就是為了對於 Instance Recognition 這一系列問題提供一個更好的 baseline 和更好的錘子。
如果去問一個同學你需要一個什麼樣的目標檢測和識別框架,我相信效能好,速度快,好用這三個關鍵詞可以覆蓋 99% 的需求,下面我們一一展開來看看 SimpleDet 在這些方面的優勢和與其他開源框架的區別。
什麼叫效能好?
在 SimpleDet 中,最值得關注的一個演算法是我們的 TridentNet(不知道 TridentNet 的同學歡迎猛戳:Naiyan Wang:TridentNet:處理目標檢測中尺度變化新思路)。我們公佈了在各個 setting 下的模型和訓練程式碼。這也是目前已知的 COCO 上單模型最高的演算法。除了一個乾淨的模型(testdev mAP=42.7)之外,我們還提供了一個加上了全部大禮包的 setting(testdev mAP=48.4),包括 Sync BN,multi-scale training/testing,deformable conv 和 softer NMS。雖然這些都是在很多 paper 和比賽中大家已經常用的技術了,但是仍然很難把所有的方法都直接正確開啟。
我們在 SimpleDet 中提供了一套開箱即用的方案,希望藉此降低復現 SOTA 的門檻,從而提升下整個領域中 baseline 的水平。除此之外,為了方便大家進一步擴充,我們還提供了一些經典模型和演算法,例如 Mask(Faster) RCNN,FPN,RetinaNet,CascadeRCNN 等。這個演算法的結果都已經經過驗證,能達到論文中和已有開原始碼的結果。我們後續還會進一步補充一些經典和重要的工作,也歡迎大家積極貢獻。
什麼叫速度快?
首先針對速度這個問題,我們一個獨特的 feature 是 FP16 training,FP16 不僅可以節省一半的視訊記憶體,在最新支援 TensorCore 的 Volta 和 Turing 系列 GPU 上還可以有一倍甚至更多的速度提升。如下左圖,從 1080Ti 的 30img/s 可以提升到 75img/s,展現了非常顯著的提升。其次,對有不同資源的同學來說,對於速度的需求也是不同的。我們著重考慮了三種典型的使用者:
入門使用者:這類使用者可能由於實驗室資源限制,或者單純是因為個人興趣,只能負擔起小於 4 塊 GPU。針對這類使用者,能夠儘量復現出更多資源下的結果是第一優先順序。核心的問題在於使用大的 batchsize 和 BN batchsize。在這樣的 setting 下,SimpleDet 提供了 Inplace ABN[1] (To be announced),結合上 MXNet 本身提供的 memonger 功能,再加上 FP16,極限狀態下訓練的單卡 batchsize 可以達到 8 到 16。雖然損失了一定的速度,但是在兩到四卡上就能達到正常八卡訓練的 batchsize。
普通使用者:這類使用者應該佔據絕大多數,可以獨佔一臺 8 卡機器進行訓練。這類使用者對於速度會有著更高的需求,可以在入門使用者的基礎上關掉 memonger 這種對速度有一些影響的元件,以得到更好的訓練速度。
土豪使用者:手裡有多臺 8 卡機器,希望充分利用機器快速迭代模型。針對這部分使用者,依託於 MXNet 優秀的分散式設計以及阿里雲更進一步最佳化的 Perseus 通訊框架,如下右圖所示,我們在 4 機 32 卡的情況下可以做到線性加速(沒有資源進行更大的測試了,更強大的土豪可以贊助點機器。。。)。這對於打比賽或者對模型迭代速度有很高要求的應用來說,無疑是個福音。
我們希望每一類使用者都能各取所需,在 SimpleDet 中找到最適合自己資源的 setting,極大化產出。
什麼叫做好用?
雖然每個使用者心裡都會有一個好用的定義(心疼產品經理 1s...),除了前面的效能和速度之外,我們認為是否容易擴充和方便清晰調參也會是兩個重要的因素。我們針對一些常見需求,進行了高度模組化的設計,一個核心思想便是儘量抽象和隔離核心操作,使各種不同演算法儘量複用,在這些核心操作之上擴充而無需修改。例如,我們抽象出了一整套乾淨通用的配置系統,除了可以配置所有常見引數之外,還將常用的預處理和資料擴充操作也都抽象出來。針對這些常見的變更,使用者不需要修改核心程式碼即可完成調優。
再比如,修改一個 detection 演算法可能會遇到最複雜的邏輯就是在於 data loader 和 pre-process,但是往往一個欠佳的實現會導致 loader 的效率大幅度下降,從而成為整個訓練中的瓶頸,使得 GPU 利用率降低。在 SimpleDet 中,我們提取出了一個通用的多執行緒 loader 框架,並抽象出了在預處理中常見的操作。後續新演算法的擴充可以很容易在這些通用工具的基礎上同時保持簡潔性和效率。更多的設計歡迎大家直接閱讀原始碼,我們也給出了一個簡單的對 Faster RCNN 和 TridentNet 程式碼結構的分析供大家參考。
以上便是 SimpleDet 的一個簡要介紹,歡迎大家積極試用,提出寶貴意見。也歡迎大家一起來捉 bug,貢獻新的演算法和 feature,共同把 SimpleDet 打造成一套目標檢測與物體識別的前沿試驗平臺。
最後,例行保留專案。開源出來的專案只是我們在進行的 Deep Learning 專案中的冰山一角,Deep Learning 也只是我們進行的無人駕駛卡車全技術棧中的一環,在圖森有著大量有趣而又有挑戰的專案有待開展。想不想試試用自己的程式碼驅動一輛 40 噸的大卡車在高速上以 80km/h 的速度飛奔?想不想試試用自己的程式碼控制一輛近 20 米長的卡車以 5cm 的精度停在吊車下呢?歡迎加入圖森未來!
[1] Rota Bulò, Samuel, Lorenzo Porzi, and Peter Kontschieder. "In-place activated batchnorm for memory-optimized training of dnns." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018.
知乎專欄地址:https://zhuanlan.zhihu.com/p/55972055