pytorch MMseg训练自己数据集

摘要

mmdet,mmseg,mmocr是商汤开源的cv工具库,代码风格具有很强的相似性,简单来学习一下使用。方便快速入手各种比赛。mmseg主要用来处理语义分割等任务。

初始准备

下载mmsegmentation,由于我服务器之前安装成功了mmdet,已经包含的mmcv等换就需求包,所以直接pip install -v -e.编译

数据准备

这里我暂定使用voc2007的数据集,之后可以将任意数据集处理成voc的格式,数据集链接百度网盘如下:
链接: https://pan.baidu.com/s/1vkk3lMheUm6IjTXznlg7Ng 提取码: 44mk
数据摆放如下
在这里插入图片描述
在这里插入图片描述

训练

norm_cfg = dict(type='SyncBN', requires_grad=True)
custom_imports = dict(imports='mmcls.models', allow_failed_imports=False)
checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-tiny_3rdparty_32xb128-noema_in1k_20220301-795e9634.pth'  # noqa

model = dict(
    type='EncoderDecoder',
    pretrained=None,
    backbone=dict(
        type='mmcls.ConvNeXt',
        arch='tiny',
        out_indices=[0, 1, 2, 3],
        drop_path_rate=0.4,
        layer_scale_init_value=1.0,
        gap_before_final_norm=False,
        init_cfg=dict(
            type='Pretrained', checkpoint=checkpoint_file,
            prefix='backbone.')),
    decode_head=dict(
        type='UPerHead',
        in_channels=[96, 192, 384, 768],
        in_index=[0, 1, 2, 3],
        pool_scales=(1, 2, 3, 6),
        channels=384,
        dropout_ratio=0.1,
        num_classes=21,
        norm_cfg=norm_cfg,
        align_corners=False,
        loss_decode=dict(
            type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)),
    auxiliary_head=dict(
        type='FCNHead',
        in_channels=384,
        in_index=2,
        channels=192,
        num_convs=1,
        concat_input=False,
        dropout_ratio=0.1,
        num_classes=21,
        norm_cfg=norm_cfg,
        align_corners=False,
        loss_decode=dict(
            type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)),
    # model training and testing settings
    train_cfg=dict(),
    test_cfg=dict(mode='whole'))







dataset_type = 'PascalVOCDataset'
data_root = 'VOCdevkit/VOC2007'
img_norm_cfg = dict(
    mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)
crop_size = (512, 512)
train_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='LoadAnnotations'),
    dict(type='Resize', img_scale=(2048, 512), ratio_range=(0.5, 2.0)),
    dict(type='RandomCrop', crop_size=(512, 512), cat_max_ratio=0.75),
    dict(type='RandomFlip', prob=0.5),
    dict(type='PhotoMetricDistortion'),
    dict(
        type='Normalize',
        mean=[123.675, 116.28, 103.53],
        std=[58.395, 57.12, 57.375],
        to_rgb=True),
    dict(type='Pad', size=(512, 512), pad_val=0, seg_pad_val=255),
    dict(type='DefaultFormatBundle'),
    dict(type='Collect', keys=['img', 'gt_semantic_seg'])
]
test_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(
        type='MultiScaleFlipAug',
        img_scale=(2048, 512),
        flip=False,
        transforms=[
            dict(type='Resize', keep_ratio=True),
            dict(type='RandomFlip'),
            dict(
                type='Normalize',
                mean=[123.675, 116.28, 103.53],
                std=[58.395, 57.12, 57.375],
                to_rgb=True),
            dict(type='ImageToTensor', keys=['img']),
            dict(type='Collect', keys=['img'])
        ])
]
data = dict(
    samples_per_gpu=4,
    workers_per_gpu=4,
    train=dict(
        type='PascalVOCDataset',
        data_root='VOCdevkit/VOC2007',
        img_dir='JPEGImages',
        ann_dir='SegmentationClass',
        split='ImageSets/Segmentation/train.txt',
        pipeline=[
            dict(type='LoadImageFromFile'),
            dict(type='LoadAnnotations'),
            dict(type='Resize', img_scale=(2048, 512), ratio_range=(0.5, 2.0)),
            dict(type='RandomCrop', crop_size=(512, 512), cat_max_ratio=0.75),
            dict(type='RandomFlip', prob=0.5),
            dict(type='PhotoMetricDistortion'),
            dict(
                type='Normalize',
                mean=[123.675, 116.28, 103.53],
                std=[58.395, 57.12, 57.375],
                to_rgb=True),
            dict(type='Pad', size=(512, 512), pad_val=0, seg_pad_val=255),
            dict(type='DefaultFormatBundle'),
            dict(type='Collect', keys=['img', 'gt_semantic_seg'])
        ]),
    val=dict(
        type='PascalVOCDataset',
        data_root='VOCdevkit/VOC2007',
        img_dir='JPEGImages',
        ann_dir='SegmentationClass',
        split='ImageSets/Segmentation/val.txt',
        pipeline=[
            dict(type='LoadImageFromFile'),
            dict(
                type='MultiScaleFlipAug',
                img_scale=(2048, 512),
                flip=False,
                transforms=[
                    dict(type='Resize', keep_ratio=True),
                    dict(type='RandomFlip'),
                    dict(
                        type='Normalize',
                        mean=[123.675, 116.28, 103.53],
                        std=[58.395, 57.12, 57.375],
                        to_rgb=True),
                    dict(type='ImageToTensor', keys=['img']),
                    dict(type='Collect', keys=['img'])
                ])
        ]),
    test=dict(
        type='PascalVOCDataset',
        data_root='VOCdevkit/VOC2007',
        img_dir='JPEGImages',
        ann_dir='SegmentationClass',
        split='ImageSets/Segmentation/val.txt',
        pipeline=[
            dict(type='LoadImageFromFile'),
            dict(
                type='MultiScaleFlipAug',
                img_scale=(2048, 512),
                flip=False,
                transforms=[
                    dict(type='Resize', keep_ratio=True),
                    dict(type='RandomFlip'),
                    dict(
                        type='Normalize',
                        mean=[123.675, 116.28, 103.53],
                        std=[58.395, 57.12, 57.375],
                        to_rgb=True),
                    dict(type='ImageToTensor', keys=['img']),
                    dict(type='Collect', keys=['img'])
                ])
        ]))
log_config = dict(
    interval=50, hooks=[dict(type='TextLoggerHook', by_epoch=False)])
dist_params = dict(backend='nccl')
log_level = 'INFO'
load_from = None
resume_from = None
workflow = [('train', 1)]
cudnn_benchmark = True
optimizer_config = dict()

optimizer = dict(
    #constructor='LearningRateDecayOptimizerConstructor',
    type='AdamW',
    lr=0.0001,
    betas=(0.9, 0.999),
    weight_decay=0.05,
    paramwise_cfg={
        'decay_rate': 0.9,
        'decay_type': 'stage_wise',
        'num_layers': 12
    })

lr_config = dict(
    #_delete_=True,
    policy='poly',
    warmup='linear',
    warmup_iters=1500,
    warmup_ratio=1e-6,
    power=1.0,
    min_lr=0.0,
    by_epoch=False)

runner = dict(type='IterBasedRunner', max_iters=20000)
checkpoint_config = dict(by_epoch=False, interval=2000)
evaluation = dict(interval=2000, metric='mIoU', pre_eval=True)
work_dir = './work_dirs/conv'
gpu_ids = [0]
auto_resume = False

可以直接运行的训练代码,如果是其他数据集我们只需要修改num_classes 数目就可以了

训练效果

在这里插入图片描述
我跑了一部分迭代,如果代码出问题大概率是环境导致的。

处理任意数据集变成png标注格式

import base64
import json
import os
import os.path as osp
import cv2
import numpy as np
import matplotlib.pyplot as plt
import PIL.Image
from labelme import utils

classes     = ["_background_","aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]


path='../datasets/before/1.jpg'
path2='../datasets/before/1.json'
data = json.load(open(path2))
imageData = data['imageData']

img = utils.img_b64_to_arr(imageData)
label_name_to_value = {'_background_': 0}
for shape in data['shapes']:
    label_name = shape['label']
    if label_name in label_name_to_value:
        label_value = label_name_to_value[label_name]
    else:
        label_value = len(label_name_to_value)
        label_name_to_value[label_name] = label_value
    label_values, label_names = [], []
    for ln, lv in sorted(label_name_to_value.items(), key=lambda x: x[1]):
        label_values.append(lv)
        label_names.append(ln)
    print(data['shapes'])
    lbl = utils.shapes_to_label(img.shape, data['shapes'], label_name_to_value)
    new = np.zeros([np.shape(img)[0], np.shape(img)[1]])
    for name in label_names:
        index_json = label_names.index(name)
        index_all = classes.index(name)
        new = new + index_all*(np.array(lbl) == index_json)
    utils.lblsave('./1111.png', new)

voc数据特点,训练图像是三通道的jpg格式文件,标注数据集是单通道的png格式文件,如果比赛给出我们其他格式的标注类型我们应该如何处理,在seg中最重要的是points字段,里面是[x1,y1,x2,y2,x3,y3······]等等,在图像的一个一个点最终形成的闭环,在coco数据格式中segmentation字段中就是给出的这种格式。只要有这个标注信息我们就可以将其生成为png格式图像,具体代码参考上面案例。0.json是labelme标注图像产生的文件,labelme==3.16.7,不同版本运行可以会报错。
在这里插入图片描述

通过json多个点提取图像

from PIL import Image
from PIL import ImageDraw
import numpy as np
import cv2
import numpy.ma as npm
img=Image.open("D:/racedata/2022boat/boxGimg/0.jpg")
w,h=img.size
mask = np.zeros((h, w), dtype=np.uint8)
mask = Image.fromarray(mask)
draw = ImageDraw.Draw(mask)
points=[[20,20],[200,20],[200,200],[100,250],[20,200]]
xy = [tuple(point) for point in points]
draw.polygon(xy=xy, outline=1, fill=1)
mask = np.array(mask, dtype=np.uint8)
img=np.array(img)
masked_img = cv2.bitwise_and(img,img,mask = mask)
print(masked_img.shape)
for i,x,y in enumerate(points):
    print(x,y)


cv2.imwrite("./1.jpg",masked_img)

利用draw库进行截取图像,在语义分割大图像切分
数据也经常用到

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 在使用PyTorch进行训练之前,需要准备好自己的数据集。一般来说,数据集应该分为训练集、验证集和测试集。其中训练集用于训练模型,验证集用于调整模型参数,测试集用于测试模型的泛化能力。 在准备好数据集后,可以开始使用PyTorch构建模型。首先,需要定义一个包含各种层和激活函数的神经网络模型。然后,使用PyTorch提供的损失函数计算模型预测结果与真实结果之间的差异。接下来,定义一个优化器来优化模型的参数。这里通常使用随机梯度下降等梯度优化方法。 当模型构建好后,可以将自己的数据集加载到PyTorch中。这可以通过自定义一个Dataset类和DataLoader类来实现。其中,Dataset类用于加载数据集,DataLoader类用于将数据集划分为小批量进行训练。 最后,使用训练集和验证集进行模型训练。每轮训练后,可以用验证集检查模型的性能,并保存最好的模型参数。 总的来说,PyTorch训练自己的数据集需要经历数据集准备、模型构建、数据集加载、模型训练等一系列步骤。需要仔细设计和调整每个环节的参数,才能得到一个准确的模型。 ### 回答2: Pytorch 是一种开源机器学习框架,因其简单易用、灵活性高和强大的能力而受到广泛关注。训练自己的数据集也是 Pytorch 中的常见操作之一。下面是 Pytorch 训练自己的数据集的基本步骤: 1. 加载数据集: 使用 Pytorch 可以方便地从本地或远程服务器上加载数据集。可以编写自定义的数据读取器或使用 Pytorch 中提供的数据加载函数,如 DataLoader、ImageFolder 等。 2. 数据预处理: 在训练模型之前,需要对数据进行预处理,如缩放、裁剪、旋转、标准化等操作,可以使用 Pytorch 中提供的 torchvision 库实现。 3. 构建模型: 根据任务需求和数据集的特点,选择合适的深度学习模型,并在 Pytorch 中实现。可以使用 Pytorch 提供的模型库,如 torch.nn、torchvision.models 等。 4. 定义损失函数和优化器: 损失函数用于衡量模型预测结果与真实值之间的差异,常见的损失函数包括交叉熵、均方误差、对比损失等。优化器用于更新模型参数,常见的优化器包括随机梯度下降(SGD)、Adam、Adagrad 等。 5. 训练模型: 将数据分为训练集、验证集和测试集,分批次进行训练,每个批次包含多个样本。使用损失函数计算模型在训练集中的误差,并使用优化器更新模型权重,重复循环这个过程直至达到最优结果。 6. 评估模型: 使用测试集评估模型性能,计算模型在测试集中的准确率、精度、召回率等指标,以及混淆矩阵等结果。 最后,可以对模型进行调整、改进和优化,以得到更好的结果。 ### 回答3: PyTorch 是一款流行的深度学习框架,可以用于许多不同的机器学习任务。要训练自己的数据集,您需要执行以下步骤: 1. 准备数据集:将数据整理为适合 PyTorch 的形式,包括分割训练集、验证集和测试集,并将图像和标签标准化。 2. 定义模型:选择适合任务的模型,例如 CNN,RNN 或 Transformer,然后定义其结构和参数。 3. 定义损失函数:选择适合任务的损失函数,例如交叉熵或均方误差,并定义训练期间要最小化的目标函数。 4. 定义优化器:选择适合任务的优化器,例如随机梯度下降(SGD)或 Adam,并定义它的学习率和动量。 5. 训练模型:使用训练训练模型,使用验证集评估模型性能,而不参与梯度计算,使用测试集测试模型性能。 6. 调整超参数:通过调整模型架构、损失函数和超参数(如学习率)来优化模型性能。 7. 保存模型:训练完成后,可以保存模型的权重,以便以后使用。 总而言之,训练 PyTorch 模型需要准备数据集、定义模型、损失函数和优化器,然后训练模型和调整超参数,最后保存模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值