論文:Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection
代碼:https://github.com/IDEA-Research/GroundingDINO
出處:清華、IDEA
時(shí)間:2023.03.20
貢獻(xiàn):
- 本文提出了一種 open-set 的目標(biāo)檢測器,Grounding DINO,將 Transformer based 檢測器 DINO 和 grounded pre-training 結(jié)合起來,能夠輸出 prompt 中提到的目標(biāo)框,或者輸出 prompt 的 referring expressions 的目標(biāo)框
- 實(shí)現(xiàn)的方法:將 language 引入閉集目標(biāo)檢測中,來對開集的概念進(jìn)行擴(kuò)展
- 如何引入:將閉集目標(biāo)檢測分為三個(gè)階段:
- feature enhancer
- language-guided query selection
- cross-modality decoder for cross-modality fusion
- 之前的工作都是在 novel categories 上測評開集目標(biāo)檢測,本文提出在文本 reffering 的目標(biāo)上也進(jìn)行測試
- 之前的工作對語言特征和圖像特征的融合不夠完全,GLIP 就只在特征層面進(jìn)行了融合
- 在 COCO 上 zero-shot 達(dá)到了 52.5 AP,fine-tuning 之后達(dá)到了 63.0 AP
作者視頻講解
bilibili
模型設(shè)計(jì)三個(gè)重點(diǎn):
- 第一:基于強(qiáng)勁的目標(biāo)檢測器 DINO
- 第二:基于閉集檢測的模型結(jié)構(gòu),但 text 和 image 要盡可能多的融合,來學(xué)習(xí)更好的信息
- 第三:模型訓(xùn)練時(shí)不同類別之間不做 attention,能加速模型訓(xùn)練
ref:只輸出一個(gè)物體
grounding 任務(wù):輸出所有提到的物體
GLIP 的方案很天才:
CLIP-based 和 Grounding 建模方式的區(qū)別:
- CLIP:把每個(gè)類別當(dāng)成一句話來做,處理的是句子級(jí)別的 feature
- Grounding:把所有類別拼成一句話,送入 BERT ,提取每個(gè) 單詞的 feature,是單詞級(jí)別的特征,特征粒度不同
Grounding 好在哪里:可以使用更多的 grounding data
- 把檢測數(shù)據(jù)轉(zhuǎn)換為 grounding 數(shù)據(jù),而且不需要做特殊的處理(如類別名稱處理什么的)
- 還可以使用預(yù)訓(xùn)練的 grounding 模型來提取 image-text pairs 的偽標(biāo)簽框,而且 image-text pair 本來的標(biāo)注就是一個(gè)圖對應(yīng)一句話,所以可以很容易的使用 grounding 進(jìn)行推理得到偽標(biāo)簽框,而且文本中有很多語義信息,更能引入豐富的語義信息。
關(guān)聯(lián)和區(qū)別:
- 傳統(tǒng)目標(biāo)檢測是提取 region feature,然后對該 region feature 進(jìn)行分類和回歸
- CLIP-based open-set 目標(biāo)檢測:box 的處理是不變的,變得是求類別的方式,變成了 region feature 和 text embedding 的相似度,可以使用 CLIP 來將類別表示成 text embedding,這個(gè)思路比較自然,且各個(gè)類別是并行輸入,不受類別限制。
- Grounding-based open-set 目標(biāo)檢測:和 grounding 數(shù)據(jù)結(jié)合,將目標(biāo)檢測轉(zhuǎn)換為 grounding,模型接收的語義信息更豐富,能利用 grounding 模型提取 image-text 偽標(biāo)簽,受類別數(shù)量的限制。
DINO :
模型設(shè)計(jì):
- 藍(lán)框是 close-set 目標(biāo)檢測過程
- 從 close-set 到 open-set 的關(guān)鍵在于引入 text encoder
- 如果想要模型有更強(qiáng)的文本、圖像理解能力,所以這兩個(gè)模態(tài)盡可能多的融合是很重要的,一般的融合會(huì)在 3 個(gè)部分:Neck、Query init、output
如何處理不同的句子:
- CLIP 會(huì)把每個(gè)類別做成句子形式來提取特征,
- Grounding 會(huì)把所有類別當(dāng)做一句話來提取特征,所以 grounding 類別名稱之間是沒有什么聯(lián)系的,所以也不需要計(jì)算各個(gè)類別之間的 attention,所以作者發(fā)現(xiàn)不計(jì)算類別之間的 attention 能提高訓(xùn)練速度且效果依然良好
一、背景
理解視覺新概念是視覺模型應(yīng)該具有的基本能力,基于此,作者提測了一個(gè)強(qiáng)大的檢測器 open-set object detection,能夠檢測任意的能用人類語言描述的目標(biāo)
而且該任務(wù)也能和其他模型結(jié)合使用,有很大的潛力,如圖 1b 所示,和生成模型結(jié)合起來就能進(jìn)行圖像編輯
開集目標(biāo)檢測的關(guān)鍵在哪里!!!
- 引入自然語言處理對語言的理解能力,來擴(kuò)展模型對沒見過的目標(biāo)的理解
- 舉一個(gè)不太嚴(yán)謹(jǐn)?shù)睦樱喝巛斎肓艘粋€(gè) prompt=哈士奇,但視覺模型不知道什么是哈士奇,那么語言模型會(huì)先分析哈士奇和 dog 關(guān)聯(lián)很近,那么就會(huì)輸出檢測為 dog 的框?yàn)楣科?/li>
GLIP 方法將目標(biāo)檢測構(gòu)建為了 phrase grounding 任務(wù),并且引入 object region 和 language phrase 之間的對比學(xué)習(xí)來進(jìn)行關(guān)聯(lián)。展現(xiàn)出了很強(qiáng)的靈活性,可以同時(shí)適用于開集和閉集目標(biāo)檢測。
但 GLIP 的效果會(huì)被 Dynamic Head 檢測器的效果限制,因?yàn)殚_集目標(biāo)檢測和閉集目標(biāo)檢測是強(qiáng)聯(lián)系的,所以,本文作者認(rèn)為一個(gè)在閉集目標(biāo)檢測上表現(xiàn)好的模型一定能在開集目標(biāo)檢測上表現(xiàn)好。
所以,本文作者基于 DINO 構(gòu)建了一個(gè)開集目標(biāo)檢測器,且在目標(biāo)檢測上獲得了很好的效果
Grounding DINO 相比 GLIP 的優(yōu)勢:
- 基于 Transformer 結(jié)構(gòu),能同時(shí)適用于圖像和語言數(shù)據(jù)
- Transformer 結(jié)構(gòu)能從大型數(shù)據(jù)集上獲得更多的信息
- DINO 可以端到端的優(yōu)化模型,不需要使用后處理等(如 NMS),能夠簡化這個(gè) grounding model 的設(shè)計(jì)
closed-set 檢測器的三個(gè)重要模塊:
- backbone:抽取圖像特征
- neck:特征增強(qiáng)
- head:回歸和分類等
如何使用語言模型將 closed-set 檢測器擴(kuò)展到 open-set 檢測器:
- 學(xué)習(xí) language-aware regiong embedding
- 這樣就可以將每個(gè)目標(biāo)區(qū)域劃分到語言語義信息對應(yīng)的空間去
- 其關(guān)鍵在于 neck 或 head 輸出的地方,在 region output 和 language features 之間使用對比學(xué)習(xí),來幫助模型學(xué)習(xí)如何對齊這兩種多模態(tài)信息
- 如圖 2 展示了三個(gè)不同的階段進(jìn)行特征融合的示例,neck(A)、query initialization(B)、head(C)
到底什么時(shí)候來進(jìn)行特征融合比較好呢:
- 一般認(rèn)為,在整個(gè) pipeline 中進(jìn)行特征的融合的效果會(huì)更好
- 類似于 CLIP 形式的檢索結(jié)構(gòu)為了高效,只需要對最后的特征來進(jìn)行對比即可
- 但是對于 open-set detection,模型的輸入是 image 和 text,所以 tight(and early)fusion 的效果更好,也就是更多的融合效果更好
- 但是以前的檢測器(如 Faster RCNN)很難在這三個(gè)階段都將語言特征引入來進(jìn)行融合,但 圖像 Transformer 結(jié)構(gòu)和 language 的結(jié)構(gòu)很類似,所以本文作者設(shè)計(jì)了三個(gè)特征融合器,分別在 neck、query initialization、head 階段進(jìn)行融合
Neck 結(jié)構(gòu):
- stacking self-attention
- text-to-image cross-attention
- image-to-text cross attention
Head:
- query 的初始化:使用 language-guided query 選擇方式來初始化
- 如何提高 query 特征表達(dá):對 image 和 text 進(jìn)行 cross-attention ,來作為 cross-modality decoder
很多現(xiàn)有的 open-set 目標(biāo)檢測器都會(huì)在新類別上來測試其效果,如圖 1b 所示
但作者認(rèn)為,只要是能描述的對象,都應(yīng)該被考慮其中
本文將這個(gè)任務(wù)命名為 Referring Expression Comprehension(REC),即參照表示理解
作者在圖 1b 的右側(cè)展示了一些 REC 的例子
作者在下面三種數(shù)據(jù)集上進(jìn)行了實(shí)驗(yàn):
- closed-set
- open-set
- referring
二、方法
Grounding DINO 會(huì)在給定一個(gè)輸入 (image, text) 的基礎(chǔ)上輸出多個(gè) [object boxes, noun phrases] pairs
如圖 3 所示,模型會(huì)根據(jù)輸入的圖像和文字描述 ‘cat’ 和 ’table’ 來框出輸入圖像中的 cat 和 table
目標(biāo)檢測和 REC 任務(wù)都可以使用這個(gè) pipeline 來對齊,類似于 GLIP:
- 如何實(shí)現(xiàn)目標(biāo)檢測:將所有類別的名字作為輸入 text 來
- 如何實(shí)現(xiàn) REC:對每個(gè)輸入 text,REC 只需要返回一個(gè) bbox 即可, 所以作者使用輸出目標(biāo)的最大得分作為 REC 的輸出
Grounding DINO 的結(jié)構(gòu):dual-encoder-single-decoder 的結(jié)構(gòu),整體結(jié)構(gòu)如圖 3 所示
- 一個(gè) image backbone 來抽取圖像信息
- 一個(gè) text backbone 來抽取文本信息
- 一個(gè) feature enhancer 來對圖像和文本信息進(jìn)行融合
- 一個(gè) language-guided query 選擇模塊來進(jìn)行 query 初始化
- 一個(gè) cross-modality decoder 來進(jìn)行 box 的修正
對每個(gè)(image, text)pair 的操作過程如下:
- 首先,使用 image backbone 和 text backbone 來抽取原始的圖像特征和文本特征
- 然后,將這兩組特征輸入 feature enhancer 模塊來進(jìn)行跨模態(tài)特征融合,得到跨模態(tài)融合特征
- 接著,使用 language-guided query selection 模型來從 image feature 中選擇跨模態(tài)特征的 query,并輸入跨模態(tài) decoder 來從這兩個(gè)模態(tài)的特征中提前需要的特征并且更新 query
- 最后,最后一層 decoder 的輸出 query 被用于預(yù)測 object box 并且提取對應(yīng)的 phrases
右邊一列就是 DINO 的結(jié)構(gòu),左邊就是對文本的處理
2.1 特征抽取和加強(qiáng)
給定(Image,Text)pair,從 Swin Transformer 的結(jié)構(gòu)中抽取多級(jí)圖像特征,從 BERT 的結(jié)構(gòu)中抽取文本特征
抽取特征之后,將兩組特征輸入 enhancer 中來進(jìn)行跨模態(tài)的特征融合,enhancer 結(jié)構(gòu)包括多個(gè) enhancer layers,其中一個(gè)如圖 3 block2 所示。
如上圖所示:
- Text features:使用 self-attention 先進(jìn)行自注意力特征提取
- Image features:使用 Deformable self-attention 來增強(qiáng)圖像特征
- 然后再順序的進(jìn)行 image-to-text 和 text-to-image 的 cross-attention
- 最后經(jīng)過 FFN 來分別得到增強(qiáng)后的兩種特征
2.2 Language-Guided Query Selection
GLIP 在進(jìn)行了特征融合后,就分別使用融合后的特征去進(jìn)行特征預(yù)測了
但 Grounding DINO 在這里設(shè)計(jì)了 language-guided query selection 再次進(jìn)行融合,為了更好的利用 input text 來指導(dǎo)目標(biāo)檢測,來選擇和 input text 相關(guān)性更大的 features 來作為 decoder queries
pytorch 偽代碼如 Algorithm 1 所示:
- num_query:decoder 中的 queries 數(shù)量,實(shí)際使用時(shí)和 DINO 一樣設(shè)定為 900
- bs:batch size
- ndim:feature dimension
- num_img_tokens:image token 的數(shù)量
- num_text_tokens:text token 的數(shù)量
language-guided query selection module 的輸出:
- num_query 索引,可以根據(jù)這個(gè)輸出的索引來初始化 queries
- 每個(gè) decoder query 包含兩部分:content(是參與訓(xùn)練的)、positional(動(dòng)態(tài) anchor box,使用 encoder 的輸出來初始化)
2.3 Cross-Modality Decoder
在 Language-Guided Query Selection 之后,還接了一個(gè) cross-modality decoder,如圖 3 block3 所示,進(jìn)一步將 image 和 text 的特征進(jìn)行結(jié)合
2.4 Sub-sentence level text feature
前面的 work 可以獲得兩種 text prompt,如圖 4 所示
- sentence level representation:如圖 4a,將整個(gè)句子的特征編碼為一個(gè)特征,如果一個(gè)句子有多個(gè)短語,則會(huì)抽取這些短語,忽略其他 word
- word level representation:如圖 4b,會(huì)對一個(gè)句子中的所有 word 進(jìn)行關(guān)聯(lián)性編碼,會(huì)引入不必要的依賴關(guān)系,一些并不相關(guān)的單詞也會(huì)被關(guān)聯(lián)起來
基于上面兩種編碼方式的問題,作者提出了 sub-sentence level 表達(dá)的方式,就是只對 sub-sentence 內(nèi)的 word 進(jìn)行關(guān)聯(lián)學(xué)習(xí),不會(huì)引入不必要的聯(lián)系
2.5 Loss Function
- 回歸 loss:L1 loss 和 GIoU loss
- 分類 loss:對比學(xué)習(xí) loss(預(yù)測的和 language token 之間的對比)
三、效果
作者在三種不同設(shè)置上進(jìn)行了實(shí)驗(yàn):
- 閉集: COCO 檢測數(shù)據(jù)集
- 開集:zero-shot COCO、LVIS、ODinW
- Referring detection:RefCOCO/+/g
設(shè)置細(xì)節(jié):
- 作者訓(xùn)練了兩個(gè)模型變體:
- Grounding-DINO-T(swin-T)
- Grounding-DINO-L(swin-L)
- text backbone 為 BERT-base(from Hugging Face)
3.1 zero-shot transfer of grounding DINO
1、COCO Benchmark:
2、LVIS Benchmark
3、ODinW Benchmark
3.2 Referring Object detection
3.3 Ablations
因?yàn)樽髡咛岢隽?tight fusion 模式,為了驗(yàn)證該方式是否有用,作者移除了一些 fusion block,結(jié)果見圖 6
所有模型都是使用 Swin-L 基于 O365 訓(xùn)練的,結(jié)果證明更緊密的 fusion 能夠提升最終的效果
3.4 從 DINO 到 Grounding DINO
如果直接從頭開始訓(xùn)練 Grounding DINO 的話,費(fèi)時(shí)費(fèi)力,所有作者嘗試使用了訓(xùn)練好的 DINO 權(quán)重,凍結(jié)了兩個(gè)模型共用的部分權(quán)重,微調(diào)其他部分的參數(shù),結(jié)果見表 7。
結(jié)果表明,使用 DINO 預(yù)訓(xùn)練好的權(quán)重,只訓(xùn)練 text 和 fusion block, 就可以達(dá)到和重新訓(xùn)練一樣的效果
四、代碼
4.1 環(huán)境安裝
git clone https://github.com/IDEA-Research/GroundingDINO.git
cd GroundingDINO/
pip install -e .
4.2 權(quán)重下載
# 瀏覽器輸入下面路徑即可下載
https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha/groundingdino_swint_ogc.pth
# wget 下載
mkdir weights
cd weights
wget -q https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha/groundingdino_swint_ogc.pth
cd ..
4.3 單張圖 demo
# 輸出需要檢測的類別:
CUDA_VISIBLE_DEVICES=7 python demo/inference_on_a_image.py \
-c groundingdino/config/GroundingDINO_SwinT_OGC.py \
-p weights/groundingdino_swint_ogc.pth \
-i images/1.jpg \
-t cat \ # 如果要檢測多個(gè)類別的目標(biāo),使用.分開,如 -t cat.dog.bird
-o output
- text_threshold=0.25
- box_threshold=0.3
過程如下:文章來源:http://www.zghlxwxcb.cn/news/detail-493952.html
- 輸入:圖像、text_prompt
('cat. dog')
- 文本處理:變成小寫字母、去除空格,如果最后沒有 . 的話,給文本最后加上 . ,變成
'cat. dog.'
,然后對輸入文本進(jìn)行分詞,變成{'input_ids': tensor([[ 101, 4937, 1012, 3899, 1012, 102]], device='cuda:0'), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0]], device='cuda:0'), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1]], device='cuda:0')}
,輸入的 special_token 為 [101, 102, 1012, 1029],可以過濾不需要的 token,包括開始 101 和結(jié)束標(biāo)記 102 和句號(hào) 1012 等。輸入 bert 進(jìn)行特征提取,這里的 mask 和 gilp 有一些區(qū)別,具體還沒細(xì)看 - 圖像處理:提取 swin 特征,輸出 3 層多尺度特征和加了位置信息的3層多尺度特征,然后在進(jìn)行一次卷積,共得到 4 層輸出特征
- 得到類別特征 [2,256],回歸特征 [2,4]
4.4 COCO zero-shot 測評
首先下載 coco 數(shù)據(jù)集,將數(shù)據(jù)集放到 dataset 路徑下,然后執(zhí)行如下命令,得到 mAP0.50:0.95 = 48.5文章來源地址http://www.zghlxwxcb.cn/news/detail-493952.html
CUDA_VISIBLE_DEVICES=7 python demo/test_ap_on_coco.py \
-c groundingdino/config/GroundingDINO_SwinT_OGC.py \
-p weights/groundingdino_swint_ogc.pth \
--anno_path dataset/coco/annotations/instances_val2017.json \
--image_dir dataset/coco/val2017
IoU metric: bbox
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.48503
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.64419
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.52925
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.33947
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.51771
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.63410
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.38590
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.66831
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.73744
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.59104
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.77465
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.88776
Final results: [0.48502937223654774, 0.6441887991833478, 0.5292488429259078, 0.3394684576029584, 0.5177052819196549, 0.634102477342082, 0.38590050340039866, 0.668313126216868, 0.7374381132430312, 0.5910350651020582, 0.7746541080843435, 0.8877636350581676]
到了這里,關(guān)于【AIGC】15、Grounding DINO | 將 DINO 擴(kuò)展到開集目標(biāo)檢測的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!