# バックボーン

オブジェクト検出や画像セグメンテーションなどの上位レベルのコンピュータビジョンタスクでは、予測を生成するために複数のモデルを連携して使用します。*backbone*、neck、headにはそれぞれ別のモデルが使用されます。backboneは入力画像から有用な特徴を抽出して特徴マップを生成し、neckは特徴マップを結合・処理し、headはそれらを用いて予測を行います。

    

[from_pretrained()](/docs/transformers/main/ja/main_classes/configuration#transformers.PreTrainedConfig.from_pretrained) でバックボーンを読み込み、`out_indices` パラメータを指定して、インデックスで示されるどの層から特徴マップを抽出するかを決定します。

```py
from transformers import AutoBackbone

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

このガイドでは、backboneクラス、[timm](https://hf.co/docs/timm/index)ライブラリからのbackbone、それらを用いた特徴量の抽出方法について説明します。

## Backboneクラス

バックボーンクラスは2つあります。

- `~transformers.utils.BackboneMixin` は、バックボーンを読み込むことを可能にし、設定から特徴マップとインデックスを抽出する関数を含みます。
- `~transformers.utils.BackboneConfigMixin` は、バックボーン設定のフィーチャマップとインデックスを設定、整列、検証することを可能にします。

どのモデルがバックボーンをサポートしているかを確認するには、[Backbone](./main_classes/backbones)のAPIドキュメントを参照してください。

Transformersのバックボーンを読み込む方法には2つあります。[AutoBackbone](/docs/transformers/main/ja/main_classes/backbones#transformers.AutoBackbone)と、モデル固有のバックボーンクラスです。

[AutoClass](./model_doc/auto) API は、サポートされている場合、事前学習済みビジョンモデルを [from_pretrained()](/docs/transformers/main/ja/main_classes/configuration#transformers.PreTrainedConfig.from_pretrained) を通じてバックボーンとして自動的に読み込みます。

`out_indices` パラメータに、特徴マップを取得したいレイヤーを設定します。レイヤー名がわかっている場合は、`out_features` を使用することもできます。これらのパラメータは相互に置き換え可能ですが、両方を使用する場合は、同じレイヤーを指していることを確認してください。

`out_indices` または `out_features` が使用されない場合、backbone は最終層の feature map を返します。以下の例では、`out_indices=(1,)` を使用して最初の層の feature map を取得しています。

    

```py
from transformers import AutoImageProcessor, AutoBackbone

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

モデルがバックボーンをサポートしていることがわかれば、バックボーンとネックをモデルの構成に直接読み込むことができます。構成をモデルに渡すことで、タスク用に初期化します。

以下の例では、[MaskFormer](./model_doc/maskformer)のインスタンスセグメンテーションヘッドで使用するために、[ResNet](./model_doc/resnet)のバックボーンとネックを読み込みます。

configからの初期化では、ランダムな重み付きのモデルが作成されることに注意してください。事前学習済みモデルを読み込む場合は、`from_pretrained` APIを使用してください。

```py
from transformers import AutoConfig, MaskFormerConfig, MaskFormerForInstanceSegmentation

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

別のオプションとして、バックボーンの構成を個別に読み込み、モデルの構成の`backbone_config`に渡す方法があります。

```py
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](https://hf.co/docs/timm/index)は、学習と推論のためのビジョンモデルのコレクションです。Transformersは、[TimmBackbone](/docs/transformers/main/ja/main_classes/backbones#transformers.TimmBackbone)クラスと[TimmBackboneConfig](/docs/transformers/main/ja/main_classes/backbones#transformers.TimmBackboneConfig)クラスを通じて、timmモデルをバックボーンとしてサポートしています。`backbone`に必要となるバックボーンチェックポイントを指定することで、重みがランダムに初期化されたTimmバックボーンを持つモデルを作成できます。

```py
from transformers import MaskFormerConfig, MaskFormerForInstanceSegmentation, TimmBackboneConfig

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

[TimmBackboneConfig](/docs/transformers/main/ja/main_classes/backbones#transformers.TimmBackboneConfig) クラスを明示的に呼び出すことで、事前学習済みの timm バックボーンを読み込んで作成することもできます。

```py
from transformers import TimmBackboneConfig

backbone_config = TimmBackboneConfig("resnet50")
```

バックボーンの構成をモデルの構成に渡し、バックボーンを用いてモデルヘッドの[MaskFormerForInstanceSegmentation](/docs/transformers/main/ja/model_doc/maskformer#transformers.MaskFormerForInstanceSegmentation)をインスタンス化します。

```py
from transformers import MaskFormerConfig, MaskFormerForInstanceSegmentation

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

## 特徴量抽出

backboneは、画像特徴の抽出に使用されます。画像をbackboneに通すことで、特徴マップを取得できます。

画像を読み込み、前処理を行い、バックボーンに渡します。以下の例では、最初のレイヤーから特徴マップを抽出しています。

```py
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_maps`属性に保存され、そこからアクセスされます。

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

