源碼解析目標(biāo)檢測(cè)的跨界之星DETR(一)嘹叫、概述與模型推斷

Date: 2020/06/27

Author: CW

前言:

閱讀了 DETR 的論文后蓬痒,近期梳理了相關(guān)代碼憨攒,本系列會(huì)結(jié)合源碼對(duì) DETR 進(jìn)行解析世杀,包含模型效果的簡(jiǎn)單演示、訓(xùn)練的 pipeline肝集、backbone瞻坝、編碼、解碼杏瞻、loss的設(shè)計(jì)與計(jì)算所刀、后處理、評(píng)估驗(yàn)證的 pipeline捞挥。CW認(rèn)為浮创,認(rèn)真閱讀完本系列的每篇文后,將 DETR 的實(shí)現(xiàn)理解透徹是OK的砌函,但要真正地吃透斩披,還需要朋友你親自實(shí)踐并且深入思考。

本文作為系列的開篇之作讹俊,就簡(jiǎn)單一些吧垦沉,一上來就是復(fù)雜的源碼分析難免有將客人拒之門外的趕腳。因此仍劈,CW在本文中會(huì)對(duì)這個(gè)模型做個(gè)簡(jiǎn)單的概述厕倍,然后基于官方給出的 notebook demo對(duì)模型推斷部分的代碼進(jìn)行解析(注意,這個(gè)demo中模型的實(shí)現(xiàn)并不是 DETR 真正的實(shí)現(xiàn)方式贩疙,僅是個(gè)簡(jiǎn)化版)讹弯。

DETR: End-to-end Object Detection with Transformers

Code


Outline

I. 概述

II. 模型推斷


概述

DETRDEtection TRansformer, 是 Facebook AI 研究院提出的 CV 模型这溅,主要用于目標(biāo)檢測(cè)组民,也可以用于分割任務(wù)。該模型使用 Transformer 替代了復(fù)雜的目標(biāo)檢測(cè)傳統(tǒng)套路悲靴,比如 two-stage 或 one-stage臭胜、anchor-based 或 anchor-free、nms 后處理等对竣;也沒有使用一些騷里騷氣的技巧庇楞,比如在使用多尺度特征融合榜配、使用一些特殊類型的卷積(如分組卷積否纬、可變性卷積、動(dòng)態(tài)生成卷積等)來抽取特征蛋褥、對(duì)特征圖作不同類型的映射以將分類與回歸任務(wù)解耦临燃、甚至是數(shù)據(jù)增強(qiáng),整個(gè)過程就是使用CNN提取特征后編碼解碼得到預(yù)測(cè)輸出

可以說膜廊,整體工作很solid乏沸,雖然效果未至于 SOTA,但將煉丹者們通常認(rèn)為是屬于 NLP 領(lǐng)域的 Transformer 拿來跨界到 CV 領(lǐng)域使用爪瓜,并且能work蹬跃,這是具有重大意義的,其中的思想也值得我們學(xué)習(xí)铆铆。這種突破傳統(tǒng)與開創(chuàng)時(shí)代的工作往往是深得人心的蝶缀,比如 Faster R-CNN 和 YOLO,你可以看到之后的許多工作都是在它們的基礎(chǔ)上做改進(jìn)的薄货。

概括地說翁都,DETR 將目標(biāo)檢測(cè)任務(wù)看作集合預(yù)測(cè)問題,對(duì)于一張圖片谅猾,固定預(yù)測(cè)一定數(shù)量的物體(原作是100個(gè)柄慰,在代碼中可更改),模型根據(jù)這些物體對(duì)象與圖片中全局上下文的關(guān)系直接并行輸出預(yù)測(cè)集税娜,也就是 Transformer 一次性解碼出圖片中所有物體的預(yù)測(cè)結(jié)果坐搔,這種并行特性使得 DETR 非常高效。

DETR 框架

模型推斷

這個(gè)demo會(huì)基于預(yù)訓(xùn)練權(quán)重實(shí)現(xiàn)一個(gè)DETR的簡(jiǎn)化版巧涧,然后對(duì)一張圖片作預(yù)測(cè)薯蝎,最后展示出預(yù)測(cè)效果。

首先導(dǎo)入需要的相關(guān)庫(kù):

導(dǎo)入相關(guān)庫(kù)

然后谤绳,實(shí)現(xiàn)一個(gè)簡(jiǎn)化版的模型:

模型定義(i) 初始化

模型主要由 backbone占锯、transformer 以及 最后形成預(yù)測(cè)輸出的線性層構(gòu)成,另外缩筛,還需要一個(gè)卷積層將backbone輸出的特征圖維度映射到transformer輸入所需的維度消略。

了解 Transformer 的朋友們應(yīng)該知道,其本身是不了解輸入序列中各部分的位置關(guān)系的瞎抛,因此通常需要加入位置編碼艺演,此處也一樣:

模型定義(i) 初始化

上圖中,行列編碼的第一個(gè)維度都是50桐臊,代表這里默認(rèn)backbone輸出的特征圖尺寸不超過50x50胎撤。

模型的初始化方法就到此結(jié)束了,是那么得絲滑..額不對(duì)断凶,是那么得簡(jiǎn)潔明了伤提,接下來看看模型的前向過程:


模型定義(ii). 前向過程

上圖中的部分是將圖片輸入到backbone提取特征,然后對(duì)輸出特征圖維度進(jìn)行轉(zhuǎn)換认烁,并且構(gòu)造位置編碼張量肿男。這里位置編碼張量的實(shí)現(xiàn)是對(duì)特征圖的行介汹、列分別進(jìn)行編碼后拼接起來,同時(shí)進(jìn)行維度轉(zhuǎn)換以適應(yīng)編碼器的輸入舶沛。

下面就是將以上部分輸入到 Transformer 進(jìn)行編碼與解碼嘹承,最后將解碼的結(jié)果輸入到線性層形成最終的預(yù)測(cè)結(jié)果:


模型定義(ii). 前向過程

注意下,上圖中對(duì) Transformer 的輸出維度順序做了調(diào)整如庭,因此最后得到的h的維度是(batch, 100, hidden_dim)叹卷。

整個(gè)前向過程也就這樣了,是不是感覺讓你擼起代碼來毫無(wú)壓力坪它,嘿嘿豪娜!

下面是對(duì)輸入圖片和輸出bbox的處理:


對(duì)輸入輸出的處理

對(duì)于輸出bbox,先將其由中心點(diǎn)坐標(biāo)和寬高轉(zhuǎn)換為矩形框左上角和右下角坐標(biāo)的形式哟楷,同時(shí)瘤载,由于回歸的是歸一化后的值,因此需要根據(jù)圖像尺寸轉(zhuǎn)換為絕對(duì)坐標(biāo)值卖擅。

現(xiàn)在鸣奔,我們定義一個(gè)方法來封裝整個(gè)推斷過程,從而獲取預(yù)測(cè)結(jié)果:


推斷過程封裝

這里有個(gè)點(diǎn)提一下惩阶,torch1.5版本中挎狸,對(duì)于tensor.max()的返回是torch.return_types.max(values=tensor(xxx), indices=tensor(xxx)),但是torch1.0中断楷,這個(gè)方法的返回是一個(gè)tuple锨匆。

選用COCO數(shù)據(jù)集的類別,總共80類冬筒,但索引是1到90恐锣。

COCO數(shù)據(jù)集類別及用于可視化的顏色參數(shù)

上圖中的COLORS用于畫出bbox的矩形框顏色。

現(xiàn)在我們可以實(shí)例化一個(gè)模型舞痰,由于COCO的類別索引是1到90土榴,因此我們的num_classes參數(shù)需要設(shè)置為91:

實(shí)例化模型與預(yù)訓(xùn)練權(quán)重加載

OK,一切準(zhǔn)備就緒响牛,我們現(xiàn)在來對(duì)一張圖片進(jìn)行檢測(cè):

對(duì)一張圖進(jìn)行檢測(cè)

可以看到玷禽,模型在這張圖中檢測(cè)到了5個(gè)物體,最后我們對(duì)這個(gè)結(jié)果進(jìn)行可視化:


可視化結(jié)果

最終效果如下圖所示:

模型檢測(cè)效果

#最后

CW認(rèn)為呀打,通過本文矢赁,應(yīng)該可以讓大家對(duì) DETR 有個(gè)基本了解,當(dāng)然同時(shí)可能也會(huì)產(chǎn)生出許多不解贬丛,不著急撩银,更多的細(xì)節(jié)實(shí)現(xiàn)與原理會(huì)在后面的篇章中解析,待我醞釀醞釀瘫寝,才香~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載蜒蕾,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者。
  • 序言:七十年代末焕阿,一起剝皮案震驚了整個(gè)濱河市咪啡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暮屡,老刑警劉巖撤摸,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異褒纲,居然都是意外死亡准夷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門莺掠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衫嵌,“玉大人,你說我怎么就攤上這事彻秆⌒ń剩” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵唇兑,是天一觀的道長(zhǎng)酒朵。 經(jīng)常有香客問我,道長(zhǎng)扎附,這世上最難降的妖魔是什么蔫耽? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮留夜,結(jié)果婚禮上匙铡,老公的妹妹穿的比我還像新娘。我一直安慰自己碍粥,他們只是感情好慰枕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著即纲,像睡著了一般具帮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上低斋,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天蜂厅,我揣著相機(jī)與錄音,去河邊找鬼膊畴。 笑死掘猿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的唇跨。 我是一名探鬼主播稠通,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼衬衬,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了改橘?” 一聲冷哼從身側(cè)響起滋尉,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎飞主,沒想到半個(gè)月后狮惜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碌识,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年碾篡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筏餐。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡开泽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出魁瞪,到底是詐尸還是另有隱情眼姐,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布佩番,位于F島的核電站众旗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏趟畏。R本人自食惡果不足惜贡歧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赋秀。 院中可真熱鬧利朵,春花似錦、人聲如沸猎莲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)著洼。三九已至樟遣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間身笤,已是汗流浹背驰唬。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工衅胀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骄恶,地道東北人琉苇。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像娇钱,于是被迫代替她去往敵國(guó)和親伤柄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绊困,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350