MMDetection 视频实例分割实战:MaskTrack R-CNN 架构解析与 YouTube-VIS 训练、评估、推理全流程指南
2026/9/19 18:24:37 网站建设 项目流程
  • 人工智能
  • 计算机视觉
  • 深度学习
  • 模型评测

【免费下载链接】mmdetection

OpenMMLab Detection Toolbox and Benchmark

项目地址:https://gitcode.com/gh_mirrors/mm/mmdetection
点击查看免费下载

导读

本文以 OpenMMLab MMDetection 仓库中的 MaskTrack R-CNN 配置目录 为对象,系统讲解视频实例分割(Video Instance Segmentation,VIS)任务中经典算法 MaskTrack R-CNN 的原理、配置文件结构,以及从环境搭建、数据集准备、多卡训练、离线评估到单卡视频推理的完整实战流程。读完本文,你将掌握基于 YouTube-VIS 2019/2021 数据集复现 MaskTrack R-CNN 的端到端方法,并理解其在检测、分割与跟踪三合一设计上的底层源码实现细节。

一、MaskTrack R-CNN 与视频实例分割任务

1.1 任务定义:从图像实例分割到视频域

视频实例分割(VIS)是由 Yang 等人在 2019 年提出的一项新视觉任务,其目标是在视频中同时完成实例的检测、分割与跟踪——即对每一帧中的每个目标实例,不仅要给出边界框与像素级掩码,还要跨帧保持一致的实例编号(instance ID)。这是图像实例分割问题首次被系统性地扩展到视频域。原文中同时发布了大规模基准数据集 YouTube-VIS,包含 2883 个高分辨率 YouTube 视频、40 个类别标签集以及 131k 高质量实例掩码,为该任务的研究提供了统一评测平台。论文引用信息见 configs/masktrack_rcnn/README.md。

1.2 核心思路:为 Mask R-CNN 增加一条跟踪分支

MaskTrack R-CNN 的核心思想非常直观:以两阶段检测器 Mask R-CNN 为基座,新增一条"跟踪分支"(tracking branch),使检测、分割与跟踪三个子任务在同一个框架内联合完成。从本仓库源码看,该模型整体由三部分组成(见 mmdet/models/vis/masktrack_rcnn.py):

  • detector:一个标准两阶段检测器(本配置中为 Mask R-CNN),负责输出目标框、类别、分数与实例掩码;
  • track_head:由 ROI 特征提取器(RoITrackHead)与嵌入头(RoIEmbedHead)构成,负责为每个候选框学习判别性嵌入向量,用于度量不同帧目标之间的相似度;
  • tracker:即MaskTrackRCNNTracker,负责利用检测分数、IoU、类别一致性以及嵌入相似度进行帧间匹配并维护实例 ID。

源码中assert hasattr(self.detector, 'roi_head'), 'MaskTrack R-CNN only supports two stage detectors.'(masktrack_rcnn.py)明确说明该算法仅支持两阶段检测器作为基座。

1.3 任务注册与基准信息

在仓库的 configs/masktrack_rcnn/metafile.yml 中,MaskTrack R-CNN 的元数据被登记为:

  • 任务:Video Instance Segmentation(视频实例分割);
  • 训练数据:YouTube-VIS 2019 / 2021;
  • 训练技术:SGD with Momentum;
  • 训练资源:8 块 TiTanXP GPU。

二、配置文件逐段解读

2.1 配置文件清单

configs/masktrack_rcnn/目录下共 6 个模型配置,覆盖 3 种骨干网络 × 2 个数据集版本:

骨干网络YouTube-VIS 2019YouTube-VIS 2021
R-50-FPNmasktrack-rcnn_mask-rcnn_r50_fpn_8xb1-12e_youtubevis2019.pymasktrack-rcnn_mask-rcnn_r50_fpn_8xb1-12e_youtubevis2021.py
R-101-FPNmasktrack-rcnn_mask-rcnn_r101_fpn_8xb1-12e_youtubevis2019.pymasktrack-rcnn_mask-rcnn_r101_fpn_8xb1-12e_youtubevis2021.py
X-101-FPNmasktrack-rcnn_mask-rcnn_x101_fpn_8xb1-12e_youtubevis2019.pymasktrack-rcnn_mask-rcnn_x101_fpn_8xb1-12e_youtubevis2021.py

其中masktrack-rcnn_mask-rcnn_r50_fpn_8xb1-12e_youtubevis2021.py仅比 2019 版本多了一处重写:通过_base_继承 2019 配置,并把data_root指向data/youtube_vis_2021/、注释文件换成youtube_vis_2021_train.jsonyoutube_vis_2021_valid.json(见 2021 配置)。

2.2 基座配置与骨干迁移学习

2019 版配置通过_base_继承三份基础配置(配置源码):

_base_ = [ '../_base_/models/mask-rcnn_r50_fpn.py', '../_base_/datasets/youtube_vis.py', '../_base_/default_runtime.py' ]

随后对基座 Mask R-CNN 做了针对性调整:

  • 类别数从 COCO 的 80 改为 YouTube-VIS 的 40:bbox_headmask_head均更新num_classes=40
  • RPN 采样数下调:train_cfg.rpn.sampler.num=64
  • 训练与测试时单图候选框数量设为nms_pre=200, max_per_img=200
  • RCNN 头采样数设为num=128,测试时score_thr=0.01保证低分框也能参与跟踪;
  • 初始化权重使用 COCO 预训练的 Mask R-CNN 检查点(init_cfg.type='Pretrained'),实现从图像任务到视频任务的迁移学习。

2.3 模型结构:MaskTrackRCNN的三件套

配置中通过model = dict(type='MaskTrackRCNN', ...)组装完整模型(配置源码),三个关键组件如下:

(1)data_preprocessor——TrackDataPreprocessor:承担视频帧的归一化与填充,参数mean=[123.675, 116.28, 103.53]std=[58.395, 57.12, 57.375]bgr_to_rgb=True(与基座图像模型一致),并开启pad_mask=Truepad_size_divisor=32,确保掩码与特征图按 32 的倍数对齐填充。

(2)track_head——RoITrackHead+RoIEmbedHead

track_head=dict( type='RoITrackHead', roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), out_channels=256, featmap_strides=[4, 8, 16, 32]), embed_head=dict( type='RoIEmbedHead', num_fcs=2, roi_feat_size=7, in_channels=256, fc_out_channels=1024), train_cfg=dict( assigner=dict( type='MaxIoUAssigner', pos_iou_thr=0.5, neg_iou_thr=0.5, min_pos_iou=0.5, match_low_quality=True, ignore_iof_thr=-1), sampler=dict( type='RandomSampler', num=128, pos_fraction=0.25, neg_pos_ub=-1, add_gt_as_proposals=True), pos_weight=-1, debug=False))

其工作机理(结合 roi_track_head.py):

  • roi_extractor用 RoIAlign 从 FPN 的 4 个尺度特征(stride 4/8/16/32)上提取 7×7、256 通道的 ROI 特征;
  • RoIEmbedHead通过 2 层全连接(FC,输出通道 1024)把 ROI 特征压缩为判别性嵌入向量,损失采用CrossEntropyLoss(见 roi_embed_head.py);
  • 训练时loss()会同时提取关键帧(key frame)采样框与参考帧(reference frame)GT 框的 ROI 特征,再调用embed_head.loss()计算跨帧匹配的相似度损失(roi_track_head.py)。

(3)tracker——MaskTrackRCNNTracker

tracker=dict( type='MaskTrackRCNNTracker', match_weights=dict(det_score=1.0, iou=2.0, det_label=10.0), num_frames_retain=20)

match_weights定义了匹配分数的三个加权分量:检测分数(1.0)、框 IoU(2.0)与类别一致性(10.0);num_frames_retain=20表示某条轨迹若超过 20 帧未出现即从记忆缓冲中清除(见 base_tracker.py 与 masktrack_rcnn_tracker.py)。

2.4 训练/验证数据流:关键帧 + 参考帧采样

configs/base/datasets/youtube_vis.py 定义了视频数据流水线,其训练与测试的关键区别在于训练使用了UniformRefFrameSample采样器:

train_pipeline = [ dict( type='UniformRefFrameSample', num_ref_imgs=1, frame_range=100, filter_key_img=True), dict( type='TransformBroadcaster', share_random_params=True, transforms=[ dict(type='LoadImageFromFile', backend_args=backend_args), dict(type='LoadTrackAnnotations', with_mask=True), dict(type='Resize', scale=(640, 360), keep_ratio=True), dict(type='RandomFlip', prob=0.5), ]), dict(type='PackTrackInputs') ]

训练时每个样本由 1 个关键帧 + 1 个参考帧组成(num_ref_imgs=1),参考帧在关键帧前后 100 帧范围内均匀采样(frame_range=100)。这解释了 masktrack_rcnn.py 中inputs必须为 5D 张量(N, T, C, H, W)T=2(1 个关键帧 + 1 个参考帧)的约束。两帧共享同一组随机增强参数(share_random_params=True),并统一缩放到 640×360。

数据集注释目录要求:

  • YouTube-VIS 2019:data/youtube_vis_2019/annotations/youtube_vis_2019_train.jsonyoutube_vis_2019_valid.json,图像位于train/JPEGImagesvalid/JPEGImages
  • YouTube-VIS 2021:同理位于data/youtube_vis_2021/下。

2.5 优化器、学习率与训练/验证循环

  • 优化器SGD(lr=0.00125, momentum=0.9, weight_decay=0.0001),并启用clip_grad(max_norm=35, norm_type=2)梯度裁剪;
  • 学习率调度:先进行 500 iter 的线性预热(LinearLRstart_factor=1/3by_epoch=False),再按 epoch 用MultiStepLR在里程碑[8, 11]处以gamma=0.1阶梯下降;
  • 训练循环EpochBasedTrainLoopmax_epochs=12val_begin=13(即前 12 个 epoch 只训练不验证);
  • 验证/测试评估器YouTubeVISMetric,指标为youtube_vis_apformat_only=True表示只产出可提交的结果文件而非本地打分(配置中outfile_prefix='./youtube_vis_results');
  • 可视化TrackVisualizationHook默认draw=False,可视化后端为TrackLocalVisualizer

2.6 训练/测试时的批大小与推理约束

train_dataloader显式设置batch_size=1(每卡 1 个视频样本,num_workers=2),并使用视频专用的TrackImgSampler(基于图像采样)与TrackAspectRatioBatchSampler。推理侧同样严格限制:源码 masktrack_rcnn.py 断言len(data_samples) == 1,即单卡单次推理仅支持 1 个视频(batch size 1)。

三、复现与实战:从环境到推理

3.1 环境搭建

跟踪类(tracking)开发环境的安装与 MMDetection 基础环境一致,请参考 docs/en/get_started.md。需要说明的是,MaskTrack R-CNN 依赖 OpenMMLab 系列中的 mmtrack 生态组件(其官方预训练权重托管于 mmtracking 下载服务),在安装时需按仓库 README 指引补齐相应依赖。

3.2 数据集准备

YouTube-VIS 2019 / 2021 数据集的下载与目录组织方式,请参考 docs/en/user_guides/tracking_dataset_prepare.md。按 2.4 节所述路径放置data/youtube_vis_2019/data/youtube_vis_2021/目录即可被配置直接读取。

3.3 训练:推荐 8 卡复现

由于默认配置中的学习率等超参数是面向多卡设定的,官方建议使用 8 块 GPU 训练以复现报告精度:

# 在 YouTube-VIS-2021 上训练 MaskTrack R-CNN(R-50-FPN) # 配置文件名后的数字表示使用的 GPU 数量,这里为 8 bash tools/dist_train.sh configs/masktrack_rcnn/masktrack-rcnn_mask-rcnn_r50_fpn_8xb1-12e_youtubevis2021.py 8

关于train.py/dist_train.sh/slurm_train.sh更详细的用法(单机多卡、Slurm 集群等),可参阅 docs/en/user_guides/tracking_train_test.md。

3.4 测试与评估:生成可提交结果

如需生成 YouTube-VIS val/test 集的可提交结果文件,使用以下命令。结果默认保存为./youtube_vis_results.submission_file.zip,可通过修改配置中test_evaluatoroutfile_prefix改变保存位置:

# 配置文件名后的数字表示使用的 GPU 数量 bash tools/dist_test_tracking.sh configs/masktrack_rcnn/masktrack-rcnn_mask-rcnn_r50_fpn_8xb1-12e_youtubevis2021.py 8 --checkpoint ${CHECKPOINT_PATH}

${CHECKPOINT_PATH}替换为本地下载的权重文件路径即可。评估与提交细节同样见 tracking_train_test.md。

3.5 单卡视频推理与可视化

使用单 GPU 对一段视频进行预测并把结果保存为视频:

python demo/mot_demo.py demo/demo_mot.mp4 configs/masktrack_rcnn/masktrack-rcnn_mask-rcnn_r50_fpn_8xb1-12e_youtubevis2021.py --checkpoint {CHECKPOINT_PATH} --out vis.mp4

其中demo/demo_mot.mp4为仓库自带示例视频,vis.mp4为输出文件名。mot_demo.py的更多用法(输入源、输出格式、可视化参数等)参见 docs/en/user_guides/tracking_inference.md。

四、推理链路的源码级剖析:帧间实例 ID 如何诞生

推理时,MaskTrackRCNN.predict()逐帧处理整个视频(masktrack_rcnn.py):

  1. 初始化:当frame_id == 0时调用self.tracker.reset()清空轨迹缓冲与计数器;
  2. 单帧检测:对每一帧,先经 RPN 得到候选框,再经roi_head.predict()得到检测框、类别、分数与掩码;
  3. 跟踪匹配:调用tracker.track(),其内部(masktrack_rcnn_tracker.py)执行:
    • 通过track_head.extract_roi_feats()提取当前帧检测框的 ROI 嵌入特征;
    • 若缓冲为空(视频首帧),为每个检测框直接分配新 ID;
    • 否则与历史轨迹的prev_roi_feats计算similarity_logits,并组合三类信息计算匹配分数(get_match_score):
      • 嵌入相似度的对数概率;
      • 检测分数(权重 1.0)的对数;
      • 当前框与历史框的 IoU(权重 2.0);
      • 类别一致性(权重 10.0,同类别为 1,否则为 0);
    • 匹配分数矩阵首列为"新建轨迹"通道:assign_ids()取每行最大值,选中第 0 列则为该目标创建新 ID,否则继承历史 ID,并做去重保留最优匹配(assign_ids);
  4. 缓冲维护BaseTracker.update()记录每帧的 ID、框、掩码、特征与帧号,并在pop_invalid_tracks()中淘汰超过num_frames_retain=20帧未出现的轨迹(base_tracker.py)。

五、评测结果:YouTube-VIS 2019 / 2021

5.1 YouTube-VIS 2019 验证集结果

引用 configs/masktrack_rcnn/README.md 及 metafile.yml:如原文 Issues #6 所述,MaskTrack R-CNN 在 R-50-FPN 骨干下的结果在不同试验间存在波动(AP 约在 28 到 31 之间),下表检查点为两次实验中较优的一次:

方法基座检测器骨干训练时长显存 (GB)AP配置权重
MaskTrack R-CNNMask R-CNNR-50-FPN12e1.6130.2configmodel
MaskTrack R-CNNMask R-CNNR-101-FPN12e2.2732.2configmodel
MaskTrack R-CNNMask R-CNNX-101-FPN12e3.6934.7configmodel

5.2 YouTube-VIS 2021 验证集结果

2021 版本数据集更富挑战性(更多视频、更长序列),各骨干 AP 略有下降(数据见 README 与 metafile.yml):

方法基座检测器骨干训练时长显存 (GB)AP配置权重
MaskTrack R-CNNMask R-CNNR-50-FPN12e1.6128.7configmodel
MaskTrack R-CNNMask R-CNNR-101-FPN12e2.2731.3configmodel
MaskTrack R-CNNMask R-CNNX-101-FPN12e3.6933.5configmodel

注:上表显存值为单卡训练峰值(train_cfgbatch_size=1时测得),官方metafile.yml中记录的对应值为 R-50 1.16 GB、R-101 2.27 GB、X-101 3.69 GB,数值差异来自测量口径不同。所有 AP 均为验证集指标。

六、实践要点与常见注意事项

  • 8 卡训练是复现前提:默认lr=0.00125与 12e 调度针对 8 GPU 设定,单卡直接训练会导致精度与收敛行为偏离官方结果;
  • 结果存在随机性:官方明确说明 MaskTrack R-CNN 不同随机种子下 AP 波动明显(R-50-FPN 约 28~31),比较结果时建议多次运行取最优;
  • 批大小约束:训练与推理均以"视频"为单位,每卡批大小固定为 1,推理时单进程只支持单个视频输入;
  • 跟踪效果依赖低阈值检测test_cfg.rcnn.score_thr=0.01的低分数阈值与num_frames_retain=20的轨迹保留策略共同决定了 ID 切换(ID switch)的频繁程度,可依据实际视频场景调参;
  • 提交格式:使用YouTubeVISMetricformat_only=True仅生成 zip 提交包,本地如需精确 AP 请参考 YouTube-VIS 官方评测脚本按 tracking_train_test.md 指引操作。

七、结语

MaskTrack R-CNN 是视频实例分割领域的奠基性工作之一,其"检测器 + ROI 跟踪头 + 帧间匹配跟踪器"的范式至今仍是视频理解任务的常用基线。本文从 MMDetection 仓库的 配置文件 出发,结合 模型实现、跟踪头、嵌入头、跟踪器 与 基类 等源码,完整还原了从数据采样、联合训练到逐帧跟踪的整个链路。希望读者能据此在 YouTube-VIS 2019/2021 上顺利复现,并将其作为更先进视频实例分割方法(如 Mask2Former-VIS 等)的对照基线。

  • 人工智能
  • 计算机视觉
  • 深度学习
  • 模型评测

【免费下载链接】mmdetection

OpenMMLab Detection Toolbox and Benchmark

项目地址:https://gitcode.com/gh_mirrors/mm/mmdetection
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询