> 백엔드 개발 > 파이썬 튜토리얼 > 비전 트랜스포머(ViT): 트랜스포머 모델을 사용한 컴퓨터 비전

비전 트랜스포머(ViT): 트랜스포머 모델을 사용한 컴퓨터 비전

尊渡假赌尊渡假赌尊渡假赌
풀어 주다: 2025-01-23 13:42:10
앞으로
445명이 탐색했습니다.

지난 몇 년 동안 Transformers는 머신러닝의 NLP 영역을 변화시켰습니다. GPT 및 BERT와 같은 모델 인간의 언어를 이해하고 생성하는 데 새로운 기준을 세웠습니다. 이제 동일한 원칙이 컴퓨터 비전 영역에도 적용되었습니다. 컴퓨터 비전 분야의 최근 발전은 비전입니다. 변압기 또는 ViT. "이미지는 16x16 단어만큼 가치가 있습니다: 규모에 따른 이미지 인식을 위한 변환기"라는 논문에 자세히 설명되어 있습니다. ViT 및 변환기 기반 모델은 컨벌루션을 대체하도록 설계되었습니다. 신경망(CNN). Vision Transformers는 컴퓨터 문제 해결에 대한 새로운 시도입니다. 비전. 전통적인 컨볼루션 신경망에 의존하는 대신 수십년 동안 이미지 관련 업무의 중추 역할을 해온 CNN(CNN)은 ViT는 변환기 아키텍처를 사용하여 이미지를 처리합니다. 그들은 치료한다 문장의 단어와 같은 이미지 패치를 통해 모델이 학습할 수 있습니다. 이러한 패치 간의 관계는 마치

CNN과 달리 ViT는 입력 이미지를 패치로 나누고 직렬화합니다. 벡터로 변환하고 행렬을 사용하여 차원을 줄입니다. 곱셈. 그런 다음 변환기 인코더는 이러한 벡터를 다음과 같이 처리합니다. 토큰 임베딩. 이 기사에서는 비전 변환기와 컨볼루션 신경망과의 주요 차이점. 무엇이 만드는가 특히 흥미로운 점은 글로벌 이해 능력입니다. 이는 CNN이 어려움을 겪을 수 있는 이미지 패턴입니다.

비전 변환기란 무엇입니까?

비전 변환기는 주의 및 변환기 개념을 사용하여 다음을 수행합니다. 프로세스 이미지 - 이는 자연어의 변환기와 유사합니다. 처리(NLP) 컨텍스트. 그러나 토큰을 사용하는 대신 이미지는 패치로 분할되어 일련의 선형 임베디드로 제공됩니다. 이것들 패치는 NLP에서 토큰이나 단어를 처리하는 것과 동일한 방식으로 처리됩니다.

전체 그림을 동시에 보는 대신 ViT는 이미지를 직소 퍼즐처럼 작은 조각으로 나눕니다. 각 조각은 회전되어 있습니다. 기능을 설명하는 숫자 목록(벡터)으로 변환한 다음 모델은 모든 조각을 보고 그것이 어떤 관계에 있는지 알아냅니다. 변환기 메커니즘을 사용하여 서로 변환합니다.

CNN과 달리 ViT는 특정 필터나 커널을 적용하여 작동합니다. 가장자리 패턴과 같은 특정 특징을 감지하는 이미지입니다. 이것은 프린터가 스캔하는 것과 매우 유사한 컨볼루션 프로세스 영상. 이 필터는 전체 이미지를 슬라이드하여 강조 표시합니다. 중요한 특징. 그런 다음 네트워크는 여러 레이어를 쌓습니다. 이러한 필터는 점점 더 복잡한 패턴을 식별합니다.
CNN을 사용하면 풀링 레이어가 기능 맵의 크기를 줄입니다. 이것들 레이어는 추출된 특징을 분석하여 유용한 예측을 만듭니다. 이미지 인식, 객체 감지 등. 그러나 CNN에는 고정된 기능이 있습니다. 수용 필드로 인해 장거리 모델링 능력이 제한됩니다.

CNN이 이미지를 보는 방식은 무엇입니까?비전 트랜스포머(ViT): 트랜스포머 모델을 사용한 컴퓨터 비전

ViT는 더 많은 매개변수가 있음에도 불구하고 self-attention 메커니즘을 사용합니다. 더 나은 기능 표현을 위해 더 깊은 레이어의 필요성을 줄입니다. CNN은 유사한 것을 달성하기 위해 훨씬 더 깊은 아키텍처가 필요합니다. 표현 능력으로 인해 계산 비용이 증가합니다.

게다가 CNN은 전역 수준의 이미지 패턴을 캡처할 수 없습니다. 필터는 이미지의 로컬 영역에 초점을 맞춥니다. 이해하려면 전체 이미지 또는 먼 관계, CNN은 여러 레이어를 쌓아 올리는 데 의존합니다. 풀링하여 시야를 확장합니다. 그러나 이 프로세스는 세부 사항을 단계별로 집계하므로 전체 정보가 손실됩니다.

반면 ViTs는 이미지를 다음과 같은 패치로 나눕니다. 개별 입력 토큰으로 처리됩니다. Self Attention을 사용하여 ViT는 비교합니다. 모든 패치를 동시에 확인하고 서로 어떻게 관련되는지 알아보세요. 이를 통해 없이 전체 이미지의 패턴과 종속성을 캡처합니다. 층별로 쌓아가세요.

귀납적 편향이란 무엇인가요?

더 진행하기 전에 귀납적 편향의 개념을 이해하는 것이 중요합니다. 귀납적 편향은 모델이 데이터에 대해 만드는 가정을 나타냅니다. 구조; 훈련 중에 이는 모델이 더욱 일반화되고 편견을 줄이세요. CNN에서 귀납적 편향에는 다음이 포함됩니다.

  1. 지역성: 이미지의 특징(예: 가장자리 또는 질감)은 작은 영역 내에 국한됩니다.
  2. 2차원 이웃 구조: 가까운 픽셀이 더 가능성이 높습니다. 연관되어 있으므로 필터는 공간적으로 인접한 영역에서 작동합니다.
  3. 변환 등분산: 이미지의 한 부분에서 감지된 특징 edge, 다른 부분에 나타나더라도 동일한 의미를 유지합니다.

이러한 편향은 CNN을 이미지 작업에 매우 효율적으로 만듭니다. 본질적으로 이미지의 공간적, 구조적 활용을 위해 설계되었습니다.

ViT(Vision Transformer)는 CNN보다 이미지별 유도 편향이 훨씬 적습니다. In ViTs:

  • 글로벌 처리: Self-attention 레이어가 작동합니다. 전체 이미지를 통해 모델이 글로벌 관계를 포착하고 지역에 구애받지 않고 의존성을 갖습니다.
  • 최소 2D 구조: 이미지의 2D 구조 처음(이미지가 패치로 분할된 경우)에만 사용됩니다. 미세 조정 중(다른 위치 임베딩을 조정하기 위해) 결의안). CNN과 달리 ViT는 근처 픽셀이 다음과 같다고 가정하지 않습니다. 필연적으로 관련됩니다.
  • 학습된 공간 관계: 위치 임베딩 ViT는 초기화 시 특정 2D 공간 관계를 인코딩하지 않습니다. 대신 모델은 데이터로부터 모든 공간 관계를 학습합니다.

Vision Transformers 작동 방식

비전 트랜스포머(ViT): 트랜스포머 모델을 사용한 컴퓨터 비전

Vision Transformers는 표준 Transformer 아키텍처를 사용합니다. 1D 텍스트 시퀀스용으로 개발되었습니다. 2D 이미지를 처리하려면 P P 픽셀과 같이 고정된 크기의 더 작은 패치로 분할됩니다. 벡터로 평면화됩니다. 이미지의 크기가 H  W이고 C인 경우 채널의 경우 총 패치 수는 N = H  W / P  P 유효합니다. Transformer의 입력 시퀀스 길이입니다. 이러한 평평한 패치는 다음과 같습니다. 그런 다음 패치 임베딩이라고 하는 고정 차원 공간 D에 선형으로 투영됩니다.

BERT의 [CLS] 토큰과 유사한 특수 학습 가능 토큰은 다음과 같습니다. 패치 임베딩 시퀀스 앞에 추가됩니다. 이 토큰은 다음을 학습합니다. 나중에 분류에 사용되는 전역 이미지 표현입니다. 또한 위치 임베딩이 패치 임베딩에 추가되어 위치 정보를 인코딩하여 모델이 공간을 이해하도록 돕습니다.

임베딩 시퀀스는 MSA(Multi-Headed Self-Attention)와 MLP 블록이라고도 하는 피드포워드 신경망이라는 두 가지 주요 작업을 번갈아 수행하는 Transformer 인코더를 통해 전달됩니다. 각 레이어에는 LN(레이어 정규화)이 포함되어 있습니다. 이러한 작업 및 잔여 연결이 추가되기 전에 적용됨 이후 훈련을 안정화한다. Transformer 인코더의 출력, 특히 [CLS] 토큰의 상태는 이미지의 상태로 사용됩니다.

분류를 위해 최종 [CLS] 토큰에 간단한 헤드를 추가합니다. 작업. 사전 훈련 중에 이 머리는 작은 다층 퍼셉트론입니다. (MLP), 미세 조정 중에는 일반적으로 단일 선형 레이어입니다. 이것 아키텍처를 통해 ViT는 글로벌 관계를 효과적으로 모델링할 수 있습니다. 패치 사이에서 이미지에 대한 self-attention의 모든 힘을 활용합니다.

하이브리드 Vision Transformer 모델에서는 직접 분할하는 대신 원시 이미지를 패치로 변환하고 입력 시퀀스는 기능 맵에서 파생됩니다. CNN에서 생성되었습니다. CNN은 이미지를 먼저 처리하여 다음을 추출합니다. 의미 있는 공간적 특징은 패치를 만드는 데 사용됩니다. 이러한 패치는 평면화되어 고정 차원 공간에 투영됩니다. 표준 Vision과 동일한 훈련 가능한 선형 투영을 사용합니다. 트랜스포머. 이 접근 방식의 특별한 경우는 크기가 큰 패치를 사용하는 것입니다. 1×1, 여기서 각 패치는 CNN의 피처맵입니다.

이 경우 피처맵의 공간적 차원은 다음과 같습니다. 평면화되고 결과 시퀀스가 Transformer의 입력 차원. 표준 ViT와 마찬가지로, 유지하기 위해 분류 토큰 및 위치 임베딩이 추가되었습니다. 위치정보를 제공하고 전체적인 이미지 이해를 가능하게 합니다. 이것 하이브리드 접근 방식은 CNN의 로컬 특징 추출 강점을 활용합니다. 이를 의 글로벌 모델링 역량과 결합하면서 Transformers.

코드 데모

다음은 Vision Transformers를 사용하는 방법에 대한 코드 블록입니다. 이미지.

# 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를 사용한 기본 ViT(Vision Transformer) 구현. 이것 코드에는 패치 임베딩, 위치 인코딩, 및 Transformer 인코더. 이는 간단한 분류에 사용될 수 있습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:digitalocean.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿