深度思考:從頭開始訓(xùn)練目標(biāo)檢測
點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時間送達(dá)
本文作者:沈志強(qiáng)
https://zhuanlan.zhihu.com/p/137410354
本文已由原作者授權(quán),不得擅自二次轉(zhuǎn)載
之前看過很多人對于這個問題的解讀,趁現(xiàn)在天天在家,也想談一下自己對于這個問題的一些看法和理解,所以今天就來討論一下learning object detection from scratch這個主題,順便回顧一下我們之前的工作DSOD(大約16年底開始的一個project,發(fā)表于ICCV2017),還有Kaiming等人[1]以及ScratchDet [2]等其他幾篇相關(guān)的工作。個人覺得這還是一個比較重要的topic,畢竟現(xiàn)在很多基于nas的detection backbone結(jié)構(gòu)搜索的工作都是基于目標(biāo)檢測可以脫離預(yù)訓(xùn)練網(wǎng)絡(luò)這個基本前提假設(shè)的 [7, 8]。
提到learning object detection from scratch大家首先想到的肯定是Kaiming他們那篇Rethinking ImageNet Pre-training (ICCV 2019), 以及知乎上很火的討論:
如何評價何愷明等 arxiv 新作 Rethinking ImageNet Pre-training?
https://www.zhihu.com/question/303234604
不得不說Kaiming做的工作真的很solid,每次總能把問題總結(jié)得很到位,包括這篇。但是很多人可能不知道,在Kaiming這個工作的兩年之前,已經(jīng)有工作關(guān)注到了這個問題,即如何脫離ImageNet預(yù)訓(xùn)練網(wǎng)絡(luò)依然能訓(xùn)練很好的目標(biāo)檢測模型。
DSOD這個項(xiàng)目開始于16年底,我記得是在cvpr deadline剛過不久,當(dāng)時我跟劉壯正在Intel Labs China實(shí)習(xí)(mentor是李建國老師),這個idea始于我們在茶水間的一次聊天,我們對這個想法都很興奮,當(dāng)天晚上就開始了動手實(shí)驗(yàn)。雖然我們有了一個很好的motivation和研究問題,但是說實(shí)話對于具體該如何來做我們真的一點(diǎn)方向都沒有。當(dāng)時唯一有用的線索是劉壯跟我介紹DenseNet有一些非常好玩和有意思的性質(zhì)(當(dāng)時DenseNet還剛投到cvpr,后來正如大家所知道的拿了當(dāng)年的best paper),比如在訓(xùn)練樣本比較少的情況下收斂得比ResNet更好,而我們這里拿掉預(yù)訓(xùn)練的權(quán)重其實(shí)在變相的減少訓(xùn)練數(shù)據(jù),這也是為什么我們最后主要使用dense connection的原因,因?yàn)槲覀冇X得這種dense的連接非常適合少量訓(xùn)練數(shù)據(jù)的收斂,比如PASCAL VOC只有幾萬張訓(xùn)練圖片。這邊我要強(qiáng)調(diào)一下的是,當(dāng)時最好的code base也還是基于caffe的py-faster-rcnn,當(dāng)時還沒有Sync BN [3],也沒有Group Norm [4],更沒有顯存巨大的GPU,后來從我們的實(shí)驗(yàn)中發(fā)現(xiàn)只要有了其中一個就能比較好的解決train object detection from scratch的問題,這個后面我會詳細(xì)說到。
眾所周知,自從Ross發(fā)表RCNN以來,所有基于deep learning的目標(biāo)檢測器都嚴(yán)重依賴于ImageNet預(yù)訓(xùn)練的權(quán)重。但是預(yù)訓(xùn)練的權(quán)重只是給了網(wǎng)絡(luò)一個初始值,為什么對性能影響會這么巨大呢?我們最初的策略是把當(dāng)時已有的所有state-of-the-art的檢測算法都去掉pretrain的權(quán)重試一下,包括Fast/Faster RCNN, SSD (當(dāng)時沒試YOLO,因?yàn)槲矣X得YOLO跟SSD的結(jié)論應(yīng)該會比較一致,而且SSD比初代YOLO擁有更好的性能)。最后結(jié)論是SSD可以得到decent的結(jié)果(PASCAL VOC上有69點(diǎn)多,這是我們paper里的結(jié)果,后來我follow了一些DSOD里面用到的訓(xùn)練超參數(shù),比如增大batch size和延長訓(xùn)練時間等等,可以訓(xùn)到74點(diǎn)多)而Fast/Faster都只有十幾二十多的樣子。
我相信很多人都看過Faster RCNN上這個issue:
https://github.com/rbgirshick/py-faster-rcnn/issues/238
我當(dāng)時也研究了很久為什么Faster RCNN不能脫離pre-trained network來訓(xùn)練。因?yàn)镾SD是可以訓(xùn)的,效果也不錯。所以我們對比之后覺得ROI Pooling layer可能是影響性能的原因,本質(zhì)上one-stage的detector更像是一個分類模型,同時SSD multi-stage prediction的結(jié)構(gòu)本質(zhì)上也是deeply supervised的。所以當(dāng)時我們歸結(jié)為需要一個one-stage+deeply supervised的結(jié)構(gòu)來training from scratch,目的之一是為了擺脫ROI Pooling。后來的ScratchDet [2]也表示one-stage比two-stage更容易得到好的結(jié)果,雖然他們發(fā)現(xiàn)通過gradient clip也能把two-stage的性能提升上去一定程度。后面很多解讀的文章說one-stage這個結(jié)論不對,因?yàn)镵aiming他們在two-stage上就得到了不亞于用pretrain模型的性能。但是大家可能都忽略了一個不大但是很重要的改動,Mask RCNN之后大家在two-stage的detector里面都普遍使用ROI Align而不是ROI Pooling,我在我們extended版本中對比了兩者,two-stage detector from scratch下ROI Align的確可以幫助提升不少性能。
現(xiàn)在我來好好回答一下上面這個issue,為什么vanilla的Faster RCNN (two-stage detector) without pre-trained network效果不好。除了ROI Pooling可以換成ROI Align來提升一定程度性能外,我覺得更本質(zhì)的一點(diǎn)是batch size太小(通常每張卡上1或2)導(dǎo)致BN收斂不好(ResNet和其他帶有BN的backbone網(wǎng)絡(luò)情況下),fine-tune我們通常fix BN所以不用考慮這個問題,如果是VGGNet這種沒有BN的網(wǎng)絡(luò)為什么效果也不好呢,我的觀點(diǎn)是還是batch size太小的問題,我覺得大家有一個很常見的誤區(qū)是把classification和detection完全分割開來對待,對于training from scratch,我覺得他們完全是相近的,我們可以想象如果ImageNet上用很小的batch size訓(xùn)classification model是不是也沒法收斂得很好。
ScratchDet中提出BN對于train from scratch非常crucial,這點(diǎn)完全沒錯,我也認(rèn)同,他們也在one-stage的detector上取得了非常好的效果,我認(rèn)為原因是one-stage的input相比two-stage是比較小的(300x300或者512x512),每張卡上默認(rèn)的batch size可以設(shè)置得比較大,所以只使用普通的BN就可以收斂的不錯,ScratchDet采用ResNet作為backbone,普通方式實(shí)現(xiàn)的DenseNet比較占用顯存,需要通過一些特殊方式來減緩它 [5],相比而言ResNet就要友好很多,所以ScratchDet可以在單張卡上使用比DSOD更大的batch size,所以結(jié)果好了很多,因?yàn)镈SOD里面也是用了BN的,我后來嘗試了使用24G顯存的顯卡跑更大batch size(double了一下batch size)的DSOD,結(jié)果直接提升了一個多點(diǎn),所以我認(rèn)為one-stage本身可以大batch訓(xùn)練讓它很容易train from scratch。ScratchDet在two-stage上還是沒有one-stage的好,我覺得是因?yàn)閱栴}不在用不用BN這邊,這里BN的作用跟在分類任務(wù)中是很相似的,沒有BN之前AlexNet,VGGNet不是效果也還可以么,同理SSD+VGGNet在完全沒有BN的情況下也能得到不錯的結(jié)果(74點(diǎn)多在PASCAL VOC上)。所以這里正常的BN更多的是錦上添花的作用。
Kaiming他們就總結(jié)得更加深入和本質(zhì):使用Sync BN和Group Norm,從本質(zhì)上看這兩個techniques跟使用普通的BN是不一樣的,他們能很好的解決batch size太小的問題,當(dāng)然直接暴力的使用更大顯存的GPU也是一個可能的解決方法,作用等同于Sync BN,這也是為什么上面我說只要有了其中一個就能比較好的解決from scratch的問題,不管是one-stage和two-stage的detectors,同時這也是為什么Kaiming他們能在two-stage上得到非常strong的結(jié)果。由于detection使用過大的batch size可能會稍微影響性能,所以對于 two-stage detector from scratch使用group norm和其他類似功能的normalization可能是一個比較優(yōu)的解決方法。我在Sync BN剛出來之后也嘗試了一下用在two-stage from scratch的detector上,的確可以提升很多accuracy。
最后總結(jié)一下,one-stage因?yàn)樽陨硖攸c(diǎn)每張卡上的batch size(包括整體的batch size)比較大,所以普通的BN就可以train from scratch,沒有BN也可以(比如SSD+VGGNet,加上DSOD中用到的大batch size,128 vs. 32和更久的training),對于two-stage的模型,單卡和整體batch size都比較小,所以需要引入其他一些技術(shù),包括ROI Align,Group Norm,Sync BN等等,只是16年底的時候并沒有這些方法,所以我們當(dāng)時提出train from scratch需要基于one-stage的detector也是完全可以理解的。DSOD除了提出train from scratch這個問題外,還有其他一些很小但有意思的contribution,包括stem結(jié)構(gòu)對于detection的幫助等等,后面的PeeleNet [6],ScratchDet [2]等也或多或少驗(yàn)證和借鑒了這點(diǎn)。個人覺得Kaiming的rethinking很好的把這個問題給講透徹了,包括training data scale和training epoch數(shù)目對最終performance的影響,但還是要說network structure對于數(shù)據(jù)規(guī)模的需求的確不太一樣,也很重要。
我覺得未來在這個方向可能還可以挖掘的點(diǎn)一個是如何提升from scratch的訓(xùn)練效率(8倍于finetune的訓(xùn)練時長還是太久了),或者大幅度提升檢測性能(通過改變backbone的結(jié)構(gòu)[9],現(xiàn)在已經(jīng)有一些跟NAS結(jié)合的文章了[7, 8])。DSOD當(dāng)時投稿ICCV拿到了三個weak accept,rebuttal之后有個reviewer提升到了oral/poster,當(dāng)時有個reviewer提出想看下如果我們的模型在imagenet上pretrain了之后結(jié)果會怎么樣,他同時也強(qiáng)調(diào)即使這個結(jié)果更高也不會damage我們文章的contribution,我跑了一下然后發(fā)現(xiàn)用了imagenet pretrain之后居然沒有什么提升,雖然由于rebuttal時間有限pretrain的模型比標(biāo)準(zhǔn)的epoch要少,但是我對這個結(jié)果還是非常震驚的,最后這個結(jié)論也被保留在了camera ready版本之中,但當(dāng)時我的確有點(diǎn)擔(dān)心有沒有可能是我實(shí)驗(yàn)弄錯了導(dǎo)致結(jié)論不正確,畢竟在17年初你跟我說不用pretrain的object detection可以跟用了的結(jié)果差不多我是很難相信的,所以這里也要感謝coauthor們對我的信任以及堅(jiān)持要把這個結(jié)論放進(jìn)最后的論文。
我很喜歡當(dāng)時其中一個reviewer給的一句評論:I think this paper is worth publishing at ICCV to open up more discussions on this direction. 如果大家有興趣的話我可以把review意見share一下,當(dāng)時看了還是很受鼓舞的。
好消息!
小白學(xué)視覺知識星球
開始面向外開放啦??????
下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程 在「小白學(xué)視覺」公眾號后臺回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。 下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講 在「小白學(xué)視覺」公眾號后臺回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計(jì)數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。 下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講 在「小白學(xué)視覺」公眾號后臺回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個基于OpenCV實(shí)現(xiàn)20個實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。 交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計(jì)算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

