Paddle图像分割训练自己的数据教程 - 教程

分割模型训练

PaddleSeg语义分割

1、数据标注

参考https://paddlepaddle.github.io/PaddleX/latest/data_annotations/cv_modules/semantic_segmentation.html#23-labelme

1)安装labelme

使用labelme标注开源地址https://github.com/wkentaro/labelme

python直接安装pipinstalllabelme

2)标注

打开Anaconda Prompt激活环境命令行执行labelme

注意通常情况下,只需要标注前景目标并设置标注类别,其他像素默认作为背景。如果需要手动标注背景区域,类别必须设置为_background_,否则格式转换会有问题针对有空洞的目标,在标注完目标外轮廓后,再沿空洞边缘画多边形,并将空洞指定为特定类别,如果空洞是背景则指定为_background_

打开数据集目录打开自动保存文件-自动保存

可设置ai自动识别多边形

右键感兴趣区域创建AI多边形模型根据所选自动下载

点击一个位置会自动出现遮罩效果鼠标移动实时变化双击确定输入名称

可手动调整多边形编辑多边形-(点击图上位置多边形列表对应多边形):

--添加鼠标放在添加位置边缘轮廓alt+

--删除鼠标放在待删除alt+shift+左键

--左右移动按住alt+鼠标滚轮

-- 缩放:按住ctrl+鼠标滚轮

--整体拖动鼠标滚轮按住拖动

完成标注json文件和图片存放在同一个文件夹,而且是一一对应关系

2、PaddleSeg环境安装

1)python环境:

conda create -n paddle python=3.11
conda activate paddle

2)根据本机GPU安装paddlepaddle-gpu

版本查询地址飞桨PaddlePaddle-源于产业实践的开源深度学习平台

 python -m pip install paddlepaddle-gpu==3.2.2 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/

(验证安装执行python -c "import paddle; paddle.utils.run_check()"提示PaddlePaddle is installed successfully!安装成功可能警告No ccache found.(编译优化工具)||Value do not have 'place' interface for pir graph mode(新版本 Paddle 的图模式警告)忽略即可)

3)安装paddleX

# 自定义保存地址
git clone https://github.com/PaddlePaddle/PaddleX.git
cd PaddleX
# -e:以可编辑模式安装,当前项目的代码更改,都会直接作用到已经安装的 PaddleX Wheel
pip install -e .

GitHub 网速较慢gitee下载git clone https://gitee.com/paddlepaddle/PaddleX.git

4)安装插件

使用PaddleX的应用场景为二次开发 (例如重新训练模型、微调模型、自定义模型结构、自定义推理代码等),官方推荐使用功能更加强大的插件安装模式。

通用语义分割插件名称"PaddleSeg"

# 此时在PaddleX根目录,conda paddle环境
paddlex --install PaddleSeg

3、训练自定义模型

1)数据准备

使用PaddleSeg提供的数据转换脚本,将1LabelMe标注工具产出的数据格式转换为PaddleSeg和PaddleX所需的数据格式官方命令

python tools/data/labelme2seg.py input_dir output_dir

第一个input_dir参数是原始图像和json标注文件的保存目录,第二个output_dir参数是转换后数据集的保存目录

当前项目执行如下PaddleSeg通过插件安装PaddleSeg目录

# 此时在PaddleX根目录
python paddlex/repo_manager/repos/PaddleSeg/tools/data/labelme2seg.py E:/Dimensional_Inspection/0datasets/train3(1129) datasets_train

结果datasets_train目录生成两个文件夹(annotationsimages)txt文件(class_names.txt)

PaddleX 针对图像分割任务定义的数据集,组织结构和标注格式如下:

dataset_dir        # 数据集根目录,目录名称可以改变
├── annotations    # 存放标注图像的目录,名称可改变,与标识文件的内容相对应
├── images         # 存放原始图像的目录,名称可改变,与标识文件的内容相对应
├── train.txt      # 训练集标注文件,文件名称不可改变。每行是原始图像路径和标注图像路径,使用空格分隔,内容举例:images/P0005.jpg annotations/P0005.png
└── val.txt        # 验证集标注文件,文件名称不可改变。每行是原始图像路径和标注图像路径,使用空格分隔,内容举例:images/N0139.jpg annotations/N0139.png

datasets_train目录结构改为如上形式执行脚本

import os, random
path, ratio = r"E:\Development\python\PaddleX\datasets_train", 0.8  # 在这里修改路径和比例
imgs = [f for f in os.listdir(f'{path}/images') if not f.startswith('.')]
pairs = [(img, a) for img in imgs for ext in ['.png','.jpg','.jpeg']
         if (a:=f"{os.path.splitext(img)[0]}{ext}") and os.path.exists(f'{path}/annotations/{a}')]
random.shuffle(pairs); split = int(len(pairs)*ratio)
open(f'{path}/train.txt','w').write('\n'.join([f'images/{i} annotations/{a}' for i,a in pairs[:split]]))
open(f'{path}/val.txt','w').write('\n'.join([f'images/{i} annotations/{a}' for i,a in pairs[split:]]))
print(f'生成完成: train({len(pairs[:split])}) val({len(pairs[split:])}) 比例: {ratio:.1%}')

结果:

上传百度安装:pip install --upgrade aistudio-sdk

命令行执行

上传文件夹aistudio upload lihua5666/dim E:/Development/python/PaddleX/datasets_train --repo-type dataset --token YOUR_ACCESS_TOKEN

2)数据校验

PaddleX 针对每一个模块提供了数据校验功能,只有通过数据校验的数据才可以进行模型训练,官方命令为

python main.py -c paddlex/configs/semantic_segmentation/PP-LiteSeg-T.yaml \
    -o Global.mode=check_dataset \
    -o Global.dataset_dir=./dataset/seg_optic_examples

当前项目

配置文件paddlex/configs/modules/semantic_segmentation/Deeplabv3-R50.yaml(总共支持18个模型,根据选择模型修改PP-LiteSeg系列移动端)

数据地址datasets_train

执行

# 根目录执行
python main.py -c paddlex/configs/modules/semantic_segmentation/PP-LiteSeg-B.yaml -o Global.mode=check_dataset -o Global.dataset_dir=datasets_train

结果显示

校验结果文件保存在./output/check_dataset_result.json

3)模型训练

选定需要训练模型(延续上一步PP-LiteSeg-B)训练500

执行

python main.py -c paddlex/configs/modules/semantic_segmentation/PP-LiteSeg-B.yaml -o Global.mode=train -o Global.device=gpu:0 -o Global.dataset_dir=datasets_train -o Global.output="output/output1" -o Train.epochs_iters=500 -o Train.num_classes=3 -o Train.dy2st=True

参数说明

---指定模型的.yaml 配置文件路径(此处为 PP-LiteSeg-B.yam,训练其他模型时,需要的指定相应的配置文件,模型和配置的文件的对应关系,可以查阅PaddleX模型列表https://github.com/PaddlePaddle/PaddleX/blob/release/3.0-beta1/docs/support_list/models_list.md

---指定模式为模型训练:-o Global.mode=train

---指定训练数据集路径:-o Global.dataset_dir 其他相关参数均可通过修改.yaml配置文件中的Global和Train下的字段来进行设置,也可以通过在命令行中追加参数来进行调整。如指定前 2 卡 gpu 训练:-o Global.device=gpu:0,1;设置训练轮次数为 10:-o Train.epochs_iters=10。更多可修改的参数及其详细解释,可以查阅模型对应任务模块的配置文件说明PaddleX通用模型配置文件参数说明https://github.com/PaddlePaddle/PaddleX/blob/release/3.0-beta1/docs/module_usage/instructions/config_parameters_common.md

4)模型评估

在完成模型训练后,对指定的模型权重文件在验证集上进行评估,验证模型精度

python main.py -c paddlex/configs/modules/semantic_segmentation/PP-LiteSeg-B.yaml -o Global.mode=evaluate -o Global.dataset_dir=datasets_train -o Global.device=gpu:0 -o Evaluate.weight_path="output/best_model/model.pdparams"

weight_path自定义训练模型地址在完成模型评估后,会生成output/evaluate_result.json,记录了评估的结果

5)模型推理

执行前安装pip install pypdfium2自动检测文件否则会报错

python main.py -c paddlex/configs/modules/semantic_segmentation/PP-LiteSeg-B.yaml -o Global.mode=predict -o Global.device=gpu:0 -o Predict.model_dir="output/best_model/inference" -o Predict.input="E:/Dimensional_Inspection/0datasets/train3(1129)/t1.jpg"

结果生成t1_res.jpg掩码以及t1_res.json

python代码预测

下载pip install "paddlex[cv]==3.3.10" #版本paddleX一致

pipinstallnumpy==1.26.*#numpy版本不得大于2matplotlib的_path模块使用了旧版NumPy编译的扩展

配置文件默认地址paddlex/configs/pipelines/semantic_segmentation.yaml根据实际模型修改

pipeline_name: semantic_segmentation
SubModules:
  SemanticSegmentation:
    module_name: semantic_segmentation
    model_name: OCRNet_HRNet-W48 # 模型类型
    model_dir: train_model/1203_1 # 模型地址,训练后默认地址output/best_model/inference
    batch_size: 1
    target_size: None

预测

from paddlex import create_pipeline
pipeline = create_pipeline(pipeline="semantic_segmentation.yaml",
                           device="gpu:0")
output = pipeline.predict(input="makassaridn-road_demo.png", target_size = -1)
for res in output:
    res.print()
    res.save_to_img(save_path="train_model/1203_1_res")
    res.save_to_json(save_path="train_model/1203_1_res")

若提示CUDNN_STATUS_ALLOC_FAILED→ 显存不够了(OOM)

PaddleSeg实例分割

1数据标注

参考https://paddlepaddle.github.io/PaddleX/latest/module_usage/tutorials/cv_modules/instance_segmentation.html#413

类似语义分割略有不同

1创建数据集根目录,如 dimdim 中创建 images 目录(必须为 images 目录),并将待标注图片存储在 images 目录下

2dim 文件夹中创建待标注数据集的类别标签文件 label.txt,并在 label.txt 中按行写入待标注数据集的类别这里contour,hole)

3标注完成标注好的标签json文件annotations目录必须为 annotations 目录完整布局如下

这里可以复用语义分割得到数据如果图片标注文件同一个目录执行以下代码

import shutil
from pathlib import Path
src = Path("image_label")  # 修改这里为自己的文件夹地址
dst = Path(f"{src}_split")
(dst/"images").mkdir(parents=True, exist_ok=True); (dst/"annotations").mkdir(parents=True, exist_ok=True)
[shutil.copy2(f, dst/("images" if f.suffix.lower() in {'.jpg','.jpeg','.png','.bmp','.tiff','.tif'} else "annotations")/f.name)
 for f in src.iterdir() if f.is_file()]
print(f"✅ 分离完成!保存到: {dst}")

结果保存自己的文件夹地址_split

4在数据集根目录创建 train_anno_list.txt 和 val_anno_list.txt 两个文本文件并将 annotations 目录下的全部 json 文件路径按一定比例分别写入 train_anno_list.txt 和 val_anno_list.txt

执行以下代码传入json文件地址annotations文件生成txt

from pathlib import Path
import random
annos_dir = Path(r"annotations") # 自己的annotations目录
jsons = list(annos_dir.glob("*.json"))
random.shuffle(jsons)
split = int(len(jsons) * 0.8)
for name, files in [("train_anno_list.txt", jsons[:split]), ("val_anno_list.txt", jsons[split:])]:
    (annos_dir.parent / name).write_text("\n".join(f"./annotations/{f.name}" for f in files))
print(f"✅ 保存在: {annos_dir.parent}\n训练集: {split}个, 验证集: {len(jsons)-split}个")

完整如下这是标准labelme格式文件

2PaddleSeg环境安装

语义分割

3、训练自定义的模型

1)数据准备数据校验

PaddleX 针对实例分割任务定义的数据集,名称是 COCOInstSegDataset,组织结构和标注格式如下:

dataset_dir                  # 数据集根目录,目录名称可以改变
├── annotations              # 标注文件的保存目录,目录名称不可改变
│   ├── instance_train.json  # 训练集标注文件,文件名称不可改变,采用COCO标注格式
│   └── instance_val.json    # 验证集标注文件,文件名称不可改变,采用COCO标注格式
└── images                   # 图像的保存目录,目录名称不可改变

使用PaddleSeg提供的数据校验脚本,可以将1中LabelMe标注工具产出的数据格式转换为实例分割所需的数据格式

官方命令为:

python main.py -c paddlex/configs/modules/instance_segmentation/Mask-RT-DETR-L.yaml\
    -o Global.mode=check_dataset \
    -o Global.dataset_dir=./dataset/instance_seg_labelme_examples

这里1数据标注label结果5(annotationsimageslabel.txttrain_anno_list.txtval_anno_list.txt)放到paddleX根目录datsets_ins_seg/instance_seg_labelme文件夹追加参数形式转换数据格式执行代码

# 此时在conda环境PaddleX根目录
python main.py -c paddlex/configs/modules/instance_segmentation/Mask-RT-DETR-L.yaml -o Global.mode=check_dataset -o Global.dataset_dir=./datsets_ins_seg/instance_seg_labelme -o CheckDataset.convert.enable=True -o CheckDataset.convert.src_dataset_type=LabelMe

执行完毕datsets_ins_seg/instance_seg_labelme/annotations文件夹生成instance_train.jsoninstance_val.json数据集整理实例分割任务形式

2)模型训练

训练安装PaddleDetectionpaddlex --install PaddleDetection(否则会提示is not a registered model name)

以此处实例分割模型 Mask-RT-DETR-L 的训练为例官方命令

python main.py -c paddlex/configs/modules/instance_segmentation/Mask-RT-DETR-L.yaml \
    -o Global.mode=train \
    -o Global.dataset_dir=./dataset/instance_seg_coco_examples

参数设置

---指定模型的.yaml 配置文件路径(此处为 Mask-RT-DETR-L.yaml,训练其他模型时,需要的指定相应的配置文件,模型和配置的文件的对应关系,可以查阅PaddleX模型列表PaddleX模型列表(CPU/GPU) - PaddleX 文档

---指定模式为模型训练:-o Global.mode=train

---指定训练数据集路径:-o Global.dataset_dir

---Paddle 3.0 版本支持了 CINN 神经网络编译器,在使用 GPU 设备训练时,不同模型有不同程度的训练加速效果。在 PaddleX 中训练模型时,可通过指定参数 -o Train.dy2st=True 开启

---其他相关参数均可通过修改.yaml配置文件中的Global和Train下的字段来进行设置,也可以通过在命令行中追加参数来进行调整。如指定前 2 卡 gpu 训练:-o Global.device=gpu:0,1;设置训练轮次数为 10:-o Train.epochs_iters=10。更多可修改的参数及其详细解释,可以查阅模型对应任务模块的配置文件说明PaddleX通用模型配置文件参数说明 - PaddleX 文档

这里1数据集为例

python main.py -c paddlex/configs/modules/instance_segmentation/Mask-RT-DETR-L.yaml -o Global.mode=train -o Global.dataset_dir=./datsets_ins_seg/instance_seg_labelme -o Global.device=gpu:0 -o Global.output="output/output_1203_16_22" -o Train.epochs_iters=10 -o Train.num_classes=2

(相关版本paddledet(0.0.0),paddlepaddle-gpu(3.2.2),paddleseg(0.0.0.dev0),paddlex(3.3.10),numpy(1.26.4))

3)模型评估

完成模型训练后,对指定的模型权重文件在验证集上进行评估,验证模型精度官方命令

python main.py -c paddlex/configs/modules/instance_segmentation/Mask-RT-DETR-L.yaml \
    -o Global.mode=evaluate \
    -o Global.dataset_dir=./dataset/instance_seg_coco_examples

这里训练完成Mask-RT-DETR-L为例

python main.py -c paddlex/configs/modules/instance_segmentation/Mask-RT-DETR-L.yaml -o Global.mode=evaluate -o Global.device=gpu:0 -o Global.output="output/output_1203_16_22" -o Global.dataset_dir=./datsets_ins_seg/instance_seg_labelme -o Evaluate.weight_path="output/output_1203_16_22/best_model/model.pdparams"

output/output_1203_16_22/evaluate_result.json记录了评估的结果

4)模型推理

命令行,官方命令为

python main.py -c paddlex/configs/modules/instance_segmentation/Mask-RT-DETR-L.yaml \
    -o Global.mode=predict \
    -o Predict.model_dir="./output/best_model/inference" \
    -o Predict.input="general_instance_segmentation_004.png"

以训练完成的Mask-RT-DETR-L为例

python main.py -c paddlex/configs/modules/instance_segmentation/Mask-RT-DETR-L.yaml -o Global.mode=predict -o Global.device=gpu:0 -o Predict.model_dir="./output/best_model/inference" -o Predict.input="t1.png"

posted @ 2026-01-24 14:26  gccbuaa  阅读(4)  评论(0)    收藏  举报