RegionCLIP (CVPR 2022) 的官方 PyTorch 实现

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] 应研究人员的要求, 我们发布 了预训练的configsscripts . 完整的教程和预培训数据将于稍后发布。敬请期待!
  • [09/18/2022] Organizing ECCV Workshop Computer Vision in the Wild (CVinW), 其中有两项挑战,分别是评估预训练视觉模型在下游任务中的零镜头、少镜头和全镜头性能:
  • [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下面.
  • 查阅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.
  • 参考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.pthcoco_65_cls_emb.pth 到文件夹下 ./pretrained_ckpt/concept_emb.
  • 参考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.pthcoco_65_cls_emb.pth 到文件夹下 ./pretrained_ckpt/concept_emb.
  • 参考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.
  • 将所有自定义图片放入一个文件夹。可以在脚本中指定(请查看下面的 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 and OUTPUT_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 and MODEL.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.
  • 将所有概念放入文件 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 and OUTPUT_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.

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值