<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>

          centerX: 用中國(guó)特色社會(huì)主義的方式打開(kāi)centernet

          共 9269字,需瀏覽 19分鐘

           ·

          2020-12-07 18:30

          ↑ 點(diǎn)擊藍(lán)字?關(guān)注極市平臺(tái)

          作者丨CPFLAME@知乎
          來(lái)源丨h(huán)ttps://zhuanlan.zhihu.com/p/323814368
          編輯丨極市平臺(tái)

          極市導(dǎo)讀

          ?

          作者結(jié)合表情包拋開(kāi)傳統(tǒng)PR稿的正經(jīng),用幽默風(fēng)趣的語(yǔ)言闡述了自己重構(gòu)的centernet的代碼,采用中國(guó)特色社會(huì)主義的核心思想去解釋centerX的trick。centerX總共分為五個(gè)模塊講述,給大家提供了一個(gè)可行性的思路。?>>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺(jué)的最前沿

          太長(zhǎng)不看版

          筆者重構(gòu)了一版centernet(objects as points)的代碼,并加入了蒸餾,多模型蒸餾,轉(zhuǎn)caffe,轉(zhuǎn)onnx,轉(zhuǎn)tensorRT,把后處理也做到了網(wǎng)絡(luò)前向當(dāng)中,對(duì)落地非常的友好。

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

          ??????冰冰鎮(zhèn)樓


          不感興趣的童鞋可以收藏一下筆者的表情包,如果覺(jué)得表情包好玩,跪求去github點(diǎn)贊。

          代碼地址:https://github.com/CPFLAME/centerX/github.com

          前言

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

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

          白嫖的快樂(lè)??????

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

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

          宣傳部分

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

          • 如果你需要用檢測(cè)算法快速的落地,需要一個(gè)速度快并精度尚可的模型,而且可以無(wú)坑轉(zhuǎn)caffe,onnx,tensorRT,同時(shí)基本不用寫后處理,那centerX會(huì)很適合你。(原本centernet的后處理需要額外的3X3 pooling和topK的操作,被作者用一個(gè)極騷操作放到了網(wǎng)絡(luò)里面)
          • 如果你想在檢測(cè)的任務(wù)上體會(huì)一下模型蒸餾的快感,在baseline上無(wú)痛漲點(diǎn),或者找一些detection蒸餾的靈感,可以來(lái)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ái)向上管理你的老師或者領(lǐng)導(dǎo),因?yàn)閏enterX里面的mAP點(diǎn)不高,稍微調(diào)一下或者加點(diǎn)東西就可以超越本人的baseline,到時(shí)候匯報(bào)的時(shí)候可以拍著胸脯說(shuō)你跑出的東西比作者高了好幾個(gè)點(diǎn),然后你的KPI就可以稍微有點(diǎn)保障了。(文章后面會(huì)給幾個(gè)方向怎么跑的比作者更高)
          • centerX的底層框架白嫖自優(yōu)秀檢測(cè)框架detectron2,如果之前有跑過(guò)detectron2的經(jīng)驗(yàn),相信可以和馬大師的閃電連五鞭一樣,無(wú)縫銜接的使用。
          • 如果沒(méi)有detectron2的使用經(jīng)驗(yàn),那也沒(méi)有關(guān)系,我專門寫了懶人傻瓜式run.sh,只需要改改config和運(yùn)行指令就可以愉快地跑起來(lái)了。
          • 如果上述的理由都沒(méi)有打動(dòng)你,那么如果我用這篇文章把你逗樂(lè)了,懇求去github給個(gè)star吧。

          代碼核心思想

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

          • 代碼cv大法————拿來(lái)主義
          • 模型蒸餾————先富帶動(dòng)后富
          • 多模型蒸餾,兩個(gè)單類檢測(cè)模型融合成為一個(gè)多類檢測(cè)模型————圣人無(wú)常師
          • 共產(chǎn)主義loss,解決模型對(duì)lr太過(guò)敏感問(wèn)題————馬克思主義
          • 把后處理放到神經(jīng)網(wǎng)絡(luò)中————團(tuán)結(jié)我們真正的朋友,以攻擊我們的真正的敵人,分清敵我。《毛選》

          centerX各個(gè)模塊

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

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

          Backbone為resnet50

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

          Backbone為resnet18

          模型蒸餾

          大嘎好,我是detection。我時(shí)常羨慕的看著隔壁村的classification,embedding等玩伴,他們?cè)谡麴s上面都混得風(fēng)生水起,什么logits蒸餾,什么KL散度,什么Overhaul of Feature Distillation。每天都有不同的家庭教師來(lái)指導(dǎo)他們,憑什么我detection的教育資源就很少,我detection什么時(shí)候才能站起來(lái)!

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

          • 1.two stage的網(wǎng)絡(luò)本身由于rpn輸出的不確定性,導(dǎo)致teacher和student的proposal對(duì)齊是個(gè)大問(wèn)題。
          • 2.筆者嘗試過(guò)在中間層feature上進(jìn)行蒸餾,這樣就可以偷懶不用寫最后的logits蒸餾部分的代碼了,結(jié)果沒(méi)有卵用,還是得在logits上蒸餾比較穩(wěn)。
          • 3.我編不下去了


          我們?cè)賮?lái)回頭看看centernet的范式,哦,我的上帝,多么簡(jiǎn)單明了的范式:

          • 1.網(wǎng)絡(luò)輸出三個(gè)頭,一個(gè)預(yù)測(cè)中心點(diǎn),一個(gè)預(yù)測(cè)寬高,一個(gè)預(yù)測(cè)中心點(diǎn)的偏移量
          • 2.沒(méi)有復(fù)雜的正負(fù)樣本采樣,只有物體的中心點(diǎn)是正樣本,其他都是負(fù)樣本


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

          • 1.對(duì)于輸出中心點(diǎn)的head,把teacher和student輸出的head feature map過(guò)一個(gè)relu層,把負(fù)數(shù)去掉,然后做一個(gè)mse的loss,就OK了。
          • 2.對(duì)于輸出寬高和中心點(diǎn)的head,按照原centernet的實(shí)現(xiàn)是只學(xué)習(xí)正樣本,在這里筆者拍腦袋想了一個(gè)實(shí)現(xiàn)方式:我們用teacher輸出中心點(diǎn)的head過(guò)了relu之后的feature作為系數(shù),在寬高和中心點(diǎn)的head上所有像素點(diǎn)都做L1 loss后和前面的系數(shù)相乘。
          • 3.在蒸餾時(shí),三個(gè)head的蒸餾loss差異很大,需要手動(dòng)調(diào)一下各自的loss weight,一般在300次迭代后各個(gè)蒸餾loss在0~3之間會(huì)比較好。
          • 4.所以在之前我都是300次epoch之后直接停掉,然后根據(jù)當(dāng)前l(fā)oss 預(yù)估一個(gè)loss weight重新開(kāi)始訓(xùn)練。這個(gè)愚蠢的操作在我拍了另外一次腦袋想出共產(chǎn)主義loss之后得以丟棄。
          • 5.在模型蒸餾時(shí)我們既可以在有標(biāo)簽的數(shù)據(jù)上聯(lián)合label的loss進(jìn)行訓(xùn)練,也可以直接用老師網(wǎng)絡(luò)的輸出在無(wú)標(biāo)簽的數(shù)據(jù)集上蒸餾訓(xùn)練。基于這個(gè)特性我們有很多妙用
          • 6.當(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)出來(lái)最高的。
          • 7.當(dāng)在無(wú)標(biāo)簽的數(shù)據(jù)集上蒸餾訓(xùn)練時(shí),我們就跳出了數(shù)據(jù)集的限制,先在有標(biāo)簽的數(shù)據(jù)集上老師訓(xùn)N個(gè)epoch,然后老師在無(wú)標(biāo)簽的數(shù)據(jù)集上蒸餾學(xué)生模型訓(xùn)練N個(gè)epoch,可以使得學(xué)生模型的精度比baseline要高,并且泛化性能更好。
          • 8.之前在centernet的source code上還跑過(guò)一個(gè)實(shí)驗(yàn),相同的網(wǎng)絡(luò),自己蒸餾自己也是可以漲點(diǎn)的。在centerX上我忘記加進(jìn)去了。


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

          多模型蒸餾

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

          • 我有一個(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,這樣在加起來(lái)的數(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更高的操作是在沒(méi)有標(biāo)注的數(shù)據(jù)集上屏蔽網(wǎng)絡(luò)對(duì)應(yīng)的輸出,(該操作僅在C個(gè)二分類輸出的檢測(cè)器下可用)
          • 有沒(méi)有一種方法,也不用標(biāo)數(shù)據(jù),也不用像偽標(biāo)簽?zāi)敲创植冢苯犹善剑瑫r(shí)novelty也比較高,比較好跟領(lǐng)導(dǎo)說(shuō)KPI的一個(gè)方法?


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

          • 我先在數(shù)據(jù)A上訓(xùn)練個(gè)老師模型A,然后在數(shù)據(jù)B上訓(xùn)練老師模型B,然后我把老師模型A和B的功力全部傳給學(xué)生模型C,豈不美哉?
          • 我們?cè)賮?lái)看看centernet的范式,我再次吹爆這個(gè)作者的工作,不僅簡(jiǎn)單易懂的支持了centerPose,centertrack,center3Ddetection,還可以輸出可旋轉(zhuǎn)的物體檢測(cè)。
          • 無(wú)獨(dú)有偶,可能是為了方便復(fù)用focal loss,作者在分類時(shí)使用了C個(gè)二分類的分類器,而不是softmax分類,這給了筆者白嫖的靈感:既然是C個(gè)二分類的分類器,那么對(duì)于每一個(gè)類別,那么我們可以給學(xué)生網(wǎng)絡(luò)分別找一個(gè)家庭教師,這樣就可以擁有多倍的快樂(lè)。
          • 理論上來(lái)說(shuō)可以有很多個(gè)老師,并且每個(gè)老師教的類別都可以是多個(gè)。


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

          筆者分別在人體和車,以及人體和人臉上做了實(shí)驗(yàn)。數(shù)據(jù)集為coco_car,crowd_human,widerface.

          共產(chǎn)主義loss

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

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

          • 加入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

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

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

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

          • 給每個(gè)loss設(shè)置一個(gè)可變化的loss weight,讓loss一直保持在一個(gè)固定的值。
          • 考慮到固定的loss值比較硬核,筆者把lr設(shè)置為cosine的lr,讓lr比較平滑的下降,來(lái)模擬正常情況下網(wǎng)絡(luò)學(xué)習(xí)到的梯度分布。
          • 其實(shí)本loss可以改名叫adaptive loss,但是為了紀(jì)念這次的氣急敗壞和思維升華,筆者依然任性的把它稱之為共產(chǎn)主義loss。

          接下來(lái)就是實(shí)驗(yàn)部分看看管不管用了,于是筆者嘗試了一下之前崩潰的lr,得益于共產(chǎn)主義的好處,換了幾個(gè)數(shù)據(jù)集跑實(shí)驗(yàn)都沒(méi)有出現(xiàn)mAP拉胯的情況了,期間有幾次出現(xiàn)了loss飛漲的情況,但是在共產(chǎn)主義loss強(qiáng)大的調(diào)控能力之下迅速恢復(fù)到正常狀態(tài),看來(lá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)了。

          模型加速

          這個(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白嫖過(guò)來(lái),結(jié)果發(fā)現(xiàn)還是有些麻煩,centerRT有點(diǎn)像是為了centernet原始實(shí)現(xiàn)定制化去寫的。這就有了以下的問(wèn)題

          • 不僅是tensorRT版本,所有的框架上我都不想寫麻煩的后處理,我想把麻煩的操作都寫到網(wǎng)絡(luò)里面去,這樣我就什么都不用干了,直接躺平
          • 在centernet cls head的輸出后面再加一層3X3的max pooling,可以減少一部分后處理的代碼
          • 有沒(méi)有辦法使得最后中心點(diǎn)head的輸出滿足以下條件:1.除了中心點(diǎn)之外,其他的像素值全是0,(相當(dāng)于已經(jīng)做過(guò)了pseudo nms);2.后處理只需要在這個(gè)feature上遍歷>thresh的像素點(diǎn)位置就可以了。
          • 如果x1表示centernet的中心點(diǎn)輸出,x2表示經(jīng)過(guò)了3X3 maxpool之后的輸出,那么在python里面其實(shí)只需要寫上一行代碼就得到上述的條件:y = x1[x1==x2]。但是筆者在使用轉(zhuǎn)換時(shí),onnx不支持==的操作。得另謀他路。

          這次筆者拍碎了腦袋都沒(méi)想到怎么白嫖,于是在獻(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中可視化如下:

          然后我們可以來(lái)康康經(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è)筆者沒(méi)有實(shí)現(xiàn),大家感興趣可以自行添加。

          優(yōu)化方向

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

          • 在centernet作者本來(lái)的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à),所以筆者沒(méi)有加。后續(xù)應(yīng)該可以把dlaup里面的卷積全部改為depthwise的,找到一個(gè)速度和精度的平衡
          • 想想辦法看看能不能把Generalized Focal Loss,Giou loss等等剽竊過(guò)來(lái),稍微改一下加到centernet里面
          • 調(diào)參,lr,lossweight,或者共產(chǎn)主義loss里面各個(gè)固定loss值,不同數(shù)據(jù)集上不同backbone的參數(shù)都可以優(yōu)化
          • 用一個(gè)牛逼的pretrain model
          • 把隔壁fast reid的自動(dòng)超參搜索白嫖過(guò)來(lái)

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

          • 蒸餾不僅適用于centernet,筆者再提一個(gè)瞎比猜想:所有的one-stage detector和anchor-free的檢測(cè)器都可以蒸餾,而且最后的檢測(cè)頭的cls層全部改為C個(gè)2分類以后,應(yīng)該也可以實(shí)現(xiàn)多模型蒸餾
          • centerPose,其實(shí)本來(lái)作者的centerpose就已經(jīng)做到一個(gè)網(wǎng)絡(luò)里面去了,但是筆者覺(jué)得可以把白嫖發(fā)揮到極致,把只在pose數(shù)據(jù)集上訓(xùn)過(guò)的simplebaseline網(wǎng)絡(luò)蒸餾到centernet里面去,這樣的好處是:1.檢測(cè)的標(biāo)注和pose的標(biāo)注可以分開(kāi),作為兩個(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)注框變大的問(wèn)題,同時(shí)說(shuō)不定我們用已有的檢測(cè)數(shù)據(jù)集+旋轉(zhuǎn)數(shù)據(jù)增強(qiáng)訓(xùn)練出來(lái)的網(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ò)了。

          結(jié)語(yǔ)

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

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

          再放一遍自己的github

          https://github.com/CPFLAME/centerXgithub.com

          以及感謝如下杰出的工作

          xingyizhou/CenterNetgithub.comfacebookresearch/detectron2github.com
          https://github.com/FateScript/CenterNet-better
          lbin/CenterNet-better-plus
          JDAI-CV/fast-reid
          https://github.com/daquexian/onnx-simplifier
          https://github.com/CaoWGG/TensorRT-CenterNet


          推薦閱讀



          添加極市小助手微信(ID : cvmart2),備注:姓名-學(xué)校/公司-研究方向-城市(如:小極-北大-目標(biāo)檢測(cè)-深圳),即可申請(qǐng)加入極市目標(biāo)檢測(cè)/圖像分割/工業(yè)檢測(cè)/人臉/醫(yī)學(xué)影像/3D/SLAM/自動(dòng)駕駛/超分辨率/姿態(tài)估計(jì)/ReID/GAN/圖像增強(qiáng)/OCR/視頻理解等技術(shù)交流群:月大咖直播分享、真實(shí)項(xiàng)目需求對(duì)接、求職內(nèi)推、算法競(jìng)賽、干貨資訊匯總、與?10000+來(lái)自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺(jué)開(kāi)發(fā)者互動(dòng)交流~

          △長(zhǎng)按添加極市小助手

          △長(zhǎng)按關(guān)注極市平臺(tái),獲取最新CV干貨

          覺(jué)得有用麻煩給個(gè)在看啦~??
          瀏覽 69
          點(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>
                  电影一级片免费官网 | 日韩欧美在线资源 | 123操逼电影网 | 一区二区三区高清无码在线 | 亚洲自拍在线观看 |