識任意類別?BBoxHeadCLIP零樣本分類頭源碼逐行解析)
UniDetector如何認(rèn)識任意類別BBoxHeadCLIP零樣本分類頭源碼逐行解析【免費下載鏈接】UniDetectorCode release for our CVPR 2023 paper Detecting Everything in the Open World: Towards Universal Object Detection.項目地址: https://gitcode.com/gh_mirrors/un/UniDetectorUniDetector 是 CVPR 2023 論文《Detecting Everything in the Open World: Towards Universal Object Detection》的官方開源代碼它讓一個目標(biāo)檢測模型能夠零樣本識別訓(xùn)練時從未見過的任意類別。其核心秘密藏在 bbox_head_clip.py 中的 BBoxHeadCLIP 分類頭用 CLIP 預(yù)訓(xùn)練好的文本向量替換了傳統(tǒng)檢測器里的全連接分類層。本文將面向新手逐行拆解這個零樣本分類頭是如何工作的。一、為什么一個模型能認(rèn)識任意類別傳統(tǒng)檢測器的痛點類別寫死在輸出層里普通 Faster R-CNN 的分類頭是一個全連接層輸出維度等于訓(xùn)練集的類別數(shù)比如 COCO 的 80 類。想檢測新類別必須重新標(biāo)注數(shù)據(jù)、重新訓(xùn)練輸出層。CLIP 的啟示文字和圖片住在同一個空間CLIP 是一個圖文對比學(xué)習(xí)模型同一張圖片和它的描述文本會被編碼到同一向量空間里的相近位置。這意味著——一張長椅的照片這個文本向量和真正的長椅圖像特征做相似度計算就能給出很高的分?jǐn)?shù)完全不需要見過長椅的訓(xùn)練樣本。UniDetector 的巧思把分類器換成文本向量查表UniDetector 的做法非常干脆圖像側(cè)用 CLIP 的視覺 ResNetclipresnet.py提取特征類別側(cè)把每個類別名喂給 CLIP 文本編碼器得到一組凍結(jié)的文本向量存成.npy文件項目已自帶 clip_embeddings/ 下的 4 份預(yù)計算嵌入分類打分圖像特征和文本向量做余弦相似度相似度就是分類得分。類別數(shù)量不再由網(wǎng)絡(luò)結(jié)構(gòu)決定而是由這個文本向量表決定——想檢測 1230 類LVIS還是 80 類COCO只是換一張表。二、BBoxHeadCLIP 源碼逐段解析 以下代碼位于 mmdet/models/roi_heads/bbox_heads/bbox_head_clip.py。第 1 步加載凍結(jié)的文本向量build_zs_layerzs_weights np.load(self.zeroshot_path) zs_weights torch.tensor(zs_weights, dtypetorch.float32).permute(1, 0).contiguous() zs_weights torch.cat([zs_weights, zs_weights.new_zeros((zs_weights.shape[0], 1))], dim1) self.register_buffer(zs_weights, zs_weights)四行代碼做了三件事讀取.npy文本嵌入、轉(zhuǎn)置成類別 × 維度、拼上一列零向量當(dāng)背景類。關(guān)鍵是register_buffer——它把文本向量注冊為緩沖區(qū)而非可訓(xùn)練參數(shù)前向參與計算反向永不更新這正是零樣本的數(shù)學(xué)保證。第 2 步AttentionPool2d 把區(qū)域特征壓成一個向量每個候選框RoI先經(jīng)過 RoIAlign 和 clip_res_layer.py 中的 CLIP 第四層2048 通道得到 7×7 特征圖再送入AttentionPool2d(7, 2048, 32, 1024)把 49 個空間位置展平成 49 個 token加上一個均值 token當(dāng)聚合器用 32 頭自注意力讓每個位置互相看一眼取均值 token 的輸出作為整個區(qū)域的 1024 維全局特征。這其實是 CLIP 視覺編碼器原生池化方式的復(fù)刻保證圖像特征和文本向量天然對齊。第 3 步一行余弦相似度完成零樣本分類 ?cls_score torch.mm(100 * F.normalize(x_cls, p2, dim1), F.normalize(self.zs_weights, p2, dim0))這是全文件最核心的一行圖像特征與所有類別文本向量各自做 L2 歸一化 → 點積即余弦相似度乘以 100 是 CLIP 慣例的溫度系數(shù)把相似度拉陡成可用的 logit輸出形狀(N, 類別數(shù)1)與經(jīng)典分類頭完全一致后續(xù) NMS 流程零改動。沒有 fc_cls沒有 softmax 競爭——每個類別獨立打分最后用 sigmoid 轉(zhuǎn)成 0~1 的概率天然支持多標(biāo)簽一個物體同時是人和騎車者。第 4 步框回歸照常訓(xùn)練fc_reg分類層雖然凍結(jié)了fc_reg線性層1024 → 4類別無關(guān)回歸仍然可訓(xùn)練配合 L1 損失微調(diào)候選框。也就是說是什么靠凍結(jié)的文本知識在哪靠少量數(shù)據(jù)精修——這正是解耦訓(xùn)練clip_decouple_faster_rcnn_r50_c4_1x_coco_2ndstage.py 中with_clsFalse能只用一個數(shù)據(jù)集就把 1230 類檢測跑通的原因。第 5 步FED 損失讓長尾類別不被淹沒LVIS 有 1230 類單個 batch 里往往只出現(xiàn)幾十類。loss()中實現(xiàn)了 FEDFine-grained Entity Decoupling策略每個 batch 只取本批出現(xiàn)的類別 隨機補樣的類別默認(rèn)上限fed_loss_num_cat50參與損失用逐類別二分類交叉熵binary_cross_entropy_with_logits替代 softmax 交叉熵類別之間互不牽制類別頻率由 scripts/get_cat_info.py 統(tǒng)計避免高頻類別主導(dǎo)訓(xùn)練。第 6 步推理頭 BBoxHeadCLIPInference分?jǐn)?shù)融合與概率校準(zhǔn) 同文件的子類BBoxHeadCLIPInference面向開放世界推理做了兩處增強配置見 clip_decouple_faster_rcnn_r50_c4_1x_lvis_v0.5_2ndstage_withcalibration.py頻率校準(zhǔn)scores × (1/freq^γ)壓制高頻類別得分虛高的偏差γ0.6雙證據(jù)融合最終得分 分類分^β × 候選框分^(1-β)β0.3讓框擬不像和內(nèi)容不對兩路證據(jù)互相把關(guān)。三、任意類別的文本向量是怎么生成的想加新類別只需運行 dump_clip_features_manyprompt.py從數(shù)據(jù)集標(biāo)注中讀取類別名如coco、lvis的 categories每個類別套用80 條提示模板a photo of a {}、a blurry photo of the {}、a cartoon {}……生成 80 句話全部句子過 CLIP 文本編碼器后取平均得到一個更魯棒的類別向量存成.npy。項目已附帶四份預(yù)計算結(jié)果coco(80 類)、lvis_v0.5(1230 類)、objects365、oid位于 clip_embeddings/開箱即用。四、最快上手三步跑通零樣本檢測 準(zhǔn)備代碼與權(quán)重獲取 UniDetector 倉庫按 README 安裝 mmdetection v2.18.0 CLIP二階段推理COCO 單數(shù)據(jù)集配置為例bash tools/dist_test.sh configs/inference/clip_decouple_faster_rcnn_r50_c4_1x_lvis_v0.5_2ndstage.py [你的checkpoint] 8 --eval bbox換成 LVIS 配置即可在 1230 類開放世界數(shù)據(jù)集上評測——同一套權(quán)重類別空間由文本向量表決定。五、開放世界泛化的真實表現(xiàn)零樣本不等于紙上談兵。論文在 LVIS v0.5 的 1230 類開放世界基準(zhǔn)上評測了該方案并做了魯棒性實驗在噪聲、運動模糊、霧、JPEG 壓縮等 15 種圖像擾動下模型依然能保持穩(wěn)定的檢測能力測試工具見 tools/analysis_tools/robustness_eval.py。訓(xùn)練數(shù)據(jù)經(jīng) mmdetection 標(biāo)準(zhǔn)流水線處理六、一頁速覽BBoxHeadCLIP 的記憶口訣 ?組件一句話總結(jié)zs_weights凍結(jié)的 CLIP 文本向量表類別數(shù)的唯一決定者AttentionPool2d復(fù)刻 CLIP 原生池化讓圖像特征與文本天然對齊100 × cos(圖像, 文本)全文件最核心的一行相似度即得分fc_reg唯一可訓(xùn)練的分類頭組件負(fù)責(zé)把框修準(zhǔn)FED loss每 batch 采樣 50 類 二分類損失治長尾BBoxHeadCLIPInference頻率校準(zhǔn) 框分融合開放世界推理調(diào)優(yōu)核心啟示零樣本目標(biāo)檢測的鑰匙不是更大的網(wǎng)絡(luò)而是把類別知識從參數(shù)里搬進(jìn)文本空間。理解了 BBoxHeadCLIP 這一行余弦相似度你就掌握了 UniDetector 認(rèn)識任意類別的全部秘密 。相關(guān)文件導(dǎo)航零樣本分類頭mmdet/models/roi_heads/bbox_heads/bbox_head_clip.py多數(shù)據(jù)集分區(qū)版分類頭mmdet/models/roi_heads/bbox_heads/bbox_head_clip_partitioned.pyCLIP 視覺骨干mmdet/models/backbones/clipresnet.py文本向量生成腳本scripts/dump_clip_features_manyprompt.py預(yù)計算文本嵌入clip_embeddings/【免費下載鏈接】UniDetectorCode release for our CVPR 2023 paper Detecting Everything in the Open World: Towards Universal Object Detection.項目地址: https://gitcode.com/gh_mirrors/un/UniDetector創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考