這是 ECCV 2022 論文《可靠的視覺問答:棄權而非錯誤答案》的實現。如果您發現我們的論文或此儲存庫對您自己的工作有用,請引用:
@inproceedings{whitehead2022reliablevqa, title={Reliable Visual Question Answering: Abstain Rather Than Answer Incorrectly}, author={Whitehead, Spencer and Petryk, Suzanne and Shakib, Vedaad and Gonzalez, Joseph and Darrell, Trevor and Rohrbach, Anna and Rohrbach, Marcus}, booktitle={Proceedings of the European Conference on Computer Vision (ECCV)}, year={2022} }
此儲存庫使用 PyTorch 並建置在 MMF 之上。它包含以下內容:
我們論文中使用的指標的實現,包括風險、覆蓋範圍和有效可靠性。
最大機率 (MaxProb)、校準和學習多模態選擇函數 (Selector) 的實現。
我們工作中模型的訓練配置。
下載我們工作中使用的 VQA v2 資料集分割、訓練模型檢查點和預提取特徵的連結。
更新:此儲存庫的先前版本無意中在欄位answers
中使用了MMF 中的預設地面真實答案,其參考答案略有不同(例如,如果某些條目不在3k 答案的詞彙表中,則它會替換它們)。因此,我們提供了一個獨立的評估腳本(eval_scripts/),它使用原始的 VQA v2 註釋作為評估的參考。此更新反映在 arXiv 版本中(請參閱附錄中的變更日誌),未來的工作應使用更新的評估來報告結果。
該儲存庫中的資料夾結構如下:
configs/
:
experiments/
包含用於訓練每個 VQA 模型和對應選擇函數的 YAML 配置。
datasets/
包含自訂vqa2_extended
資料集的 YAML 配置。
datasets/
:包含vqa2_extended
的資料集實作和建構器。此資料集與 MMF 中的 VQA v2 相同,但它還支援選擇函數的附加模型置信度輸出和用於校準評估的多項選擇註釋。
eval_scripts/
:包含論文中計算風險覆蓋率和有效可靠性指標的評估腳本。
reliable_vqa_eval.py
:包含計算不同指標的評估器物件。
run.py
:用於執行給定模型預測和地面實況註釋的評估的腳本。
vqa.py
:包含一個用於與 VQA v2 註釋和預測交互作用的物件。
models/
:對於我們實驗中的每個 VQA 模型,我們在原始模型之上註冊一個版本,該版本會傳回選擇函數所需的額外置信度和中間特徵輸出。
selective_predictors.py
包含校準和選擇器模型的實作。
modules/
:
losses.py
包含學習的選擇器模型的正確性預測損失函數。
metrics.py
包含 MMF 中用於驗證的風險覆蓋率和有效可靠性指標的實現。
__init__.py
:導入 MMF 使用的自訂 MMF 元件。
請按照此處的 MMF 安裝說明進行操作:https://mmf.sh/docs/。我們建議從原始碼安裝。請注意,從來源安裝時,您不需要複製此儲存庫下的 MMF 儲存庫。您可以簡單地將 MMF 克隆到自己的目錄中。我們還建議使用 conda 環境進行安裝和運行,該環境可用於 MMF 和此存儲庫。
安裝 MMF 後,您的環境應安裝 Python 3.7+ 和 PyTorch 1.6+。您還需要 scikit-learn 1.0+ 和 pandas 1.3.4+。
TL;DR:我們使用 VQA v2 資料集。我們將 VQA v2 驗證集分為 3 部分,並提供下面的註釋。我們也為 CLIP-ViL 模型提取自訂網格特徵,如下所示。所有其他註釋和功能均由 MMF 自動下載,如本儲存庫中每個配置所指定的。
首先,從此處下載原始 VQA v2 驗證問題和答案註釋 JSON 檔案:https://visualqa.org/download.html。這些將用於評估。
第一次使用我們的設定檔之一執行 MMF 時,MMF 應自動下載 VQA v2 的功能和註解。這些目錄/檔案將儲存在vqa2
目錄下的$MMF_DATA_DIR
( env.data_dir
) 中。請參閱 MMF 以了解更多詳細資訊。我們建議先透過此儲存庫執行 Pythia+MaxProb,這將下載用於 Pythia、ViLBERT 和 VisualBERT 的註解和功能(詳細資訊請參閱訓練)
我們還建議將驗證拆分和 CLIP 功能(在下一節中描述)也保存在這些目錄中,以下設定假設情況如此。如果您決定以不同的方式建立目錄,那麼您將需要相應地更新您的配置路徑等。
標準VQA v2訓練集用於訓練VQA模型。然而,由於答案註釋不適用於 test-dev 和 test-std VQA v2 分割,因此我們將 VQA v2 驗證集分成 3 個不相交的集合(即,不共享圖像或問題)以用於評估目的:
dev
:VQA 模型訓練的驗證集和選擇性預測變數的訓練集。
val
:選擇性預測變數的驗證集。
test
:所有模型的測試集,以及我們在論文中報告結果的內容。
這些分割註釋檔案可以在這裡下載:下載
下載後,將壓縮檔案放置在<env.data_dir>/vqa2/
目錄中。解壓縮該檔案應該會建立以下目錄結構:
vqa2/ reliable_vqa/ annotations/ imdb_val2014-dev.npy imdb_val2014-test.npy imdb_val2014-val.npy
若要原樣使用我們的配置文件,這些註釋檔案應放置在路徑<env.data_dir>/vqa2/reliable_vqa/annotations
下。否則,您將需要編輯配置和註釋檔案以符合您的路徑。例如,用於訓練 VQA 模型的配置中的資料集註解為:
dataset_config: vqa2_extended: annotations: train: - vqa2/defaults/annotations/imdb_train2014.npy val: - vqa2/reliable_vqa/annotations/imdb_val2014-dev.npy test: - vqa2/reliable_vqa/annotations/imdb_val2014-test.npy
而訓練選擇器的註解是:
dataset_config: vqa2_extended: annotations: train: - vqa2/reliable_vqa/annotations/imdb_val2014-dev.npy val: - vqa2/reliable_vqa/annotations/imdb_val2014-val.npy test: - vqa2/reliable_vqa/annotations/imdb_val2014-test.npy
為了訓練所有 VQA 模型,我們使用預先提取的特徵而不是圖像來提高速度和一致性。 Pythia、ViLBERT 和 VisualBERT 模型都使用可在透過 MMF 執行時自動下載的功能。然而,CLIP-ViL 使用 CLIP 的網格影像功能。我們提供了預先計算的特徵以及來自 CLIP-ViL 儲存庫的提取腳本的稍微調整版本,可用於獨立提取 CLIP 特徵。
下載功能(下載)及其更新的註釋檔案(下載)。重要提示:這些功能非常大(壓縮後約 150GB),下載可能需要很長時間。
解壓縮<env.data_dir>/vqa2/
中文件內的註釋,結果如下:
vqa2/ reliable_vqa-clip/ annotations/ imdb_train2014.npy imdb_val2014-dev.npy imdb_val2014-test.npy imdb_val2014-val.npy
將下載的功能放在註解目錄旁的目錄中:
vqa2/ reliable_vqa-clip/ annotations/ ... clip_features.tar.gz
解壓縮reliable_vqa-clip
目錄中的功能。您的目錄結構應鏡像 MMF 的:
vqa2/ reliable_vqa-clip/ annotations/ ... features/ train2014/ val2014/
[可選] 我們建議創建一個單獨的 conda 環境(使用 Python 3.7+)用於特徵提取。
複製 CLIP-ViL 儲存庫並依照其安裝/設定說明進行操作(即從 CLIP-ViL 提供的本機複製安裝 Detectron2)。請注意,無需在此儲存庫中克隆 CLIP-ViL 儲存庫。
下載 COCO train+val 2014 圖像和註釋,並將它們放在具有以下結構和路徑名的目錄中:
coco_2014/ annotations/ instances_train2014.json instances_val2014.json images/ train2014/ val2014/
將fixed_mcan_clip_grid_feature.py
複製/移動到CLIP-ViL儲存庫中的CLIP-ViL/CLIP-ViL-Direct/vqa
。
將CLIP-ViL/CLIP-ViL-Direct/vqa/configs/R-50-grid.yaml
中的OUTPUT_DIR
更改為所需的功能目錄(即<env.data_dir>/vqa2/reliable_vqa-clip/features
)。
在 train2014 映像上執行下列命令(重複使用coco_2014_val
在 val2014 映像上執行):
DETECTRON2_DATASETS=<PATH_TO_PARENT_DIR_OF_coco_2014> python fixed_mcan_clip_grid_feature.py --config-file configs/R-50-grid.yaml --dataset coco_2014_train --model_type RN50x4
您可以按照預先提取功能部分下載更新的註釋,也可以執行映射腳本來為 CLIP-ViL 建立更新的註釋檔案:
python clipvil_anns_conversion.py --input_dir <env.data_dir>/vqa2/reliable_vqa/annotations --output_dir <env.data_dir>/vqa2/reliable_vqa-clip/annotations
我們為論文中 4 個 VQA 模型和 3 個選擇函數的每種組合提供了經過訓練的模型檢查點。請注意,MaxProb 模型檢查點只是 VQA 模型。校準和選擇器選擇性預測器本身比 VQA 模型小得多,但為了方便起見,我們將 VQA 模型納入其相應的檢查點中。
請注意,MaxProb ViLBERT 和 VisualBERT 與 MMF 中的相同(經過預先訓練和微調),因此也可以透過 MMF 模型庫下載它們。從 MMF 模型動物園來看,ViLBERT 對應於vilbert.finetuned.vqa2.from_vqa2_train
,VisualBERT 對應於visual_bert.finetuned.vqa2.from_coco_train
。
最大機率 | 校準 | 選擇器 | |
---|---|---|---|
皮提亞 | 下載 | 下載 | 下載 |
維爾伯特 | MMF下載 | 下載 | 下載 |
視覺BERT | MMF下載 | 下載 | 下載 |
夾子ViL | 下載 | 下載 | 下載 |
在這裡,我們提供了用於訓練和評估模型的範例命令。這些範例使用 CLIP-ViL 模型(稱為movie_mcan
,這是對應的模型架構)。使用其他模型運行只需將config
更改為正確的路徑,並將model
參數更改為pythia
、 vilbert
、 visual_bert
或movie_mcan
之一(使用 MaxProb 時)或對模型使用select_*
*
使用校準或選擇器時,例如, select_visual_bert
)。請注意,CLIP-ViL 的註解檔案有所不同,因為使用了 CLIP 功能(例如,請參閱configs/experiments/movie_mcan/vqa2/defaults.yaml
),而所有其他模型都使用同一組註解文件,因此請務必使用正確的對應註解檔案和要素路徑。
所有命令都應從reliable_vqa
目錄運行,並在 MMF 命令列選項中設定env.user_dir=<PATH_TO_REPO>/reliable_vqa
(或等效地,在命令之前設定MMF_USER_DIR=$PWD
)。
訓練 VQA 模型:
mmf_run env.user_dir=<PATH_TO_REPO>/reliable_vqa env.data_dir=<YOUR_DATA_DIR> env.save_dir=<YOUR_MAXPROB_SAVE_DIR> dataset=vqa2_extended model=movie_mcan config=configs/experiments/movie_mcan/vqa2/defaults.yaml run_type=train_val
為 VQA 模型訓練學習的多模態選擇函數(Selector):
mmf_run env.user_dir=<PATH_TO_REPO>/reliable_vqa env.data_dir=<YOUR_DATA_DIR> env.save_dir=<YOUR_SELECTOR_SAVE_DIR> dataset=vqa2_extended model=select_movie_mcan config=configs/experiments/movie_mcan/vqa2/select_pred.yaml run_type=train_val checkpoint.resume_pretrained=True checkpoint.resume_file=<YOUR_MAXPROB_SAVE_DIR>/best.ckpt
checkpoint.resume_file
選項也可以是上面下載的model.pth
檔案之一。另外,最好確保 MaxProb 和 Selector 的env.save_dir
不同。否則,它們將互相覆蓋。
對於 ViLBERT 和 VisualBERT,我們利用 MMF 提供的已在 VQA v2 上微調的模型。這些用作 ViLBERT 和 VisualBERT 的 MaxProb 選擇性模型。要使用 ViLBERT 或 VisualBERT 訓練選擇器,您應該提供從模型動物園(或上面的連結)下載的 MMF 模型.pth
檔案的checkpoint.resume_file
路徑:
mmf_run env.user_dir=<PATH_TO_REPO>/reliable_vqa env.data_dir=<YOUR_DATA_DIR> env.save_dir=<YOUR_SELECTOR_SAVE_DIR> dataset=vqa2_extended model=select_visual_bert config=configs/experiments/visual_bert/vqa2/select_pred.yaml run_type=train_val checkpoint.resume_pretrained=True checkpoint.resume_file=<YOUR_MMF_MODEL_SAVE_DIR>/visual_bert.finetuned.vqa2.from_coco_train/model.pth
我們首先對驗證集和測試集進行預測,然後使用評估腳本對其進行評估。
若要取得預測,請將執行類型變更為 test ( run_type=test
),新增參數evaluation.predict=True
,並將設定中的test
註解路徑替換為要取得預測的註解路徑(例如, vqa2/reliable_vqa/annotations/imdb_val2014-test.npy
、 vqa2/reliable_vqa/annotations/imdb_val2014-val.npy
):
mmf_run env.user_dir=<PATH_TO_REPO>/reliable_vqa env.data_dir=<YOUR_DATA_DIR> env.save_dir=<YOUR_RESULT_SAVE_DIR> dataset=vqa2_extended model=select_movie_mcan config=configs/experiments/movie_mcan/vqa2/select_pred.yaml run_type=test evaluation.predict=True checkpoint.resume=True checkpoint.resume_file=<YOUR_SELECTOR_SAVE_DIR>/best.ckpt dataset_config.vqa2_extended.annotations.test=vqa2/reliable_vqa-clip/annotations/imdb_val2014-test.npy
要使用 MaxProb 從 ViLBERT 和 VisualBERT 取得預測,您也可以簡單地使用這些模型的 Zoo 版本:
mmf_run env.user_dir=<PATH_TO_REPO>/reliable_vqa env.data_dir=<YOUR_DATA_DIR> env.save_dir=<YOUR_RESULT_SAVE_DIR> dataset=vqa2_extended model=visual_bert config=configs/experiments/visual_bert/vqa2/defaults.yaml run_type=test evaluation.predict=True checkpoint.resume=True checkpoint.resume_zoo=visual_bert.finetuned.vqa2.from_coco_train dataset_config.vqa2_extended.annotations.test=vqa2/reliable_vqa-clip/annotations/imdb_val2014-test.npy
這將在env.save_dir
中產生一個 JSON 檔案(與 VQA v2 結果格式類似的格式),其中包含我們用於評估的模型答案和置信度。使用imdb_val2014-val.npy
作為測試集重複此操作,以獲得用於選擇閾值的 val 資料結果。
接下來,我們使用獨立的評估腳本來取得評估指標,該腳本接受原始 VQA v2 問題和註釋 JSON 作為參考:
python eval_scripts/run.py --questions <PATH>/v2_OpenEnded_mscoco_val2014_questions.json --annotations <PATH/v2_mscoco_val2014_annotations.json --predictions <RESULTS_ON_TEST_DATA>.json --threshold_predictions <RESULTS_ON_VAL_DATA>.json
此指令將輸出VQA 準確度、覆蓋率@風險、風險覆蓋率曲線的AUC和有效可靠性。請注意,由於這使用原始 VQA v2 註釋和與 VQA 結果格式類似的格式,因此該評估腳本應該透過在預測中提供額外的confidence
欄位來與此儲存庫之外的模型的預測相容。
我們要感謝 MMF 的創建者的開源實作。我們感謝 Shen Shen 和《CLIP 對視覺和語言任務有多大好處?為提取特徵、重現模型以及發布程式碼提供協助。我們也感謝艾西瓦婭·阿格拉瓦爾 (Aishwarya Agrawal) 對評估的意見。最後,我們感謝 Grace Luo 對 MMF 的早期幫助。
大多數Reliable VQA 均在CC-BY-NC 下獲得許可(有關詳細信息,請參閱許可證),但是,fixed_mcan_clip_grid_feature.py 是根據https://github.com/clip-vil/CLIP-ViL 中的mcan_clip_grid_feature .py 腳本修改的/tree/master/CLIP-ViL-Direct/vqa,已獲得Apache 2.0 許可證和eval_scripts/vqa.py 以及eval_scripts/reliable_vqa_eval.py 的許可,這些文件是從https://vqa.py和vqaEval.py 修改而來的/github.com/GT-Vision-Lab/VQA,根據 BSD 2-Clause 許可證獲得許可。