:基于視覺-語言知識蒸餾的兩階段檢測器全解析)
深度學習后端開發(fā)工具【免費下載鏈接】tpuReference models and tools for Cloud TPUs.項目地址https://gitcode.com/gh_mirrors/tpu/tpu點擊查看免費下載本文以 TensorFlow Cloud TPU 參考模型倉庫中的 ViLD 項目文檔 為主體系統(tǒng)講解 ViLDVision and Language Distillation開放詞匯目標檢測方法的原理、代碼組織、配置參數、數據預處理與推理流程。讀完本文你將掌握如何在當前倉庫中復現 ViLD 的 LVIS 評測管線理解教師-學生蒸餾在檢測器中的落地方式并能夠將預訓練模型直接遷移到 PASCAL VOC、COCO、Objects365 等任意數據集上做零微調推理。一、ViLD 要解決的問題開放詞匯目標檢測傳統(tǒng)目標檢測器只能識別訓練數據集中出現過的固定類別集合。開放詞匯open-vocabulary目標檢測的目標是檢測任意文本描述所對應的目標。其根本困難在于訓練數據的匱乏——現有檢測數據集通常只有數百個類別且標注新類別成本極高。ViLD 提出的解決方案是一種視覺-語言知識蒸餾框架其核心思想是使用一個預訓練的開放詞匯圖像分類模型教師模型本項目采用 OpenAI CLIP來編碼類別文本與候選區(qū)域object proposals的圖像區(qū)域訓練一個兩階段檢測器學生模型本項目基于 Mask R-CNN 架構使檢測框的區(qū)域嵌入region embeddings與教師模型推斷出的文本嵌入、圖像嵌入對齊。從源碼結構看這一思路在倉庫中落地為四類模塊蒸餾數據解析vild_parser.py、模型結構vild_model.py、檢測頭vild_head.py與損失函數vild_losses.py。論文作者在 LVIS 上通過將所有稀有類rare categories作為訓練時未見過的 novel 類別來構建評測基準據論文報告 ViLD 以 ResNet-50 骨干取得 16.1 mask APr甚至超過有監(jiān)督對照 3.8模型無需微調即可直接遷移到其他數據集在 PASCAL VOC、COCO 與 Objects365 上分別取得 72.2 AP50、36.6 AP 與 11.8 AP在 COCO 上較此前最優(yōu)方法在 novel AP 與整體 AP 上分別提升 4.8 與 11.4。二、代碼組織與啟動入口ViLD 作為 Cloud TPU detection 框架下的一個項目代碼集中在 models/official/detection/projects/vildprojects/vild/ ├── README.md # 本文主體對應的項目文檔 ├── ViLD_demo.ipynb # Colab 交互演示兩個示例可換自己的圖與類別 ├── requirements.txt # Python 依賴 ├── configs/ │ ├── vild_config.py # 默認參數模板繼承 DETECTION_CFG │ ├── vild_resnet.yaml # ViLDvanilla 蒸餾配置 │ └── vild_ensemble_resnet.yaml # ViLD-ensembledouble_branch 蒸餾配置 ├── dataloader/ │ ├── tf_example_decoder.py # 解碼含蒸餾標簽的 tf.Example │ └── vild_parser.py # 圖像/標注/蒸餾標簽解析器 ├── modeling/ │ ├── vild_head.py # ViLD Fast R-CNN 頭CLIP 分類器 特征蒸餾投影 │ ├── vild_losses.py # 分類損失支持 mask_rare │ └── vild_model.py # ViLD 模型主體繼承 base_model.BaseModel ├── ops/ │ └── postprocess_ops.py # 檢測后處理NMS 等 └── preprocessing/ ├── create_lvis_tf_record.py # LVIS → TFRecord 轉換腳本 └── dataset_util.pyViLD 通過三處工廠函數掛載到統(tǒng)一框架中參數模板configs/factory.py 中model vild時返回vild_config.VILD_CFG模型構建modeling/factory.py 中params.type vild時實例化vild_model.ViLDModel數據解析dataloader/factory.py 中parser vild_parser時實例化vild_parser.Parser檢測頭modeling/architecture/factory.py 中的vild_fast_rcnn_head_generator。啟動入口是統(tǒng)一的 models/official/detection/main.py通過--modelvild與--modeeval/train等參數驅動。三、核心實現特征蒸餾如何在兩階段檢測器內落地3.1 模型前向流程vild_model.pyViLDModel繼承base_model.BaseModel整體保留 Mask R-CNN 的 ResNet-FPN-RPN 管線關鍵改造點見 vild_model.py訓練時拼接蒸餾 ROI在 RPN 采樣得到rpn_rois后若開啟特征蒸餾visual_feature_distill非 None將教師模型預計算的labels[roi_boxes]形狀[batch, max_distill_rois, 4]沿 axis1 與 RPN 的 ROI 拼接隨后統(tǒng)一經過multilevel_crop_and_resize提取 ROI 特征前向結束后再tf.split還原。max_num_rois默認 300決定了每張圖蒸餾 ROI 的數量RoI 特征 → 檢測頭_frcnn_head_fn返回class_outputs / box_outputs / distill_feat_outputs / distill_class_outputs四路輸出其中distill_feat_outputs只在訓練期參與蒸餾損失推理期_generate_detections_fn使用postprocess_ops.GenericDetectionGenerator做 NMS 等后處理vild_model.pyViLD-ensemble 額外傳入distill_class_outputs做雙分支分類集成。3.2 蒸餾損失build_losses總損失為vild_model.pymodel_loss rpn_score_loss rpn_box_loss frcnn_class_loss frcnn_box_loss mask_loss feat_distill_weight * feat_distill_loss其中特征蒸餾損失的計算細節(jié)vild_model.py訓練時將教師預計算的gt_visual_feat按 L2 范數歸一化normalize_feat_during_trainingTrue用valid_roisroi_boxes最大值大于 0 的條目作為權重掩碼僅對有效 ROI 計算 L1 損失tf.losses.absolute_differenceSUM_BY_NONZERO_WEIGHTS損失值再乘以visual_feature_dim512以保持量綱穩(wěn)定feat_distill_weight為蒸餾損失的縮放系數配置中 ResNet-50 取 0.5ResNet-152 取 1.0 或 2.0見后文 checkpoint 表。3.3 兩種蒸餾模式vanilla 與 double_branchvisual_feature_distill支持三種取值vild_config.py 中注釋為None / vanilla / double_branchNone關閉蒸餾退化為普通分類頭vanilla對應 vild_resnet.yamlRPN ROI 與蒸餾 ROI 共享同一個 Fast R-CNN 特征提取網絡訓練時在投影到 CLIP 空間后按[num_rois - max_distill_rois, max_distill_rois]切分前者用于分類后者作為distill_feat_outputsdouble_branch對應 vild_ensemble_resnet.yaml在ViLDFastrcnnHead中為蒸餾 ROI 建立獨立的 conv/fc 分支distill_conv_{i}、distill_fc{i6}與獨立的投影層distill-project-to-clip訓練、推理兩路各自前向推理時將蒸餾分支的分類輸出distill_class_outputs并入檢測結果實現 ViLD-ensemble 集成效果vild_head.py 與 vild_head.py。3.4 ViLD 檢測頭與 CLIP 分類器vild_head.pyViLDFastrcnnHeadvild_head.py的關鍵參數與行為參數默認值作用clip_dim512CLIP 文本/視覺嵌入維度classifier_weight_path必填預計算的 CLIP 文本嵌入.npy路徑作為分類權重normalize_classifierTrue是否對分類器權重按列做 L2 歸一化后除到 logits 上normalize_visualTrue是否對投影后的視覺特征做 L2 歸一化temperature100.0乘到 logits 上的溫度系數放大對比度visual_feature_distillNone蒸餾模式None/vanilla/double_branchmax_distill_rois300蒸餾 ROI 數量上限class_agnostic_bbox_predTrue類別無關的框回歸只預測 4 個坐標而非 num_classes×4實現要點訓練期通過tf.gfile.GFile(self._classifier_weight_path)加載文本嵌入斷言形狀為(clip_dim, num_classes - 1)并以tf.initializers.constant作為class-predict全連接層無 bias的核初始化vild_head.py。這意味著1204 個類別 1 個背景類 1203 個 LVIS 類別分類器與背景分支分別做 L2 歸一化后拼接background_output在前與tf.concat組合最后統(tǒng)一乘以temperaturevild_head.py變量作用域為frcnn_layer_0/fast_rcnn_head配合配置frozen_variable_prefix: frcnn_layer_0/fast_rcnn_head/class-predict在訓練時凍結 CLIP 分類器權重僅微調視覺投影與檢測頭。3.5 分類損失與稀有類掩碼vild_losses.pyFastrcnnClassLossvild_losses.py在配置frcnn_class_loss.mask_rareTrue時從rare_mask_path加載 LVIS 稀有類二值掩碼將稀有類 logits 置零后計算 softmax 交叉熵。這一設計保證在僅監(jiān)督基類frequent/common categories的訓練設定下稀有類novel categories不會產生錯誤的梯度信號與論文的“稀有類全部視作 novel”基準保持一致。四、配置文件深度解析ViLD 提供兩個 YAML 配置均以 vild_config.py 中的VILD_CFG為默認模板通過--config_file加載、--params_override覆蓋。4.1 vild_resnet.yamlViLDResNet-50核心字段含義architecturebackbone: resnet、multilevel_features: fpn特征金字塔 level 2–6num_classes: 1204include_mask: true、mask_target_size: 28輸出 mask 尺寸visual_feature_distill: vanilla、visual_feature_dim: 512、max_num_rois: 300、feat_distill_weight: 0.5、normalize_feat_during_training: true、filter_distill_boxes_size: 00 表示不過濾小于指定尺寸的蒸餾框frcnn_headnum_convs: 4、num_filters: 256、num_fcs: 2、fc_dims: 1024clip_dim: 512、normalize_classifier: true、normalize_visual: true、temperature: 100.0、class_agnostic_bbox_pred: trueresnetresnet_depth: 50frcnn_class_lossmask_rare: true配合推理腳本中的rare_mask_pathroi_proposal / roi_samplingRPN 訓練期rpn_pre_nms_top_k: 2000、rpn_post_nms_top_k: 1000、nms_iou_threshold: 0.7ROI 采樣num_samples_per_image: 512、fg_fraction: 0.25、fg_iou_thresh: 0.5、mix_gt_boxes: truepostprocessmax_total_size: 300、pre_nms_num_boxes: 1000、nms_iou_threshold: 0.5、score_threshold: 0.0、apply_nms: truetrainfrozen_variable_prefix: frcnn_layer_0/fast_rcnn_head/class-predict凍結 CLIP 文本分類器l2_weight_decay: 4.0e-05total_steps: 180000train_batch_size: 256step 式學習率init_learning_rate: 0.32、learning_rate_steps: [162000, 171000, 175500]、warmup_steps: 1000momentum 優(yōu)化器0.9vild_parser輸入圖output_size: [1024, 1024]RPN 匹配閾值 0.7/0.3隨機水平翻轉尺度增強aug_scale_min: 0.1、aug_scale_max: 2.0mask_crop_size: 112、max_num_instances: 300訓練時跳過 crowd 標注evaltype: lvis_box_and_mask、eval_samples: 19809、use_json_file: true。4.2 vild_ensemble_resnet.yamlViLD-ensemble與 vanilla 配置的差異集中在兩點visual_feature_distill: double_branch見 3.3 節(jié)的雙分支實現與use_tpu: false。README 中 ViLD-ensemble 與 ResNet-152 系列的 checkpoint 均引用該配置蒸餾權重依據下表使用feat_distill_weight覆蓋。五、環(huán)境準備與依賴運行前需要滿足兩個前提詳見 README.md安裝 TensorFlow代碼基于tensorflow.compat.v1編寫需確保導入兼容安裝 requirements.txt 中的依賴tensorflow pycocotools lvis opencv-python此外腳本內部存在sys.path.insert(0, tpu/models)的路徑假設見 main.py 與 vild_config.py因此從倉庫根目錄出發(fā)命令中的配置路徑與模塊路徑應以tpu/models/official/detection/...形式書寫與官方 README 中的腳本保持一致。六、數據預處理LVIS v1.0 → TFRecord6.1 目錄結構要求下載并解壓 LVIS v1.0 驗證集到DATA_DIR需按如下結構組織DATA_DIR -- lvis_v1_val.json -- val2017 | -- ***.jpg | -- ...6.2 轉換腳本在models/official/detection/projects/vild/preprocessing/目錄下執(zhí)行腳本入口為 create_lvis_tf_record.pymax_num_processes可按機器核數調整DEST_DIR指定 TFRecord 輸出目錄DATA_DIR[DATA_DIR] DEST_DIR[DEST_DIR] VAL_JSON${DATA_DIR}/lvis_v1_val.json python3 preprocessing/create_lvis_tf_record.py \ --image_dir${DATA_DIR} \ --json_path${VAL_JSON} \ --dest_dir${DEST_DIR} \ --include_maskTrue \ --splitval \ --num_parts100 \ --max_num_processes100腳本支持的 flags 包括--include_mask是否包含 PNG 編碼的實例分割掩碼、--split取值train/val、--num_parts生成的 TFRecord 分片數、--debug等。腳本會把 LVIS 的[x, y, width, height]絕對坐標轉換為 TensorFlow Object Detection API 期望的[ymin, xmin, ymax, xmax]歸一化格式并利用 pycocotools 的 mask 工具解碼 RLE 分割標注。6.3 訓練數據說明從 vild_parser.py 與 tf_example_decoder.py 可以看出ViLD 訓練所用的 TFRecord 除常規(guī)圖像、框、類別、掩碼標注外還須包含教師模型預計算的蒸餾標簽roi_boxes蒸餾候選框與groundtruth_visual_featuresCLIP 圖像區(qū)域嵌入。解析器在訓練期會將這些標簽隨 RPN 標簽一起打包labels[roi_boxes]、labels[gt_visual_feat]clip 到max_num_rois長度并可選地按filter_distill_boxes_size過濾過小的蒸餾框。這類帶蒸餾標簽的訓練數據需要依據論文的離線教師推理流程預先產生官方文檔未在倉庫內給出其生成腳本。七、預訓練 Checkpoint 與評測指標官方在 LVIS稀有類全部作為 novel上發(fā)布的預訓練模型與指標如下表數據來自 README.mdMethodBackboneDistillation weightAPrAPcAPfAPconfigckptViLDResNet-500.516.619.828.222.5vild_resnet.yamlresnet50_vild.tar.gzViLD-ensembleResNet-500.51824.730.625.9vild_resnet.yamlresnet50_vild_ensemble.tar.gzViLDResNet-1521.019.621.628.524.0vild_ensemble_resnet.yamlresnet152_vild.tar.gzViLD-ensembleResNet-1522.019.224.830.826.2vild_ensemble_resnet.yamlresnet152_vild_ensemble.tar.gz其中 APr/APc/APf 分別對應 LVIS 的稀有類、常見類與頻繁類 AP蒸餾權重feat_distill_weight越大模型越偏向蒸餾信號。官方 checkpoint 均托管于云存儲下載地址見原文檔表格。另外據論文報告使用 ResNet-50 骨干時 ViLD 取得 16.1 mask APr較有監(jiān)督對照提升 3.8跨數據集零微調遷移結果為 PASCAL VOC 72.2 AP50、COCO 36.6 AP、Objects365 11.8 AP。八、推理Evaluation完整流程8.1 準備推理所需的三個輸入下載 CLIP 文本嵌入 clip_synonym_prompt.npy 與稀有類二值掩碼 lvis_rare_masks.npy放入[WEIGHTS_DIR]下載并解壓上表任一預訓練模型到[MODEL_DIR]將[RESNET_DEPTH]、[MODEL_DIR]、[DATA_DIR]、[DEST_DIR]、[WEIGHTS_DIR]、[CONFIG_FILE]替換為實際值。8.2 運行腳本BATCH_SIZE1 RESNET_DEPTH[RESNET_DEPTH] MODEL_DIR[MODEL_DIR] EVAL_FILE_PATTERN[DEST_DIR]/val* VAL_JSON_FILE[DATA_DIR]/lvis_v1_val.json RARE_MASK_PATH[WEIGHTS_DIR]/lvis_rare_masks.npy CLASSIFIER_WEIGHT_PATH[WEIGHTS_DIR]/clip_synonym_prompt.npy CONFIG_FILEtpu/models/official/detection/projects/vild/configs/[CONFIG_FILE] python3 tpu/models/official/detection/main.py \ --modelvild \ --model_dir${MODEL_DIR?} \ --modeeval \ --use_tpuFalse \ --config_file${CONFIG_FILE?} \ --params_override{ resnet: {resnet_depth: ${RESNET_DEPTH?}}, predict: {predict_batch_size: ${BATCH_SIZE?}}, eval: {eval_batch_size: ${BATCH_SIZE?}, val_json_file: ${VAL_JSON_FILE?}, eval_file_pattern: ${EVAL_FILE_PATTERN?} }, frcnn_head: {classifier_weight_path: ${CLASSIFIER_WEIGHT_PATH?}}, postprocess: {rare_mask_path: ${RARE_MASK_PATH?}}}8.3 參數含義與底層行為--modelvild由 main.py 決定加載 ViLD 參數模板與模型--modeeval觸發(fā)評估--use_tpuFalse時 main.py 會強制關閉 bfloat16 與同步 BN因此純 GPU/CPU 即可運行推理--config_file指向vild_resnet.yaml或vild_ensemble_resnet.yaml兩者通過--params_override覆蓋骨干深度、批大小、數據路徑與兩個.npy權重路徑classifier_weight_path最終進入ViLDFastrcnnHead作為class-predict層核初始化并在歸一化后參與打分rare_mask_path同時服務于frcnn_class_loss訓練期掩碼與后處理階段的稀有類約束評估類型為lvis_box_and_mask輸出 mask 與 box 雙模態(tài)指標predict_batch_size與eval_batch_size保持一致即可示例取 1以降低顯存占用。更完整的訓練/評估流程可參考檢測模塊通用指南 GETTING_STARTED.md。九、Colab 交互演示倉庫提供兩種演示途徑見 README.md在線 Colab原文檔給出的ViLD_demo.ipynb托管版本本地 NotebookViLD_demo.ipynb。演示內置兩個示例同時支持上傳自己的圖片并指定想檢測的類別文本直觀展示開放詞匯檢測能力。十、引用與說明本項目致謝部分明確說明教師模型使用 OpenAI 的 CLIP 模型整體代碼構建于 Cloud TPU detection 框架之上。若在研究中引用 ViLD可按原文檔給出的 BibTeX 條目引用Gu, Xiuye; Lin, Tsung-Yi; Kuo, Weicheng; Cui, Yin. Open-Vocabulary Detection via Vision and Language Knowledge Distillation. arXiv:2104.13921, 2021.。倉庫許可證與 LICENSE 一致使用前請留意。結語ViLD 通過將 CLIP 的開放詞匯能力蒸餾進兩階段檢測器為開放詞匯目標檢測提供了一個可復現、可遷移的完整實現。本文沿著“原理 → 源碼 → 配置 → 數據 → 推理”的路徑覆蓋了 vild/README.md 的全部實操內容并深入到 vild_model.py、vild_head.py、vild_config.py 等實現細節(jié)讀者可按文中命令在本地或 Cloud TPU 上復現 LVIS 評測或將預訓練模型直接用于自定義數據集的開放詞匯檢測。贊分享深度學習后端開發(fā)工具【免費下載鏈接】tpuReference models and tools for Cloud TPUs.項目地址https://gitcode.com/gh_mirrors/tpu/tpu點擊查看免費下載相關推薦F-VLM 實戰(zhàn)指南基于凍結視覺語言模型的開詞匯目標檢測JAX/FLAX 實現F VLM 實戰(zhàn)指南基于凍結視覺語言模型的開詞匯目標檢測JAX/FLAX 實現 F VLMFrozen Vision Language Model是人工智能深度學習NLP計算機視覺強化學習MMDetection 中的 GLIP 實現指南視覺-語言聯合預訓練的開放詞匯目標檢測MMDetection 中的 GLIP 實現指南視覺 語言聯合預訓練的開放詞匯目標檢測 GLIPGrounded Language Image Pre tr人工智能計算機視覺深度學習模型評測Sentence Transformers 稀疏編碼器知識蒸餾實戰(zhàn)基于 SparseMarginMSELoss 訓練 SPLADE 檢索模型Sentence Transformers 稀疏編碼器知識蒸餾實戰(zhàn)基于 SparseMarginMSELoss 訓練 SPLADE 檢索模型 知識蒸餾是訓練最人工智能NLPEmbedding微調機器學習上一篇為什么我勸你用 ZonyLrcToolsX 做歌詞批量下載完整上手與避坑指南下一篇告別缺少 MSVCP140.dllVisualCppRedist AIO 一次裝齊 2005-2022 全部 Visual C 運行庫創(chuàng)作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考