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 ( jingling respectivamente 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.txt
Ejecutar la línea de comando anterior generará , val_list.txt
, en convert_dataset_dir/ test_list.txt
para 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