# 骨干网络

更高级的计算机视觉任务，例如目标检测或图像分割，会同时使用多个模型来生成预测。分别使用独立的模型作为*backbone*、neck 和 head。backbone 从输入图像中提取有用的特征并生成特征图，neck 对特征图进行组合和处理，head 则利用这些特征图做出预测。

    

使用 [from_pretrained()](/docs/transformers/main/zh/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,))
```

本指南介绍了骨干类、来自 [timm](https://hf.co/docs/timm/index) 库的骨干网络，以及如何使用它们提取特征。

## 骨干类

有两个骨干类。

- `~transformers.utils.BackboneMixin` 允许你加载 backbone，并包含用于从 config 中提取特征图和索引的函数。
- `~transformers.utils.BackboneConfigMixin` 允许您设置、对齐并验证骨干网络配置中的特征图和索引。

请参阅 [Backbone](./main_classes/backbones) API 文档，以查看哪些模型支持 backbone。

加载 Transformers 骨干网络有两种方式：[AutoBackbone](/docs/transformers/main/zh/main_classes/backbones#transformers.AutoBackbone) 和特定模型的骨干网络类。

如果受支持，[AutoClass](./model_doc/auto) API 会通过 [from_pretrained()](/docs/transformers/main/zh/main_classes/configuration#transformers.PreTrainedConfig.from_pretrained) 自动加载预训练视觉模型作为骨干网络。

将 `out_indices` 参数设置为您希望获取特征图的目标层。如果您知道该层的名称，也可以使用 `out_features`。这两个参数可以互换使用，但如果同时使用两者，请确保它们指向同一层。

当未使用 `out_indices` 或 `out_features` 时，backbone 会返回最后一层的特征图。下面的示例代码使用 `out_indices=(1,)` 来获取第一层的特征图。

    

```py
from transformers import AutoImageProcessor, AutoBackbone

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

当您知道某个模型支持 backbone 时，可以直接将 backbone 和 neck 加载到模型的配置中。将该配置传递给模型，即可针对特定任务对其进行初始化。

以下示例加载了一个 [ResNet](./model_doc/resnet) 骨干网络和颈部，用于 [MaskFormer](./model_doc/maskformer) 实例分割头。

请注意，从配置初始化会创建一个具有随机权重的模型。如果您想加载预训练模型，请使用 `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 支持将 timm 模型作为骨干网络，通过 [TimmBackbone](/docs/transformers/main/zh/main_classes/backbones#transformers.TimmBackbone) 和 [TimmBackboneConfig](/docs/transformers/main/zh/main_classes/backbones#transformers.TimmBackboneConfig) 类实现。在 `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/zh/main_classes/backbones#transformers.TimmBackboneConfig) 类来加载并创建一个预训练的 timm 骨干网络。

```py
from transformers import TimmBackboneConfig

backbone_config = TimmBackboneConfig("resnet50")
```

将骨干网络配置传递给模型配置，并使用该骨干网络实例化模型头 [MaskFormerForInstanceSegmentation](/docs/transformers/main/zh/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]
```

