paddlex使用自定义数据集训练语义分割模型

本文详细介绍了如何使用Paddlex进行语义分割模型的训练。首先,通过labelme工具对图片进行标注,然后按照指定格式组织数据集,接着使用Paddlex命令进行数据集转换和划分。在训练阶段,计算图片的均值和方差,配置训练和评估数据集,选用DeepLabV3P模型进行训练。最后,导出模型,使用VisualDL进行可视化,并提供了完整的训练脚本和参数设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

paddlex使用自定义数据集训练语义分割模型步骤:

1.数据准备

(1)使用labelme标注工具,对图片进行标注;

(2)数据集按照如下方式进行组织,原图均放在同一目录,如JPEGImages,标注的同名json文件均放在同一目录,如Annotations

MyDataset/ # 语义分割数据集根目录
|--JPEGImages/ # 原图文件所在目录
|  |--1.jpg
|  |--2.jpg
|  |--...
|  |--...
|
|--Annotations/ # 标注文件所在目录
|  |--1.json
|  |--2.json
|  |--...
|  |--...

(3)标注数据格式转换

进入MyDataset/文件夹,在终端输入下列语句,随后会在converted_dataset_dir/Annotations/文件夹中生成json对应的png图片;

paddlex --data_conversion --source labelme --to SEG --pics ./JPEGImages --annotations ./Annotations --save_dir ./converted_dataset_dir
参数说明
–source表示数据标注来源,支持labelmejingling(分别表示数据来源于LabelMe,精灵标注助手)
–to表示数据需要转换成为的格式,支持ImageNet(图像分类)、PascalVOC(目标检测),MSCOCO(实例分割,也可用于目标检测)和SEG(语义分割)
–pics指定原图所在的目录路径
–annotations指定标注文件所在的目录路径

(4)划分数据集

使用paddlex命令即可将数据集随机划分成70%训练集,20%验证集和10%测试集,将上述的converted_dataset_dir/文件夹拷贝到上一级目录,与MyDataset/同级,输入下列语句进行数据集划分;

paddlex --split_dataset --format SEG --dataset_dir converted_dataset_dir --val_value 0.2 --test_value 0.1

执行上面命令行,会在converted_dataset_dir/下生成train_list.txt, val_list.txt, test_list.txt,分别存储训练样本信息,验证样本信息,测试样本信息;

2.模型训练

首先利用以下脚本计算样本图片的均值和方差:

import numpy as np
from tqdm import tqdm
from glob import glob
import cv2
import random
import os

means = [0, 0, 0]
stdevs = [0, 0, 0]

index = 1
num_imgs = 0
imgslist = glob(r'C:\Users\*\Desktop\converted_dataset_dir\JPEGImages\\*.jpg')
for imgpath in tqdm(imgslist):
    num_imgs += 1
    img = cv2.imread(imgpath)
    img = np.asarray(img)
    img = img.astype(np.float32) / 255.
    for i in range(3):
        means[i] += img[:, :, i].mean()
        stdevs[i] += img[:, :, i].std()

means = np.asarray(means) / num_imgs
stdevs = np.asarray(stdevs) / num_imgs

print('normMean = {}   normStd = {}'.format(means, stdevs))

计算得到的结果:
n o r m M e a n = [ 0.382315840.377324210.38105058 ] n o r m S t d = [ 0.235456770.24525060.24322171 ] normMean = [0.38231584 0.37732421 0.38105058] normStd = [0.23545677 0.2452506 0.24322171] normMean=[0.382315840.377324210.38105058]normStd=[0.235456770.24525060.24322171]
训练脚本:

# -*- coding:utf-8 -*-
import paddlex as pdx
from paddlex import transforms as T

# from paddlex.seg import transforms
train_transforms = T.Compose([
    T.RandomHorizontalFlip(),
    T.Resize(target_size=640),
    T.MixupImage(alpha=1.5, beta=1.5, mixup_epoch=-1),
    T.RandomDistort(),
    T.RandomBlur(),
    T.Normalize(mean=[0.38231584,0.37732421,0.38105058], std=[0.23545677,0.2452506,0.24322171])
])
eval_transforms = T.Compose([
    T.Resize(target_size=640),
    T.Normalize(mean=[0.38231584,0.37732421,0.38105058], std=[0.23545677,0.2452506,0.24322171])
])


train_dataset = pdx.datasets.SegDataset(
    data_dir='converted_dataset_dir',
    file_list='converted_dataset_dir/train_list.txt',
    label_list='converted_dataset_dir/labels.txt',
    transforms=train_transforms,
    shuffle=True)
eval_dataset = pdx.datasets.SegDataset(
    data_dir='converted_dataset_dir',
    file_list='converted_dataset_dir/val_list.txt',
    label_list='converted_dataset_dir/labels.txt',
    transforms=eval_transforms)



num_classes = len(train_dataset.labels)
model = pdx.seg.DeepLabV3P(num_classes=num_classes)
model.train(
    num_epochs=40,
    optimizer=None,
    train_dataset=train_dataset,
    train_batch_size=1,
    eval_dataset=eval_dataset,
    learning_rate=0.01,
    save_interval_epochs=10,
    # pretrain_weights='output/deeplab4/best_model',
    save_dir='out/deeplab',
    early_stop=True,
    early_stop_patience=5,
)

将上述结果放入T.Normalize:

T.Normalize(mean=[0.38231584,0.37732421,0.38105058], std=[0.23545677,0.2452506,0.24322171])

调整一下相关参数,即可开始训练…

3.模型导出:
paddlex --export_inference --model_dir=./best_model/ --save_dir=./inference 
4.可视化:
visualdl --logdir=./vdl_log
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhijun.li@Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值