このチュートリアルでは、pytorch バージョン 2.0 とシングル カード 4090 の使用を推奨します。使いやすいように、使用するモデルはチュートリアルにダウンロードされています。順番に実行してください。
先進的なコンピュータ ビジョン システムに対する需要が業界全体で急増し続ける中、ビジョン トランスフォーマーの導入が研究者や実務者にとって注目を集めています。ただし、これらのモデルの可能性を最大限に発揮するには、そのアーキテクチャを深く理解する必要があります。さらに、これらのモデルを効果的に導入するための最適化戦略を開発することも同様に重要です。
この記事は、Vision Transformer の概要を提供し、そのアーキテクチャ、主要なコンポーネント、およびそれらをユニークなものにする基本を詳しく説明することを目的としています。この記事の最後では、モデルをよりコンパクトにして展開を容易にするためのコードのデモを通じて、いくつかの最適化戦略について説明します。
ViT は、主に画像分類とターゲット検出に使用される特殊なタイプのニューラル ネットワークです。 ViT の精度は従来の CNN の精度を上回っています。これに寄与する主な要因は、ViT が Transformer アーキテクチャに基づいていることです。このアーキテクチャは今何ですか?
2017 年に、バスワニらは、 「必要なのは注意力だけです」Transformer ニューラル ネットワーク アーキテクチャは、 で紹介されています。このネットワークは、リカレント ニューラル ネットワーク (RNN) によく似たエンコーダーとデコーダーの構造を使用します。このモデルでは、入力にはタイムスタンプの概念がありません。すべての単語が同時に渡され、単語の埋め込みも同時に決定されます。
このタイプのニューラル ネットワーク アーキテクチャは、自己注意と呼ばれるメカニズムに依存しています。
以下は、Transformer アーキテクチャの主要コンポーネントの概要です。
CNN は、画像分類タスクに最適なソリューションと考えられています。事前トレーニングされたデータセットが十分に大きい場合、ViT はそのようなタスクにおいて常に CNN を上回ります。 ViT は、ImageNet 上で Transformer エンコーダーのトレーニングに成功することで重要な成果を達成し、よく知られている畳み込みアーキテクチャと比較して優れた結果を実証しました。
元の研究論文からの ViT アーキテクチャの図
Transformers モデルは通常、エンコーダー/デコーダーに順次渡される画像と単語を処理します。 ViT の簡単な概要は次のとおりです。
事前トレーニングされた ViT モデルは、有名な ImageNet-21k (1,400 万の画像と 21,000 のカテゴリを含むデータセット) を使用して事前トレーニングされ、100 万の画像と 1,000 のカテゴリを含む ImageNet データセットで微調整されています。
デモ:
!pip install --user -q transformers timm
from transformers import ViTFeatureExtractor, ViTForImageClassification
from PIL import Image as img
from IPython.display import Image, display
FILE_NAME = '/notebooks/football-1419954_640.jpg'
display(Image(FILE_NAME, width = 700, height = 400))
#预测图片的地址
image_path = "./pic/football.jpg"
image_array = img.open(image_path)
#Vit 模型地址
vision_encoder_decoder_model_name_or_path = "./my_model/"
#加载 ViT 特征转化 and 预训练模型
#feature_extractor = ViTFeatureExtractor.from_pretrained(vision_encoder_decoder_model_name_or_path)
#model = ViTForImageClassification.from_pretrained(vision_encoder_decoder_model_name_or_path)
feature_extractor = ViTFeatureExtractor.from_pretrained('google/vit-base-patch16-224')
model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224')
#使用 Vit 特征提取器处理输入图像,专为 ViT 模型的格式
inputs = feature_extractor(images = image_array,
return_tensors="pt")
#预训练模型处理输入并生成输出 logits,代表模型对不同类别的预测。
outputs = model(**inputs)
#创建一个变量来存储预测类的索引。
logits = outputs.logits
# 查找具有最高 Logit 分数的类的索引
predicted_class_idx = logits.argmax(-1).item()
print(predicted_class_idx)
#805
print("Predicted class:", model.config.id2label[predicted_class_idx])
#预测种类:足球
コードの内訳:
DeiT は、利用可能なデータとリソースが限られている場合でも、コンピューター ビジョン タスクへの Transformers の適用が成功していることを示しています。
from PIL import Image
import torch
import timm
import requests
import torchvision.transforms as transforms
from timm.data.constants import IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD
print(torch.__version__)
# should be 1.8.0
#从 DeiT 存储库加载名为 “deit_base_patch16_224” 的预训练 DeiT 模型。
model = torch.hub.load('facebookresearch/deit:main', 'deit_base_patch16_224', pretrained=True)
#将模型设置为评估模式,这在使用预训练模型进行推理时非常重要。
model.eval()
#定义一系列应用于图像的变换。例如调整大小、中心裁剪、将图像转换为 PyTorch 张量、使用 ImageNet 数据常用的平均值和标准差值对图像进行归一化。
transform = transforms.Compose([
transforms.Resize(256, interpolation=3),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD),
])
#从 URL 下载图像并对其进行转换。或者直接从本地上传
#Image.open(requests.get("https://images.rawpixel.com/image_png_800/czNmcy1wcml2YXRlL3Jhd3BpeGVsX2ltYWdlcy93ZWJzaXRlX2NvbnRlbnQvcHUyMzMxNjM2LWltYWdlLTAxLXJtNTAzXzMtbDBqOXFrNnEucG5n.png", stream=True).raw)
img = Image.open("./pic/football.jpg")
#None 模拟大小为 1 的批次
img = transform(img)[None,]
#模型的推理、预测
out = model(img)
clsidx = torch.argmax(out)
#打印预测类别的索引。
print(clsidx.item())
コードの内訳:
モデルのサイズを削減するには、量子化が適用されます。このプロセスにより、モデルの精度に影響を与えることなくサイズが縮小されます。
#将量化后端指定为 “qnnpack” 。 QNNPACK(Quantized Neural Network PACKage)是 Facebook 开发的低精度量化神经网络推理库
backend = "qnnpack"
model.qconfig = torch.quantization.get_default_qconfig(backend)
torch.backends.quantized.engine = backend
#推理过程中量化模型的权重,并 qconfig_spec 指定量化应仅应用于线性(全连接)层。使用的量化数据类型是 torch.qint8(8 位整数量化)
quantized_model = torch.quantization.quantize_dynamic(model, qconfig_spec={torch.nn.Linear}, dtype=torch.qint8)
scripted_quantized_model = torch.jit.script(quantized_model)
#模型保存到名为 “fbdeit_scripted_quantized.pt” 的文件
scripted_quantized_model.save("fbdeit_scripted_quantized.pt")
コードの内訳:
optimize_for_mobile 関数は、特にモバイル展開向けに最適化し、結果の最適化モデルをファイルに保存します。
from torch.utils.mobile_optimizer import optimize_for_mobile
optimized_scripted_quantized_model = optimize_for_mobile(scripted_quantized_model)
optimized_scripted_quantized_model.save("fbdeit_optimized_scripted_quantized.pt")
# 使用优化模型进行预测
out = optimized_scripted_quantized_model(img)
clsidx = torch.argmax(out)
print(clsidx.item())
これは、PyTorch Lite をサポートするモバイルまたはエッジ デバイスにモデルをデプロイし、そのようなデバイスのランタイム環境の互換性と効率を確保するために重要です。
optimized_scripted_quantized_model._save_for_lite_interpreter("fbdeit_optimized_scripted_quantized_lite.ptl")
ptl = torch.jit.load("fbdeit_optimized_scripted_quantized_lite.ptl")
さまざまなモデル バリアントの推論速度を比較するには、提供されたコードを実行します。
with torch.autograd.profiler.profile(use_cuda=False) as prof1:
out = model(img)
with torch.autograd.profiler.profile(use_cuda=False) as prof2:
out = scripted_quantized_model(img)
with torch.autograd.profiler.profile(use_cuda=False) as prof3:
out = optimized_scripted_quantized_model(img)
with torch.autograd.profiler.profile(use_cuda=False) as prof4:
out = ptl(img)
print("original model: {:.2f}ms".format(prof1.self_cpu_time_total/1000))
print("scripted & quantized model: {:.2f}ms".format(prof2.self_cpu_time_total/1000))
print("scripted & quantized & optimized model: {:.2f}ms".format(prof3.self_cpu_time_total/1000))
print("lite model: {:.2f}ms".format(prof4.self_cpu_time_total/1000))
上記のコードは、pre_ViT.ipynb でアクセスして実行できます。 ! ! !
この記事には、Visual Transformer の使用を開始し、Paperspace コンソールを使用してモデルを探索するために必要なものがすべて含まれています。このモデルの重要なアプリケーションの 1 つである画像認識を検討します。 ViT の比較と簡単な説明のために、Transformer アーキテクチャも含めます。
Vision Transformer の論文では、CNN の代替として有望でシンプルなモデルが紹介されています。 ILSVRC の ImageNet とそのスーパーセット ImageNet-21M で事前トレーニングされたこのモデルは、Oxford-IIIT Pets、Oxford Flowers、Google Brain の JFT-300M などの一般的な画像分類データセットで最先端のベンチマークに達します。
要約すると、ビジョン トランスフォーマー (ViT) と DeiT は、コンピューター ビジョンの分野における大きな進歩を表しています。 ViT は、従来の畳み込み手法に挑戦する、注意ベースのアーキテクチャによる画像理解における Transformer モデルの有効性を実証します。
特に DeiT は、知識の蒸留を導入することで、ViT が直面する課題にさらに取り組んでいます。 DeiT は、教師と生徒のトレーニング パラダイムを活用することで、大幅に削減されたラベル付きデータで競争力のあるパフォーマンスを達成できる可能性を実証しており、大規模なデータセットがすぐに利用できないシナリオでは価値のあるソリューションとなります。
この分野の研究が進化し続けるにつれて、これらのイノベーションはより効率的で強力なモデルへの道を切り開き、コンピューター ビジョン アプリケーションの将来に刺激的な可能性をもたらします。