- 人工智能
- 计算机视觉
- 深度学习
- 模型评测
【免费下载链接】mmdetection
OpenMMLab Detection Toolbox and Benchmark
导读
本文以 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 2019 | YouTube-VIS 2021 |
|---|---|---|
| R-50-FPN | masktrack-rcnn_mask-rcnn_r50_fpn_8xb1-12e_youtubevis2019.py | masktrack-rcnn_mask-rcnn_r50_fpn_8xb1-12e_youtubevis2021.py |
| R-101-FPN | masktrack-rcnn_mask-rcnn_r101_fpn_8xb1-12e_youtubevis2019.py | masktrack-rcnn_mask-rcnn_r101_fpn_8xb1-12e_youtubevis2021.py |
| X-101-FPN | masktrack-rcnn_mask-rcnn_x101_fpn_8xb1-12e_youtubevis2019.py | masktrack-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.json与youtube_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_head与mask_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=True、pad_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.json与youtube_vis_2019_valid.json,图像位于train/JPEGImages与valid/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 的线性预热(
LinearLR,start_factor=1/3,by_epoch=False),再按 epoch 用MultiStepLR在里程碑[8, 11]处以gamma=0.1阶梯下降; - 训练循环:
EpochBasedTrainLoop,max_epochs=12,val_begin=13(即前 12 个 epoch 只训练不验证); - 验证/测试评估器:
YouTubeVISMetric,指标为youtube_vis_ap,format_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_evaluator的outfile_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):
- 初始化:当
frame_id == 0时调用self.tracker.reset()清空轨迹缓冲与计数器; - 单帧检测:对每一帧,先经 RPN 得到候选框,再经
roi_head.predict()得到检测框、类别、分数与掩码; - 跟踪匹配:调用
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);
- 通过
- 缓冲维护:
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-CNN | Mask R-CNN | R-50-FPN | 12e | 1.61 | 30.2 | config | model |
| MaskTrack R-CNN | Mask R-CNN | R-101-FPN | 12e | 2.27 | 32.2 | config | model |
| MaskTrack R-CNN | Mask R-CNN | X-101-FPN | 12e | 3.69 | 34.7 | config | model |
5.2 YouTube-VIS 2021 验证集结果
2021 版本数据集更富挑战性(更多视频、更长序列),各骨干 AP 略有下降(数据见 README 与 metafile.yml):
| 方法 | 基座检测器 | 骨干 | 训练时长 | 显存 (GB) | AP | 配置 | 权重 |
|---|---|---|---|---|---|---|---|
| MaskTrack R-CNN | Mask R-CNN | R-50-FPN | 12e | 1.61 | 28.7 | config | model |
| MaskTrack R-CNN | Mask R-CNN | R-101-FPN | 12e | 2.27 | 31.3 | config | model |
| MaskTrack R-CNN | Mask R-CNN | X-101-FPN | 12e | 3.69 | 33.5 | config | model |
注:上表显存值为单卡训练峰值(
train_cfg中batch_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)的频繁程度,可依据实际视频场景调参; - 提交格式:使用
YouTubeVISMetric的format_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
相关推荐
DiT 文档布局分析实战:基于 Detectron2 的 Mask R-CNN / Cascade Mask R-CNN 推理、训练与评估完全指南
DiT 文档布局分析实战:基于 Detectron2 的 Mask R CNN / Cascade Mask R CNN 推理、训练与评估完全指南 本指南以 u
人工智能大模型预训练深度学习NLP计算机视觉多模态语音音频微调Cascade R-CNN 在 MMDetection 中的原理剖析、配置解析与训练实战
Cascade R CNN 在 MMDetection 中的原理剖析、配置解析与训练实战 Cascade R CNN 是目标检测与实例分割领域里程碑式的高质量检
人工智能计算机视觉深度学习模型评测Detectron2 点级监督实例分割(PointSup)实战:从 10 点标注生成到 Mask R-CNN / PointRend 训练与评估
Detectron2 点级监督实例分割(PointSup)实战:从 10 点标注生成到 Mask R CNN / PointRend 训练与评估 本指南以 De
人工智能计算机视觉深度学习机器学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考