首页
/ TF Models backbone_reuse:用冻结的 ImageNet 预训练 Backbone 训练 Mask R-CNN 的完整实践

TF Models backbone_reuse:用冻结的 ImageNet 预训练 Backbone 训练 Mask R-CNN 的完整实践

2026-09-04 09:44:09作者:伍希望

本文基于 tensorflow/models 仓库中 official/projects/backbone_reuse 子项目的说明文档与配套配置文件,讲解"冻结图像分类 backbone 的特征复用"(backbone freezing)方法在目标检测/实例分割模型上的落地方式:如何选用 ResNet-RS-101 预训练权重、如何选择并修改 FPN / NASFPN / Cascade 系列实验配置、freeze_backboneinit_checkpoint_modules 两个核心标志在源码中如何生效,以及不同训练日程(72 / 600 epochs)下的学习率与步数设置,帮助读者掌握以分类预训练特征提升下游检测任务效果的可复现实战流程。

背景:backbone 冻结训练方法

backbone_reuse 项目对应的工作是论文《Proper Reuse of Image Classification Features Improves Object Detection》(CVPR 2022,被选为 Oral 报告),其核心思想是:在把图像分类预训练的 backbone 迁移到 Mask R-CNN 等下游检测架构时,在整个下游训练过程中保持 backbone 权重冻结,只训练 decoder、检测头等其余部分,反而能获得更好的检测效果。

仓库中的项目入口文档为 README.md,它给出了一套"下载预训练 checkpoint → 选择实验配置 → 指向 checkpoint 文件 → 走标准 TFVision 训练管线"的极简操作流程。

训练 Mask R-CNN:冻结 ResNet-RS-101(ImageNet 预训练)

README 给出的完整训练步骤如下(已结合仓库内配置补充细节):

  1. 下载 ResNet-RS-101 预训练 checkpoint。README 指出应使用 TF-Vision Model Garden 中以 ImageNet 预训练的 ResNet-RS-101 权重(原始文档中提供了 Model Garden 与 checkpoint 的下载链接,可按文档指引获取 resnet-rs-101 压缩包)。
  2. 选择实验配置文件。仓库内置了 ResNet-101 消融实验的全部 YAML 配置,位于 configs/experiments/faster_rcnn。选择依据两个维度:
    • 目标架构:FPN、NASFPN、NASFPN + Cascade;
    • 训练日程偏好:较短的 72 epochs 或较长的 600 epochs。
  3. 修改配置中的 init_checkpoint 标志,指向第 1 步下载的 checkpoint 文件。

完成以上三步后,按照官方 TFVision 的 Mask R-CNN 标准训练管线(即 official/vision/train.py 入口)即可开始训练。

配置文件中预置的关键标志

打开任意一份消融配置(例如 fastrcnn_resnet101_fpn_72epochs.yaml),可以看到所有配置都以相同的任务头开启冻结逻辑:

task:
  # init_checkpoint: 'a_pretrained_backbone_checkpoint'
  init_checkpoint_modules: backbone
  freeze_backbone: true
  model:
    backbone:
      resnet:
        model_id: 101
        replace_stem_max_pool: true
        resnetd_shortcut: true
        scale_stem: true
        se_ratio: 0.25
        stem_type: v1
      type: resnet
    decoder:
      type: fpn
    detection_head:
      num_fcs: 2
    norm_activation:
      activation: swish

其中三个与"特征复用"直接相关的字段:

字段 取值 作用
init_checkpoint 需自行填写 被注释掉的占位行,需要改为实际的 ResNet-RS-101 checkpoint 路径
init_checkpoint_modules backbone 只从预训练 checkpoint 恢复 backbone 模块的权重(可选值还有 alldecoder,见下文源码说明)
freeze_backbone true 训练全程冻结 backbone,其参数不产生梯度更新

backbone 子配置则精确刻画了 ResNet-RS-101 这一模型变体(RS 系列改进点):

  • model_id: 101:101 层 ResNet;
  • replace_stem_max_pool: true:用 stride-4 的卷积 stem 替换 stem 中的 max-pooling,保留更高分辨率特征;
  • resnetd_shortcut: true:ResNet-D 风格的 shortcut(低分辨率处对 shortcut 下采样,避免形状不匹配时的零填充);
  • scale_stem: true:对 stem 卷积初始化进行缩放;
  • se_ratio: 0.25:加入 SE(Squeeze-and-Excitation)模块,通道压缩比 0.25;
  • stem_type: v1:使用 v1 stem。

decoder.type 决定特征金字塔类型:FPN 配置直接写 fpn;NASFPN 配置写 nasfpn,并额外指定金字塔层级范围 min_level: 3max_level: 7,且 FPN 的 NASFPN 消融还显式设置 include_mask: false(只评测框 AP);Cascade 系列在 detection_head 中开启 cascade_class_ensemble: trueclass_agnostic_bbox_pred: true,并将 input_size 提高到 [1280, 1280, 3],同时在 roi_sampler 中给出级联 IoU 阈值 cascade_iou_thresholds: [0.7, 0.8]

可用配置一览

configs/experiments 下共 12 份 YAML,按检测架构与训练日程组织:

README 正文聚焦于 Mask R-CNN 的消融实验,RetinaNet 配置属于仓库中额外提供的同方法延伸,可按相同方式使用。

训练日程:学习率与步数的差异

同一架构下 72 epochs 与 600 epochs 两份配置的主要差别在 trainer 段。以 FPN 为例(fastrcnn_resnet101_fpn_72epochs.yamlfastrcnn_resnet101_fpn_600epochs.yaml):

72 epochs 600 epochs
学习率调度 PiecewiseConstantDecayvalues: [0.16, 0.016, 0.0016]boundaries: [88704, 125664] 同学习率序列,boundaries: [1062734, 1090458]
train_steps 133056 1108940
steps_per_loop / summary_interval 1848 1848

即两种日程使用完全一致的阶梯学习率曲线(0.16 → 0.016 → 0.0016,各衰减 10 倍),只是衰减边界按总步数等比后移。数据侧两份配置保持一致:global_batch_size: 64、随机水平翻转(aug_rand_hflip: true)、缩放范围 [0.1, 2.0]。RetinaNet 系列则使用更大 batch(global_batch_size: 256)和相应翻倍的学习率(values: [0.32, 0.032, 0.0032]),72 epochs 档 train_steps: 33264

原理剖析:freeze_backbone 在源码中如何生效

README 的 "How does it work?" 部分说明:配置文件设置任务标志 freeze_backbone: true,该标志会阻止预训练 backbone 权重在下游模型训练中更新。这一行为在官方 TFVision 任务实现中可以找到直接证据:

  • 配置定义:在 official/vision/configs/maskrcnn.py 中,任务配置包含:

    init_checkpoint: Optional[str] = None
    init_checkpoint_modules: Union[str, List[str]] = 'all'  # all, backbone, and/or decoder
    ...
    # If set, freezes the backbone during training.
    freeze_backbone: bool = False
    

    这解释了 YAML 中 init_checkpoint_modules: backbone 的合法取值(allbackbonedecoder):它决定恢复 checkpoint 时只加载哪些模块,与"恢复范围"和"可训练范围"解耦。

  • 冻结逻辑:在 official/vision/tasks/maskrcnn.pybuild_model() 末尾:

    if self.task_config.freeze_backbone:
      model.backbone.trainable = False
    

    即在构建 Mask R-CNN 模型后,直接将 Keras backbone 的 trainable 置为 False——backbone 前向照常计算特征图,但其参数不再参与反向传播与优化器更新。同项目也复用了 init_checkpoint 的加载逻辑(initialize() 中支持文件或目录形式的 checkpoint)。同样的 freeze_backbone 开关在 retinanet.pyimage_classification.pyvideo_classification.py 等任务中均以相同方式实现,因此 backbone_reuse 的配置可无缝挂到既有 TFVision 训练管线上。

需要说明的一点是:README 的表述是"backbone 权重在训练期间不更新",从源码看实现方式即 Keras 层级的 trainable = False;这意味着冻结作用于 backbone 子模块内部参数,而 FPN/NASFPN decoder、RPN 与 RoI 检测头仍按常规训练(其中 decoder 部分默认不从分类 checkpoint 恢复,除非另行调整 init_checkpoint_modules)。

使用方式与适用前提

  • 运行入口:完成 checkpoint 路径修改后,使用 TFVision 标准训练命令以本项目的 YAML 作为 --config_file 传入即可(配置为纯 YAML,由 official/vision/train.py 的实验配置体系加载)。
  • 适用前提:方法针对 ImageNet 预训练的 ResNet-RS-101 特征复用到 Mask R-CNN(FPN / NASFPN / Cascade)的检测场景设计,训练数据与评估均沿用 TFVision 的 Mask R-CNN 数据管线;RetinaNet 配置可视为同一思想的单阶段检测延伸。
  • 结果引用:具体的精度与消融结论以原论文为准,仓库 README 未内嵌数值表格。

引用信息

如需在论文或报告中引用该工作,README 提供了如下 BibTeX:

@inproceedings{vasconcelos2022backbonefreeze,
      title = {Proper Reuse of Image Classification Features Improves Object Detection},
      author = {Cristina Vasconcelos and Vighnesh Birodkar and Vincent Dumoulin},
      booktitle={CVPR}
      year={2022},
}

小结

backbone_reuse 子项目用一个可复制的配置集合,把 CVPR 2022 Oral 论文"冻结分类 backbone 复用特征"的方法落到 TFVision 的 Mask R-CNN 管线上:三份 YAML 级选择(架构 × 日程)覆盖 FPN、NASFPN、Cascade 与 72/600 epochs 组合,核心改动只是 init_checkpoint_modules: backbone + freeze_backbone: true 两个标志,其底层实现是 maskrcnn.py 中一行 model.backbone.trainable = False。理解了配置与源码的对应关系后,即可按"下载 ResNet-RS-101 checkpoint → 修改 init_checkpoint → 标准管线训练"三步完整复现该实验。

登录后查看全文
热门项目推荐
相关项目推荐