🚀 视觉变换器(基础大小模型)
视觉变换器(ViT)是一种基于Transformer架构的图像识别模型,它在大规模图像数据集上进行预训练,能够学习图像的内在表示,为下游图像分类等任务提供强大的特征提取能力。
🚀 快速开始
视觉变换器(ViT)是一种类似BERT的Transformer编码器模型,它在大量图像数据上进行有监督预训练,即ImageNet - 21k数据集(分辨率为224x224像素)。之后,该模型在ImageNet(也称为ILSVRC2012)数据集上进行微调,该数据集包含100万张图像和1000个类别,微调时的分辨率为384x384。
以下是如何使用该模型将COCO 2017数据集中的图像分类到1000个ImageNet类别之一的示例:
from transformers import ViTFeatureExtractor, ViTForImageClassification
from PIL import Image
import requests
url = 'http://images.cocodataset.org/val2017/000000039769.jpg'
image = Image.open(requests.get(url, stream=True).raw)
feature_extractor = ViTFeatureExtractor.from_pretrained('google/vit-base-patch32-384')
model = ViTForImageClassification.from_pretrained('google/vit-base-patch32-384')
inputs = feature_extractor(images=image, return_tensors="pt")
outputs = model(**inputs)
logits = outputs.logits
predicted_class_idx = logits.argmax(-1).item()
print("Predicted class:", model.config.id2label[predicted_class_idx])
目前,特征提取器和模型都支持PyTorch。Tensorflow和JAX/FLAX即将支持,并且ViTFeatureExtractor的API可能会发生变化。
✨ 主要特性
- 预训练与微调:在ImageNet - 21k数据集上进行预训练,然后在ImageNet数据集上进行微调,能够学习到丰富的图像特征。
- 图像输入处理:将图像表示为固定大小的图像块序列(分辨率为32x32),并进行线性嵌入,同时添加[CLS]标记用于分类任务。
- 位置嵌入:在将序列输入到Transformer编码器层之前添加绝对位置嵌入。
📦 安装指南
文档中未提及具体安装步骤,暂不展示。
💻 使用示例
基础用法
from transformers import ViTFeatureExtractor, ViTForImageClassification
from PIL import Image
import requests
url = 'http://images.cocodataset.org/val2017/000000039769.jpg'
image = Image.open(requests.get(url, stream=True).raw)
feature_extractor = ViTFeatureExtractor.from_pretrained('google/vit-base-patch32-384')
model = ViTForImageClassification.from_pretrained('google/vit-base-patch32-384')
inputs = feature_extractor(images=image, return_tensors="pt")
outputs = model(**inputs)
logits = outputs.logits
predicted_class_idx = logits.argmax(-1).item()
print("Predicted class:", model.config.id2label[predicted_class_idx])
高级用法
文档中未提及高级用法代码示例,暂不展示。
📚 详细文档
模型描述
视觉变换器(ViT)是一种类似BERT的Transformer编码器模型,它在大量图像数据上进行有监督预训练,即ImageNet - 21k数据集(分辨率为224x224像素)。之后,该模型在ImageNet(也称为ILSVRC2012)数据集上进行微调,该数据集包含100万张图像和1000个类别,微调时的分辨率为384x384。
图像以固定大小的图像块序列(分辨率为32x32)的形式输入到模型中,并进行线性嵌入。同时,在序列开头添加一个[CLS]标记,用于分类任务。在将序列输入到Transformer编码器层之前,还会添加绝对位置嵌入。
通过预训练,模型学习到图像的内在表示,这些表示可用于提取对下游任务有用的特征。例如,如果您有一个带标签的图像数据集,可以在预训练的编码器之上放置一个线性层来训练一个标准分类器。通常,会在[CLS]标记之上放置一个线性层,因为该标记的最后隐藏状态可以看作是整个图像的表示。
预期用途与限制
您可以使用原始模型进行图像分类。您可以在模型中心中查找针对您感兴趣的任务进行微调的版本。
训练数据
ViT模型在ImageNet - 21k数据集上进行预训练,该数据集包含1400万张图像和21000个类别;并在ImageNet数据集上进行微调,该数据集包含100万张图像和1000个类别。
训练过程
预处理
训练/验证期间图像预处理的确切细节可以在这里找到。
图像会被调整大小/缩放至相同的分辨率(预训练时为224x224,微调时为384x384),并在RGB通道上进行归一化,均值为(0.5, 0.5, 0.5),标准差为(0.5, 0.5, 0.5)。
预训练
该模型在TPUv3硬件(8核)上进行训练。所有模型变体都使用4096的批量大小和10000步的学习率预热进行训练。对于ImageNet数据集,作者发现额外应用全局范数为1的梯度裁剪是有益的。预训练分辨率为224。
评估结果
关于几个图像分类基准的评估结果,请参考原文的表2和表5。请注意,对于微调,在较高分辨率(384x384)下可获得最佳结果。当然,增加模型大小会提高性能。
BibTeX引用和引用信息
@misc{https://doi.org/10.48550/arxiv.2010.11929,
doi = {10.48550/ARXIV.2010.11929},
url = {https://arxiv.org/abs/2010.11929},
author = {Dosovitskiy, Alexey and Beyer, Lucas and Kolesnikov, Alexander and Weissenborn, Dirk and Zhai, Xiaohua and Unterthiner, Thomas and Dehghani, Mostafa and Minderer, Matthias and Heigold, Georg and Gelly, Sylvain and Uszkoreit, Jakob and Houlsby, Neil},
keywords = {Computer Vision and Pattern Recognition (cs.CV), Artificial Intelligence (cs.AI), Machine Learning (cs.LG), FOS: Computer and information sciences, FOS: Computer and information sciences},
title = {An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale},
publisher = {arXiv},
year = {2020},
copyright = {arXiv.org perpetual, non-exclusive license}
}
@inproceedings{deng2009imagenet,
title={Imagenet: A large-scale hierarchical image database},
author={Deng, Jia and Dong, Wei and Socher, Richard and Li, Li-Jia and Li, Kai and Fei-Fei, Li},
booktitle={2009 IEEE conference on computer vision and pattern recognition},
pages={248--255},
year={2009},
organization={Ieee}
}
📄 许可证
本项目采用Apache - 2.0许可证。