MMDetection训练中断恢复指南:从指定epoch继续训练的完整流程

mmdetection训练中断,怎么接上次训练结果继续训练,或从之前某个epoch的模型直接开始训练? 比如如果之前训练后最新的pth是第11个epoch的,但是不小心把epoch_11.pth删了,程序默认找epoch_11.pth,那就找不到这个模型文件了,就会报错。注意我们采用这种方法恢复时,命令的第二个py文件和我们最初用系统提供的模型来训练的命令的第二个py文件是不同的。字段,'help'中写道:如果指定路径,那么恢复相应的模型;最初用系统提供的模型来训练的命令如下:可以看到第二个py文件是configs/...目录里的。因此,要从上次中断的位置或者用之前的模型训练,只需加上--resume字段。 阅读详情

1. 训练中断恢复:为什么这比你想的更重要

搞目标检测模型训练,尤其是用MMDetection这种框架,最让人头疼的莫过于训练到一半突然中断。我遇到过各种情况:服务器机房断电、GPU内存爆掉、甚至实验室保洁阿姨不小心踢掉了电源线。每次看到训练了十几个小时的进度突然归零,那种心情真是五味杂陈。

其实训练中断恢复不仅仅是“接着训练”那么简单,它涉及到几个关键问题:模型权重怎么加载?优化器状态要不要恢复?学习率调度器从哪开始?如果这些没处理好,你可能会发现恢复后的训练效果还不如从头开始。更糟糕的是,有些中断恢复不当会导致模型发散,前面几十个epoch的努力全白费了。

在MMDetection里,中断恢复的核心机制就是--resume参数。但很多人对这个参数的理解只停留在表面,以为就是简单指定一个checkpoint文件。实际上,MMDetection从2.x版本升级到3.x后,整个训练恢复机制有了很大变化,特别是引入了MMEngine作为底层引擎,很多细节需要重新理解。

我刚开始用MMDetection 3.0的时候,就踩过一个坑:以为恢复训练只需要改配置文件里的max_epochs,结果发现模型虽然接着训练了,但验证集上的指标一直在原地踏步。后来才发现,是因为学习率调度器没有正确恢复,导致学习率始终停留在很低的水平,模型参数几乎不更新。

2. 理解MMDetection的checkpoint机制

要正确恢复训练,首先得明白MMDetection是怎么保存训练状态的。在MMDetection 3.x里,一个完整的checkpoint文件(通常是.pth格式)包含的内容远不止模型权重。

当你用默认配置训练时,MMDetection会在每个epoch结束后保存一个checkpoint。我们来看看这个checkpoint里到底有什么:

import torch

# 加载一个保存的checkpoint看看结构
checkpoint = torch.load('work_dirs/faster_rcnn/epoch_12.pth', map_location='cpu')

print("Checkpoint包含的键:")
for key in checkpoint.keys():
    print(f"- {key}")

# 输出通常包括:
# - meta: 元信息,包括训练配置、时间戳等
# - state_dict: 模型权重
# - optimizer: 优化器状态
# - param_schedulers: 学习率调度器状态
# - epoch: 当前的epoch数
# - iter: 当前的迭代次数

这里有个关键点:resume和load_from是完全不同的两个概念。很多人容易混淆,结果用错了参数,训练效果大打折扣。

load_from 只加载模型权重,其他所有状态(优化器、学习率调度器、当前epoch)都从头开始。这相当于用预训练权重初始化模型,然后从零开始训练。适合迁移学习或者fine-tuning的场景。

resume 则是完整恢复训练状态,包括模型权重、优化器状态、学习率调度器状态、当前的epoch和iter计数。这才是真正意义上的“接着上次训练”。

我整理了一个对比表格,让你一目了然:

特性load_fromresume
模型权重加载加载
优化器状态不加载加载
学习率调度器重新初始化恢复状态
当前epoch从0开始从保存的epoch继续
训练历史不保留保留
适用场景迁移学习、fine-tuning训练意外中断恢复

在实际操作中,如果你用错了,很容易看出来。比如用load_from恢复中断的训练,你会发现训练日志里的loss曲线在恢复点有个明显的跳跃,因为优化器动量等状态都重置了。

3. 从指定epoch恢复训练的完整操作流程

现在我们来一步步操作,假设你的Faster R-CNN训练在epoch 12时中断了,你想从epoch 12继续训练。

3.1 第一步:找到并修改配置文件

训练开始后,MMDetection会在work_dirs目录下生成一个配置文件副本。这个副本很重要,因为它是实际训练时使用的配置,包含了所有运行时信息。

# 假设你的原始配置文件在configs/faster_rcnn/
# 训练生成的配置文件在work_dirs/faster-rcnn_r50_fpn_1x_coco/

# 首先进入工作目录
cd work_dirs/faster-rcnn_r50_fpn_1x_coco/

# 查看生成的配置文件
ls -la *.py
# 你会看到一个类似 faster-rcnn_r50_fpn_1x_coco.py 的文件

用你喜欢的编辑器打开这个文件,我习惯用VSCode,但vim或者nano都可以:

vim faster-rcnn_r50_fpn_1x_coco.py

在这个文件里,你需要修改几个关键参数。用Ctrl+F搜索功能找到这些位置:

  1. 修改max_epochs:如果你原本计划训练24个epoch,现在想增加到36个,就把max_epochs从24改成36。

  2. 调整milestones:这是学习率下降的节点。如果原本的配置是milestones=[8, 11],表示在第8和第11个epoch时学习率会下降。现在总epoch数从24增加到36,你需要等比例调整这些里程碑点。

    计算很简单:新的里程碑 = 原里程碑 × (新总epoch数 / 原总epoch数)

    比如:8 × (36/24) = 12,11 × (36/24) = 16.5,取整后就是[12, 17]。

    在配置文件里找到param_scheduler部分,修改对应的值:

param_scheduler = [
    # ... 可能还有其他调度器
    dict(
        type='MultiStepLR',
        by_epoch=True,
        milestones=[12, 17],  # 修改这里
        gamma=0.1)
]
  1. 检查train_cfg:确保max_epochs已经更新:
train_cfg = dict(
    type='EpochBasedTrainLoop',
    max_epochs=36,  # 修改这里
    val_interval=1)

3.2 第二步:使用resume参数恢复训练

修改完配置文件后,就可以开始恢复训练了。这里有两种常见情况,你需要根据实际情况选择:

情况A:从最新的checkpoint恢复

如果你不确定具体要恢复哪个epoch,或者想从最近的一次保存点继续,可以这样操作:

python tools/train.py work_dirs/faster-rcnn_r50_fpn_1x_coco/faster-rcnn_r50_fpn_1x_coco.py --resume

不加具体路径的--resume参数会让MMDetection自动查找work_dirs目录下最新的checkpoint文件。系统会按照文件名排序,选择epoch编号最大的那个文件。

情况B:从指定epoch恢复

有时候你可能想从更早的某个epoch恢复,比如你发现epoch 12之后模型开始过拟合,想回到epoch 10重新调整训练策略:

python tools/train.py work_dirs/faster-rcnn_r50_fpn_1x_coco/faster-rcnn_r50_fpn_1x_coco.py --resume work_dirs/faster-rcnn_r50_fpn_1x_coco/epoch_10.pth

这里有个实用技巧:恢复训练前,先检查一下checkpoint文件是否完整。有时候训练中断可能导致最后一个checkpoint损坏。

import torch

def check_checkpoint(filepath):
    try:
        checkpoint = torch.load(filepath, map_location='cpu')
        required_keys = ['meta', 'state_dict', 'optimizer', 'epoch']
        for key in required_keys:
            if key not in checkpoint:
                print(f"警告:checkpoint缺少必要的键 {key}")
                return False
        print(f"checkpoint检查通过,保存于epoch {checkpoint.get('epoch', '未知')}")
        return True
    except Exception as e:
        print(f"加载checkpoint失败:{e}")
        return False

# 使用示例
check_checkpoint('work_dirs/faster-rcnn_r50_fpn_1x_coco/epoch_12.pth')

3.3 第三步:验证恢复是否成功

开始恢复训练后,你需要确认一切是否正常。观察训练开始的日志输出:

2024-01-15 10:30:15,789 - mmengine - INFO - Load checkpoint from work_dirs/faster-rcnn_r50_fpn_1x_coco/epoch_12.pth
2024-01-15 10:30:16,123 - mmengine - INFO - resumed epoch 12, iter 5000
2024-01-15 10:30:16,124 - mmengine - INFO - Start running from epoch 13, iter 5001

关键信息是resumed epoch 12和Start running from epoch 13,这说明系统正确识别了要从epoch 13开始训练(因为epoch 12已经完成)。

如果看到的是Start running from epoch 1,那说明恢复没成功,可能是checkpoint文件有问题,或者--resume参数没生效。

4. 配置文件深度解析:不只是改几个数字

很多人在修改配置文件时只关注max_epochs和milestones,其实配置文件里还有很多细节会影响恢复训练的效果。

4.1 理解配置文件的继承结构

MMDetection的配置文件采用继承机制,这既方便了管理,也增加了恢复训练的复杂性。比如典型的Faster R-CNN配置:

# 在 faster-rcnn_r50_fpn_1x_coco.py 中
_base_ = [
    '../_base_/models/faster-rcnn_r50_fpn.py',
    '../_base_/datasets/coco_detection.py', 
    '../_base_/schedules/schedule_1x.py',
    '../_base_/default_runtime.py'
]

当你训练模型时,MMDetection会把所有这些基础配置合并,然后在work_dirs下生成一个完整的配置文件。恢复训练时,你修改的是这个合并后的文件,而不是原始的基础配置文件。

这里有个坑:如果你在恢复训练后想再次修改配置,应该修改work_dirs下的文件,而不是原始配置文件。因为训练过程中可能会通过--cfg-options参数覆盖某些配置,这些覆盖只体现在工作目录的配置文件中。

4.2 关键参数详解

在恢复训练的配置文件中,有几个参数需要特别关注:

train_cfg.val_interval:验证间隔。如果你之前是每1个epoch验证一次,但训练到后期模型变化缓慢,可以考虑增大这个值,比如改为每2个或每3个epoch验证一次,以加快训练速度。

default_hooks.checkpoint.interval:checkpoint保存间隔。默认是每个epoch保存一次。如果你的模型很大,保存频繁会影响训练速度。可以考虑改为每2-3个epoch保存一次,但这样会减少恢复训练的粒度。

param_scheduler:学习率调度器配置。除了MultiStepLR,MMDetection还支持CosineAnnealingLR、LinearLR、PolyLR等多种调度器。恢复训练时,要确保调度器的begin和end参数与新的总epoch数匹配。

举个例子,如果你使用余弦退火调度器:

param_scheduler = [
    dict(
        type='CosineAnnealingLR',
        T_max=36,  # 总epoch数,需要修改
        eta_min=1e-7,
        begin=0,
        end=36,  # 需要修改
        by_epoch=True)
]

optim_wrapper:优化器包装器配置。恢复训练时,优化器的状态会被完整恢复,包括动量、二阶矩估计等。但如果你发现恢复后训练不稳定,可以考虑重置优化器状态,这需要一些技巧操作。

4.3 使用cfg-options动态修改配置

有时候你可能不想直接修改配置文件,而是想通过命令行参数临时调整某些配置。这时可以用--cfg-options参数:

python tools/train.py work_dirs/faster-rcnn_r50_fpn_1x_coco/faster-rcnn_r50_fpn_1x_coco.py \
    --resume work_dirs/faster-rcnn_r50_fpn_1x_coco/epoch_12.pth \
    --cfg-options train_cfg.max_epochs=36 \
    param_scheduler.0.milestones="[12,17]" \
    default_hooks.checkpoint.interval=2

这种方式的优点是灵活,不会永久修改配置文件。但要注意,通过--cfg-options修改的配置只在本次训练中生效,不会保存到配置文件里。

5. 学习率调整策略:恢复训练的核心技巧

恢复训练时,学习率的处理是最容易出问题的地方。很多人恢复训练后效果变差,根本原因就是学习率没设置好。

5.1 学习率预热(Warmup)的恢复

如果你的训练配置中包含学习率预热(这是现代深度学习训练的常见技巧),恢复训练时需要特别注意。

假设你的原始配置有500次迭代的线性warmup:

param_scheduler = [
    dict(
        type='LinearLR',
        start_factor=0.001,
        by_epoch=False,
        begin=0,
        end=500),  # 前500次迭代warmup
    dict(
        type='MultiStepLR',
        by_epoch=True,
        milestones=[8, 11],
        gamma=0.1)
]

当你从epoch 12恢复训练时,warmup阶段应该跳过吗?这取决于你的判断。

如果你觉得模型已经训练得比较充分,warmup可能不再需要,可以修改配置去掉warmup阶段:

param_scheduler = [
    # 注释掉或删除LinearLR部分
    dict(
        type='MultiStepLR',
        by_epoch=True,
        milestones=[12, 17],  # 调整后的里程碑
        gamma=0.1)
]

如果你认为还需要warmup,但要确保从适当的学习率开始,可以调整start_factor:

param_scheduler = [
    dict(
        type='LinearLR',
        start_factor=0.1,  # 从10%的基础学习率开始,而不是0.1%
        by_epoch=False,
        begin=0,
        end=100),  # 缩短warmup周期
    dict(
        type='MultiStepLR',
        by_epoch=True,
        milestones=[12, 17],
        gamma=0.1)
]

5.2 自适应学习率调整

有时候,恢复训练后你可能想改变学习率策略。比如,原始训练使用固定学习率,但恢复后你想改用余弦退火:

param_scheduler = [
    dict(
        type='CosineAnnealingLR',
        T_max=36,  # 总epoch数
        eta_min=1e-6,  # 最小学习率
        begin=12,  # 从当前epoch开始
        end=36,
        by_epoch=True)
]

这里的关键是begin=12,表示余弦退火从第12个epoch开始计算。这样前12个epoch的学习率历史被忽略,从第12个epoch开始应用新的调度策略。

5.3 梯度累积与学习率缩放

如果你的恢复训练使用了不同的batch size(比如原来用4张GPU,每GPU batch size=2,现在用2张GPU,每GPU batch size=4),那么学习率可能需要重新调整。

根据线性缩放规则(Linear Scaling Rule),学习率应该与batch size成比例。但这里有个细节:恢复训练时,优化器状态中保存的梯度统计信息是基于原始batch size的,直接缩放学习率可能不准确。

比较稳妥的做法是:如果batch size变化不大(比如从8到16),可以按比例缩放学习率;如果变化很大,建议重置优化器状态,从头开始积累梯度统计信息。

6. 常见问题排查与解决方案

在实际操作中,恢复训练可能会遇到各种问题。我总结了一些常见的情况和解决方法。

6.1 问题一:恢复训练后loss突然飙升

这是最让人头疼的问题。你可能看到这样的日志:

Epoch 13, iter 100: loss=0.85
Epoch 13, iter 200: loss=15.32  # 突然飙升!
Epoch 13, iter 300: loss=nan     # 直接爆炸

可能原因及解决方案:

  1. 学习率过高:恢复训练时,如果学习率调度器状态恢复错误,可能导致学习率突然变大。

    检查方法:查看训练日志中的lr字段,确认学习率是否合理。

    解决方案:手动调整学习率,在恢复训练命令中添加--cfg-options optim_wrapper.optimizer.lr=0.002,将学习率设为较小的值。

  2. 优化器状态不匹配:如果恢复的checkpoint中的优化器状态与当前模型结构不匹配(比如你修改了模型结构),会导致梯度计算错误。

    检查方法:尝试不使用优化器状态恢复,只加载模型权重:

    # 先只加载权重,不恢复优化器状态
    python tools/train.py config.py --load-from epoch_12.pth
    
    # 如果这样正常,说明是优化器状态问题
    
  3. 梯度爆炸:可以尝试添加梯度裁剪:

    optim_wrapper = dict(
        type='OptimWrapper',
        optimizer=dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001),
        clip_grad=dict(max_norm=35, norm_type=2))  # 添加梯度裁剪
    

6.2 问题二:恢复训练后性能不再提升

模型训练一段时间后,验证集指标不再提升,甚至下降。恢复训练后,这个问题依然存在。

可能原因及解决方案:

  1. 模型已收敛:可能模型已经训练到最优,继续训练只会过拟合。

    检查方法:观察训练集loss是否还在下降,验证集loss是否开始上升。

    解决方案:提前停止训练,或者尝试更强的正则化(增加weight decay、添加dropout等)。

  2. 学习率策略问题:学习率可能已经降得太低,模型参数更新缓慢。

    解决方案:重置学习率到较高的值,或者改用周期性学习率(CyclicLR):

    param_scheduler = [
        dict(
            type='CyclicLR',
            target_ratio=(10, 1e-4),  # 学习率在最大值和最小值之间循环
            cyclic_times=1,
            step_ratio_up=0.4,
            by_epoch=True,
            begin=12,
            end=36)
    ]
    
  3. 数据问题:检查训练数据是否有变化,或者数据增强是否过于强烈。

6.3 问题三:多GPU训练恢复失败

在多GPU环境下恢复训练,可能会遇到各种同步问题。

常见错误及解决方案:

  1. GPU数量变化:原来用4张GPU训练,现在用8张GPU恢复。

    解决方案:MMDetection通常能处理这种情况,但要注意batch size的变化。如果GPU数量翻倍,你可能需要相应调整学习率,或者使用--cfg-options auto_scale_lr.enable=True启用自动学习率缩放。

  2. checkpoint保存格式问题:有些情况下,多GPU训练的checkpoint在单GPU环境下无法加载。

    解决方案:使用MMEngine提供的转换工具:

    from mmengine.runner import save_checkpoint, load_checkpoint
    
    # 加载多GPUcheckpoint
    checkpoint = load_checkpoint('multi_gpu_checkpoint.pth')
    
    # 保存为单GPU格式
    save_checkpoint(checkpoint, 'single_gpu_checkpoint.pth')
    
  3. 分布式训练端口冲突:如果同一台机器上同时运行多个恢复训练任务,可能会端口冲突。

    解决方案:指定不同的端口号:

    # 第一个任务
    CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 ./tools/dist_train.sh config.py 4 --resume checkpoint1.pth
    
    # 第二个任务  
    CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 ./tools/dist_train.sh config.py 4 --resume checkpoint2.pth
    

6.4 问题四:迭代次数不连续

有时候你会发现,恢复训练后迭代次数不是从上次结束的地方开始,而是有跳跃。

可能原因:

  1. checkpoint保存间隔:如果之前设置的是每2个epoch保存一次checkpoint,那么你恢复时可能丢失了中间迭代的信息。

    解决方案:这是正常现象,不影响训练效果。但如果想保持迭代连续性,可以设置default_hooks.checkpoint.by_epoch=False和default_hooks.checkpoint.interval=1000,按迭代次数保存。

  2. 数据加载器随机种子:恢复训练时,数据加载器的随机状态可能不同,导致数据顺序变化。

    解决方案:在配置中设置固定的随机种子:

    randomness = dict(seed=42, deterministic=True)
    

7. 高级技巧与最佳实践

经过多次实战,我总结了一些恢复训练的高级技巧,能帮你避免很多坑。

7.1 创建恢复训练检查点

在开始长时间训练前,我习惯先创建一个“恢复训练检查点”,特别是当我要修改配置或者尝试新的训练策略时。

具体做法:

  1. 先训练少量epoch(比如5个),确保一切正常
  2. 保存这个中间状态
  3. 基于这个检查点尝试不同的恢复训练策略
  4. 选择效果最好的策略进行完整训练

这样即使恢复训练失败,损失也不大,最多就是5个epoch的时间。

7.2 使用实验管理工具

如果你经常需要中断和恢复训练,建议使用实验管理工具,比如MMEngine自带的日志系统,或者第三方工具如Weights & Biases、TensorBoard等。

这些工具能帮你:

  • 自动记录每次训练的超参数
  • 可视化比较不同恢复策略的效果
  • 管理多个checkpoint文件

7.3 自动化恢复脚本

对于生产环境,可以编写自动化恢复脚本,定期检查训练状态,遇到中断自动恢复。

#!/usr/bin/env python3
import os
import subprocess
import time
from pathlib import Path

def find_latest_checkpoint(work_dir):
    """查找最新的checkpoint文件"""
    checkpoint_dir = Path(work_dir)
    if not checkpoint_dir.exists():
        return None
    
    pth_files = list(checkpoint_dir.glob('*.pth'))
    if not pth_files:
        return None
    
    # 按修改时间排序,取最新的
    latest_file = max(pth_files, key=lambda x: x.stat().st_mtime)
    return str(latest_file)

def auto_resume_training(config_path, work_dir, max_retries=3):
    """自动恢复训练"""
    for attempt in range(max_retries):
        try:
            # 查找最新checkpoint
            checkpoint = find_latest_checkpoint(work_dir)
            
            if checkpoint:
                cmd = f"python tools/train.py {config_path} --resume {checkpoint}"
                print(f"尝试恢复训练,使用checkpoint: {checkpoint}")
            else:
                cmd = f"python tools/train.py {config_path}"
                print("未找到checkpoint,从头开始训练")
            
            # 执行训练命令
            result = subprocess.run(cmd, shell=True, check=True)
            if result.returncode == 0:
                print("训练正常完成")
                return True
                
        except subprocess.CalledProcessError as e:
            print(f"训练中断,错误码: {e.returncode}")
            print(f"等待10秒后重试... (尝试 {attempt + 1}/{max_retries})")
            time.sleep(10)
    
    print(f"经过{max_retries}次重试后仍失败")
    return False

if __name__ == "__main__":
    config_path = "configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py"
    work_dir = "work_dirs/faster-rcnn_r50_fpn_1x_coco"
    auto_resume_training(config_path, work_dir)

7.4 混合精度训练恢复

如果你使用混合精度训练(AMP),恢复训练时需要额外注意。混合精度训练的状态(如梯度缩放器)也保存在checkpoint中。

确保你的恢复训练命令包含AMP相关参数:

python tools/train.py config.py \
    --resume checkpoint.pth \
    --amp  # 启用混合精度训练

如果恢复训练后出现NaN loss,可能是梯度缩放器状态有问题,可以尝试重置:

# 在配置文件中
optim_wrapper = dict(
    type='AmpOptimWrapper',  # 使用AmpOptimWrapper
    loss_scale='dynamic',  # 动态损失缩放
    dtype='float16')

7.5 跨版本恢复训练

有时候你可能需要在不同版本的MMDetection之间恢复训练,这需要格外小心。

版本兼容性检查清单:

  1. 模型结构兼容性:确保两个版本的模型定义相同
  2. 配置格式兼容性:MMDetection 2.x和3.x的配置格式有很大变化
  3. checkpoint格式:使用MMEngine提供的转换工具

如果必须跨版本恢复,建议的步骤:

  1. 在新版本中加载旧checkpoint
  2. 只加载模型权重(--load-from),不加载优化器状态
  3. 用较小的学习率微调几个epoch,让模型适应新版本
  4. 再恢复正常训练

8. 实战案例:从训练中断到成功恢复

让我分享一个真实案例。去年我们在训练一个自定义的检测模型时,服务器在epoch 47时突然宕机。这个模型已经训练了3天,batch size很小,每个epoch要6个小时。

第一步:评估损失

首先检查最后一个完整的checkpoint(epoch 46)是否可用:

import torch
checkpoint = torch.load('epoch_46.pth', map_location='cpu')
print(f"Epoch: {checkpoint['epoch']}")
print(f"保存时间: {checkpoint['meta']['time']}")

第二步:分析训练状态

查看训练日志,发现epoch 46的mAP是0.412,还在稳步提升,没有过拟合迹象。学习率当前是0.002(原始学习率0.02的10%)。

第三步:制定恢复策略

原计划训练100个epoch,已经完成46个。我们决定:

  1. 增加到120个epoch,给模型更多时间收敛
  2. 调整学习率里程碑:原计划在[80, 110]下降,现在改为[96, 132]
  3. 增加验证间隔,从每1个epoch改为每2个epoch,节省时间

第四步:修改配置文件

# 在work_dirs下的配置文件中修改
train_cfg = dict(
    type='EpochBasedTrainLoop',
    max_epochs=120,  # 从100增加到120
    val_interval=2)  # 验证间隔改为2

param_scheduler = [
    dict(
        type='MultiStepLR',
        by_epoch=True,
        milestones=[96, 132],  # 等比例调整
        gamma=0.1)
]

第五步:恢复训练

python tools/train.py work_dirs/my_model/config.py \
    --resume work_dirs/my_model/epoch_46.pth \
    --cfg-options \
    train_cfg.max_epochs=120 \
    train_cfg.val_interval=2 \
    param_scheduler.1.milestones="[96,132]"

第六步:监控恢复效果

恢复训练后,我们密切监控前几个epoch:

  • epoch 47的loss应该与epoch 46末尾的loss连续,没有跳跃
  • 学习率应该是0.002,与中断前一致
  • 验证集mAP应该平稳过渡

实际结果:恢复训练后,模型在epoch 60达到最佳mAP 0.438,比原计划提前了20个epoch。总共节省了大约5天的训练时间。

这个案例的关键经验是:恢复训练不只是技术操作,更需要根据模型的实际状态做出合理决策。有时候,训练中断反而给了我们重新评估训练策略的机会。

通过这个完整流程,你应该能够应对大多数MMDetection训练中断的情况。记住,恢复训练的核心是理解checkpoint的完整内容,以及MMDetection的训练状态管理机制。每次中断都是一次学习的机会,熟练掌握恢复技巧,能让你在深度学习实践中更加从容。

MMDetection训练中断后如何精准恢复?详解resume与epoch调整技巧 本文详细解析了MMDetection训练中断后的精准恢复方法,重点介绍了resume参数的使用技巧与epoch动态调整策略。通过实际案例演示如何避免常见错误,包括学习率错位、配置未生效等问题,并提供自动化脚本和高级恢复技巧,帮助开发者高效恢复模型训练。 阅读详情

相关推荐

MMDetection训练中断?手把手教你用--resume参数恢复训练(附常见错误排查)

本文详细解析了MMDetection框架中`--resume`参数的使用方法,帮助用户在训练意外中断后恢复训练。文章深入对比了`--resume`与`load_from`的区别,提供了从基础操作到高级排错的完整指南,并针对恢复后epoch计数异常、卡在dataloader等常见问题给出了解决方案,确保训练状态能无缝衔接。

weixin_29063979的博客 415

mmdetection训练中断后如何精准恢复?详解resume机制与epoch指定技巧

本文详细解析了MMDetection框架中训练中断后的精准恢复方法,重点对比了resume-from与load-from的核心区别与适用场景。通过实战命令演示,指导用户如何利用--resume参数从最新或指定epoch检查点恢复训练,并提供了多GPU环境下的操作指南与常见报错排查方案,帮助开发者高效管理长时间训练任务,避免重复计算。

weixin_28223453的博客 590

YOLO+VOC双标签生活用品数据集:4500张图开箱即用训练指南

目标检测是计算机视觉的核心任务,其原理是通过边界框定位与分类实现物体识别。高质量标注数据是模型性能的关键,而YOLO与VOC作为主流标注格式,分别以归一化坐标和绝对像素坐标记录目标位置。双格式数据集能显著降低格式转换成本,提升跨框架兼容性,广泛应用于智能家居、零售盘点、机器人抓取等场景。本文围绕一套4500张、覆盖钟表、剪刀等五类生活用品的YOLO+VOC双标签数据集,详解从data.yaml配置到YOLOv8训练、验证及TensorRT推理加速的完整链路,并针对类别索引错位、验证集泄漏等常见问题提供排查方

weixin_34235457的博客 146

【 [mmdetection] 如何在训练中断后,接着上次训练?】

[mmdetection] 如何在训练中断后,接着上次训练? 最近由于不知名原因,在用 faster rcnn 训练一个大型数据集的时候,在epoch= 20 的时候中断训练了.采用以下方式继续上次训练. 打开 train.py,如图: 也就是说,训练时,最后加一个–resume from 参数,然后后面跟上次训练生成的最后一个权重文件(.pth)就可以了. 因此,在命令行输入以下语句进行训练即可以完全相同的模型配置继续上次的训练啦:: python tools/train.py configs/fas

weixin_46600060的博客 1万+

煤矿输送带异物检测:从数据集标注到YOLO训练实战

目标检测是深度学习在工业视觉中的核心应用,其效果高度依赖训练数据的质量与分布。在复杂环境下,如煤矿井下输送带场景,异物识别面临光照不足、粉尘干扰、遮挡和类别不均衡等多重挑战。通过理解目标检测原理,合理构建与标注数据集,并应用针对性的数据增强与训练策略,可显著提升模型鲁棒性。本文以煤矿输送带异物识别数据集为基础,介绍从COCO到YOLO格式转换、数据检查、增强策略、训练监控到部署优化的完整技术路径,为同类工业视觉检测项目提供工程实践参考。

weixin_34268169的博客 430

海洋目标检测数据集全解析:标注格式转换与YOLO训练实战

目标检测是计算机视觉领域的核心任务之一,而高质量标注数据集是训练可靠模型的基础。在实际工程中,数据标注格式的选择与转换直接影响模型训练效率。VOC、COCO与YOLO三种主流格式各自采用不同的坐标表达方式,其中YOLO的归一化坐标设计让模型读取更高效。理解这些原理,能帮助开发者避免标签越界、类别ID错位等常见问题。海洋目标检测场景如渔业监测、水下机器人视觉,尤其需要针对性的真实数据支持。一份10000张海洋目标检测数据集,同时提供VOC/COCO/YOLO三种格式标签及配套划分脚本,从数据准备到YOLO环境

weixin_34049948的博客 326

如何在mmdetection训练中断后接着上一次的训练结果训练?

我们在训练过程中难免会遇到一些特殊情况,使得训练过程中断,那么我们应该如何在训练中断之后再接着之前的训练结果训练呢?运行之后我们就可以看到模型接着从上次中断的轮数开始训练啦。我们分析train.py中的参数设置。

Ambition_Du的博客 1463

告别GUI点点点:Formality形式化验证的TCL脚本自动化实战(附完整脚本)

本文详细介绍了如何通过TCL脚本实现Formality形式化验证的全流程自动化,显著提升验证效率并降低错误率。内容涵盖脚本框架解析、参数化设计、验证报告生成及团队协作策略,特别适合芯片设计工程师摆脱传统GUI操作,实现300%以上的效率提升。

weixin_33737134的博客 283

mmdetection 模型训练技巧

由于在项目中和比赛中经常用到mmdetection,在此总结一些mmdetection的小技巧,有利于涨点。

guopeiAI 8662

USB 3.0 高清音视频采集芯片——MS2130

MS2130 是一款 USB 3.0 高清视频和音频采集芯片,内部集成 USB3.0 Device 控制器、数据收发模块、音视频处理模块。

YOU_SeMi的博客 7859

Jenkins离线安装保姆级教程:从下载.war包到SVN+Maven项目一键部署(附避坑脚本)

本文详细介绍了Jenkins离线安装的全流程,包括.war包下载、SVN+Maven项目配置及自动化部署。特别针对内网环境提供解决方案,涵盖插件管理、开发工具链配置、构建触发器和SSH部署等关键步骤,帮助企业在网络隔离环境下实现高效持续集成。

weixin_30096975的博客 374

[mmdetection] 如何在训练中断后,接着上次训练?

[mmdetection] 如何在训练中断后,接着上次训练?

wzk4869的博客 1312

基于python的电商评论文本分析

本文基于京东平台安井手抓饼2000余条评论数据,运用Python文本分析技术(包括分词、词频统计、LDA主题模型等)探究消费者评价特征。研究发现:1)产品评价聚焦口味("好吃")、性价比("一分钱")和便捷性("早餐");2)京东物流服务获得高度认可;3)销售旺季集中在11月至次年1月。分析揭示了速冻食品消费者的核心关注点,为商家优化产品与服务提供数据支持,同时展示了文本挖掘技术在电商评论分析中的实用价值。

weixin_50902344的博客 8347

MMDetection训练中断后如何精准恢复:从指定epoch到自动续训全解析

本文详细解析了MMDetection框架在训练意外中断后如何精准恢复训练。核心介绍了两种恢复方式:手动指定历史checkpoint路径的精准恢复,以及使用`--resume`参数自动恢复最新模型的智能模式。文章深入剖析了`resume`与`load-from`的原理区别,并提供了多卡训练、版本兼容性及常见报错的实战避坑指南,帮助用户高效利用检查点机制,节省训练时间与资源。

n7o8p的博客 171

Android实现自动输入文本效果 (附完整源码)

Android实现自动输入文本效果 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 416

YOLOv11改进 | 注意力篇 | YOLOv11引入CA注意力机制

摘要:最近关于移动网络设计的研究已经证明了通道注意力(例如,挤压和激励注意力)对于提升模型性能的显着有效性,但它们通常忽略了位置信息,而位置信息对于生成空间选择性注意力图很重要。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~3.2 在Extramodule里创建CA。在CA.py文件里添加给出的CA代码。

tsg6698的博客 2979

MMDetection训练中断后如何无缝恢复?详解resume与epoch调整技巧

本文详细解析了MMDetection框架中训练中断后的恢复方法,重点介绍了resume参数的使用技巧和epoch调整策略。通过实际案例说明如何从检查点恢复训练状态,包括模型权重、优化器状态等,并提供了修改配置文件调整epoch数的完整指南,帮助开发者高效完成目标检测模型训练。

Python的专栏 171

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

从epoch_12.pth继续训练?MMDetection恢复训练全流程详解(含多GPU/分布式场景)

本文详细解析了MMDetection框架中训练中断恢复的全流程,包括单卡、多GPU及分布式场景下的实战操作。重点介绍了`--resume`参数的使用方法、checkpoint文件结构解析,以及常见问题的排查技巧,帮助开发者高效恢复模型训练,确保项目进度不受影响。

lg888的博客 531

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

MMDetection断点训练全指南:如何利用resume参数拯救你的训练进度

本文详细介绍了MMDetection框架中断点训练的核心功能,重点解析了`resume`参数的使用方法、工作机制及最佳实践。通过结合YOLOX、Faster-RCNN和DAB-DETR等模型的实际案例,指导开发者如何从硬件故障、配置错误等中断中恢复训练进度,有效节省计算资源和时间,提升研发效率。

jenkins8butler的博客 407

从零跑通BEVFormer:AutoDL上Nuscenes数据集训练全流程指南

在自动驾驶感知领域,基于Transformer的BEV(鸟瞰图)感知方案正逐步成为纯视觉路线的核心技术范式,它通过将多目相机特征统一映射到俯视空间,有效解决了三维目标检测中视角遮挡与空间重叠的难题。BEVFormer作为该方向的经典工作,利用可变形注意力机制在时序上高效融合多帧特征,为车辆提供稳定的环境理解能力。然而,实际工程落地中,环境依赖配置复杂、数据规模庞大以及显存资源受限常常成为复现的主要障碍。针对这一痛点,以AutoDL云GPU平台为承载,结合Nuscenes这一业内广泛使用的高质量自动驾驶数据集

weixin_34354945的博客 436

MMDetection3D 配置文件完全指南:字段解析、继承机制与命令行覆盖

本文以 MMDetection3D(OpenMMLab 面向通用三维目标检测的下一代平台)官方文档为基础,系统讲解其配置文件体系。MMDetection3D 采用 MMEngine 的模块化与继承式配置系统,一份配置文件即可完整描述模型结构、数据管线、训练策略与运行环境。读完本文,你将掌握 `model`、`dataloader`、`optim_wrapper`、`default_hooks` 等

gitblog_00352的博客 978

【mmdetection】训练测试时用到的命令-自用

mmdetection的一些命令

jyjy0608的博客 414

云GPU平台跑通BEVFormer训练Nuscenes的完整实践指南

BEV感知作为自动驾驶视觉感知的核心技术,通过将多视角图像转换到鸟瞰图空间,为3D目标检测与轨迹预测提供了统一表达。BEVFormer利用可变形注意力与时空查询机制,在该领域取得了显著效果,但其训练对显存和算力要求极高。面对Nuscenes大规模数据集,传统本地工作站往往受限于环境配置、数据下载和资源调度。借助云GPU平台,以按需租用、预置环境和高带宽下载的优势,可以大幅降低复现门槛。本文基于实际训练经验,系统梳理了从GPU选型、镜像版本锁定、Nuscenes数据处理、mmdet3d依赖安装到单卡训练参数调

weixin_34062469的博客 338

Jetson 上基于 PyTorch 重训 SSD-Mobilenet 目标检测模型:从 Open Images 数据下载到 TensorRT 部署全流程

本指南以 jetson-inference 仓库中的 [pytorch-ssd.md](https://link.gitcode.com/i/87cce3748ceca1ea4c54b3a320377a6f) 为核心脉络,完整讲解在 Jetson(JetPack 4.4+,含 TensorRT 7.1)上用 PyTorch 对 SSD-Mobilenet 做迁移学习(transfer learni

gitblog_00304的博客 926
上一篇: 避坑指南:如何根据显卡驱动选择正确的CUDA版本?附最新CUDA 11.x + cuDNN安装教程
下一篇: 深入解析CAN通信:数据帧与遥控帧的结构与仲裁机制
github5actions
博客等级 码龄1天 0粉丝 1824原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值