[CVPR2023亮点] 侧边适配器网络用于开放词汇语义分割
[PAMI] SAN: 侧边适配器网络用于开放词汇语义分割
这是我们会议论文"侧边适配器网络用于开放词汇语义分割"(主分支)和期刊论文"SAN: 侧边适配器网络用于开放词汇语义分割"(视频分支)的官方实现。
简介
本文提出了一种基于预训练视觉-语言模型的开放词汇语义分割新框架,称为侧边适配器网络(SAN)。我们的方法将语义分割任务建模为区域识别问题。一个侧边网络被附加到冻结的CLIP模型上,包含两个分支:一个用于预测掩码提案,另一个用于预测注意力偏置,应用于CLIP模型以识别掩码的类别。这种解耦设计有利于CLIP识别掩码提案的类别。由于附加的侧边网络可以重用CLIP特征,因此可以非常轻量。此外,整个网络可以端到端训练,允许侧边网络适应冻结的CLIP模型,使预测的掩码提案具有CLIP感知能力。
我们的方法快速、准确,并且只增加了少量额外的可训练参数。我们在多个语义分割基准上评估了我们的方法。与其他对手相比,我们的方法显著优于其他方法,可训练参数减少了18倍,推理速度提高了19倍。
目录
演示
- 在🤗HuggingFace上运行演示应用。(它在低配置机器上运行,可能会很慢)
- 使用Docker运行演示应用。
docker build docker/app.Docker -t san_app docker run -it --shm-size 4G -p 7860:7860 san_app
安装
- 克隆仓库
git clone https://github.com/MendelXu/SAN.git
- 进入项目目录
cd SAN
- 安装依赖
提示:您可以在 Docker 中运行任务,而不是在本地安装依赖。 使用预构建的 Docker 运行:bash install.sh
或使用提供的 dockerfiledocker run -it --gpus all --shm-size 8G mendelxu/pytorch:d2_nvcr_2008 /bin/bash
docker/Dcokerfile
构建您自己的 Docker。
数据准备
参考 SimSeg。数据应按以下方式组织:
datasets/
coco/
...
train2017/
val2017/
stuffthingmaps_detectron2/
VOC2012/
...
images_detectron2/
annotations_detectron2/
pcontext/
...
val/
pcontext_full/
...
val/
ADEChallengeData2016/
...
images/
annotations_detectron2/
ADE20K_2021_17_01/
...
images/
annotations_detectron2/
提示 在代码中,这些数据集以相关的数据集名称注册。关系如下:
coco_2017_*_stuff_sem_seg : COCO Stuff-171
voc_sem_seg_*: Pascal VOC-20
pcontext_sem_seg_*: Pascal Context-59
ade20k_sem_seg_*: ADE-150
pcontext_full_sem_seg_*: Pascal Context-459
ade20k_full_sem_seg_*: ADE-847
使用方法
-
预训练权重
模型 配置 权重 日志 SAN-ViT-B/16 configs/san_clip_vit_res4_coco.yaml Huggingface 日志 SAN-ViT-L/14 configs/san_clip_vit_large_res4_coco.yaml Huggingface 日志 -
评估
- 在所有数据集的验证集上评估训练好的模型。
python train_net.py --eval-only --config-file <配置文件> --num-gpus <GPU数量> OUTPUT_DIR <输出路径> MODEL.WEIGHTS <训练好的模型路径>
例如,评估我们预训练的模型:
# 1. 从 https://huggingface.co/Mendel192/san/blob/main/san_vit_b_16.pth 下载 SAN (ViT-B/16 CLIP)。 # 2. 将其放在 `output/model.pth`。 # 3. 评估 python train_net.py --eval-only --config-file configs/san_clip_vit_res4_coco.yaml --num-gpus 8 OUTPUT_DIR ./output/trained_vit_b16 MODEL.WEIGHTS output/model.pth
- 在一个数据集的验证集上评估训练好的模型。
python train_net.py --eval-only --config-file <配置文件> --num-gpus <GPU数量> OUTPUT_DIR <输出路径> MODEL.WEIGHTS <训练好的模型路径> DATASETS.TEST "('<填写数据集名称>',)"
-
可视化
python visualize_json_results.py --input <JSON结果> --output <保存可视化结果的位置> --dataset <数据集> # 示例: # 生成结果。 # python train_net.py --eval-only --config-file configs/san_clip_vit_res4_coco.yaml --num-gpus 1 OUTPUT_DIR ./output/trained_vit_b16 MODEL.WEIGHTS output/san/san_vit_b_16.pth DATASETS.TEST '("pcontext_sem_seg_val",)' # 可视化 # python visualize_json_results.py --input output/trained_vit_b16/inference/sem_seg_predictions.json --output output/viz --dataset pcontext_sem_seg_val
-
训练
wandb off # [可选] 如果您想将训练日志记录到 wandb。 # wandb login # wandb on python train_net.py --config-file <配置文件> --num-gpus <GPU数量> OUTPUT_DIR <输出路径> WANDB.NAME <WANDB日志名称>
提示:我们使用
<>
表示您应根据自己的设置替换的变量。
常见问题
如果您发现在 GitHub 上很难及时得到作者的回复,请直接发送电子邮件至 [shea.mendel] [AT] [gmail.com]。
许可证
在MIT许可证下分发。有关更多信息,请参阅LICENSE文件。
引用
如果您觉得有帮助,可以在您的工作中引用我们的论文。
@proceedings{xu2023side,
title={用于开放词汇语义分割的侧面适配器网络},
author={徐梦德, 张政, 魏方韵, 胡瀚, 白翔},
journal={CVPR},
year={2023}
}