基础视觉模型高效调优-Prompt
  • 模型资讯
  • 模型资料

基础视觉模型高效调优:Prompt

基于大规模预训练基础模型的参数高效迁移学习方法在各种下游应用中均取得了优异的表现,其中包括了利用Prompt进行调优的方法。该方法对输入的块嵌入向量额外添加了多个可学习的prompt向量,仅需训练极少部分的参数,就能取得不错的性能表现。

该页面展示了Prompt在图像分类任务上的应用,即给定一张图片,返回候选类别中的分类标签及置信度。

模型描述

Prompt的模型结构如下所示,其中左侧为Prompt嵌入到Vision Transformer中的框架,右侧为Prompt的具体结构:

architecture

期望模型使用方式以及适用范围

如何使用

基于 ModelScope 框架,通过调用预定义的 Pipeline 可实现快速调用。

代码范例

from modelscope.pipelines import pipeline

prompt_pipeline = pipeline('vision-efficient-tuning',
                            'damo/cv_vitb16_classification_vision-efficient-tuning-prompt',
                             model_revision='v1.0.2')
result = prompt_pipeline('https://modelscope.oss-cn-beijing.aliyuncs.com/test/images/vision_efficient_tuning_test_1.png')
print(f'Output: {result}.')            

模型局限性以及可能的偏差

  • 本模型基于公开的CIFAR100通用数据集训练,且仅适用于训练数据的覆盖类别,在具体应用场景下可能存在偏差。
  • 本模型当前仅用于图像分类任务,同时该方法可用于其他模态输入(如文本、视频等)和其他视觉下游任务(如检测、分割等)。

训练数据介绍

  1. CIFAR100 通用图像分类数据集,包含100个类别。
  2. CUB-200-2011 鸟类细粒度分类数据集,包含200个类别。
  3. NABirds 鸟类细粒度分类数据集,包含555个类别。
  4. Oxford Flowers 花卉细粒度分类数据集,包含102个类别。
  5. Stanford Cars 车辆细粒度分类数据集,包含196个类别。
  6. Stanford Dogs 犬类细粒度分类数据集,包含120个类别。

数据评估及结果

模型分别在不同的预训练模型和图像分类数据集下进行评估,结果如下:

Dataset ViT-B/16 (IN-21K) ViT-L/14 (CLIP)
Prompt Shallow Prompt Deep Prompt Shallow Prompt Deep
CIFAR100 86.62% 91.58% 88.95% 91.28%
CUB-200-2011 86.92% 87.99% 85.64% 85.92%
NABirds 79.31% 82.77% 80.25% 82.18%
Oxford Flowers 98.46% 98.60% 98.55% 97.72%
Stanford Cars 55.45% 78.25% 90.65% 91.82%
Stanford Dogs 89.53% 90.27% 84.22% 85.28%
Average 82.72% 88.24% 88.04% 89.03%

其中,ViT-B/16模型使用 ImageNet-21K 作为预训练模型,ViT-L/14使用 CLIP 作为预训练模型。

模型训练和验证

以下为使用FME Benchmark中的子数据集OxfordFlowers[点击预览]进行finetune训练和评测的示例代码:

import tempfile
from modelscope.msdatasets import MsDataset
from modelscope.metainfo import Trainers
from modelscope.trainers import build_trainer
from modelscope.utils.constant import DownloadMode

# 模型ID
model_id = 'damo/cv_vitb16_classification_vision-efficient-tuning-prompt'

# 加载训练集
ms_train_dataset = MsDataset.load(
    'foundation_model_evaluation_benchmark', 
    namespace='damo',
    subset_name='OxfordFlowers', 
    split='train',
	download_mode=DownloadMode.FORCE_REDOWNLOAD)   

# 加载验证集
ms_eval_dataset = MsDataset.load(
    'foundation_model_evaluation_benchmark', 
    namespace='damo',
    subset_name='OxfordFlowers', 
    split='eval',
	download_mode=DownloadMode.FORCE_REDOWNLOAD)      

tmp_dir = tempfile.TemporaryDirectory().name # 使用临时目录作为工作目录

# 修改配置文件
def cfg_modify_fn(cfg):
    max_epochs = 1                            # 最大训练轮次
    cfg.model.head.num_classes = 102          # 类别数
    cfg.model.finetune = True                 # 进行微调
    cfg.train.max_epochs = max_epochs         # 最大训练轮次
    cfg.train.lr_scheduler.T_max = max_epochs # 学习率调度器的参数
    cfg.model.backbone.prompt_length = 10     # 模型超参数
    return cfg

# 构建训练器
kwargs = dict(
    model=model_id,                 # 模型id
    work_dir=tmp_dir,               # 工作目录
    train_dataset=ms_train_dataset, # 训练集  
    eval_dataset=ms_eval_dataset,   # 验证集
    cfg_modify_fn=cfg_modify_fn     # 用于修改训练配置文件的回调函数
)
trainer = build_trainer(name=Trainers.vision_efficient_tuning, default_args=kwargs)

# 进行训练
trainer.train()

# 进行评估
result = trainer.evaluate()
print('result:', result)

训练说明见示例代码中的注释部分,详细的训练说明和用法见官方的训练文档

相关论文以及引用信息

如果该模型对您有所帮助,请引用下面的相关的论文:

@inproceedings{jia2022vpt,
  title={Visual Prompt Tuning},
  author={Jia, Menglin and Tang, Luming and Chen, Bor-Chun and Cardie, Claire and Belongie, Serge and Hariharan, Bharath and Lim, Ser-Nam},
  booktitle=ECCV,
  year={2022}
}