該存儲庫是 INTR 的官方實現:用於細粒度圖像分類和分析的簡單可解釋轉換器。它目前包括用於解釋細粒度資料的程式碼和模型。當本文在線上發佈時,我們將提供即將到來的 ICLR 2024 會議記錄的連結。
INTR 是 Transformer 的新穎用法,使影像分類變得可解釋。在 INTR 中,我們研究了一種主動的分類方法,要求每個類別在圖像中尋找自己。我們學習特定於類別的查詢(每個類別一個)作為解碼器的輸入,使它們能夠透過交叉注意來尋找圖像中的存在。我們表明,INTR 本質上鼓勵每個班級以不同的方式參加;因此,交叉注意力權重為模型的預測提供了有意義的解釋。有趣的是,透過多頭交叉注意力,INTR 可以學習定位一個類別的不同屬性,使其特別適合細粒度的分類和分析。
在INTR模型中,解碼器中的每個查詢負責一個類別的預測。因此,查詢會查看自身以從特徵圖中尋找特定於類別的特徵。首先,我們視覺化特徵圖,即 Transformer 架構的值矩陣,以查看影像中物件的重要部分。為了找到模型在值矩陣中關注的特定特徵,我們顯示了模型關注的熱圖。為了避免分類中的外部幹擾,我們使用共享權重向量進行分類,因此註意力權重解釋了模型的預測。
DETR-R50 主幹上的 INTR、分類性能以及不同資料集上的微調模型。
數據集 | 帳戶@1 | ACC@5 | 模型 |
---|---|---|---|
幼獸 | 71.8 | 89.3 | 檢查點下載 |
鳥 | 97.4 | 99.2 | 檢查點下載 |
蝴蝶 | 95.0 | 98.3 | 檢查點下載 |
建立python環境(可選)
conda create -n intr python=3.8 -y
conda activate intr
克隆儲存庫
git clone https://github.com/dipanjyoti/INTR.git
cd INTR
安裝python依賴項
pip install -r requirements.txt
請遵循以下資料格式。
datasets
├── dataset_name
│ ├── train
│ │ ├── class1
│ │ │ ├── img1.jpeg
│ │ │ ├── img2.jpeg
│ │ │ └── ...
│ │ ├── class2
│ │ │ ├── img3.jpeg
│ │ │ └── ...
│ │ └── ...
│ └── val
│ ├── class1
│ │ ├── img4.jpeg
│ │ ├── img5.jpeg
│ │ └── ...
│ ├── class2
│ │ ├── img6.jpeg
│ │ └── ...
│ └── ...
若要評估 INTR 在CUB資料集上的效能,請在多 GPU(例如 4 個 GPU)設定上執行下列命令。 INTR 檢查點可在微調模型和結果中使用。
CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 --master_port 12345 --use_env main.py --eval --resume < path/to/intr_checkpoint_cub_detr_r50.pth > --dataset_path < path/to/datasets > --dataset_name < dataset_name >
若要產生 INTR 解釋的視覺表示,請執行下面提供的指令。此命令將顯示索引為
python -m tools.visualization --eval --resume < path/to/intr_checkpoint_cub_detr_r50.pth > --dataset_path < path/to/datasets > --dataset_name < dataset_name > --class_index < class_number >
推理時間單一影像預測和視覺化:我們還提供了 Jupyter Notebook demo.ipynb,專為推理過程中的單一影像預測和視覺化而設計。請注意,該演示主要針對 CUB 資料集。
要準備 INTR 進行訓練,請使用預訓練模型 DETR-R50。要訓練特定資料集,請修改“--num_queries”,將其設定為資料集中的類別數。在 INTR 架構中,解碼器中的每個查詢都被分配了捕獲特定於類別的特徵的任務,這意味著每個查詢都可以透過學習過程進行調整。因此,模型參數的總數將與資料集中的類別數量成比例增長。若要在多 GPU 系統(例如 4 個 GPU)上訓練 INTR,請執行下列指令。
CUDA_VISIBLE_DEVICES=0,1,2,3 python -m torch.distributed.launch --nproc_per_node=4 --master_port 12345 --use_env main.py --finetune < path/to/detr-r50-e632da11.pth > --dataset_path < path/to/datasets > --dataset_name < dataset_name > --num_queries < num_of_classes >
我們的模型受到 DEtection TRansformer (DETR) 方法的啟發。
我們感謝 DETR 的作者所做的如此出色的工作。
如果您發現我們的工作對您的研究有幫助,請考慮引用 BibTeX 條目。
@inproceedings{paul2024simple,
title={A Simple Interpretable Transformer for Fine-Grained Image Classification and Analysis},
author={Paul, Dipanjyoti and Chowdhury, Arpita and Xiong, Xinqi and Chang, Feng-Ju and Carlyn, David and Stevens, Samuel and Provost, Kaiya and Karpatne, Anuj and Carstens, Bryan and Rubenstein, Daniel and Stewart, Charles and Berger-Wolf, Tanya and Su, Yu and Chao, Wei-Lun},
booktitle={International Conference on Learning Representations},
year={2024}
}