ホームページ > バックエンド開発 > Python チュートリアル > ビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョン

ビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョン

尊渡假赌尊渡假赌尊渡假赌
リリース: 2025-01-23 13:42:10
転載
400 人が閲覧しました

ここ数年にわたり、トランスフォーマーは機械学習における NLP ドメインを変革してきました。 GPT や BERT などのモデル 人間の言語の理解と生成において新たな基準を設定しました。 現在、同じ原理がコンピュータ ビジョンの分野にも適用されています。 コンピュータ ビジョンの分野における最近の発展は、ビジョンです。 トランスまたは ViT。論文「An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale」で詳しく説明されているように、 ViT とトランスベースのモデルは、畳み込みアルゴリズムを置き換えるように設計されています。 ニューラル ネットワーク (CNN)。 ビジョン トランスフォーマーは、コンピューターの問題を解決するための新しい考え方です。 ビジョン。従来の畳み込みニューラル ネットワークに依存するのではなく (CNN) は、何十年にもわたって画像関連タスクの根幹を担ってきました。 ViT は、トランスフォーマー アーキテクチャを使用して画像を処理します。彼らは治療します 文中の単語のような画像パッチを使用して、モデルが学習できるようにします。 これらのパッチ間の関係は、パッチのコンテキストを学習するのと同じように、 テキストの段落。

CNN とは異なり、ViT は入力画像をパッチに分割し、シリアル化します。 ベクトルに変換し、行列を使用して次元を削減します。 乗算。次に、トランスフォーマー エンコーダーはこれらのベクトルを次のように処理します。 トークンの埋め込み。この記事では、ビジョントランスフォーマーと 畳み込みニューラル ネットワークとの主な違い。何がそうさせるのか 彼らの特に興味深いのは、世界的なものを理解する能力です。 画像内のパターンは、CNN にとって困難な問題です。

ビジョン トランスフォーマーとは何ですか?

ビジョン トランスフォーマーは、アテンションとトランスフォーマーの概念を使用して、 画像を処理する - これは自然言語のトランスフォーマーに似ています 処理 (NLP) コンテキスト。ただし、トークンを使用する代わりに、イメージは パッチに分割され、一連の線形埋め込みとして提供されます。これら パッチは、NLP でトークンや単語が扱われるのと同じ方法で扱われます。

全体像を同時に見る代わりに、ViT はカットします。 画像をジグソーパズルのように小さなピースに分割します。それぞれのピースが回転します 特徴を表す数値のリスト (ベクトル) に変換し、 モデルはすべてのピースを見て、それらがどのように関連しているかを理解します。

CNN とは異なり、ViT は特定のフィルターまたはカーネルを適用することで機能します。 エッジ パターンなどの特定の特徴を検出するための画像。これは、 畳み込みプロセスは、プリンターが画像をスキャンするのと非常によく似ています。 画像。これらのフィルターは画像全体をスライドして強調表示します。 重要な機能。その後、ネットワークは複数の層を積み重ねます。
CNN では、プーリング層により特徴マップのサイズが削減されます。これら レイヤーは抽出された特徴を分析して、予測に役立つようにします。 画像認識、物体検出など。ただし、CNN には固定の 受容野が弱くなり、長距離をモデル化する能力が制限される

CNN はどのように画像を表示するのか?ビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョン

ViT は、より多くのパラメーターがあるにもかかわらず、セルフアテンション メカニズムを使用します 特徴表現を改善し、より深い層の必要性を軽減します。 CNN では、同様の機能を実現するには、非常に深いアーキテクチャが必要です。 表現力が低下し、計算コストの増加につながります。

さらに、CNN はグローバル レベルの画像パターンをキャプチャできません。 これらのフィルターは、画像の局所領域に焦点を当てます。を理解するには、 画像全体や離れた関係など、CNN は多くのレイヤーを積み重ねることに依存します プールして視野を拡大します。ただし、このプロセスでは、 詳細を段階的に集約するため、グローバル情報は失われます。一方、

ViT は、画像をパッチに分割します。 個々の入力トークンとして扱われます。自己注意を使用して ViT を比較する すべてのパッチを同時に実行し、それらがどのように関連しているかを学びます。これにより、彼らは イメージ全体にわたるパターンと依存関係をキャプチャするため、

誘導バイアスとは何ですか?

先に進む前に、誘導バイアスの概念を理解することが重要です。 誘導バイアスとは、モデルがデータに関して行う仮定を指します。 構造;これにより、トレーニング中にモデルがより一般化され、 偏見を減らす。 CNN では、帰納的バイアスには以下が含まれます。

  1. 局所性: 画像内の特徴 (エッジやテクスチャなど) は小さな領域内に局在化されます。
  2. 2 次元近傍構造: 近くのピクセルである可能性が高くなります。
  3. 変換等分散: 一部で検出された特徴。画像は、エッジと同様、別の部分に表示されても同じ意味を保持します。

これらのバイアスにより、CNN はそのままの画像タスクに対して非常に効率的になります。 本質的に画像の空間的および構造を活用するように設計されています

ビジョン トランスフォーマー (ViT) は、CNN よりも画像固有の誘導バイアスが大幅に少なくなります。 ViT 内:

  • グローバル処理: セルフアテンション層が動作します 画像全体をモデルにグローバルな関係をキャプチャさせ、
  • 最小 2D 構造: 画像の 2D 構造 先頭(画像をパッチに分割するとき)のみ使用 および微調整中(さまざまな位置の埋め込みを調整するため) 決議)。 CNN とは異なり、ViT は近くのピクセルが
  • 学習された空間関係: における位置埋め込み ViT は、初期化時に特定の 2D 空間関係をエンコードしません。 代わりに、モデルはデータからすべての空間関係を学習します。

ビジョン トランスフォーマーの仕組み

ビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョン

ビジョン トランスフォーマーは標準のトランスフォーマー アーキテクチャを使用します 1D テキスト シーケンス用に開発されました。 2D 画像を処理するには、 P P ピクセルなどの固定サイズの小さなパッチに分割されます。 ベクトルに平坦化されます。画像の寸法が H W で C の場合 チャンネル数の場合、パッチの総数は N = H W / P P になります。 Transformer の入力シーケンスの長さ。これらの平坦化されたパッチは、 次に、パッチ埋め込みと呼ばれる固定次元空間 D に線形投影されます。

特別な学習可能なトークンは、BERT の [CLS] トークンに似ており、 パッチ埋め込みのシーケンスの先頭に追加されます。このトークンは、 後で分類に使用されるグローバルな画像表現。 さらに、位置埋め込みがパッチ埋め込みに追加されます。 位置情報をエンコードし、モデルが空間を理解できるようにします。

一連のエンベディングは Transformer エンコーダーを介して渡され、Transformer エンコーダーは 2 つの主要な操作、つまりマルチヘッド セルフ アテンション (MSA) と MLP ブロックとも呼ばれるフィードフォワード ニューラル ネットワークを交互に実行します。各レイヤーにはレイヤー正規化 (LN) が含まれています これらの操作の前に適用され、残りの接続が追加されます その後はトレーニングを安定させるため。 Transformer エンコーダーの出力、 特に [CLS] トークンの状態は、イメージの状態として使用されます。

分類のために最終的な [CLS] トークンに単純なヘッドが追加されます。 タスク。事前トレーニング中、このヘッドは小さな多層パーセプトロンです (MLP)、微調整中は通常、単一の線形レイヤーになります。これ アーキテクチャにより、ViT はグローバルな関係を効果的にモデル化できます パッチ間で画像に対する自己注意力を最大限に活用します。

ハイブリッド Vision Transformer モデルでは、直接分割するのではなく、 RAW 画像をパッチに変換し、入力シーケンスは特徴マップから派生します CNN によって生成されました。 CNN は最初に画像を処理し、抽出します。 意味のある空間特徴を抽出し、パッチの作成に使用します。 これらのパッチは平坦化され、固定次元の空間に投影されます。 標準の Vision と同じトレーニング可能な線形投影を使用する トランスフォーマー。このアプローチの特殊なケースは、次のサイズのパッチを使用することです。 1×1。各パッチは、空間内の 1 つの空間位置に対応します。 CNN の特徴マップ。

この場合、特徴マップの空間次元は次のとおりです。 平坦化され、結果のシーケンスが トランスの入力寸法。標準の ViT と同様に、 分類トークンと位置埋め込みが追加されて保持されます。 位置情報を取得し、グローバルな画像の理解を可能にします。これ CNN の局所特徴抽出の強みを活用したハイブリッド アプローチ それらをグローバル モデリング機能と組み合わせながら、 トランスフォーマー。

コード デモ

これは、ビジョン トランスフォーマーの使用方法に関するコード ブロックです。画像。

# Install the necessary libraries  pip install -q transformers
ログイン後にコピー
from transformers import ViTForImageClassification  
from PIL import Image  
from transformers import ViTImageProcessor
ログイン後にコピー
import requests  
import torch
ログイン後にコピー
# Load the model and move it to ‘GPU’  device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224')  model.to(device)
ログイン後にコピー
# Load the ビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョン to perform predictions  url = 'link to your ビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョン'  ビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョン = Image.open(requests.get(url, stream=True).raw)processor = ViTImageProcessor.from_pretrained('google/vit-base-patch16-224')  inputs = processor(ビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョンs=ビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョン, return_tensors="pt").to(device)  pixel_values = inputs.pixel_values  
# print(pixel_values.shape)
ログイン後にコピー

ViTモデルは画像を処理します。 BERT のようなエンコーダと 線形分類ヘッドは、最終的な隠れ状態の上に配置されます。 [CLS] トークン。

with torch.no_grad():  
  outputs = model(pixel_values)  logits = outputs.logits# logits.shapeprediction = logits.argmax(-1)  print("Predicted class:", model.config.id2label[prediction.item()])
ログイン後にコピー

は次のとおりです PyTorch を使用した基本的な Vision Transformer (ViT) の実装。これ コードには、パッチの埋め込み、位置エンコーディング、 これは簡単な分類に使用できます。 タスク。

import torchimport torch.nn as nnimport torch.nn.functional as Fclass VisionTransformer(nn.Module):
    def __init__(self, img_size=224, patch_size=16, num_classes=1000, dim=768, depth=12, heads=12, mlp_dim=3072, dropout=0.1):
        super(VisionTransformer, self).__init__()
        
        # Image and patch dimensions
        assert img_size % patch_size == 0, "Image size must be divisible by patch size"
        self.num_patches = (img_size // patch_size) ** 2
        self.patch_dim = (3 * patch_size ** 2)  # Assuming 3 channels (RGB)
        
        # Layers
        self.patch_embeddings = nn.Linear(self.patch_dim, dim)
        self.position_embeddings = nn.Parameter(torch.randn(1, self.num_patches   1, dim))
        self.cls_token = nn.Parameter(torch.randn(1, 1, dim))
        self.dropout = nn.Dropout(dropout)
        
        # Transformer Encoder
        self.transformer = nn.TransformerEncoder(
            nn.TransformerEncoderLayer(d_model=dim, nhead=heads, dim_feedforward=mlp_dim, dropout=dropout),
            num_layers=depth        )
        
        # MLP Head for classification
        self.mlp_head = nn.Sequential(
            nn.LayerNorm(dim),
            nn.Linear(dim, num_classes)
        )
    
    def forward(self, x):
        # Flatten patches and embed
        batch_size, channels, height, width = x.shape
        patch_size = height // int(self.num_patches ** 0.5)

        x = x.unfold(2, patch_size, patch_size).unfold(3, patch_size, patch_size)
        x = x.contiguous().view(batch_size, 3, patch_size, patch_size, -1)
        x = x.permute(0, 4, 1, 2, 3).flatten(2).permute(0, 2, 1)
        x = self.patch_embeddings(x)
        
        # Add positional embeddings
        cls_tokens = self.cls_token.expand(batch_size, -1, -1)
        x = torch.cat((cls_tokens, x), dim=1)
        x = x   self.position_embeddings
        x = self.dropout(x)
        
        # Transformer Encoder
        x = self.transformer(x)
        
        # Classification Head
        x = x[:, 0]  # CLS token
        return self.mlp_head(x)# Example usageif __name__ == "__main__":
    model = VisionTransformer(img_size=224, patch_size=16, num_classes=10, dim=768, depth=12, heads=12, mlp_dim=3072)
    print(model)
    
    dummy_img = torch.randn(8, 3, 224, 224)  # Batch of 8 ビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョンs, 3 channels, 224x224 size
    preds = model(dummy_img)
    print(preds.shape)  # Output: [8, 10] (Batch size, Number of classes)
ログイン後にコピー

以上がビジョン トランスフォーマー (ViT): トランスフォーマー モデルを使用したコンピューター ビジョンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:digitalocean.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート