BEiTv2图像分类-通用-large

我要开发同款
匿名用户2024年07月31日
228阅读

技术信息

开源地址
https://modelscope.cn/models/iic/cv_beitv2-large_image-classification_patch16_224_pt1k_ft22k_in1k
授权协议
Apache License 2.0

作品详情

通用预训练模型介绍

BEiTv2(large模型,在ImageNet-1k上预训练,并在ImageNet-21k上进行微调)

BEiTv2模型先在ImageNet-1k(1419万张图像,1000个类别)数据集上以自监督的方式进行预训练,并在ImageNet-21k(1400万张图像,21,841个类别)数据集上进行微调,得到的预训练模型在下游ImageNet-1k分类任务上进行微调后,BEiTv2-large在ImageNet-1k验证集上达到了88.4%的top-1精度,在其它下游任务上也分别达到了SOTA的结果。

本系列还有如下模型,欢迎试用:

模型描述

BEiT(Bidirectioal Ecoder Image Trasformers)是一个自监督视觉表示模型。受BERT在NLP领域中的启发,BEiT提出掩码图像建模(masked image modelig,MIM)任务来预训练Visio Trasformer。 BEiT预训练过程如下:预训练之前,通过自编码器dVAE学习一个image tokeizer,其根据学习到的vocabulary,可以将一幅图像tokeized为离散visual tokes。在预训练期间,每个图像有两种视角:image patches和visual tokes。随机掩盖Image patches的一部分,并且用特定的mask embeddig替换,然后将patches输入到backboe visio Trasformer。预训练的目标是基于掩盖的image patches来恢复原有visual tokes。预训练BEiT之后,可以通过在预训练的ecoder上添加特定任务的层,直接对下游任务的模型参数进行微调,预训练过程如图:
BEiT预训练概览

BEiTv2在BEiT的基础上对dVAE学到的语义空间进行深入的探讨和优化:使用矢量量化-知识蒸馏(Vector-quatized Kowledge Distillatio,VQ-KD)的方法来学习生成视觉标志,该方法的核心思想是通过一个训练好的模型,例如CLIPDINO作为Teacher来指导视觉标志的学习。BEiTv2和BEiT一样,它也是一个两阶段的模型:它的第一阶段是VQ-KD的训练,第二阶段是预训练模型的训练。为了提升BEiT的效果,BEiTv2做了如下改进:

  • 提出了VQ-KD方法来对图像进行编码,它将原始图像作为输入,使用另外一个模型作为教师系统来引导视觉标志模型的训练。在通过VQ-KD得到图像的视觉标志之后,使用这个视觉标志作为预训练模型的训练目标。
    VQ-KD计算流程:
    VQ-KD计算流程

  • 为了学习图像的全局信息,BEiTv2在输入编码中拼接了[CLS]标志,然后通过对[CLS]标志的预训练来得到图像的全局信息,从而使得BEiTv2在线性探测(Liear Probe)方式也能拥有非常高的准确率。
    掩码图像模型的计算流程:
    掩码图像模型的计算流程

在ImageNet-1K上,patch为16,分辨率为224x224,BEiTv2-large的top-1准确率相比BEiT-large从87.4%提高到了88.4%,超过从头开始训练DeiT模型的准确率。

本模型基于BEiTv2-large,patch为16,分辨率为224x224,先在ImageNet-1k进行预训练1600个epoch,并在ImageNet-21k上进行微调90个epoch,得到预训练模型后在ImageNet-1k上进行微调20个epoch,最终在ImageNet-1k验证集上的top-1精度为88.4%。

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

本模型作为一个Trasformer预训练模型,可直接作为分类、检测、分割等下游任务的预训练backboe,在下游任务数据集上进行少量微调即可得到很好的结果。

如何使用

在ModelScope框架上,提供输入图片,即可通过简单的Pipelie调用来使用。

代码范例

from modelscope.pipelies import pipelie
from modelscope.utils.costat import Tasks

img_path = 'https://modelscope.oss-c-beijig.aliyucs.com/test/images/bird.JPEG'
image_classificatio = pipelie(Tasks.image_classificatio, 
                                model='damo/cv_beitv2-large_image-classificatio_patch16_224_pt1k_ft22k_i1k')
result = image_classificatio(img_path)
prit(result)

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

  • 本模型以ImageNet-1K作为下游分类任务的示例,仅支持ImageNet-1K标签体系的1000类分类。如若在其它下游任务中使用,直接进行fie-tue即可。
  • 模型基于ImageNet-1K、ImageNet-21K等公开数据集进行训练,生成结果可能会存在与训练数据分布相关的偏差。
  • fie-tue时超参不同,生成的结果可能有略微差异。

训练数据介绍

  • ImageNet-1k:ImageNet数据集包含14,197,122个带注释的图像。自2010年以来,作为图像分类的基准数据集,该数据集被用于ImageNet大规模视觉识别挑战(ILSVRC)。
  • ImageNet-21k:开源数据集,1400万张带注释的图像,共21,841个类别。

模型训练流程

  • 主要训练参数参考BEiTv2论文中的设置,使用8张GPU,batchsize为1024,学习率为5e-5,使用Cosie进行5个epoch预热,一共微调训练20个epoch。

预处理

测试时主要的预处理如下:

  • Resize:先将原始图片的短边缩放至256
  • Normalize:图像归一化,减均值除以标准差
  • CeterCrop:裁切为224x224

数据评估及结果

模型在ImageNet1K验证集上的评估结果:

Model top-1 acc top-5 acc #params Remark
BEiTv2-large 88.4 98.6 304M modelscope

论文中模型在ImageNet1K验证集上的评估结果:
ImageNet1K测试结果

模型训练

使用托管在modelscope DatasetHub上的小型数据集mii_imageet100进行fietue训练的示例代码:

from modelscope.msdatasets import MsDataset
from modelscope.metaifo import Traiers
from modelscope.traiers import build_traier
import tempfile

model_id = 'damo/cv_beitv2-large_image-classificatio_patch16_224_pt1k_ft22k_i1k'

# 加载数据
ms_trai_dataset = MsDataset.load(
            'mii_imageet100', amespace='tay0699',
            subset_ame='default', split='trai')      # 加载训练集

ms_val_dataset = MsDataset.load(
            'mii_imageet100', amespace='tay0699',
            subset_ame='default', split='validatio') # 加载验证集

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

# 修改配置文件
def cfg_modify_f(cfg):
    cfg.trai.dataloader.batch_size_per_gpu = 4  # batch大小
    cfg.trai.dataloader.workers_per_gpu = 1     # 每个gpu的worker数目
    cfg.trai.max_epochs = 1                     # 最大训练epoch数
    cfg.model.mm_model.head.um_classes = 100    # 分类数
    cfg.model.mm_model.head.loss.um_classes = 100
    cfg.trai.optimizer.lr = 1e-4                # 学习率
    cfg.trai.lr_cofig.warmup_iters = 1         # 预热次数
    retur cfg

# 构建训练器
kwargs = dict(
    model=model_id,                 # 模型id
    work_dir=tmp_dir,               # 工作目录
    trai_dataset=ms_trai_dataset, # 训练集  
    eval_dataset=ms_val_dataset,    # 验证集
    cfg_modify_f=cfg_modify_f     # 用于修改训练配置文件的回调函数
    )
traier = build_traier(ame=Traiers.image_classificatio, default_args=kwargs)

# 进行训练
traier.trai()

# 进行评估
result = traier.evaluate()
prit('result:', result)

训练说明见示例代码中的注释,更详细的训练说明和用法见官方的训练文档。训练过程产生的log和模型权重文件保存在workdir工作目录中,并以前缀为'best'的文件保存了在验证集上最优精度的权重。evaluate()默认使用精度最高的模型权重进行评估。

模型评估

使用训练好的模型对需要评估的数据集进行精度评估示例代码如下:

from modelscope.msdatasets import MsDataset
from modelscope.metaifo import Traiers
from modelscope.traiers import build_traier
import tempfile

model_id = 'damo/cv_beitv2-large_image-classificatio_patch16_224_pt1k_ft22k_i1k'

# 加载用于评估的数据集
ms_val_dataset = MsDataset.load(
            'imageet_val', amespace='tay0699',
            subset_ame='default', split='validatio') 

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

# 构建训练器
kwargs = dict(
    model=model_id,                 # 模型id
    work_dir=tmp_dir,               # 工作目录
    trai_dataset=Noe,  
    eval_dataset=ms_val_dataset     # 评估的数据集
    )
traier = build_traier(ame=Traiers.image_classificatio, default_args=kwargs)

# 开始评估
result = traier.evaluate()
prit('result:', result)

评估过程默认使用模型中自带的预训练权重进行评估,以上对ImageNet1K验证集的评估结果为: result: {'accuracytop-1': 88.35600280761719, 'accuracytop-5': 98.5780029296875}

Cloe with HTTP

 git cloe https://www.modelscope.c/damo/cv_beitv2-large_image-classificatio_patch16_224_pt1k_ft22k_i1k.git

引用

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

@iproceedigs{beit,
title={{BEiT}: {BERT} Pre-Traiig of Image Trasformers},
author={Hagbo Bao ad Li Dog ad Soghao Piao ad Furu Wei},
booktitle={Iteratioal Coferece o Learig Represetatios},
year={2022},
url={https://opereview.et/forum?id=p-BhZSz59o4}
}

@article{beitv2,
title={{BEiT v2}: Masked Image Modelig with Vector-Quatized Visual Tokeizers},
author={Zhiliag Peg ad Li Dog ad Hagbo Bao ad Qixiag Ye ad Furu Wei},
year={2022},
eprit={2208.06366},
archivePrefix={arXiv},
primaryClass={cs.CV}
}

功能介绍

通用预训练模型介绍 BEiTv2(large模型,在ImageNet-1k上预训练,并在ImageNet-21k上进行微调) BEiTv2模型先在ImageNet-1k(1419万张图像,1000个类

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论