백본

백본 (Backbones)

객체 탐지(object detection)나 이미지 분할(image segmentation) 같은 상위 레벨 컴퓨터 비전 태스크는 예측을 만들기 위해 여러 모델을 함께 사용해요. 백본(backbone), neck, head 각각에 별도의 모델이 쓰이지요. 백본은 입력 이미지에서 유용한 feature를 뽑아 feature map으로 만들고, neck은 feature map들을 결합·처리하며, head는 그걸로 예측을 해요.

출처: 문서

본문

from_pretrained()로 백본을 로드하고, out_indices 파라미터로 어느 레이어(인덱스로 주어지는)에서 feature map을 뽑을지 결정해요.

from transformers import AutoBackbone

model = AutoBackbone.from_pretrained("microsoft/swin-tiny-patch4-window7-224", out_indices=(1,))

이 가이드에서는 백본 클래스, timm 라이브러리의 백본, 그리고 백본으로 feature를 추출하는 방법을 설명할게요.

백본 클래스 (Backbone classes)

백본 클래스는 두 가지가 있어요.

  • ~transformers.utils.BackboneMixin은 백본을 로드할 수 있게 해주고, config에서 feature map과 인덱스를 추출하는 함수를 포함해요.
  • ~transformers.utils.BackboneConfigMixin은 백본 설정의 feature map과 인덱스를 설정·정렬·검증할 수 있게 해줘요.

어떤 모델이 백본을 지원하는지 확인하려면 Backbone API 문서를 참조해 주세요.

Transformers 백본을 로드하는 방법은 두 가지예요. AutoBackbone과 모델별 백본 클래스가 있어요.

AutoClass API는 지원되는 경우 from_pretrained()으로 사전 학습된(pre-trained) 비전 모델을 백본으로 자동 로드해요.

feature map을 얻고 싶은 레이어로 out_indices 파라미터를 설정해요. 레이어 이름을 안다면 out_features를 쓸 수도 있어요. 이 두 파라미터는 서로 바꿔 쓸 수 있지만, 둘 다 쓴다면 같은 레이어를 가리키도록 주의해 주세요.

out_indices나 out_features를 쓰지 않으면 백본은 마지막 레이어에서 feature map을 반환해요. 아래 예시 코드는 out_indices=(1,)을 사용해서 첫 번째 레이어에서 feature map을 가져와요.

from transformers import AutoImageProcessor, AutoBackbone

model = AutoBackbone.from_pretrained("microsoft/swin-tiny-patch4-window7-224", out_indices=(1,))

모델이 백본을 지원하는 걸 안다면 백본과 neck을 모델 configuration에 직접 로드할 수 있어요. 모델에 configuration을 전달해서 태스크용으로 초기화해요.

아래 예시는 ResNet 백본과 neck을 로드해서 MaskFormer 인스턴스 분할 head에 사용해요.

config에서 초기화하면 랜덤 가중치로 모델을 만든다는 점을 기억하세요. 사전 학습된 모델을 로드하려면 from_pretrained API를 사용해요.

from transformers import AutoConfig, MaskFormerConfig, MaskFormerForInstanceSegmentation

backbone_config = AutoConfig.from_pretrained("microsoft/resnet-50")
config = MaskFormerConfig(backbone_config=backbone_config)
model = MaskFormerForInstanceSegmentation(config)

또 다른 방법은 백본 configuration을 별도로 로드한 다음 모델 configuration의 backbone_config에 전달하는 거예요.

from transformers import MaskFormerConfig, MaskFormerForInstanceSegmentation, ResNetConfig

# instantiate backbone configuration
backbone_config = ResNetConfig()
# load backbone in model
config = MaskFormerConfig(backbone_config=backbone_config)
# attach backbone to model head
model = MaskFormerForInstanceSegmentation(config)

timm 백본 (timm backbones)

timm은 학습과 추론을 위한 비전 모델 모음이에요. Transformers는 TimmBackbone과 TimmBackboneConfig 클래스로 timm 모델을 백본으로 지원해요. backbone에 필요한 백본 checkpoint를 설정하면 랜덤 초기화 가중치를 가진 Timm 백본 모델을 만들 수 있어요.

from transformers import MaskFormerConfig, MaskFormerForInstanceSegmentation, TimmBackboneConfig

backbone_config = TimmBackboneConfig(backbone="resnet50", out_indices=[-1])
config = MaskFormerConfig(backbone_config=backbone_config)
model = MaskFormerForInstanceSegmentation(config)

TimmBackboneConfig 클래스를 명시적으로 호출해서 사전 학습된 timm 백본을 로드하고 만들 수도 있어요.

from transformers import TimmBackboneConfig

backbone_config = TimmBackboneConfig("resnet50")

백본 configuration을 모델 configuration에 전달하고, 백본으로 모델 head인 MaskFormerForInstanceSegmentation을 인스턴스화해요.

from transformers import MaskFormerConfig, MaskFormerForInstanceSegmentation

config = MaskFormerConfig(backbone_config=backbone_config)
model = MaskFormerForInstanceSegmentation(config)

Feature 추출 (Feature extraction)

백본은 이미지 feature를 추출하는 데 쓰여요. 이미지를 백본에 통과시켜 feature map을 얻어요.

이미지를 로드·전처리해서 백본에 전달해요. 아래 예시는 첫 번째 레이어에서 feature map을 추출해요.

from transformers import AutoImageProcessor, AutoBackbone
import torch
from PIL import Image
import requests

model = AutoBackbone.from_pretrained("microsoft/swin-tiny-patch4-window7-224", out_indices=(1,))
processor = AutoImageProcessor.from_pretrained("microsoft/swin-tiny-patch4-window7-224")

url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)

inputs = processor(image, return_tensors="pt")
outputs = model(**inputs)

feature는 출력의 feature_maps 속성에 저장되어 접근할 수 있어요.

feature_maps = outputs.feature_maps
list(feature_maps[0].shape)
[1, 96, 56, 56]

더 알아보기 (Learn more)