Samar-blog

导航

P6_MMSegmentation训练语义分割深度学习算法

6.1【G】训练语义分割模型

1.跑通代码

python tools/train.py Zihao-Configs/ZihaoDataset_FastSCNN_20230818.py

由于jupyter演示的代码模型太大,换了轻量级的FastSCNN_20230818.py且改小了各种参数才跑通

2.修改参数如下

当前配置的 batch_size=4num_workers>0 与 GTX 1650 显存 + Windows 多进程兼容性不匹配,需针对性修改以解决之前的页面文件不足和 worker 崩溃问题

(1)调整 DataLoader 多进程(Windows 必改)

Windows 下 num_workers>0 易触发崩溃,同时 persistent_workers=True 会额外占用内存,统一修改:

点击查看代码
# 训练数据加载器
train_dataloader = dict(
    batch_size=2,  # 从4降至2,平衡显存占用与BatchNorm需求(≥2即可)
    dataset=dict(...),  # 保持原有dataset配置不变
    num_workers=0,  # 禁用多进程,避免worker崩溃
    persistent_workers=False,  # num_workers=0时必须设为False
    sampler=dict(shuffle=True, type='InfiniteSampler'))

# 验证数据加载器
val_dataloader = dict(
    batch_size=1,
    dataset=dict(...),  # 保持原有dataset配置不变
    num_workers=0,  # 禁用多进程
    persistent_workers=False,
    sampler=dict(shuffle=False, type='DefaultSampler'))

# 测试数据加载器
test_dataloader = dict(
    batch_size=1,
    dataset=dict(...),  # 保持原有dataset配置不变
    num_workers=0,  # 禁用多进程
    persistent_workers=False,
    sampler=dict(shuffle=False, type='DefaultSampler'))

(2)优化模型输入尺寸(适配 GTX 1650 显存)
512x512 裁剪尺寸 +batch_size=2 对 4G 显存压力较大,适当减小以避免显存溢出:

点击查看代码
# 1. 减小裁剪尺寸(从512x512改为384x384)
crop_size = (384, 384)

# 2. 同步修改 train_pipeline 中的 RandomCrop
train_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='LoadAnnotations'),
    dict(
        keep_ratio=True,
        ratio_range=(0.5, 2.0),
        scale=(1536, 768),  # 从2048x1024降至1536x768,减少缩放后显存占用
        type='RandomResize'),
    dict(cat_max_ratio=0.75, crop_size=crop_size, type='RandomCrop'),  # 用新的裁剪尺寸
    dict(prob=0.5, type='RandomFlip'),
    dict(type='PhotoMetricDistortion'),
    dict(type='PackSegInputs'),
]

# 3. 同步修改 data_preprocessor 的 size(从512x1024改为384x768)
data_preprocessor = dict(
    bgr_to_rgb=True,
    mean=[123.675, 116.28, 103.53],
    pad_val=0,
    seg_pad_val=255,
    size=(384, 768),
    std=[58.395, 57.12, 57.375],
    type='SegDataPreProcessor')

# 4. 同步修改 model 内的 data_preprocessor(与全局保持一致)
model = dict(
    data_preprocessor=dict(
        bgr_to_rgb=True,
        mean=[123.675, 116.28, 103.53],
        pad_val=0,
        seg_pad_val=255,
        size=(384, 768),  # 改为384x768
        std=[58.395, 57.12, 57.375],
        type='SegDataPreProcessor'),
    # 其他 model 配置保持不变
)

(3)调整验证 / 测试的缩放尺寸(同步优化)
避免验证时加载过大尺寸图像导致内存压力:

点击查看代码
# 验证数据加载器的 pipeline
val_dataloader = dict(
    dataset=dict(
        pipeline=[
            dict(type='LoadImageFromFile'),
            dict(keep_ratio=True, scale=(1536, 768), type='Resize'),  # 从2048x1024降至1536x768
            dict(type='LoadAnnotations'),
            dict(type='PackSegInputs'),
        ],
        # 其他 dataset 配置不变
    ),
    # 其他 dataloader 配置不变
)

# 测试 pipeline
test_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(keep_ratio=True, scale=(1536, 768), type='Resize'),  # 从2048x1024降至1536x768
    dict(type='LoadAnnotations'),
    dict(type='PackSegInputs'),
]

# 测试数据加载器的 pipeline
test_dataloader = dict(
    dataset=dict(
        pipeline=[
            dict(type='LoadImageFromFile'),
            dict(keep_ratio=True, scale=(1536, 768), type='Resize'),  # 从2048x1024降至1536x768
            dict(type='LoadAnnotations'),
            dict(type='PackSegInputs'),
        ],
        # 其他 dataset 配置不变
    ),
    # 其他 dataloader 配置不变
)
3.运行成果

生成一个以日期命名的文件夹

6.2【H1】可视化训练日志-训练过程总体评估指标

训练模型时在work_dirs目录生成记录训练日志,解析其中损失函数、评估指标等信息,并可视化。

1.设置Matplotlib中文字体
2.进入MMSegmentation主目录
3.导入工具包
4.载入训练日志

换成自己训练出来的时间的文件夹 scalers.json文件

训练集、测试集

5.导出训练日志表格

导出到图表文件夹,变成两个csv文件

6.可视化辅助函数
7.训练集损失函数
8.训练集准确率

Acc_seg

训练集准确率在稳步提升

9.测试集评估指标

如果训练集的评估指标稳步提升,测试集的评估指标先升后降,那就说明发生了过拟合

6.3【H2】可视化训练日志-训练过程各类别评估指标

1.设置Matplotlib中文字体
2.可视化辅助函数
3.进入MMSegmentation主目录

这次要解析.log日志文件

4.导入工具包
5.类别列表
6.载入日志文件
7.横轴-训练迭代次数

每隔500个记录一次

8.定义正则表达式

匹配表格里面的信息

9.查看某一类别的评估指标 IoU Acc Dice Fscore Precision Recall

x的元素个数,应和metrics_json [each_class] [' metrics ']元素个数一致,绘图才能成功

让x的元素个数80和真实的日志如这个red的类别的日志个数一样即可

10.查看每个类别的评估指标 IoU Acc Dice Fscore Precision Recall

写一个循环遍历,

6.4【J】测试集性能评估

1.PSPNet-测试集精度指标

(1)前面

!python tools/train.py daiyali-Configs/ZihaoDataset_FastSCNN_20230818.py

即训练train.py

现在是

!python tools/test.py daiyali-Configs/ZihaoDataset_FastSCNN_20230818.py ./work_dirs/ZihaoDataset-FastSCNN/iter_30000.pth

即测试集test.py

(2)或者运行:
把"D:\DeepLearning\Learn_SAM\mmsegmentation\work_dirs\ZihaoDataset-FastSCNN\best_mIoU_iter_24000.pth"路径下训练得到的.pth文件重命名为Zihao_FastSCNN.pth,并剪切到主目录下的checkpoint文件夹里

运行代码如下(up主用的这个):

!python tools/test.py daiyali-Configs/ZihaoDataset_FastSCNN_20230818.py/checkpoint/Zihao_FastSCNN.pth

即先指定config配置文件,再指定checkpoint权重文件

(3)运行成果

在work_dirs文件夹里面生成一个以日期和时间命名的文件夹:

这个日期文件夹里面应该生成一个.log文件、一个json文件(测试的指标都保存在了这个json文件里面)和一个vis_data文件夹(里面有.py文件和两个json文件),但是我的文件夹下面生成的是vis_data(里面只有.py文件)、一个.log文件和一个.json文件

即:

"D:\DeepLearning\Learn_SAM\mmsegmentation\work_dirs\ZihaoDataset-FastSCNN\20251109_103007\20251109_103007.log"
"D:\DeepLearning\Learn_SAM\mmsegmentation\work_dirs\ZihaoDataset-FastSCNN\20251109_103007\vis_data"
"D:\DeepLearning\Learn_SAM\mmsegmentation\work_dirs\ZihaoDataset-FastSCNN\20251109_103007\20251109_103007.json"

2.速度指标-FPS

测试集至少要有200张图片,否则跑不出分数

特别注意,在同一个benchmark上面对比性能指标,才有意义
而此处西瓜数据集只有87张图片,无法进行速度指标测试

【抛开baseline谈精度都是耍流氓】

posted on 2025-12-03 21:45  风居住的街道DYL  阅读(0)  评论(0)    收藏  举报