# Swin Transformer

**Swin Transformer**는 Vision Transformer(ViT) 계열의 모델로, Transformer 기반의 self-attention 메커니즘을 이미지 처리에 최적화한 모델입니다. Swin Transformer는 특히 컴퓨터 비전 작업에서 기존 CNN 기반 모델을 능가하는 성능을 보여주고 있으며, 포트홀 탐지와 같은 작은 객체를 탐지하는 문제에서도 효과적입니다.

### Swin Transformer의 주요 특징

1. **Shifted Window Self-Attention**:
   * Swin Transformer는 기존 ViT의 한계를 극복하기 위해 **Shifted Window Self-Attention** 메커니즘을 도입했습니다. 일반적인 Transformer 모델은 이미지 전체에서 self-attention을 계산하기 때문에 매우 높은 계산 비용이 발생하는 반면, Swin Transformer는 이미지를 여러 작은 윈도우로 분할하고 그 안에서 self-attention을 계산합니다.
   * 또한, 각 단계마다 윈도우를 약간씩 이동시키는 방식(shifted window)을 사용하여 윈도우 간의 정보를 교환하며, 이는 모델이 로컬뿐만 아니라 글로벌한 문맥을 파악하는 데 도움을 줍니다.
2. **계층적 구조**:
   * Swin Transformer는 이미지의 **계층적 표현**을 학습합니다. 이는 작은 패치부터 시작해 점진적으로 큰 패치로 확장하는 방식을 따르며, 이는 CNN의 풀링과 비슷하게 동작합니다. 이러한 구조는 다양한 크기의 객체를 처리하는 데 효과적이며, 작은 패치로부터 큰 구조적 정보까지 캡처할 수 있습니다.
3. **계산 효율성**:
   * 기존 ViT 모델은 모든 패치 간의 관계를 계산해야 하므로 매우 높은 연산 비용이 들지만, Swin Transformer는 윈도우 기반으로 연산을 제한하여 더 효율적인 계산을 가능하게 합니다. 이로 인해 대형 이미지에서도 더 적은 메모리와 계산량으로 높은 성능을 발휘할 수 있습니다.
4. **유연한 적용**:
   * Swin Transformer는 **객체 탐지, 이미지 분할, 이미지 분류**와 같은 다양한 컴퓨터 비전 작업에 유연하게 적용될 수 있습니다. 특히 포트홀 탐지와 같은 세그멘테이션 작업에서는 정확한 경계 탐지가 중요한데, Swin Transformer는 이를 효과적으로 처리할 수 있습니다.

### Swin Transformer의 아키텍처

Swin Transformer의 아키텍처는 이미지 처리에서 효율성과 성능을 동시에 잡기 위해 Transformer 모델의 구조를 변형한 것입니다. Vision Transformer(ViT)의 단점을 극복하고, CNN이 제공하는 계층적 특성 학습과 유사한 효과를 Transformer 기반 모델에서 얻기 위해 설계되었습니다. Swin Transformer는 주로 **Shifted Window** 메커니즘을 도입하고, **계층적 구조**를 통해 이미지의 멀티스케일 특징을 학습할 수 있도록 설계되었습니다. 아래는 Swin Transformer의 아키텍처를 단계별로 설명한 것입니다.

![teaser](https://3185889288-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRLG1IioyolTsxQZZJ2xc%2Fuploads%2Fgit-blob-bcd2f74ba2ab964f1c0752b330519a60bad8e2bf%2Fteaser.png?alt=media)

#### 패치 분할 및 패치 임베딩

Swin Transformer의 첫 번째 단계는 입력 이미지를 고정된 크기의 작은 패치로 나누는 것입니다. 이 단계는 다음과 같이 진행됩니다.

* **입력 이미지 크기**: $H \times W \times 3$ (이미지의 높이 H, 너비 W, 그리고 3개의 RGB 채널)
* 이 이미지를 고정된 크기 $(P \times P)$의 패치로 나누어 $n = \frac{H}{P} \times \frac{W}{P}$개의 패치로 분할합니다.
* 각 패치는 크기 $P^2 \times 3$의 벡터로 변환되며, 이 벡터는 선형 변환을 통해 고정된 차원의 임베딩 벡터로 변환됩니다. 이 임베딩 벡터가 Transformer의 입력이 됩니다.

이 과정은 CNN에서 사용하는 컨볼루션 필터와 유사한 방식으로 이미지에서 지역적 특징을 추출하는 역할을 합니다.

#### 계층적 구조 (Hierarchical Structure)

Swin Transformer는 **계층적 구조**를 사용하여 이미지의 다양한 크기와 스케일에서 정보를 추출합니다. 이 구조는 **Transformer 블록**들이 반복적으로 적용되며, 각 계층마다 이미지 해상도가 점차 줄어들고 패치 크기는 증가합니다.

* 처음에는 작은 패치에서 지역적 특징을 학습하고, 점차적으로 더 큰 패치에서 전역적 특징을 학습합니다. 이는 CNN에서의 풀링(pooling)과 유사한 역할을 합니다.
* 계층적 구조는 다음과 같은 4개의 단계로 이루어집니다.
  1. **Stage 1**: 처음 패치 분할 후 $P \times P$ 크기의 패치에서 지역적 특징을 학습.
  2. **Stage 2**: 패치 크기를 2배로 증가시키고 더 큰 영역에서 특징 학습.
  3. **Stage 3**: 다시 패치 크기를 2배로 증가시키면서 더 전역적인 특징을 학습.
  4. **Stage 4**: 최종적으로 전체 이미지의 전역적 정보를 학습.

이 과정에서 패치 분할과 병합이 반복되면서, 이미지의 다양한 크기와 해상도에서 특징을 효과적으로 학습할 수 있습니다.

#### Shifted Window Self-Attention

기존 Vision Transformer(ViT)에서는 **Self-Attention**이 이미지 전체의 패치 간 관계를 학습했지만, 이는 계산 비용이 매우 크다는 단점이 있었습니다. Swin Transformer는 이를 개선하기 위해 **윈도우 기반 Self-Attention**을 사용합니다.

* **윈도우 기반 Self-Attention**: Swin Transformer는 이미지 패치를 여러 고정된 크기의 윈도우로 나누고, 각 윈도우 안에서 Self-Attention을 수행합니다. 이렇게 하면 윈도우 간의 관계를 따로 계산할 필요가 없기 때문에 계산 비용이 크게 줄어듭니다.
* **Shifted Window 메커니즘**: 한 가지 문제는 윈도우 기반 Self-Attention을 사용할 경우, 윈도우 간의 상호작용이 제한된다는 점입니다. 이를 해결하기 위해, Swin Transformer는 일정한 주기마다 윈도우를 약간 이동시키는 **Shifted Window** 메커니즘을 도입했습니다.
  * 첫 번째 Self-Attention에서는 고정된 윈도우 안에서만 학습하고, 그다음 Self-Attention 단계에서는 윈도우를 약간 이동시켜서 이전에 고려되지 않은 패치 간의 관계를 학습합니다.
  * 이 메커니즘을 통해 모델은 전역적 문맥을 학습하면서도 계산 비용을 최소화할 수 있습니다.

#### MLP 헤드 (Multi-Layer Perceptron Head)

각 윈도우 내에서 Self-Attention을 수행한 후, Swin Transformer는 **MLP 헤드**를 사용해 추가적인 비선형 변환을 수행합니다. 이 단계는 Self-Attention이 학습한 패치 간의 관계를 기반으로 더 복잡한 특징을 학습합니다. MLP 헤드는 두 개 이상의 Fully Connected 레이어로 구성되며, 각 패치의 표현을 더욱 강화합니다.

#### 패치 병합 (Patch Merging)

각 Transformer 블록이 완료될 때마다, Swin Transformer는 패치 병합(Patch Merging) 단계를 통해 패치 크기를 점진적으로 키웁니다. 이는 기존 CNN에서 사용하는 풀링(pooling)과 유사하며, 이를 통해 더 높은 레벨의 특징을 학습합니다.

* 패치 병합은 연속된 패치들을 병합하여 더 큰 패치로 변환합니다. 예를 들어, $2 \times 2$의 패치를 하나의 패치로 병합하여, 해상도는 줄이면서 특징 공간은 더 넓게 확보할 수 있습니다.
* 병합된 패치는 다시 Transformer 블록으로 전달되어 학습이 계속됩니다.

#### 분류 또는 세그멘테이션 헤드

Swin Transformer는 마지막 단계에서 일반적으로 **Fully Connected Layer**나 **Segmentation Head**를 통해 결과를 출력합니다. 작업에 따라 이미지 분류, 객체 탐지, 세그멘테이션 등 다양한 작업을 처리할 수 있습니다.

* **분류 작업**에서는 최종 패치의 출력 벡터를 분류 헤드에 전달하여 각 클래스에 대한 예측을 수행합니다.
* **세그멘테이션 작업**에서는 각 패치에 해당하는 출력을 Segmentation Head에 전달하여 이미지의 각 픽셀에 대한 클래스를 예측합니다.

### Swin Transformer의 장점

* **효율적인 계산**:
  * Swin Transformer는 윈도우 기반 self-attention 메커니즘을 사용하여 연산을 지역적으로 제한함으로써, 기존 Vision Transformer(ViT)보다 훨씬 적은 연산량으로 높은 성능을 냅니다. 이는 특히 고해상도 이미지나 실시간 처리에 유리합니다.
* **다양한 크기의 객체 처리**:
  * Swin Transformer는 계층적인 구조로 작은 패치에서 큰 패치로 점진적으로 특징을 추출하기 때문에, 작은 객체부터 큰 객체까지 다양한 크기의 객체를 처리하는 데 매우 효과적입니다. 이는 포트홀과 같이 크기와 형태가 다양한 손상을 탐지하는 데 큰 도움이 됩니다.
* **로컬 및 글로벌 정보 결합**:
  * Shifted Window 메커니즘을 통해 지역적인 정보(로컬)와 이미지 전반의 정보(글로벌)를 결합할 수 있어, 더 정밀한 탐지와 세그멘테이션이 가능합니다. 이는 작은 영역의 객체라도 주변 맥락을 고려해 정확한 위치를 찾는 데 유리합니다.
* **확장성**:
  * Swin Transformer는 이미지 분류, 객체 탐지, 세그멘테이션 등 다양한 비전 작업에 적용될 수 있으며, 동일한 아키텍처를 다양한 문제에 쉽게 확장할 수 있습니다. 이는 여러 컴퓨터 비전 작업에 유연하게 사용할 수 있는 큰 장점입니다.
* **고해상도 이미지 처리**:
  * 고해상도 이미지에서도 계산 복잡도를 줄이면서 성능을 유지할 수 있어, 대형 이미지에서 세밀한 객체를 탐지하는 작업에 적합합니다. 포트홀 탐지에서 고해상도 도로 이미지를 사용할 때 특히 유리합니다.
* **정확도와 속도 균형**:
  * Swin Transformer는 높은 정확도와 효율적인 속도 사이에서 균형을 잡고 있어, 실시간 시스템이나 대규모 데이터 처리에도 적합합니다.

이러한 장점들 덕분에 Swin Transformer는 최신 딥러닝 모델 중에서도 특히 이미지 분석 작업에서 매우 강력한 성능을 발휘합니다.

### Swin Transformer의 단점

* **복잡한 구조로 인한 구현 난이도**:
  * Swin Transformer는 기존 CNN 기반 모델보다 구조가 복잡합니다. **Shifted Window** 및 **계층적 self-attention** 메커니즘은 설계와 구현 면에서 더 많은 세부적인 조정이 필요하며, 이를 제대로 구현하고 최적화하는 것이 어려울 수 있습니다.
  * 이러한 복잡성 때문에 Swin Transformer를 처음 다루는 연구자나 개발자는 CNN 기반 모델보다 더 많은 학습 시간과 노력, 그리고 하드웨어 자원이 필요할 수 있습니다.
* **훈련 시간 및 자원 요구량 증가**:
  * Transformer 기반 모델은 CNN에 비해 더 많은 **훈련 자원**을 요구합니다. 특히 대규모 이미지 데이터셋을 처리할 때 메모리 요구량이 매우 높을 수 있으며, 훈련 시간이 증가할 수 있습니다.
  * Swin Transformer는 효율성을 개선했지만, 여전히 CNN에 비해 **모델 크기**와 **훈련 시간** 측면에서 무거울 수 있습니다. 고성능 GPU가 필요한 경우가 많으며, 실시간 응용에서는 추가적인 최적화가 필요할 수 있습니다.
* **데이터 요구량**:
  * Transformer 계열 모델은 대규모 데이터를 기반으로 학습하는 것이 성능에 매우 중요한 영향을 미칩니다. **충분히 큰 학습 데이터셋이 없을 경우** 성능이 떨어질 수 있습니다. 이는 특히 도로 손상 탐지와 같은 특정 도메인에서는 대규모 레이블링된 데이터셋을 구하기 어려운 문제로 이어질 수 있습니다.
  * 소규모 데이터셋에서는 과적합(overfitting) 문제가 발생할 가능성이 높으며, 이 경우 모델의 일반화 성능이 떨어질 수 있습니다.
* **실시간 응용에서의 제한**:
  * Swin Transformer는 CNN에 비해 효율성이 개선되었지만, **실시간 응용**에서 요구되는 속도를 충족하는 데 한계가 있을 수 있습니다. 특히, 실시간으로 도로에서 포트홀을 탐지해야 하는 경우 높은 처리 속도가 필요하므로, 추가적인 경량화 작업이나 최적화가 필요할 수 있습니다.
* **윈도우 기반의 한계**:
  * Swin Transformer의 **Shifted Window** 메커니즘은 윈도우 간의 정보를 잘 교환하도록 설계되었지만, 여전히 각 윈도우 내에서만 self-attention을 계산한다는 제한이 있습니다. 이는 **큰 객체**나 **복잡한 전역적 관계**를 파악해야 할 때 CNN이나 다른 Transformer 기반 모델에 비해 부족할 수 있습니다.
* **하이퍼파라미터 설정의 복잡성**:
  * Swin Transformer는 다양한 **하이퍼파라미터**(예: 윈도우 크기, 계층의 깊이, 헤드 수 등)를 설정해야 하는데, 이들이 작업에 맞게 제대로 설정되지 않으면 모델 성능이 저하될 수 있습니다. 따라서 하이퍼파라미터 튜닝에 많은 시간과 노력이 필요할 수 있습니다.

이러한 단점들에도 불구하고 Swin Transformer는 최신 컴퓨터 비전 작업에서 높은 성능을 발휘하고 있으며, 적절한 자원과 데이터를 활용한다면 매우 강력한 모델이 될 수 있습니다.

### 포트홀 탐지에서의 Swin Transformer 활용

포트홀 탐지는 이미지 내에서 작은 손상을 정확하게 탐지하는 것이 매우 중요합니다. Swin Transformer는 다음과 같은 이유로 포트홀 탐지에서 유리합니다:

* **정밀한 영역 탐지**: 윈도우 기반 self-attention을 통해 작은 패치 내의 상세 정보를 캡처할 수 있어 포트홀과 같은 작은 객체를 잘 탐지합니다.
* **전역적 문맥 고려**: Shifted Window를 통해 주변 정보를 함께 고려하여 포트홀의 정확한 위치와 크기를 탐지할 수 있습니다.
* **고효율 처리**: 계산 효율이 뛰어나 고해상도 도로 이미지에서도 빠르게 포트홀을 탐지할 수 있습니다.

Swin Transformer는 최신 비전 Transformer 모델로, 포트홀 탐지와 같은 고정밀 작업에서 매우 유용한 선택이 될 수 있습니다.

### 객체 탐지 PyTorch 예제

Swin Transformer를 사용한 객체 탐지 작업은 일반적으로 사전 학습된 모델을 사용하여 손쉽게 구현할 수 있습니다. Swin Transformer는 PyTorch 기반의 **timm**(PyTorch Image Models) 라이브러리를 사용하여 쉽게 불러올 수 있으며, 이를 객체 탐지 작업에 활용할 수 있습니다.

아래는 **PyTorch**와 **timm**을 사용하여 Swin Transformer를 불러오고, 객체 탐지 작업을 위한 기본적인 예제를 보여드리겠습니다.

#### Swin Transformer를 사용한 객체 탐지 예제 코드

```python
import torch
from torchvision import transforms
from PIL import Image
import matplotlib.pyplot as plt
import timm  # PyTorch Image Models

# 모델 불러오기 (Swin Transformer 사전 학습된 모델)
model = timm.create_model('swin_base_patch4_window7_224', pretrained=True)
model.eval()

# 이미지 불러오기 및 전처리
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

img_path = 'path_to_your_image.jpg'  # 객체 탐지를 원하는 이미지 경로
img = Image.open(img_path)
img_tensor = transform(img).unsqueeze(0)  # 배치 차원을 추가하여 Tensor 변환

# 모델로 예측 수행
with torch.no_grad():
    outputs = model(img_tensor)

# 예측 결과 출력 (여기서는 단순 분류 모델로 활용)
print(outputs)

# 결과 이미지 시각화
plt.imshow(img)
plt.show()
```

1. **timm 라이브러리**:
   * `timm`은 다양한 사전 학습된 모델을 제공하는 PyTorch 라이브러리입니다. Swin Transformer를 포함하여 많은 최신 모델들이 포함되어 있습니다.
   * 위 코드에서 `timm.create_model`을 통해 `swin_base_patch4_window7_224` 모델을 불러옵니다. 이는 224x224 크기의 입력 이미지를 처리하도록 설계된 Swin Transformer 모델입니다.
2. **이미지 전처리**:
   * `torchvision.transforms`를 사용하여 이미지를 모델에 입력하기 전 필요한 전처리를 수행합니다. 모델이 기대하는 입력 크기와 정규화를 수행합니다.
3. **예측 수행**:
   * Swin Transformer 모델을 통해 예측을 수행하며, `torch.no_grad()` 블록 안에서 예측을 진행하여 그래디언트 계산을 막고 메모리 효율을 높입니다.
4. **출력**:
   * 모델의 예측 결과는 이미지에 대한 각 클래스의 예측값이 됩니다. Swin Transformer는 기본적으로 이미지 분류 모델로 동작하기 때문에, 객체 탐지 작업을 위해서는 추가적인 후처리가 필요합니다.

#### 객체 탐지 작업 확장

위 예제는 이미지 분류 작업에 Swin Transformer를 사용하는 기본 예제입니다. 객체 탐지 작업을 위해 Swin Transformer를 활용하려면 **Detectron2**와 같은 프레임워크를 사용할 수 있습니다. Detectron2는 Mask R-CNN, Faster R-CNN 등의 최신 객체 탐지 모델을 지원하며, Swin Transformer와 결합하여 더욱 강력한 객체 탐지 시스템을 구축할 수 있습니다.

Detectron2와 Swin Transformer를 결합한 예제는 다음과 같은 방법으로 확장 가능합니다:

1. **Detectron2 설치**:

   ```bash
   pip install detectron2
   ```
2. **Detectron2와 Swin Transformer 결합 코드**: Detectron2에서 Swin Transformer backbone을 사용하여 객체 탐지 모델을 구축하는 방법도 있습니다. Detectron2의 기본 Mask R-CNN이나 Faster R-CNN의 backbone을 Swin Transformer로 변경하는 방식입니다.

이러한 방식을 통해 객체 탐지 작업에 Swin Transformer를 효과적으로 활용할 수 있습니다.

### CNN 백본(Backbone)을 대체

**Swin Transformer**를 객체 탐지 모델의 **CNN 백본(Backbone)** 부분을 대체하는 방식으로 사용합니다. 백본은 입력 이미지로부터 특징을 추출하는 역할을 하는 네트워크로, 객체 탐지 모델의 중요한 구성 요소입니다.

기존 객체 탐지 모델인 **Faster R-CNN**이나 **Mask R-CNN** 등은 일반적으로 **ResNet** 또는 **VGG**와 같은 **CNN** 기반의 백본을 사용하여 이미지에서 특징을 추출합니다. 그러나 최근 Transformer 기반의 모델들이 등장하면서, CNN 대신 **Swin Transformer**와 같은 **Transformer 기반 백본**을 사용해 성능을 개선할 수 있습니다.

#### CNN과 Swin Transformer의 차이점

* **CNN 백본**:
  * CNN은 합성곱 계층을 통해 지역적인 특징을 추출합니다. 이는 이미지 내의 작은 패치들을 처리하여 국소적인 정보를 잘 캡처하지만, 전역적인 정보나 멀리 떨어진 픽셀들 간의 관계를 처리하는 데 한계가 있습니다.
* **Swin Transformer 백본**:
  * Swin Transformer는 **self-attention 메커니즘**을 사용하여 이미지의 전역적이고 복합적인 관계를 학습합니다. 특히 Swin Transformer는 **Shifted Window** 방식을 도입하여 효율적으로 지역적인 정보와 전역적인 정보를 동시에 처리할 수 있도록 설계되었습니다.
  * 이 방식은 CNN에 비해 더 강력한 특징 표현을 가능하게 하며, 작은 객체나 복잡한 구조를 더 잘 학습할 수 있어, 포트홀 탐지와 같은 작업에 유리할 수 있습니다.

#### Swin Transformer 백본 사용 방법

1. **객체 탐지 모델에서 백본 교체**:
   * 기존의 객체 탐지 모델인 **Faster R-CNN**이나 **Mask R-CNN**에서 **ResNet**과 같은 CNN 백본을 제거하고, 그 자리에 **Swin Transformer**를 배치할 수 있습니다.
   * Detectron2와 같은 프레임워크를 사용하면 백본 교체가 매우 간단합니다.
2. **Swin Transformer 백본 예시 (Detectron2 기반)**: Detectron2와 Swin Transformer를 결합하는 과정에서 Swin Transformer를 백본으로 설정하는 예시입니다.

   ```python
   from detectron2.config import get_cfg
   from detectron2.engine import DefaultTrainer
   from detectron2.modeling import build_model
   from detectron2.checkpoint import DetectionCheckpointer

   # Detectron2 설정 불러오기
   cfg = get_cfg()

   # Swin Transformer backbone으로 설정
   cfg.merge_from_file("configs/COCO-InstanceSegmentation/mask_rcnn_swin_base_patch4_window7_224.yaml")

   # 사전 학습된 모델 불러오기
   cfg.MODEL.WEIGHTS = "path_to_pretrained_swin_transformer_weights.pth"
   cfg.MODEL.BACKBONE.NAME = "SwinTransformer"

   # 모델 초기화 및 훈련
   model = build_model(cfg)
   DetectionCheckpointer(model).load(cfg.MODEL.WEIGHTS)

   trainer = DefaultTrainer(cfg)
   trainer.resume_or_load(resume=False)
   trainer.train()
   ```
3. **Swin Transformer 백본의 이점**:
   * **더 복잡한 관계 학습**: Swin Transformer는 이미지의 더 복잡한 구조를 학습할 수 있기 때문에, 도로에서 발생하는 다양한 크기와 형태의 포트홀을 탐지하는 데 유리합니다.
   * **전역적 문맥 정보**: CNN과 달리 self-attention 메커니즘은 전역적인 문맥 정보를 학습하는 데 강점이 있어, 포트홀 주변의 환경까지 고려한 탐지가 가능합니다.
   * **확장성**: Swin Transformer는 다양한 비전 작업에 적용될 수 있으며, 객체 탐지뿐만 아니라 세그멘테이션이나 이미지 분류 작업에서도 뛰어난 성능을 발휘합니다.

**Swin Transformer를 CNN 백본 대신 사용하는 것**은 기존 객체 탐지 모델의 성능을 개선할 수 있는 강력한 방법입니다. Detectron2와 같은 프레임워크를 사용하면 Swin Transformer를 쉽게 통합할 수 있으며, 이를 통해 포트홀 탐지와 같은 작업에서 더 높은 정확도와 성능을 기대할 수 있습니다.

### 요구 자원

**Swin Transformer**는 기존 **CNN** 백본에 비해 더 많은 메모리와 계산 자원이 필요할 수 있습니다. 이는 특히 self-attention 메커니즘이 고해상도 이미지를 처리할 때 많은 계산을 요구하기 때문입니다. Swin Transformer의 메모리 및 계산 자원 요구 사항은 사용하는 모델의 크기와 이미지의 해상도에 따라 달라집니다.

#### Swin Transformer 모델의 크기 및 자원 요구

Swin Transformer는 **Tiny, Small, Base, Large** 등 여러 버전이 있으며, 각 버전은 다른 자원 요구 사항을 가집니다. 아래는 Swin Transformer의 각 모델에 대한 메모리 및 계산 자원 요구 사항의 대략적인 비교입니다.

| 모델 버전               | 입력 크기   | 파라미터 수 | FLOPs (Floating Point Operations) | VRAM 요구 사항 (대략) |
| ------------------- | ------- | ------ | --------------------------------- | --------------- |
| Swin-Tiny (Swin-T)  | 224x224 | 28M    | 4.5 GFLOPs                        | 약 4\~6 GB       |
| Swin-Small (Swin-S) | 224x224 | 50M    | 8.7 GFLOPs                        | 약 8\~10 GB      |
| Swin-Base (Swin-B)  | 224x224 | 88M    | 15.4 GFLOPs                       | 약 10\~12 GB     |
| Swin-Large (Swin-L) | 224x224 | 197M   | 34.5 GFLOPs                       | 약 16\~20 GB     |

#### 자원 요구에 영향을 미치는 요소

1. **모델 크기**:
   * Swin Transformer는 여러 크기 버전이 있습니다. **Swin-Tiny**와 **Swin-Small**은 상대적으로 가벼운 버전으로, 메모리와 계산 자원이 비교적 적게 필요합니다.
   * 반면, **Swin-Base**나 **Swin-Large**는 더 많은 메모리와 계산 자원을 필요로 하지만, 더 높은 성능을 제공할 수 있습니다.
2. **입력 이미지의 해상도**:
   * 입력 이미지의 해상도가 높을수록 self-attention 메커니즘이 처리해야 하는 패치 수가 많아져 메모리와 계산 자원 요구량이 급격히 증가합니다. 예를 들어, 224x224 해상도보다 더 큰 해상도의 이미지를 처리할 경우, **VRAM** 사용량이 크게 증가합니다.
   * Swin Transformer의 경우 윈도우 기반의 attention을 사용하므로, 해상도가 클수록 윈도우의 개수가 증가해 연산량이 커지게 됩니다.
3. **Batch Size**:
   * 배치 크기가 클수록 더 많은 이미지가 한 번에 처리되므로, 메모리 요구량이 증가합니다. 대형 배치 크기로 학습하려면 GPU VRAM 용량이 충분해야 합니다.
4. **GPU 및 메모리 요구 사항**:
   * Swin Transformer는 연산량이 많아 고성능 **GPU**가 필요합니다. 예를 들어, **NVIDIA RTX 3090**과 같은 고용량 VRAM을 가진 GPU가 Swin-Base 이상의 모델을 사용할 때 적합합니다.
   * 학습에 필요한 **VRAM** 요구량은 데이터의 해상도, 배치 크기, 모델 크기에 따라 결정되며, 대략적으로 **8GB** 이상의 GPU 메모리가 필요하며, 더 큰 모델이나 고해상도 이미지의 경우 **16GB 이상의 VRAM**이 필요할 수 있습니다.
5. **추론 시 메모리 요구 사항**:
   * 학습 단계에서는 많은 연산 자원이 필요하지만, 추론 단계에서는 상대적으로 메모리 사용량이 적습니다. 그러나 고해상도 이미지를 처리하는 경우 추론 시에도 충분한 메모리가 필요할 수 있습니다.

#### 예시: Swin-Base를 이용한 객체 탐지

* **FLOPs**: 약 15.4 GFLOPs
* **VRAM**: 약 10\~12 GB (224x224 해상도 이미지 입력 시)
* **학습 시간**: 고해상도 이미지 및 대형 배치 크기의 경우 **NVIDIA RTX 3090** 또는 **A100**과 같은 GPU가 권장됩니다.

#### 자원 최적화 방법

1. **Mixed Precision Training**:
   * **FP16**(Half-precision)을 사용하는 혼합 정밀도 학습을 도입하면 메모리 사용량을 줄이고, 연산 속도를 향상시킬 수 있습니다. PyTorch에서는 **Apex**와 같은 라이브러리를 사용하여 쉽게 mixed precision을 구현할 수 있습니다.
2. **Gradient Checkpointing**:
   * 메모리 사용량을 줄이기 위해 **gradient checkpointing** 기법을 도입할 수 있습니다. 이는 일부 중간 결과를 다시 계산함으로써 메모리 사용량을 줄이는 방법입니다.
3. **윈도우 크기 최적화**:
   * Swin Transformer는 윈도우 기반 attention을 사용하므로, 윈도우 크기를 조정하여 메모리와 성능의 균형을 맞출 수 있습니다.

Swin Transformer는 기존 CNN 백본보다 더 높은 메모리와 계산 자원을 요구하지만, **self-attention**의 이점을 통해 더 정확하고 세밀한 특징을 학습할 수 있습니다. 모델의 크기, 이미지 해상도, 배치 크기 등을 고려하여 자원을 최적화하는 것이 중요하며, 고성능 GPU가 필요한 경우도 많습니다.
