RegionCLIP: Region-based Language-Image Pretraining
文章目录
这是 RegionCLIP (CVPR 2022) 的官方 PyTorch 实现。本人在学习时也需要经常查看这个文献,放在这里供有需要的人参考,仅供学习使用。
Paper | Demo on Hugging Face | Slides | Github
RegionCLIP: Region-based Language-Image Pretraining (CVPR 2022)
Yiwu Zhong, Jianwei Yang, Pengchuan Zhang, Chunyuan Li, Noel Codella, Liunian Li, Luowei Zhou, Xiyang Dai, Lu Yuan, Yin Li, and Jianfeng Gao
概述
我们提出的 RegionCLIP 对 CLIP 进行了大幅扩展,以学习区域级视觉表征。RegionCLIP 可实现图像区域与文本概念之间的精细对齐,从而支持基于区域的推理任务,包括零镜头对象检测和开放词汇对象检测。
- Pretraining: 我们利用 CLIP 模型将图像区域与模板标题相匹配,然后对模型进行预训练,以对齐这些区域-文本对。
- Zero-shot inference: 经过预训练后,学习到的区域表征就能支持物体检测的零点推理。
- Transfer learning: 学习到的 RegionCLIP 模型可通过附加的对象检测注释进一步微调,从而使我们的模型可用于完全监督或开放词汇的对象检测。
- Results: 我们的方法在零镜头物体检测和开放词汇物体检测方面取得了SOTA成果。
更新
💥 [10/05/2022] RegionCLIP 现在不仅支持 resnet,还支持许多视觉转换器(如 vit、swin、davit、focalnet),用于零镜头对象检测!请查看 zero-shot branch!
- [09/23/2022] 应研究人员的要求, 我们发布 了预训练的configs 和scripts . 完整的教程和预培训数据将于稍后发布。敬请期待!
- [09/18/2022] Organizing ECCV Workshop Computer Vision in the Wild (CVinW), 其中有两项挑战,分别是评估预训练视觉模型在下游任务中的零镜头、少镜头和全镜头性能:
- Image Classification in the Wild (ICinW) 挑战赛对 20 项图像分类任务进行评估。
- Object Detection in the Wild (ODinW) 挑战赛对 35 项物体检测任务进行了评估。
- [07/11/2022] 我们提供了概念特征提取脚本。它可用于您自己的成本计算概念池!
- [07/07/2022] 我们提供了用于提取区域特征的脚本。提取的视觉特征可用于各种下游任务!
- [06/24/2022] 我们发布了 a Web demo using Gradio on Hugging Face. 它使用我们预训练的 RegionCLIP 进行零点推理。快来看看吧
- [06/20/2022] 我们发布了 RegionCLIP 的模型和推理代码!
Installation
安装说明查看文件docs文件夹下的INSTALL.md
.
Datasets
准备数据集的方式查看datasets文件夹下的README.md
Model Zoo
获取已经训练好的模型请查看docs文件夹下的 MODEL_ZOO.md
Zero-shot Inference
经过预训练后,RegionCLIP 可以直接支持具有挑战性的零镜头物体检测任务,而无需对检测注释进行微调。给定一幅输入图像,我们经过预训练的RegionCLIP可以将图像区域特征与物体概念嵌入相匹配,从而将图像区域识别为多种物体类别。图像区域由区域定位器(如 RPN)生成,其中的物体类别名称来自用户指定的字典。
自定义图像的可视化Visualization on custom images
下面我们将举例说明在自定义图像上使用预训练的 RegionCLIP 进行零镜头物体检测以及结果的可视化。
检测物体前,请准备好预训练模型、标签文件和自定义图像。详见下文。- Check
MODEL_ZOO.md
to- 下载预训练模型
regionclip_pretrained-cc_rn50x4.pth
(使用ResNet50x4训练的RegionCLIP) 于文件夹下./pretrained_ckpt/regionclip
. - 下载类嵌入
lvis_1203_cls_emb_rn50x4.pth
到文件夹下./pretrained_ckpt/concept_emb
.
- 下载预训练模型
- 查看
datasets/README.md
去下载 LVIS label 文件lvis_v1_val.json
并放到这个文件夹下./datasets/lvis/lvis_v1_val.json
. 该文件用于指定对象类名称。 - 将所有自定义图片放入文件夹
./datasets/custom_images/
.
python3 ./tools/train_net.py \
--eval-only \
--num-gpus 1 \
--config-file ./configs/LVISv1-InstanceSegmentation/CLIP_fast_rcnn_R_50_C4_custom_img.yaml \
MODEL.WEIGHTS ./pretrained_ckpt/regionclip/regionclip_pretrained-cc_rn50x4.pth \
MODEL.CLIP.TEXT_EMB_PATH ./pretrained_ckpt/concept_emb/lvis_1203_cls_emb_rn50x4.pth \
MODEL.CLIP.OFFLINE_RPN_CONFIG ./configs/LVISv1-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml \
MODEL.CLIP.TEXT_EMB_DIM 640 \
MODEL.RESNETS.DEPTH 200 \
MODEL.ROI_BOX_HEAD.POOLER_RESOLUTION 18 \
检测结果将存储为文件"./output/inference/lvis_instances_results.json"。要查看结果,请运行下面的脚本。
python ./tools/visualize_json_results.py \
--input ./output/inference/lvis_instances_results.json \
--output ./output/regions \
--dataset lvis_v1_val_custom_img \
--conf-threshold 0.05 \
--show-unique-boxes \
--max-boxes 25 \
--small-region-px 8100\
可视化图像将放置在 ./output/regions/
。可视化图像的如下.
在本例中,检测结果来自我们采用 ResNet50x4 架构预训练的 RegionCLIP。区域是由 LVIS 数据集中 866 个对象类别训练的 RPN 提出的。现在,我们使用 LVIS 数据集中的 1203 个对象类别名称来制作这个可视化示例。我们还在
visualize_zeroshot_inference.sh
中提供了一个使用预训练的 RegionCLIP(ResNet50 架构)的示例。
Evaluation for zero-shot inference, zero-shot的评估
下面我们将举例说明如何使用 COCO 数据集上的地面实况框评估我们预训练的 RegionCLIP (ResNet50)。这将再现本文表 4 中的结果。
评估前,请准备预训练模型并设置数据集。- 查看
MODEL_ZOO.md
中下面的部分:- 下载预训练的RegionCLIP checkpoint
regionclip_pretrained-cc_rn50.pth
到文件夹./pretrained_ckpt/regionclip
下面. - 下载类别嵌入文件
coco_65_cls_emb.pth
到文件夹trained_ckpt/concept_emb
下面.
- 下载预训练的RegionCLIP checkpoint
- 查阅sets/README.md`](datasets/README.md) 设置COCO数据集.
python3 ./tools/train_net.py \
--eval-only \
--num-gpus 1 \
--config-file ./configs/COCO-InstanceSegmentation/CLIP_fast_rcnn_R_50_C4_ovd_zsinf.yaml \
MODEL.WEIGHTS ./pretrained_ckpt/regionclip/regionclip_pretrained-cc_rn50.pth \
MODEL.CLIP.TEXT_EMB_PATH ./pretrained_ckpt/concept_emb/coco_65_cls_emb.pth \
MODEL.CLIP.CROP_REGION_TYPE GT \
MODEL.CLIP.MULTIPLY_RPN_SCORE False \
有关更多示例,请参阅test_zeroshot_inference.sh
。该脚本涵盖了多种预训练模型(ResNet50、ResNet50x4)、数据集(COCO、LVIS)和区域建议类型(地面实况区域、RPN 建议)。此外,请参阅 MODEL_ZOO.md了解可用的训练模型,以及 datasets/README.md
了解 COCO 和 LVIS 数据集的设置。
Transfer Learning(迁移学习)
如果有了人类对物体的注释,我们的预训练区域CLIP就可以进一步微调。在这种迁移学习设置中,我们展示了开放词汇对象检测的结果,其中对象检测器在基础类别上进行训练,并在基础和**新颖类别上进行评估。
我们还展示了在自定义图像上运行训练有素的检测器的示例。此外,我们还提供了开放词汇对象检测基准的训练和评估脚本,包括 COCO 和 LVIS 数据集(论文中的表 1 和表 2)。
Visualization on custom images(自定义图像的可视化)
下面我们提供了一个示例,用于在自定义图像上运行训练有素的开放词汇对象检测器,并将结果可视化。在这个示例中,检测器使用 RegionCLIP (RN50x4)进行初始化,在 866 个 LVIS 基本类别上进行训练,任务是检测 LVIS 上的所有 1203 个类别。
检测物体前,请准备好训练好的检测器、标签文件和自定义图像。- 查看文件
MODEL_ZOO.md
- 下载训练好的检测器checkpoint
regionclip_finetuned-lvis_rn50x4.pth
到文件夹下./pretrained_ckpt/regionclip
. - 下载训练好的 RPN checkpoint
rpn_lvis_866_lsj.pth
到文件夹下./pretrained_ckpt/rpn
. - 下载类别嵌入
lvis_1203_cls_emb_rn50x4.pth
到文件夹下./pretrained_ckpt/concept_emb
.
- 下载训练好的检测器checkpoint
- 参考
datasets/README.md
下载 label 文件lvis_v1_val.json
放到文件夹下./datasets/lvis/lvis_v1_val.json
. - 将所有自定义图片放入文件夹
./datasets/custom_images/
.
# for simplicity, we integrate the script in visualize_transfer_learning.sh
bash visualize_transfer_learning.sh
可视化图像将放置在 ./output/regions/
.
Evaluate the trained detectors(评估训练好的检测器)
下面我们提供一个示例来评估我们的开放词汇对象检测器,该检测器由 RegionCLIP (ResNet50) 初始化,并在 COCO 数据集上进行了训练。
评估前,请准备好训练有素的检测器并设置好数据集。- 参考
MODEL_ZOO.md
- 下载训练好的检测器checkpoint
regionclip_finetuned-coco_rn50.pth
到文件夹下./pretrained_ckpt/regionclip
, - 下载训练好的 RPN checkpoint
rpn_coco_48.pth
到文件夹下./pretrained_ckpt/rpn
, - 下载类别嵌入
coco_48_base_cls_emb.pth
和coco_65_cls_emb.pth
到文件夹下./pretrained_ckpt/concept_emb
.
- 下载训练好的检测器checkpoint
- 参考
datasets/README.md
设置 COCO 数据集.
python3 ./tools/train_net.py \
--eval-only \
--num-gpus 1 \
--config-file ./configs/COCO-InstanceSegmentation/CLIP_fast_rcnn_R_50_C4_ovd.yaml \
MODEL.WEIGHTS ./pretrained_ckpt/regionclip/regionclip_finetuned-coco_rn50.pth \
MODEL.CLIP.OFFLINE_RPN_CONFIG ./configs/COCO-InstanceSegmentation/mask_rcnn_R_50_C4_1x_ovd_FSD.yaml \
MODEL.CLIP.BB_RPN_WEIGHTS ./pretrained_ckpt/rpn/rpn_coco_48.pth \
MODEL.CLIP.TEXT_EMB_PATH ./pretrained_ckpt/concept_emb/coco_48_base_cls_emb.pth \
MODEL.CLIP.OPENSET_TEST_TEXT_EMB_PATH ./pretrained_ckpt/concept_emb/coco_65_cls_emb.pth \
MODEL.ROI_HEADS.SOFT_NMS_ENABLED True \
有关更多示例,请参阅test_transfer_learning.sh
。该脚本包括对各种训练有素的检测器(ResNet50、ResNet50x4)和数据集(COCO、LVIS)组合的基准评估。此外,请参阅 MODEL_ZOO.md了解可用的训练模型,以及 datasets/README.md
了解 COCO 和 LVIS 数据集的设置。
Train detectors on your own(训练你自己的检测器)
下面我们将举例说明如何在 COCO 数据集上训练开放词汇对象检测器,并将预训练的 RegionCLIP(ResNet50)作为初始化。
在训练之前,请准备好我们预先训练好的 RegionCLIP 模型并设置好数据集。- 参考
MODEL_ZOO.md
- 下载预训练的 RegionCLIP checkpoint
regionclip_pretrained-cc_rn50.pth
到文件夹下./pretrained_ckpt/regionclip
, - 下载训练好的 RPN checkpoint
rpn_coco_48.pth
到文件夹下./pretrained_ckpt/rpn
, - 下载类别嵌入
coco_48_base_cls_emb.pth
和coco_65_cls_emb.pth
到文件夹下./pretrained_ckpt/concept_emb
.
- 下载预训练的 RegionCLIP checkpoint
- 参考
datasets/README.md
设置COCO 数据集.
python3 ./tools/train_net.py \
--num-gpus 1 \
--config-file ./configs/COCO-InstanceSegmentation/CLIP_fast_rcnn_R_50_C4_ovd.yaml \
MODEL.WEIGHTS ./pretrained_ckpt/regionclip/regionclip_pretrained-cc_rn50.pth \
MODEL.CLIP.OFFLINE_RPN_CONFIG ./configs/COCO-InstanceSegmentation/mask_rcnn_R_50_C4_1x_ovd_FSD.yaml \
MODEL.CLIP.BB_RPN_WEIGHTS ./pretrained_ckpt/rpn/rpn_coco_48.pth \
MODEL.CLIP.TEXT_EMB_PATH ./pretrained_ckpt/concept_emb/coco_48_base_cls_emb.pth \
MODEL.CLIP.OPENSET_TEST_TEXT_EMB_PATH ./pretrained_ckpt/concept_emb/coco_65_cls_emb.pth \
有关更多示例,请参阅train_transfer_learning.sh
。该脚本为探测器骨干网(ResNet50、ResNet50x4)和数据集(COCO、LVIS)的各种组合提供训练脚本。此外,请参阅 MODEL_ZOO.md了解可用的训练模型,以及 datasets/README.md
了解 COCO 和 LVIS 数据集的设置。
Extract Region Features(提取区域特征)
我们提供了从预先训练好的 RegionCLIP 中提取区域特征的脚本。给定一个图像文件夹后,我们的脚本会提取区域特征(以及其他检测结果,如方框坐标),并将其保存为本地文件。
下面是一个使用预训练的 RegionCLIP 和 ResNet50 的示例。我们扩展了零点推理(上节)中的脚本,并做了一些小改动,例如输入和输出文件夹。
以下是设置的简要介绍。我们可以为两类区域提取特征:
-
RPN 区域: 该设置与类别无关。区域是得分最高的 RPN 建议。
-
检测区域: 此设置需要额外输入概念嵌入文件(感兴趣的概念)。这些区域是最终的检测输出框(在第二阶段 NMS 之后)。作为参考,Bottom-Up features (广泛应用于视觉语言任务)也来自最终检测框。
- 参考
MODEL_ZOO.md
- 下载预训练的 RegionCLIP checkpoint
regionclip_pretrained-cc_rn50.pth
到文件夹下./pretrained_ckpt/regionclip
. - 下载训练好的 RPN checkpoint
rpn_lvis_866.pth
到文件夹下./pretrained_ckpt/rpn
. - (可选) 如果您想提取为 1203 LVIS 概念检测到的方框特征,请将类嵌入
lvis_1203_cls_emb.pth
下载到文件夹./pretrained_ckpt/concept_emb
.
- 下载预训练的 RegionCLIP checkpoint
- 将所有自定义图片放入一个文件夹。可以在脚本中指定(请查看下面的
INPUT_DIR
)。
以下脚本可从 RPN 区域提取特征。
# RN50, features of RPN regions
python3 ./tools/extract_region_features.py \
--config-file ./configs/LVISv1-InstanceSegmentation/CLIP_fast_rcnn_R_50_C4_zsinf.yaml \
MODEL.WEIGHTS ./pretrained_ckpt/regionclip/regionclip_pretrained-cc_rn50.pth \
MODEL.CLIP.CROP_REGION_TYPE RPN \
MODEL.CLIP.MULTIPLY_RPN_SCORE True \
MODEL.CLIP.OFFLINE_RPN_CONFIG ./configs/LVISv1-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml \
MODEL.CLIP.BB_RPN_WEIGHTS ./pretrained_ckpt/rpn/rpn_lvis_866.pth \
INPUT_DIR ./datasets/custom_images \
OUTPUT_DIR ./output/region_feats \
MODEL.CLIP.OFFLINE_RPN_POST_NMS_TOPK_TEST 100 \
以下脚本可从检测区域(第二阶段 NMS 后)提取特征。
# You can simply run "bash extract_region_features.sh"
python3 ./tools/extract_region_features.py \
--config-file ./configs/LVISv1-InstanceSegmentation/CLIP_fast_rcnn_R_50_C4_zsinf.yaml \
MODEL.WEIGHTS ./pretrained_ckpt/regionclip/regionclip_pretrained-cc_rn50.pth \
MODEL.CLIP.TEXT_EMB_PATH ./pretrained_ckpt/concept_emb/lvis_1203_cls_emb.pth \
MODEL.CLIP.CROP_REGION_TYPE RPN \
MODEL.CLIP.MULTIPLY_RPN_SCORE True \
MODEL.CLIP.OFFLINE_RPN_CONFIG ./configs/LVISv1-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml \
MODEL.CLIP.BB_RPN_WEIGHTS ./pretrained_ckpt/rpn/rpn_lvis_866.pth \
INPUT_DIR ./datasets/custom_images \
OUTPUT_DIR ./output/region_feats \
TEST.DETECTIONS_PER_IMAGE 100 \
每幅图像的区域特征将被保存到 OUTPUT_DIR
文件夹下的 .pth
文件中。为简单起见,当前脚本仅支持单 GPU 推理。作为参考,在使用 RegionCLIP-ResNet50 和 1203 LVIS 对象概念的单个 Titan-Xp GPU 上大约需要 0.76 秒。
以下是特征提取的关键参数列表。您可以根据需要在脚本中指定这些参数。
-
INPUT_DIR
andOUTPUT_DIR
: 分别指定输入图像文件夹和保存区域特征的输出文件夹。 -
MODEL.CLIP.BB_RPN_WEIGHTS
: 指定使用哪种训练有素的 RPN。您可以根据需要替换它。更多细节,请参考MODEL_ZOO.md
. -
MODEL.CLIP.TEXT_EMB_PATH
(可选): 指定要使用的对象概念嵌入文件。概念的选择将影响每个类别的 NMS(第二阶段),从而影响最终的输出框。 -
TEST.DETECTIONS_PER_IMAGE
: 定义最终输出区域的数量(例如,COCO 配置中的默认值为 100,LVIS 配置中的默认值为 300) -
MODEL.CLIP.OFFLINE_RPN_POST_NMS_TOPK_TEST
: 定义来自 RPN 的区域建议数(例如,默认值为 1000)。降低该值可以大大减少推理时间和内存成本,但可能会影响最终的检测质量。 -
MODEL.CLIP.OFFLINE_RPN_NMS_THRESH
andMODEL.ROI_HEADS.NMS_THRESH_TEST
: 分别控制 RPN(第一阶段,默认值为 0.9)和预测头(第二阶段,默认值为 0.5)中的 NMS IoU 阈值。如果使用 RPN 区域提取特征,可能需要更改MODEL.CLIP.OFFLINE_RPN_NMS_THRESH
.
Extract Concept Features(提取概念特征)
除了区域特征提取,我们还提供了从预训练的 RegionCLIP 中提取概念特征的脚本。给定概念列表后,我们的脚本会提取文本嵌入并将其保存为本地文件。下面是一个使用预训练 RegionCLIP 的示例。我们扩展了区域特征提取(上节)的脚本,并做了一些小改动。
在运行脚本之前,请准备好预训练模型和自定义概念。- 参考
MODEL_ZOO.md
- 下载预训练的 RegionCLIP checkpoint
regionclip_pretrained-cc_rn50.pth
到文件夹下./pretrained_ckpt/regionclip
.
- 下载预训练的 RegionCLIP checkpoint
- 将所有概念放入文件
concepts.txt
中,每行为一个概念名称。将该文件放到脚本中指定的文件夹中(查看下面的INPUT_DIR
)。
以下脚本可从 ResNet50 中提取特征。
# RN50 concept embeddings
python3 ./tools/extract_concept_features.py \
--config-file ./configs/LVISv1-InstanceSegmentation/CLIP_fast_rcnn_R_50_C4_zsinf.yaml \
MODEL.WEIGHTS ./pretrained_ckpt/regionclip/regionclip_pretrained-cc_rn50.pth \
MODEL.CLIP.OFFLINE_RPN_CONFIG ./configs/LVISv1-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml \
INPUT_DIR ./datasets/custom_concepts \
OUTPUT_DIR ./output/concept_feats \
MODEL.CLIP.GET_CONCEPT_EMB True \
对于 ResNet50x4,请使用以下命令:
# RN50x4 concept embeddings
python3 ./tools/extract_concept_features.py \
--config-file ./configs/LVISv1-InstanceSegmentation/CLIP_fast_rcnn_R_50_C4_zsinf.yaml \
MODEL.WEIGHTS ./pretrained_ckpt/regionclip/regionclip_pretrained-cc_rn50x4.pth \
MODEL.CLIP.TEXT_EMB_DIM 640 \
MODEL.RESNETS.DEPTH 200 \
MODEL.CLIP.OFFLINE_RPN_CONFIG ./configs/LVISv1-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml \
INPUT_DIR ./datasets/custom_concepts \
OUTPUT_DIR ./output/concept_feats \
MODEL.CLIP.GET_CONCEPT_EMB True \
所有概念的语言内嵌将保存到 OUTPUT_DIR
文件夹中的 .pth
文件中。为了与 MODEL_ZOO.md
中提供的概念内嵌保持一致,这些语言内嵌还没有经过规范化处理。
以下是特征提取的关键参数列表。您可以根据需要在脚本中指定这些参数。
INPUT_DIR
andOUTPUT_DIR
: 分别指定一个输入概念文件夹和一个保存区域特征的输出文件夹。
Citation and Acknowledgement(引用和鸣谢)
Citation(引用)
If you find this repo useful, please consider citing our paper:
@inproceedings{zhong2022regionclip,
title={Regionclip: Region-based language-image pretraining},
author={Zhong, Yiwu and Yang, Jianwei and Zhang, Pengchuan and Li, Chunyuan and Codella, Noel and Li, Liunian Harold and Zhou, Luowei and Dai, Xiyang and Yuan, Lu and Li, Yin and others},
booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
pages={16793--16803},
year={2022}
}
Acknowledgement
This repository was built on top of Detectron2, CLIP, OVR-CNN, and maskrcnn-benchmark. We thank the effort from our community.
Contributing
This project welcomes contributions and suggestions. Most contributions require you to agree to a
Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us
the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com.
When you submit a pull request, a CLA bot will automatically determine whether you need to provide
a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions
provided by the bot. You will only need to do this once across all repos using our CLA.
This project has adopted the Microsoft Open Source Code of Conduct.
For more information see the Code of Conduct FAQ or
contact opencode@microsoft.com with any additional questions or comments.