paddlex usa un conjunto de datos personalizado para entrenar un modelo de segmentación semántica

paddlex utiliza un conjunto de datos personalizado para entrenar los pasos del modelo de segmentación semántica:

1. Preparación de datos

(1) Use la herramienta de etiquetado labelme para etiquetar la imagen;

(2) El conjunto de datos se organiza de la siguiente manera, las imágenes originales se colocan en el mismo directorio, por ejemplo JPEGImages, los archivos json marcados con el mismo nombre se colocan en el mismo directorio, como Annotations;

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

(3) Conversión de formato de datos de etiquetas

Ingrese a la carpeta MyDataset/, ingrese la siguiente declaración en el terminal, y luego se generará una imagen png correspondiente a json en la carpeta convert_dataset_dir/Annotations/;

paddlex --data_conversion --source labelme --to SEG --pics ./JPEGImages --annotations ./Annotations --save_dir ./converted_dataset_dir
parámetro ilustrar
-fuente Indica la fuente de etiquetado de datos, soporte labelme( jinglingrespectivamente indica que los datos provienen de LabelMe, Elf Labeling Assistant)
-a Indica el formato al que deben convertirse los datos, admite ImageNet(clasificación de imágenes), PascalVOC(detección de objetos), MSCOCO(segmentación de instancias, también se puede usar para la detección de objetos) y SEG(segmentación semántica)
–fotos Especifique la ruta del directorio donde se encuentra la imagen original
–anotaciones Especifique la ruta del directorio donde se encuentra el archivo de anotación

(4) Dividir el conjunto de datos

Use el comando paddlex para dividir aleatoriamente el conjunto de datos en un 70 % de entrenamiento, un 20 % de verificación y un 10 % de prueba, copie la carpeta convert_dataset_dir/ anterior en el directorio de nivel superior y MyDataset/ en el mismo nivel, ingrese la siguiente declaración para proceder División del conjunto de datos;

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

train_list.txtEjecutar la línea de comando anterior generará , val_list.txt, en convert_dataset_dir/ test_list.txtpara almacenar información de muestra de entrenamiento, información de muestra de verificación e información de muestra de prueba, respectivamente;

2. Formación modelo

Primero use el siguiente script para calcular la media y la varianza de la imagen de muestra:

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))

Resultados calculados:
norma media = [ 0.382315840.377324210.38105058 ] norma estándar = [ 0.235456770.24525060.24322171 ] norma media = [0.38231584 0.37732421 0.3810 5058] no rmStd = [0,23545677 0,2452506 0,24322171]n o m Media _ _=[ 0.382315840.377324210.38105058 ] n o m St d=[ 0.235456770.24525060.24322171 ]
Guión de entrenamiento:

# -*- 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,
)

Ponga el resultado anterior en T.Normalize:

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

Ajuste los parámetros relevantes para comenzar a entrenar...

3. Modelo de exportación:

paddlex --export_inference --model_dir=./best_model/ --save_dir=./inference 

4. Visualización:

visualdl --logdir=./vdl_log

Supongo que te gusta

Origin blog.csdn.net/weixin_45921929/article/details/126067604
Recomendado
Clasificación