<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用中國(guó)特色社會(huì)主義的方式打開 CenterNet

          共 8739字,需瀏覽 18分鐘

           ·

          2020-12-12 23:38

          點(diǎn)擊上方“Jack Cui”,選擇“設(shè)為星標(biāo)

          第一時(shí)間關(guān)注技術(shù)干貨!


          大家好,我是 Jack 。


          CenterNet 想必做過目標(biāo)檢測(cè)的都知道,一個(gè)近期很流行的 anchor-free 目標(biāo)檢測(cè)算法。


          最近,我看到了一個(gè)非常不錯(cuò)的開源項(xiàng)目,作者重構(gòu)了 CenterNet,做了一個(gè)支持多模型蒸餾、支持多框架轉(zhuǎn)換的目標(biāo)檢測(cè)框架 centerX。


          同時(shí)將后處理也做到了網(wǎng)絡(luò)前向當(dāng)中,對(duì)落地非常的友好


          放一個(gè) centerX 多模型蒸餾出來的效果圖,在蒸餾時(shí)沒有用到數(shù)據(jù)集的標(biāo)簽,只用了兩個(gè) teacher 的 model 蒸餾同一個(gè) student 網(wǎng)絡(luò)。


          冰冰鎮(zhèn)樓


          項(xiàng)目地址:

          https://github.com/CPFLAME/centerX


          直接看這位作者(CPFLAME)充滿中國(guó)特色社會(huì)主義的介紹吧!


          1


          前言

          centernet 是我最喜歡的檢測(cè)文章之一,沒有 anchor ,沒有 nms ,結(jié)構(gòu)簡(jiǎn)單,可拓展性強(qiáng),最主要的是:落地極其方便,選一個(gè)簡(jiǎn)單的 backbone ,可以沒有 bug 的轉(zhuǎn)成你想要的模型(caffe,onnx,tensorRT)。并且后處理也極其的方便。

          但是 centernet 原版的代碼我初看時(shí)有點(diǎn)吃力,但也沒有重構(gòu)的想法,過了一些時(shí)日后我找到了 centernet-better 和 centernet-better-plus ,于是把他們的代碼白嫖了過來然后自己完善一下,形成對(duì)我友好的代碼風(fēng)格。(當(dāng)然剽竊最多的其實(shí)是 fast reID 和 detectron2)。

          白嫖的快樂

          由于本人不喜歡寫純技術(shù)方面的博客,也不想寫成一篇純 PR 稿(從本科開始就深惡痛覺寫實(shí)驗(yàn)報(bào)告),更不想讓人覺得讀這篇文章是在學(xué)習(xí),所以本篇文章不太正經(jīng),也沒有捧一踩一的操作,跟別人的宣傳稿不太一樣。

          畢竟代碼寫的不是打打殺殺,而是人情世故,真學(xué)東西還得看其他人的文章,看我的也就圖一樂。

          2


          宣傳部分

          一般來說讀文章的人點(diǎn)進(jìn)來都會(huì)帶著這樣一個(gè)心理,我為什么要用 centerX ,明明我用別的框架用的很順利了,轉(zhuǎn)過來多麻煩你知道嗎,你在教我做事?

          如果你需要用檢測(cè)算法快速的落地,需要一個(gè)速度快并精度尚可的模型,而且可以無坑轉(zhuǎn) caffe,onnx,tensorRT,同時(shí)基本不用寫后處理,那 centerX 會(huì)很適合你。(原本 centernet 的后處理需要額外的 3X3 pooling和 topK 的操作,被作者用一個(gè)極騷操作放到了網(wǎng)絡(luò)里面)。

          如果你想在檢測(cè)的任務(wù)上體會(huì)一下模型蒸餾的快感,在 baseline 上無痛漲點(diǎn),或者找一些 detection 蒸餾的靈感,可以來 centerX 康康。

          如果你同時(shí)只有兩個(gè)單類標(biāo)注的數(shù)據(jù)集,但是你懶得去補(bǔ)全這兩個(gè)數(shù)據(jù)集各自缺失的類別標(biāo)注,你可以嘗試使用 centerX 訓(xùn)練得到一個(gè)可以同時(shí)預(yù)測(cè)兩類標(biāo)注的檢測(cè)器。

          如果你想基于 centernet 做一些學(xué)術(shù)研究,你同樣也可以在 centerX 的 projects 里面重構(gòu)自己的代碼,和 centerX 里面 centernet 的 codebase 并不沖突,可以快速定位 bug。

          如果你是苦逼的學(xué)生或者悲催的工具人,你可以用 centerX 來向上管理你的老師或者領(lǐng)導(dǎo),因?yàn)?centerX 里面的 mAP 點(diǎn)不高,稍微調(diào)一下或者加點(diǎn)東西就可以超越本人的 baseline,到時(shí)候匯報(bào)的時(shí)候可以拍著胸脯說你跑出的東西比作者高了好幾個(gè)點(diǎn),然后你的 KPI 就可以稍微有點(diǎn)保障了。(文章后面會(huì)給幾個(gè)方向怎么跑的比作者更高)

          centerX 的底層框架白嫖自優(yōu)秀檢測(cè)框架 detectron2 ,如果之前有跑過 detectron2 的經(jīng)驗(yàn),相信可以和馬大師的閃電連五鞭一樣,無縫銜接的使用。

          如果沒有 detectron2 的使用經(jīng)驗(yàn),那也沒有關(guān)系,我專門寫了懶人傻瓜式 run.sh ,只需要改改 config 和運(yùn)行指令就可以愉快地跑起來了。

          3


          代碼核心思想

          受到老領(lǐng)導(dǎo)道家思維編程的啟發(fā), centerX 的 trick 里面也貫徹了一些具有中國(guó)特色社會(huì)主義的中心主題思想。

          • 代碼 cv 大法:拿來主義

          • 模型蒸餾:富帶動(dòng)后富

          • 多模型蒸餾,兩個(gè)單類檢測(cè)模型融合成為一個(gè)多類檢測(cè)模型:圣人無常師

          • 共產(chǎn)主義 loss,解決模型對(duì) lr 太過敏感問題:馬克思主義

          • 把后處理放到神經(jīng)網(wǎng)絡(luò)中:團(tuán)結(jié)我們真正的朋友,以攻擊我們的真正的敵人,分清敵我。《毛選》


          4


          基礎(chǔ)實(shí)現(xiàn)

          這個(gè)方面沒有什么好說的,也沒有做到和其他框架的差異化,只是在 detectron2 上對(duì)基礎(chǔ)的 centernet 進(jìn)行了復(fù)現(xiàn)而已,而且大部分代碼都是白嫖自 centernet-better 和 centernet-better-plus ,就直接上在 COCO 上的實(shí)驗(yàn)結(jié)果吧。



          centerX_KD 是用 27.9 的 resnet18 作為學(xué)生網(wǎng)絡(luò), 33.2 的 resnet50 作為老師網(wǎng)絡(luò)蒸餾得到的結(jié)果,詳細(xì)過程在在下面的章節(jié)會(huì)講。


          5


          模型蒸餾

          大嘎好,我是 detection 。我時(shí)常羨慕的看著隔壁村的 classification ,embedding 等玩伴,他們?cè)谡麴s上面都混得風(fēng)生水起,什么 logits 蒸餾,什么 KL 散度,什么 Overhaul of Feature Distillation 。


          每天都有不同的家庭教師來指導(dǎo)他們,憑什么我 detection 的教育資源就很少,我 detection 什么時(shí)候才能站起來!



          造成上述的原因主要是因?yàn)?detection 的范式比較復(fù)雜,并不像隔壁村的classification embedding 等任務(wù),開局一張圖,輸出一個(gè) vector :


          • two stage的網(wǎng)絡(luò)本身由于rpn輸出的不確定性,導(dǎo)致teacher和student的proposal對(duì)齊是個(gè)大問題。

          • 筆者嘗試過在中間層feature上進(jìn)行蒸餾,這樣就可以偷懶不用寫最后的logits蒸餾部分的代碼了,結(jié)果沒有卵用,還是得在logits上蒸餾比較穩(wěn)。

          • 我編不下去了


          我們?cè)賮砘仡^看看centernet的范式,哦,我的上帝,多么簡(jiǎn)單明了的范式:


          • 網(wǎng)絡(luò)輸出三個(gè)頭,一個(gè)預(yù)測(cè)中心點(diǎn),一個(gè)預(yù)測(cè)寬高,一個(gè)預(yù)測(cè)中心點(diǎn)的偏移量

          • 沒有復(fù)雜的正負(fù)樣本采樣,只有物體的中心點(diǎn)是正樣本,其他都是負(fù)樣本


          這讓筆者看到了在detection上安排家庭教師的希望,于是我們仿照了centernet本來的loss的寫法,仿照了一個(gè)蒸餾的loss。具體的實(shí)現(xiàn)可以去code里面看,這里就說一下簡(jiǎn)單的思想。


          • 對(duì)于輸出中心點(diǎn)的head,把teacher和student輸出的head feature map過一個(gè)relu層,把負(fù)數(shù)去掉,然后做一個(gè)mse的loss,就OK了。


          • 對(duì)于輸出寬高和中心點(diǎn)的head,按照原centernet的實(shí)現(xiàn)是只學(xué)習(xí)正樣本,在這里筆者拍腦袋想了一個(gè)實(shí)現(xiàn)方式:我們用teacher輸出中心點(diǎn)的head過了relu之后的feature作為系數(shù),在寬高和中心點(diǎn)的head上所有像素點(diǎn)都做L1 loss后和前面的系數(shù)相乘。


          • 在蒸餾時(shí),三個(gè)head的蒸餾loss差異很大,需要手動(dòng)調(diào)一下各自的loss weight,一般在300次迭代后各個(gè)蒸餾loss在0~3之間會(huì)比較好。


          • 所以在之前我都是300次epoch之后直接停掉,然后根據(jù)當(dāng)前l(fā)oss 預(yù)估一個(gè)loss weight重新開始訓(xùn)練。這個(gè)愚蠢的操作在我拍了另外一次腦袋想出共產(chǎn)主義loss之后得以丟棄。


          • 在模型蒸餾時(shí)我們既可以在有標(biāo)簽的數(shù)據(jù)上聯(lián)合label的loss進(jìn)行訓(xùn)練,也可以直接用老師網(wǎng)絡(luò)的輸出在無標(biāo)簽的數(shù)據(jù)集上蒸餾訓(xùn)練。基于這個(gè)特性我們有很多妙用


          • 當(dāng)在有標(biāo)簽的數(shù)據(jù)上聯(lián)合label的loss進(jìn)行訓(xùn)練時(shí),老師訓(xùn)N個(gè)epoch,學(xué)生訓(xùn)N個(gè)epoch,然后老師教學(xué)生,并保留原本的label loss再訓(xùn)練N個(gè)epoch,這樣學(xué)生的mAP是訓(xùn)出來最高的。


          • 當(dāng)在無標(biāo)簽的數(shù)據(jù)集上蒸餾訓(xùn)練時(shí),我們就跳出了數(shù)據(jù)集的限制,先在有標(biāo)簽的數(shù)據(jù)集上老師訓(xùn)N個(gè)epoch,然后老師在無標(biāo)簽的數(shù)據(jù)集上蒸餾學(xué)生模型訓(xùn)練N個(gè)epoch,可以使得學(xué)生模型的精度比baseline要高,并且泛化性能更好。


          • 之前在centernet的source code上還跑過一個(gè)實(shí)驗(yàn),相同的網(wǎng)絡(luò),自己蒸餾自己也是可以漲點(diǎn)的。在centerX上我忘記加進(jìn)去了。


          • 結(jié)構(gòu)相同的teacher和student可以漲點(diǎn),不一樣結(jié)構(gòu)可能會(huì)掉點(diǎn)。


          我們拉到實(shí)驗(yàn)的部分,上述的瞎比猜想得到驗(yàn)證。


          6


          多模型蒸餾


          看到蒸餾效果還可以,可以在不增加計(jì)算量的情況下無痛漲點(diǎn),筆者高興了好一陣子,直到筆者在實(shí)際項(xiàng)目場(chǎng)景上遇到了一個(gè)尷尬地問題:


          • 我有一個(gè)數(shù)據(jù)集A,里面有物體A的標(biāo)注

          • 我有一個(gè)數(shù)據(jù)集B,里面有物體B的標(biāo)注

          • 現(xiàn)在由于資源有限,只能跑一個(gè)檢測(cè)網(wǎng)絡(luò),我怎么得到可以同時(shí)預(yù)測(cè)物體A和物體B的檢測(cè)器?


          因?yàn)閿?shù)據(jù)集A里面可能會(huì)有大量的未標(biāo)注的B,B里面也會(huì)有大量的未標(biāo)注的A,直接放到一起訓(xùn)練肯定不行,網(wǎng)絡(luò)會(huì)學(xué)傻。



          • 常規(guī)的操作是去數(shù)據(jù)集A里面標(biāo)B,然后去數(shù)據(jù)集B里面標(biāo)A,這樣在加起來的數(shù)據(jù)集上就可以訓(xùn)練了。但是標(biāo)注成本又很貴,這讓灑家如何是好?


          • 稍微騷一點(diǎn)的操作是在A和B上訓(xùn)練兩個(gè)網(wǎng)絡(luò),然后在缺失的標(biāo)注數(shù)據(jù)集上預(yù)測(cè)偽標(biāo)簽,然后在補(bǔ)全的數(shù)據(jù)集上訓(xùn)練


          • novelty更高的操作是在沒有標(biāo)注的數(shù)據(jù)集上屏蔽網(wǎng)絡(luò)對(duì)應(yīng)的輸出,(該操作僅在C個(gè)二分類輸出的檢測(cè)器下可用)


          • 有沒有一種方法,也不用標(biāo)數(shù)據(jù),也不用像偽標(biāo)簽?zāi)敲创植冢苯犹善剑瑫r(shí)novelty也比較高,比較好跟領(lǐng)導(dǎo)說KPI的一個(gè)方法?


          在筆者再次拍了拍腦袋后,發(fā)揮了我最擅長(zhǎng)的技能:白嫖。想到了這樣一個(gè)方案:


          • 我先在數(shù)據(jù)A上訓(xùn)練個(gè)老師模型A,然后在數(shù)據(jù)B上訓(xùn)練老師模型B,然后我把老師模型A和B的功力全部傳給學(xué)生模型C,豈不美哉?


          • 我們?cè)賮砜纯碿enternet的范式,我再次吹爆這個(gè)作者的工作,不僅簡(jiǎn)單易懂的支持了centerPose,centertrack,center3Ddetection,還可以輸出可旋轉(zhuǎn)的物體檢測(cè)。


          • 無獨(dú)有偶,可能是為了方便復(fù)用focal loss,作者在分類時(shí)使用了C個(gè)二分類的分類器,而不是softmax分類,這給了筆者白嫖的靈感:既然是C個(gè)二分類的分類器,那么對(duì)于每一個(gè)類別,那么我們可以給學(xué)生網(wǎng)絡(luò)分別找一個(gè)家庭教師,這樣就可以擁有多倍的快樂。


          • 理論上來說可以有很多個(gè)老師,并且每個(gè)老師教的類別都可以是多個(gè)。


          那么我們的多模型蒸餾就可以用現(xiàn)有的方案拼湊起來了。這相當(dāng)于我同時(shí)白嫖了自己的代碼,以及不完整標(biāo)注的數(shù)據(jù)集,白嫖是真的讓人快樂啊。和上述提到的操作進(jìn)行一番比♂較,果然用了的多模型蒸餾的效果要好一些。又一個(gè)瞎比猜想被驗(yàn)證了。


          筆者分別在人體和車,以及人體和人臉上做了實(shí)驗(yàn)。


          數(shù)據(jù)集為coco_car,crowd_human,widerface。



          7


          共產(chǎn)主義 loss


          筆者在訓(xùn)練centerX時(shí),出現(xiàn)過這樣一個(gè)問題,設(shè)置合適的lr時(shí),訓(xùn)練的一切都那么自然又和諧,而當(dāng)我lr設(shè)置大了以后,有時(shí)候會(huì)訓(xùn)到一半,網(wǎng)絡(luò)直接loss飛漲然后mAP歸零又重新開始往上爬,導(dǎo)致最后模型的mAP很拉胯。對(duì)于這種情況脾氣暴躁的我直接爆了句粗口。



          罵完了爽歸爽,問題還是要解決的,為了解決這個(gè)問題,筆者首先想到筆者的代碼是不是哪里有bug,但是找了半天都沒找到,筆者還嘗試了如下的方式:


          • 加入clip gradients,不work


          • 自己加了個(gè)skip loss,當(dāng)本次iter的loss是上次loss的k=1.1倍以上時(shí),這次loss全部置0,不更新網(wǎng)絡(luò),不work


          • 換lr_scheduler, 換optimalizer,不work

          看來這個(gè)bug油鹽不進(jìn),軟硬不吃。訓(xùn)練期間總會(huì)出現(xiàn)某個(gè)時(shí)間段loss突然增大,然后網(wǎng)絡(luò)全部從頭開始訓(xùn)練的情況。

          這讓我想到了內(nèi)卷加速,資本主義泡沫破裂,經(jīng)濟(jì)大危機(jī)后一切推倒重來。這個(gè)時(shí)候才想起共產(chǎn)主義的好,毛主席真是永遠(yuǎn)滴神。

          既然如此,咱們一不做二不休,直接把蛋糕給loss們分好,讓共產(chǎn)主義無產(chǎn)階級(jí)的光照耀到它們身上,筆者一氣之下把loss的大小給各個(gè)兔崽子head們給規(guī)定死,具體操作如下:

          • 給每個(gè)loss設(shè)置一個(gè)可變化的loss weight,讓loss一直保持在一個(gè)固定的值。


          • 考慮到固定的loss值比較硬核,筆者把lr設(shè)置為cosine的lr,讓lr比較平滑的下降,來模擬正常情況下網(wǎng)絡(luò)學(xué)習(xí)到的梯度分布。


          • 其實(shí)本loss可以改名叫adaptive loss,但是為了紀(jì)念這次的氣急敗壞和思維升華,筆者依然任性的把它稱之為共產(chǎn)主義loss。


          接下來就是實(shí)驗(yàn)部分看看管不管用了,于是筆者嘗試了一下之前崩潰的lr,得益于共產(chǎn)主義的好處,換了幾個(gè)數(shù)據(jù)集跑實(shí)驗(yàn)都沒有出現(xiàn)mAP拉胯的情況了,期間有幾次出現(xiàn)了loss飛漲的情況,但是在共產(chǎn)主義loss強(qiáng)大的調(diào)控能力之下迅速恢復(fù)到正常狀態(tài),看來社會(huì)主義確實(shí)優(yōu)越。同時(shí)筆者也嘗試了用合適的lr,跑baseline和共產(chǎn)主義loss的實(shí)驗(yàn),發(fā)現(xiàn)兩者在±0.3的mAP左右,影響不大。


          筆者又為此高興了好一段時(shí)間,并且發(fā)現(xiàn)了共產(chǎn)主義loss可以用在蒸餾當(dāng)中,并且表現(xiàn)也比較穩(wěn)定,在±0.2個(gè)mAP左右。這下蒸餾可以end2end訓(xùn)練了,再也不用人眼去看loss、算loss weight、停掉從頭訓(xùn)了。

          8


          模型加速

          這個(gè)部分的代碼都在code的projects/speedup中,注意網(wǎng)絡(luò)中不能包含DCN,不然轉(zhuǎn)碼很難。

          centerX中提供了轉(zhuǎn)caffe,轉(zhuǎn)onnx的代碼,onnx轉(zhuǎn)tensorRT只要裝好環(huán)境后一行指令就可以轉(zhuǎn)換了,筆者還提供了轉(zhuǎn)換后不同框架的前向代碼。 

          其中筆者還找到了centernet的tensorRT前向版本(后續(xù)筆者把它稱為centerRT),在里面用cuda寫了centernet的后處理(包括3X3 max pool和topK后處理)。筆者在轉(zhuǎn)完了tensorRT之后想直接把centerRT白嫖過來,結(jié)果發(fā)現(xiàn)還是有些麻煩,centerRT有點(diǎn)像是為了centernet原始實(shí)現(xiàn)定制化去寫的。這就有了以下的問題。

          • 不僅是tensorRT版本,所有的框架上我都不想寫麻煩的后處理,我想把麻煩的操作都寫到網(wǎng)絡(luò)里面去,這樣我就什么都不用干了,直接躺平


          • 在centernet cls head的輸出后面再加一層3X3的max pooling,可以減少一部分后處理的代碼


          • 有沒有辦法使得最后中心點(diǎn)head的輸出滿足以下條件:1.除了中心點(diǎn)之外,其他的像素值全是0,(相當(dāng)于已經(jīng)做過了pseudo nms);2.后處理只需要在這個(gè)feature上遍歷>thresh的像素點(diǎn)位置就可以了。


          • 如果x1表示centernet的中心點(diǎn)輸出,x2表示經(jīng)過了3X3 maxpool之后的輸出,那么在python里面其實(shí)只需要寫上一行代碼就得到上述的條件:y = x1[x1==x2]。但是筆者在使用轉(zhuǎn)換時(shí),onnx不支持==的操作。得另謀他路。


          這次筆者拍碎了腦袋都沒想到怎么白嫖,于是在獻(xiàn)祭了幾根珍貴的頭發(fā)之后,強(qiáng)行發(fā)動(dòng)了甩鍋技能,把后處理操作都扔給神經(jīng)網(wǎng)絡(luò),具體操作如下:

          • x2是x1的max pool,我們需要的是x1[x1==x2]的feature map


          • 那么我們只需要得到x1==x2,也就是一張二值化的mask,然后用mask*x1就可以了。


          • 由于x2是x1的max pool,所以x1-x2 <= 0, 我們?cè)趚1-x2上加一個(gè)很小的數(shù),使得等于0的像素點(diǎn)變成正數(shù),小于0的像素點(diǎn)仍然為負(fù)數(shù)。然后在加個(gè)relu,乘以一個(gè)系數(shù)使得正數(shù)縮放到1,就可以得到我們想要的東西了。


          代碼如下:


          def centerX_forward(self, x):    x = self.normalizer(x / 255.)    y = self._forward(x)    fmap_max = nn.MaxPool2d(kernel_size=3, stride=1, padding=1)(y['cls'])    keep = (y['cls'] - fmap_max).float() + 1e-9    keep = nn.ReLU()(keep)    keep = keep * 1e9    result = y['cls'] * keep    ret = [result,y['reg'],y['wh']]  ## change dict to list    return ret


          onnx中可視化如下:


          然后我們可以來康康經(jīng)歷了騷操作之后的后處理代碼,極其的簡(jiǎn)單,相信也可以在任何的框架上快速的實(shí)現(xiàn):

          def postprocess(self, result, ratios, thresh=0.3):    clses, regs, whs = result    # clses: (b,c,h,w)    # regs:  (b,2,h,w)    bboxes = []
          for cls, reg, wh, ratio in zip(clses, regs, whs, ratios): index = np.where(cls >= thresh) ratio = 4 / ratio score = np.array(cls[index]) cat = np.array(index[0]) ctx, cty = index[-1], index[-2] w, h = wh[0, cty, ctx], wh[1, cty, ctx] off_x, off_y = reg[0, cty, ctx], reg[1, cty, ctx] ctx = np.array(ctx) + np.array(off_x) cty = np.array(cty) + np.array(off_y) x1, x2 = ctx - np.array(w) / 2, ctx + np.array(w) / 2 y1, y2 = cty - np.array(h) / 2, cty + np.array(h) / 2 x1, y1, x2, y2 = x1 * ratio, y1 * ratio, x2 * ratio, y2 * ratio bbox = np.stack((cat, score, x1, y1, x2, y2), axis=1).tolist() bbox = sorted(bbox, key=lambda x: x[1], reverse=True) bboxes.append(bbox)
          return bboxes

          值得注意的是上述騷操作在轉(zhuǎn)caffe的時(shí)候會(huì)報(bào)錯(cuò),所以不能加。如果非要添加上去,得在caffe的prototxt中自行添加scale層,elementwise層,relu層,這個(gè)筆者沒有實(shí)現(xiàn),大家感興趣可以自行添加。

          9


          優(yōu)化方向

          考慮到大家需要向上管理,筆者寫幾個(gè)可以漲點(diǎn)的東西。

          • 在centernet作者本來的issue里面提到,centernet很依賴于網(wǎng)絡(luò)最后一層的特征,所以加上dlaup會(huì)漲點(diǎn)特別明顯,但是由于feature的channel太多,會(huì)有一些時(shí)間損耗。筆者實(shí)測(cè)在某個(gè)backbone+deconv上加上dlaup之后,batchsize=8時(shí)間由32ms->44ms左右,有一些代價(jià),所以筆者沒有加。后續(xù)應(yīng)該可以把dlaup里面的卷積全部改為depthwise的,找到一個(gè)速度和精度的平衡


          • 想想辦法看看能不能把Generalized Focal Loss,Giou loss等等剽竊過來,稍微改一下加到centernet里面


          • 調(diào)參,lr,lossweight,或者共產(chǎn)主義loss里面各個(gè)固定loss值,不同數(shù)據(jù)集上不同backbone的參數(shù)都可以優(yōu)化


          • 用一個(gè)牛逼的pretrain model


          • 把隔壁fast reid的自動(dòng)超參搜索白嫖過來


          除了以上的在精度方面的優(yōu)化之外,其實(shí)筆者還想到很多可以做的東西,咱們不在精度這個(gè)地方跟別人卷,因?yàn)榫聿贿^別人,檢測(cè)這個(gè)領(lǐng)域真是神仙打架,打不過打不過。我們想著把蛋糕做大,大家一起有肉吃


          • 蒸餾不僅適用于centernet,筆者再提一個(gè)瞎比猜想:所有的one-stage detector和anchor-free的檢測(cè)器都可以蒸餾,而且最后的檢測(cè)頭的cls層全部改為C個(gè)2分類以后,應(yīng)該也可以實(shí)現(xiàn)多模型蒸餾


          • centerPose,其實(shí)本來作者的centerpose就已經(jīng)做到一個(gè)網(wǎng)絡(luò)里面去了,但是筆者覺得可以把白嫖發(fā)揮到極致,把只在pose數(shù)據(jù)集上訓(xùn)過的simplebaseline網(wǎng)絡(luò)蒸餾到centernet里面去,這樣的好處是:1.檢測(cè)的標(biāo)注和pose的標(biāo)注可以分開,作為兩個(gè)單獨(dú)的數(shù)據(jù)集去標(biāo)注,這樣的話可以白嫖的數(shù)據(jù)集就更多了。2:并且做到一個(gè)網(wǎng)絡(luò)里面速度會(huì)更快。


          • centerPoint,直接輸出矩形框四個(gè)角點(diǎn)相對(duì)于中心點(diǎn)的偏移量,而不是矩形框的寬高,這樣的話相當(dāng)于檢測(cè)的輸出是個(gè)任意四邊形,好處為:1.我們?cè)谟?xùn)練的時(shí)候可以加入任何旋轉(zhuǎn)的數(shù)據(jù)增強(qiáng)而不用擔(dān)心gt標(biāo)注框變大的問題,同時(shí)說不定我們用已有的檢測(cè)數(shù)據(jù)集+旋轉(zhuǎn)數(shù)據(jù)增強(qiáng)訓(xùn)練出來的網(wǎng)絡(luò)就具備了預(yù)測(cè)旋轉(zhuǎn)物體的能力。2.這個(gè)網(wǎng)絡(luò)在檢測(cè)車牌,或者身份證以及發(fā)票等具有天然的優(yōu)勢(shì),直接預(yù)測(cè)四個(gè)角點(diǎn),不用做任何的仿射變換,也不用換成笨重的分割網(wǎng)絡(luò)了。

          10


          結(jié)語(yǔ)

          其實(shí)有太多的東西想加到 centerX 里面去了,里面有很多很好玩的以及非常具有實(shí)用價(jià)值的東西都可以去做,但是個(gè)人精力有限,而且剛開始做 centerX 完全是基于興趣愛好去做的,本人也只是渣碩,無法 full time 撲到這個(gè)東西上面去,所以上述的優(yōu)化方向看看在我有生之年能不能做出來,做不出來給大家提供一個(gè)可行性思路也是極好的。


          非常感謝廖星宇,何凌霄對(duì) centerX 代碼,以及發(fā)展方向上的貢獻(xiàn),感謝郭聰,于萬(wàn)金,蔣煜襄,張建浩等同學(xué)對(duì) centerX 加速模塊的采坑指導(dǎo)。

          本文已由原作者授權(quán),不得擅自二次轉(zhuǎn)載

          https://zhuanlan.zhihu.com/p/323814368




          以上,就是這位作者(CPFLAME)的全部關(guān)于目標(biāo)檢測(cè)框架 centerX 的介紹。

          感興趣的,記得去看看:
          https://github.com/CPFLAME/centerX

          我是 Jack ,我們下期見。

          ·················END·················



          推薦閱讀

          ?? ?帶你「周游世界」的 MODNet 算法?? ?2020年的最后一個(gè)月????「修煉開始」一文帶你入門深度學(xué)習(xí)?? ?「完美復(fù)刻」的人物肖像畫生成?? ?為藝術(shù)而生的驚艷算法



          瀏覽 24
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  激情丁香五月天 | 日韩在线视频网站 | 日韩欧美一级黄色电影 | 欧美三级片免费网站 | avavttt |