🚀 視覺變換器(基礎大小模型)
視覺變換器(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許可證。