paddlex はカスタム データセットを使用してセマンティック セグメンテーション モデルのステップをトレーニングします。
1. データの準備
(1) labelme ラベル付けツールを使用して画像にラベルを付けます。
(2) データ セットは次のように構成されます。元の画像は同じディレクトリに配置されます。たとえばJPEGImages
、同じ名前のマークされた json ファイルは同じディレクトリに配置されますAnnotations
。
MyDataset/ # 语义分割数据集根目录
|--JPEGImages/ # 原图文件所在目录
| |--1.jpg
| |--2.jpg
| |--...
| |--...
|
|--Annotations/ # 标注文件所在目录
| |--1.json
| |--2.json
| |--...
| |--...
(3) ラベルデータ形式の変換
MyDataset/ フォルダーに入り、ターミナルで次のステートメントを入力すると、json に対応する png イメージが Converted_dataset_dir/Annotations/ フォルダーに生成されます。
paddlex --data_conversion --source labelme --to SEG --pics ./JPEGImages --annotations ./Annotations --save_dir ./converted_dataset_dir
パラメータ | 説明する |
---|---|
-ソース | データラベル付けのソース support を示しますlabelme (jingling それぞれ、データが LabelMe、Elf Labeling Assistant から取得されたものであることを示します) |
-に | データを変換する必要がある形式を示し、ImageNet (画像分類)、PascalVOC (オブジェクト検出)、MSCOCO (インスタンス セグメンテーション、オブジェクト検出にも使用可能)、SEG (セマンティック セグメンテーション)をサポートします。 |
–写真 | 元のイメージが存在するディレクトリ パスを指定します |
–注釈 | 注釈ファイルが配置されているディレクトリ パスを指定します |
(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
train_list.txt
上記のコマンドラインを実行すると、converted_dataset_dir/ の下に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))
計算結果:
ノルム平均 = [ 0.382315840.377324210.38105058 ] ノルム標準 = [ 0.235456770.24525060.24322171 ] ノルム平均 = [0.38231584 0.37732421 0.3810 5058] Norm mStd = [0.23545677 0.2452506 0.24322171]nまたはm平均_ _=[ 0.382315840.377324210.38105058 ] nまたはm St d=[ 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