Esta é a implementação do artigo ECCV 2022 Resposta visual confiável a perguntas: abster-se em vez de responder incorretamente. Se você achar nosso artigo ou este repositório útil para seu próprio trabalho, cite:
@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}
}
Este repositório usa PyTorch e é construído sobre MMF. Ele contém o seguinte:
Atualização: a versão anterior deste repositório usou involuntariamente as respostas verdadeiras padrão no MMF no campo answers
que tem respostas de referência ligeiramente diferentes (por exemplo, ele substitui algumas entradas se elas não estiverem no vocabulário de 3k respostas). Portanto, fornecemos um script de avaliação independente (eval_scripts/) que usa as anotações originais do VQA v2 como referências para avaliações. Esta atualização está refletida na versão arXiv (consulte Changelog no apêndice) e trabalhos futuros devem usar as avaliações atualizadas para relatar resultados.
As pastas neste repositório estão estruturadas da seguinte forma:
configs/
:experiments/
contém configurações YAML para treinar cada um dos modelos VQA e funções de seleção correspondentes.datasets/
contém a configuração YAML para o conjunto de dados vqa2_extended
personalizado.datasets/
: contém a implementação e o construtor do conjunto de dados para vqa2_extended
. Este conjunto de dados é igual ao VQA v2 no MMF, mas também suporta saídas adicionais de confiança do modelo para as funções de seleção e anotações de múltipla escolha para avaliação de calibração.eval_scripts/
: contém scripts de avaliação para calcular cobertura de risco e métricas de confiabilidade efetiva no artigo.reliable_vqa_eval.py
: contém um objeto avaliador que calcula as diferentes métricas.run.py
: script para executar as avaliações dadas as previsões do modelo e as anotações verdadeiras.vqa.py
: contém um objeto para interface com as anotações e previsões do VQA v2.models/
: para cada modelo VQA em nossos experimentos, registramos uma versão no topo do modelo original que retorna confiança adicional e resultados de recursos intermediários necessários para as funções de seleção.selective_predictors.py
contém implementações para modelos de calibração e seletor.modules/
:losses.py
contém a função de perda de previsão de correção para modelos de seletor aprendidos.metrics.py
contém implementações das métricas de cobertura de risco e confiabilidade efetiva no MMF para validação.__init__.py
: importa componentes MMF personalizados para serem usados pelo MMF. Siga as instruções de instalação do MMF aqui: https://mmf.sh/docs/. Recomendamos instalar a partir da fonte. Observe que ao instalar a partir do código-fonte, você não precisa clonar o repositório MMF neste repositório. Você pode simplesmente clonar o MMF em seu próprio diretório. Também recomendamos o uso de um ambiente conda para instalação e execução, que pode ser usado tanto para MMF quanto para este repositório.
Após a instalação do MMF, seu ambiente deve ter Python 3.7+ e PyTorch 1.6+ instalados. Você também precisará do scikit-learn 1.0+ e do pandas 1.3.4+.
DR: Usamos o conjunto de dados VQA v2. Dividimos o conjunto de validação VQA v2 em 3 partes e fornecemos as anotações abaixo. Também extraímos recursos de grade personalizados para o modelo CLIP-ViL, fornecidos abaixo. Todas as outras anotações e recursos são baixados automaticamente pelo MMF, conforme especificado por cada uma das configurações neste repositório.
Primeiro, baixe a pergunta de validação VQA v2 original e os arquivos JSON de anotação de resposta aqui: https://visualqa.org/download.html. Eles serão usados para as avaliações.
Ao executar o MMF com um de nossos arquivos de configuração pela primeira vez, o MMF deverá baixar automaticamente os recursos e anotações do VQA v2. Esses diretórios/arquivos serão armazenados em $MMF_DATA_DIR
( env.data_dir
) em um diretório vqa2
. Consulte MMF para obter mais detalhes sobre isso. Recomendamos começar executando Pythia+MaxProb por meio deste repositório, que fará download das anotações e recursos usados para Pythia, ViLBERT e VisualBERT (consulte Treinamento para obter detalhes)
Também recomendamos salvar nossas divisões de validação e recursos CLIP (descritos nas próximas seções) nesses diretórios, e a configuração a seguir pressupõe que este seja o caso. Se você decidir estruturar seus diretórios de maneira diferente, precisará atualizar seu caminho de configuração, etc.
O conjunto de treinamento VQA v2 padrão é usado para treinar modelos VQA. No entanto, como as anotações de resposta não estão disponíveis para as divisões test-dev e test-std VQA v2, dividimos o conjunto de validação VQA v2 em 3 conjuntos separados (ou seja, nenhuma imagem ou pergunta é compartilhada) para fins de avaliação:
dev
: conjunto de validação para o treinamento do modelo VQA e conjunto de treinamento para os preditores seletivos.val
: conjunto de validação para os preditores seletivos.test
: conjunto de testes para todos os modelos e quais resultados relatamos em nosso artigo.Esses arquivos de anotação dividida podem ser baixados aqui: download
Após o download, coloque o arquivo compactado no diretório
. A descompactação do arquivo deverá configurar a seguinte estrutura de diretórios:
vqa2/
reliable_vqa/
annotations/
imdb_val2014-dev.npy
imdb_val2014-test.npy
imdb_val2014-val.npy
Para usar nossos arquivos de configuração como estão, esses arquivos de anotação devem ser colocados no caminho
. Caso contrário, você precisará editar os arquivos de configuração e anotação para corresponder aos seus caminhos. Por exemplo, as anotações do conjunto de dados em uma configuração para treinar um modelo VQA são:
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
Considerando que as anotações para treinar um Seletor são:
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
Para treinar todos os modelos VQA, usamos recursos pré-extraídos em vez de imagens para velocidade e consistência. Todos os modelos Pythia, ViLBERT e VisualBERT usam recursos que podem ser baixados automaticamente ao serem executados via MMF. No entanto, o CLIP-ViL usa recursos de imagem de grade do CLIP. Fornecemos nossos recursos pré-computados, bem como uma versão ligeiramente ajustada do script de extração do repositório CLIP-ViL que pode ser usado para extrair recursos CLIP de forma independente.
/vqa2/
, o que resulta: 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
. Sua estrutura de diretórios deve espelhar os MMFs: vqa2/
reliable_vqa-clip/
annotations/
...
features/
train2014/
val2014/
coco_2014/
annotations/
instances_train2014.json
instances_val2014.json
images/
train2014/
val2014/
fixed_mcan_clip_grid_feature.py
para CLIP-ViL/CLIP-ViL-Direct/vqa
no repositório CLIP-ViL.OUTPUT_DIR
em CLIP-ViL/CLIP-ViL-Direct/vqa/configs/R-50-grid.yaml
para o diretório desejado para os recursos (ou seja, /vqa2/reliable_vqa-clip/features
).coco_2014_val
para executar nas imagens val2014): DETECTRON2_DATASETS= python fixed_mcan_clip_grid_feature.py --config-file configs/R-50-grid.yaml --dataset coco_2014_train --model_type RN50x4
python clipvil_anns_conversion.py --input_dir /vqa2/reliable_vqa/annotations --output_dir /vqa2/reliable_vqa-clip/annotations
Fornecemos pontos de verificação de modelo treinado para cada combinação dos 4 modelos VQA e 3 funções de seleção em nosso artigo. Observe que os pontos de verificação do modelo MaxProb são simplesmente os modelos VQA. Os próprios preditores seletivos de Calibração e Seletor são muito menores que os modelos VQA, mas incluímos o modelo VQA em seus pontos de verificação correspondentes por conveniência.
Observe que MaxProb ViLBERT e VisualBERT são iguais aos do MMF (pré-treinados e ajustados), portanto, também podem ser baixados por meio do zoológico modelo MMF. Do zoológico modelo MMF, ViLBERT corresponde a vilbert.finetuned.vqa2.from_vqa2_train
e VisualBERT corresponde a visual_bert.finetuned.vqa2.from_coco_train
.
MaxProb | Calibração | Seletor | |
---|---|---|---|
Pítia | download | download | download |
ViLBERT | Baixar MMF | download | download |
VisualBERT | Baixar MMF | download | download |
CLIP-ViL | download | download | download |
Aqui, fornecemos exemplos de comandos para treinar e avaliar modelos. Esses exemplos usam o modelo CLIP-ViL (referido como movie_mcan
, que é a arquitetura do modelo correspondente). A execução com outros modelos envolve simplesmente alterar a config
para o caminho correto e alterar o argumento model
para pythia
, vilbert
, visual_bert
ou movie_mcan
(ao usar MaxProb) ou usar select_*
para um modelo *
(ao usar Calibration ou um Seletor, por exemplo, select_visual_bert
). Observe que os arquivos de anotação para CLIP-ViL são diferentes porque os recursos CLIP são usados (consulte, por exemplo, configs/experiments/movie_mcan/vqa2/defaults.yaml
), enquanto todos os outros modelos usam o mesmo conjunto de arquivos de anotação, portanto, certifique-se de use os arquivos de anotação e caminhos de recursos correspondentes corretos.
Todos os comandos devem ser executados a partir do diretório reliable_vqa
e definidos env.user_dir=
nas opções de linha de comando do MMF (ou, equivalentemente, MMF_USER_DIR=$PWD
antes do comando).
Para treinar um modelo VQA:
mmf_run env.user_dir=/reliable_vqa env.data_dir= env.save_dir= dataset=vqa2_extended model=movie_mcan config=configs/experiments/movie_mcan/vqa2/defaults.yaml run_type=train_val
Para treinar uma função de seleção multimodal aprendida (Seletor) para o modelo VQA:
mmf_run env.user_dir=/reliable_vqa env.data_dir= env.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=/best.ckpt
A opção checkpoint.resume_file
também pode ser um dos arquivos model.pth
baixados acima. Além disso, é melhor certificar-se de que env.save_dir
para MaxProb e Selector sejam diferentes. Caso contrário, eles substituirão um ao outro.
Para ViLBERT e VisualBERT, utilizamos os modelos já ajustados no VQA v2 fornecidos pelo MMF. Eles servem como nossos modelos seletivos MaxProb para ViLBERT e VisualBERT. Para treinar o seletor com ViLBERT ou VisualBERT, você deve fornecer o caminho checkpoint.resume_file
para o arquivo .pth
do modelo MMF baixado do zoológico modelo (ou no link acima):
mmf_run env.user_dir=/reliable_vqa env.data_dir= env.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=/visual_bert.finetuned.vqa2.from_coco_train/model.pth
Primeiro fazemos previsões nos conjuntos val e test e depois os avaliamos usando os scripts de avaliação.
Para obter previsões, altere o tipo de execução para test ( run_type=test
), adicione o argumento evaluation.predict=True
e substitua o caminho de anotação test
na configuração pelo das anotações para obter previsões (por exemplo, vqa2/reliable_vqa/annotations/imdb_val2014-test.npy
, vqa2/reliable_vqa/annotations/imdb_val2014-val.npy
):
mmf_run env.user_dir=/reliable_vqa env.data_dir= env.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=/best.ckpt dataset_config.vqa2_extended.annotations.test=vqa2/reliable_vqa-clip/annotations/imdb_val2014-test.npy
Para obter previsões de ViLBERT e VisualBERT com MaxProb, você também pode simplesmente usar as versões do zoológico modelo destes:
mmf_run env.user_dir=/reliable_vqa env.data_dir= env.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
Isso produzirá um arquivo JSON (formato semelhante ao formato de resultado VQA v2) dentro de env.save_dir
contendo as respostas e confidências do modelo que usamos para avaliar. Repita isso usando imdb_val2014-val.npy
como conjunto de teste para obter resultados nos dados val para escolher limites.
Em seguida, usamos um script de avaliação independente para obter as métricas de avaliação, que aceita a pergunta original do VQA v2 e os JSONs de anotação como referências:
python eval_scripts/run.py
--questions /v2_OpenEnded_mscoco_val2014_questions.json
--annotations .json
--threshold_predictions .json
Este comando produzirá precisão VQA , cobertura@risco , AUC para a curva de cobertura de risco e Confiabilidade Efetiva . Observe que, como isso usa as anotações originais do VQA v2 e um formato semelhante ao formato de resultado do VQA, esse script de avaliação deve ser compatível com previsões de modelos fora deste repositório, simplesmente fornecendo um campo confidence
extra nas previsões.
Gostaríamos de agradecer aos criadores do MMF pelas suas implementações de código aberto. Agradecemos a Sheng Shen e aos autores de Quanto o CLIP pode beneficiar as tarefas de visão e linguagem? por fornecer assistência na extração de recursos e reprodução de seu modelo, bem como na liberação de seu código. Agradecemos também a Aishwarya Agrawal pela contribuição nas avaliações. Por último, agradecemos a Grace Luo pela assistência inicial ao MMF.
A maioria do Reliable VQA é licenciada sob CC-BY-NC (consulte LICENSE para obter detalhes), no entanto, Fixed_mcan_clip_grid_feature.py, que é modificado a partir do script mcan_clip_grid_feature.py em https://github.com/clip-vil/CLIP-ViL /tree/master/CLIP-ViL-Direct/vqa, está licenciado sob a licença Apache 2.0 e eval_scripts/vqa.py, bem como eval_scripts/reliable_vqa_eval.py, que são modificados de vqa.py e vqaEval.py em https://github.com/GT-Vision-Lab/VQA, são licenciados sob a BSD 2-Clause Licença.