十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ViTDet 实战指南:在 Detectron2 中用 Plain ViT 骨干网络训练与评估目标检测模型

ViTDet 实战指南:在 Detectron2 中用 Plain ViT 骨干网络训练与评估目标检测模型 ViTDet 实战指南在 Detectron2 中用 Plain ViT 骨干网络训练与评估目标检测模型【免费下载链接】detectron2Detectron2 is a platform for object detection, segmentation and other visual recognition tasks.项目地址: https://gitcode.com/GitHub_Trending/de/detectron2本文围绕 Detectron2 仓库中 projects/ViTDet/README.md 的核心内容系统讲解 ViTDetExploring Plain Vision Transformer Backbones for Object DetectionarXiv:2203.16527在 Detectron2 中的落地实现从模型与配置的组织方式、MAE 预训练权重的加载到基于 LazyConfig 的训练、评估与结果复现。读完本文你将掌握 ViTDet 各规格模型ViT-B/L/H的配置文件结构、关键超参数含义并能在自己的环境里直接运行官方训练与评估命令同时理解其背后的源码实现细节。ViTDet 的核心理念是一个朴素plain的 ViT 骨干网络不做金字塔结构改造仅通过 Simple Feature Pyramid 与窗口注意力即可在目标检测上取得具有竞争力的结果。本仓库在 Detectron2 中同时提供了 ViTDetViT-B/L/H、MViTv2 与 Swin 三种 Transformer 骨干的配置与预训练模型。仓库中 ViTDet 的资源组织在 projects/ViTDet 目录下资源按以下方式组织目录 / 文件内容projects/ViTDet/configs/COCO/COCO 数据集上的 Mask R-CNN 与 Cascade Mask R-CNN 配置ViT-B/L/H、MViTv2-B/L/H、Swin-B/L 共 11 个配置projects/ViTDet/configs/LVIS/LVIS 数据集上的同系列配置11 个projects/ViTDet/configs/common/coco_loader_lsj.py共享的 LSJLarge-Scale Jittering数据增强与 dataloader 定义projects/ViTDet/README.md官方说明、预训练模型清单含 COCO/LVIS 上的 box AP 与 mask AP与训练/评估命令所有 ViTDet 配置均为 Python 格式的 LazyConfig 文件这与仓库中大量.yaml传统配置如 configs/COCO-Detection/faster_rcnn_R_50_FPN_1x.yaml形成对照。LazyConfig 允许配置以可执行代码的形式被 import、继承与动态改写ViTDet 的 ViT-B → ViT-L → ViT-H 升级正是通过逐层 import 与覆盖实现的。预训练模型清单与复现基线COCO 上的 Mask R-CNNViT-B / ViT-L / ViT-H配置configs/COCO/下pre-trainbox APmask APtrain mem (GB)mask_rcnn_vitdet_b_100ep.pyIN1K, MAE51.645.910.9mask_rcnn_vitdet_l_100ep.pyIN1K, MAE55.549.220.9mask_rcnn_vitdet_h_75ep.pyIN1K, MAE56.750.231.5COCO 上的 Cascade Mask R-CNNViT / MViTv2 / Swin配置configs/COCO/下pre-trainbox APmask APcascade_mask_rcnn_swin_b_in21k_50ep.pyIN21K, sup53.946.2cascade_mask_rcnn_swin_l_in21k_50ep.pyIN21K, sup55.047.2cascade_mask_rcnn_mvitv2_b_in21k_100ep.pyIN21K, sup55.648.1cascade_mask_rcnn_mvitv2_l_in21k_50ep.pyIN21K, sup55.748.3cascade_mask_rcnn_mvitv2_h_in21k_36ep.pyIN21K, sup55.948.3cascade_mask_rcnn_vitdet_b_100ep.pyIN1K, MAE54.046.7cascade_mask_rcnn_vitdet_l_100ep.pyIN1K, MAE57.650.0cascade_mask_rcnn_vitdet_h_75ep.pyIN1K, MAE58.751.0LVIS 上的 Mask R-CNN 与 Cascade Mask R-CNNLVIS 版本配置位于projects/ViTDet/configs/LVIS/同样覆盖 ViT-B/L/H、MViTv2-B/L/H 与 Swin-B/L。代表性结果box AP / mask APMask R-CNNViT-B 40.2 / 38.2ViT-L 46.1 / 43.6ViT-H 49.1 / 46.0Cascade Mask R-CNNSwin-B 44.0 / 39.6Swin-L 46.0 / 41.4MViTv2-B 46.3 / 42.0MViTv2-L 49.4 / 44.2MViTv2-H 49.5 / 44.1ViT-B 43.0 / 38.9ViT-L 49.2 / 44.5ViT-H 51.5 / 46.6。官方说明中给出两条重要复现备注与论文中的系统级对比不同这些模型使用较低分辨率1024 而非 1280与标准 NMS而非 soft NMS因此 box AP 与 mask AP 略低于论文数值LVIS 评估结果的方差高于 COCO以 ViT-B 训练 5 次不同随机种子为例box AP 与 mask AP 的标准差约为 0.30%COCO 上约为 0.10%复现时需留意随机种子带来的波动。上述模型使用 8 节点共64 块 NVIDIA A100 GPU训练与评测表中标注*的 MViTv2-H 条目使用了激活检查点activation checkpointing来节省显存。配置逐层拆解从 ViT-B 到 ViT-L基础配置 mask_rcnn_vitdet_b_100ep.py该文件是 ViTDet 系列的核心基础配置关键片段如下from functools import partial from fvcore.common.param_scheduler import MultiStepParamScheduler from detectron2 import model_zoo from detectron2.config import LazyCall as L from detectron2.solver import WarmupParamScheduler from detectron2.modeling.backbone.vit import get_vit_lr_decay_rate from ..common.coco_loader_lsj import dataloader model model_zoo.get_config(common/models/mask_rcnn_vitdet.py).model # Initialization and trainer settings train model_zoo.get_config(common/train.py).train train.amp.enabled True train.ddp.fp16_compression True train.init_checkpoint ( detectron2://ImageNetPretrained/MAE/mae_pretrain_vit_base.pth?matching_heuristicsTrue ) # Schedule # 100 ep 184375 iters * 64 images/iter / 118000 images/ep train.max_iter 184375 lr_multiplier L(WarmupParamScheduler)( schedulerL(MultiStepParamScheduler)( values[1.0, 0.1, 0.01], milestones[163889, 177546], num_updatestrain.max_iter, ), warmup_length250 / train.max_iter, warmup_factor0.001, ) # Optimizer optimizer model_zoo.get_config(common/optim.py).AdamW optimizer.params.lr_factor_func partial(get_vit_lr_decay_rate, num_layers12, lr_decay_rate0.7) optimizer.params.overrides {pos_embed: {weight_decay: 0.0}}要点解读预训练权重detectron2://ImageNetPretrained/MAE/mae_pretrain_vit_base.pth即 MAEMasked Autoencoder在 ImageNet-1K 上预训练的 ViT-Base 权重matching_heuristicsTrue允许按名称做启发式匹配加载训练规模max_iter 184375对应 100 epoch由184375 iters × 64 images/iter ÷ 118000 images/ep推算而来COCO train2017 约 11.8 万张图片学习率调度多段式衰减1.0 → 0.1 → 0.01里程碑位于 163889 与 177546 iter前 250 iter 线性 warmupwarmup 因子 0.001优化器继承 configs/common/optim.py 中的 AdamW 模板lr1e-4、betas(0.9, 0.999)、weight_decay0.1并通过get_vit_lr_decay_rate施加层间学习率衰减详见下文源码分析混合精度train.amp.enabled True与train.ddp.fp16_compression True组合配合 DDP 训练。模型结构configs/common/models/mask_rcnn_vitdet.pyViTDet 的骨干由ViT SimpleFeaturePyramid组合而成该文件定义了 ViT-B 的默认结构model.backbone L(SimpleFeaturePyramid)( netL(ViT)( # Single-scale ViT backbone img_size1024, patch_size16, embed_dimembed_dim, # 768 depthdepth, # 12 num_headsnum_heads, # 12 drop_path_ratedp, # 0.1 window_size14, mlp_ratio4, qkv_biasTrue, norm_layerpartial(nn.LayerNorm, eps1e-6), window_block_indexes[0, 1, 3, 4, 6, 7, 9, 10], residual_block_indexes[], use_rel_posTrue, out_featurelast_feat, ), in_feature${.net.out_feature}, out_channels256, scale_factors(4.0, 2.0, 1.0, 0.5), top_blockL(LastLevelMaxPool)(), normLN, square_pad1024, )关键设计单尺度 ViTout_featurelast_feat只用最后一个 block 输出的单一分辨率特征窗口注意力window_size14ViT-B 的 12 层中第 0/1/3/4/6/7/9/10 层使用窗口注意力第 2/5/8/11 层为全局注意力源码注释# 2, 5, 8 11 for global attention相对位置编码use_rel_posTrue配合window_size提供平移等变性的相对位置信息Simple Feature Pyramid对单尺度特征用scale_factors(4.0, 2.0, 1.0, 0.5)上采样/下采样出 p2~p5再经LastLevelMaxPool生成 p6输出通道统一为 256使用 LayerNorm检测头微调box_head.conv_norm mask_head.conv_norm LNRPN 头部改为 2 卷积conv_dims [-1, -1]box head 为 4conv1fcconv_dims[256,256,256,256]、fc_dims[1024]。从 ViT-B 升级到 ViT-Lcascade_mask_rcnn_vitdet_l_100ep.pyViT-L 配置直接 import ViT-B 的配置并覆盖骨干参数from .cascade_mask_rcnn_vitdet_b_100ep import ( dataloader, lr_multiplier, model, train, optimizer, get_vit_lr_decay_rate, ) train.init_checkpoint ( detectron2://ImageNetPretrained/MAE/mae_pretrain_vit_large.pth?matching_heuristicsTrue ) model.backbone.net.embed_dim 1024 model.backbone.net.depth 24 model.backbone.net.num_heads 16 model.backbone.net.drop_path_rate 0.4 # 5, 11, 17, 23 for global attention model.backbone.net.window_block_indexes ( list(range(0, 5)) list(range(6, 11)) list(range(12, 17)) list(range(18, 23)) ) optimizer.params.lr_factor_func partial(get_vit_lr_decay_rate, lr_decay_rate0.8, num_layers24)可见 ViT-L 的 24 层中第 5/11/17/23 层为全局注意力其余为窗口注意力层间学习率衰减率由 0.7 调整为 0.8。ViT-H 配置cascade_mask_rcnn_vitdet_h_75ep.py同理将embed_dim提升至 1280、depth32、num_heads16。Cascade Mask R-CNN 的组装cascade_mask_rcnn_vitdet_b_100ep.pyCascade 版本在 Mask R-CNN 基础上替换 ROI head[model.roi_heads.pop(k) for k in [box_head, box_predictor, proposal_matcher]] model.roi_heads.update( _target_CascadeROIHeads, box_heads[L(FastRCNNConvFCHead)( input_shapeShapeSpec(channels256, height7, width7), conv_dims[256, 256, 256, 256], fc_dims[1024], conv_normLN, ) for _ in range(3)], box_predictors[L(FastRCNNOutputLayers)( input_shapeShapeSpec(channels1024), test_score_thresh0.05, box2box_transformL(Box2BoxTransform)(weights(w1, w1, w2, w2)), cls_agnostic_bbox_regTrue, num_classes${...num_classes}, ) for (w1, w2) in [(10, 5), (20, 10), (30, 15)]], proposal_matchers[L(Matcher)(thresholds[th], labels[0, 1], allow_low_quality_matchesFalse) for th in [0.5, 0.6, 0.7]], )三个级联 stage 使用递增的 IoU 阈值 0.5/0.6/0.7 与递增的回归权重 (10,5)/(20,10)/(30,15)box head 采用类别无关的边界框回归cls_agnostic_bbox_regTrue每级均为 4conv1fc LN 结构。MViTv2 与 Swin 配置MViTv2cascade_mask_rcnn_mvitv2_b_in21k_100ep.py 以mask_rcnn_fpn.py为基础将model.backbone.bottom_up替换为L(MViT)(embed_dim96, depth24, num_heads1, last_block_indexes(1,4,20,23), residual_poolingTrue, drop_path_rate0.4, out_features(scale2,scale3,scale4,scale5))即 MViTv2 天然输出多尺度特征in_features直接取自其多尺度输出FPN 使用 LNsquare_pad1024Swincascade_mask_rcnn_swin_b_in21k_50ep.py 在 MViTv2 配置之上将bottom_up替换为L(SwinTransformer)(depths[2,2,18,2], embed_dim128, num_heads[4,8,16,32], drop_path_rate0.4)in_features(p0,p1,p2,p3)并将 100ep 调度按比例缩放到 50eptrain.max_iter // 2milestones 同步减半优化器lr4e-5、weight_decay0.05relative_position_bias_table不施加权重衰减。数据侧LSJ 增强 configs/common/coco_loader_lsj.py所有 ViTDet 配置共用同一份 LSJLarge-Scale Jittering数据流水线image_size 1024 dataloader model_zoo.get_config(common/data/coco.py).dataloader dataloader.train.mapper.augmentations [ L(T.RandomFlip)(horizontalTrue), # flip first L(T.ResizeScale)( min_scale0.1, max_scale2.0, target_heightimage_size, target_widthimage_size ), L(T.FixedSizeCrop)(crop_size(image_size, image_size), padFalse), ] dataloader.train.mapper.image_format RGB dataloader.train.total_batch_size 64 # recompute boxes due to cropping dataloader.train.mapper.recompute_boxes True dataloader.test.mapper.augmentations [ L(T.ResizeShortestEdge)(short_edge_lengthimage_size, max_sizeimage_size), ]训练时先水平翻转再做 0.1~2.0 倍的随机缩放最后裁剪/缩放到 1024×1024因为裁剪会改变标注框recompute_boxesTrue强制重算。测试阶段仅做 short edge 1024 的等比缩放配合square_pad1024补齐到方形。训练 batch size 为 64。训练与评估官方命令与运行机制训练README 给出的官方训练命令在projects/ViTDet/目录下执行../../tools/lazyconfig_train_net.py --config-file configs/path/to/config.py例如训练 ViT-B Mask R-CNN../../tools/lazyconfig_train_net.py --config-file configs/COCO/mask_rcnn_vitdet_b_100ep.py默认使用64 块 GPU、batch size 64即单卡 1 张图由 coco_loader_lsj.py 中dataloader.train.total_batch_size 64与 tools/lazyconfig_train_net.py 中launch(..., args.num_gpus, ...)共同决定。训练命令也可在仓库根目录下以python tools/lazyconfig_train_net.py --config-file projects/ViTDet/configs/...的形式运行。评估../../tools/lazyconfig_train_net.py --config-file configs/path/to/config.py --eval-only train.init_checkpoint/path/to/model_checkpoint--eval-only跳过训练直接走推理train.init_checkpoint指向下载好的model_final_*.pkl权重。对应源码在 tools/lazyconfig_train_net.py 的main()eval_only分支中instantiate(cfg.model)构建模型、DetectionCheckpointer(model).load(...)加载权重然后do_test通过inference_on_dataset调用cfg.dataloader.evaluatorCOCO 场景即 coco_evaluation.py 中的 COCOEvaluator并print_csv_format输出结果。训练流程源码脉络main 先LazyConfig.load(args.config_file)读取 Python 配置、LazyConfig.apply_overrides(cfg, args.opts)应用命令行覆盖这正是--eval-only、train.init_checkpoint...生效的机制随后default_setup完成日志与随机种子初始化。训练阶段do_train会依次实例化模型、优化器与 dataloader根据cfg.train.amp.enabled选择AMPTrainer或SimpleTrainer注册 LRScheduler、PeriodicCheckpointer、EvalHook、PeriodicWriter 等钩子后以resume_or_load加载预训练权重并从start_iter训练到max_iter。源码级原理ViT 骨干与 Simple Feature PyramidViTDet 的核心实现位于 detectron2/modeling/backbone/vit.py主要包括ViT类vit.py#L232输入经PatchEmbedpatch 16×16切成 patch叠加可选的绝对位置编码pos_embed后依次通过多个Block。输出单尺度特征out_featurelast_featstride 等于patch_size16Blockvit.py#L145窗口注意力与全局注意力的切换由window_block_indexes决定——window_size 0的层先window_partition分窗、注意力后再window_unpartition还原Attention在use_rel_posTrue时通过add_decomposed_rel_pos注入可分解的相对位置偏置vit.py#L25-L81SimpleFeaturePyramidvit.py#L363对单尺度特征按scale_factors生成金字塔scale4.0 时用两次ConvTranspose2d上采样特征减半再减半scale2.0 用一次转置卷积scale1.0 原样通过scale0.5 用MaxPool2d下采样每级再接 1×1 与 3×3 卷积并归一化到out_channels默认 256、LN。top_blockLastLevelMaxPool在 p5 后追加 p6get_vit_lr_decay_ratevit.py#L506按参数所属 block 计算lr_decay_rate ** (num_layers 1 - layer_id)越靠前的层学习率越低pos_embed/patch_embed视为 layer 0实现浅层小学习率的分层微调策略。复现注意事项与常见问题显存与算力门槛COCO 上 ViT-B 训练显存约 10.9 GB、ViT-H 约 31.5~32.9 GB官方以 64×A100 训练。小规模复现时建议从quick_schedules思路入手自行缩短max_iter或采用更小的 batchMViTv2-H 的*标注即代表官方启用了激活检查点以控制显存输入分辨率本仓库所有配置统一为 1024×1024LSJ 增强 square_pad1024这与论文中 1280 分辨率的系统级设置不同故复现 AP 以本 README 表格为准切勿与论文数值直接对比随机种子方差LVIS 评估方差显著大于 COCOViT-B 五次训练的 box/mask AP 标准差约 0.30% vs 0.10%对比实验结果时需考虑该波动范围预训练权重自动下载train.init_checkpoint使用detectron2://协议首次运行会自动下载 MAE/MViTv2/Swin 的 ImageNet 预训练权重并缓存需保持网络可用LazyConfig 语法ViTDet 全部配置均为 Python LazyConfig非 yaml修改参数遵循model.backbone.net.xxx value的覆盖方式学习曲线可参考 docs/tutorials/lazyconfigs.md 与 configs/common/train.py数据集准备COCO 与 LVIS 数据集的注册与格式要求见 docs/tutorials/builtin_datasets.md 与 datasets/README.mdLVIS 配置依赖 LVIS v1 标注相关元数据在 detectron2/data/datasets/lvis_v1_categories.py。引用若在研究中使用了 ViTDet请引用原始论文article{li2022exploring, title{Exploring plain vision transformer backbones for object detection}, author{Li, Yanghao and Mao, Hanzi and Girshick, Ross and He, Kaiming}, journal{arXiv preprint arXiv:2203.16527}, year{2022} }小结ViTDet 用朴素 ViT Simple Feature Pyramid 窗口注意力证明了 plain backbone 在检测任务上的巨大潜力。本文基于 projects/ViTDet/README.md 完整梳理了仓库提供的模型清单、配置层级、训练/评估命令并结合 detectron2/modeling/backbone/vit.py 与 configs/common/models/mask_rcnn_vitdet.py 等源码解析了其底层实现。按文中命令与配置即可在本地复现 ViT-B/L/H、MViTv2、Swin 系列在 COCO 与 LVIS 上的结果。【免费下载链接】detectron2Detectron2 is a platform for object detection, segmentation and other visual recognition tasks.项目地址: https://gitcode.com/GitHub_Trending/de/detectron2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表