零.写在最前

该项目源于《飞桨学习赛:眼底OCT层分割(GOALS挑战赛任务一)

基于飞桨高性能图像分割开发套件(PaddleSeg),进行快速微调和预测,生成比赛结果文件

一.安装PaddleSeg

PaddleSeg是基于飞桨PaddlePaddle的端到端图像分割套件,内置40+模型算法及140+预训练模型,支持配置化驱动和API调用开发方式,打通数据标注、模型开发、训练、压缩、部署的全流程,提供语义分割、交互式分割、Matting、全景分割四大分割能力,助力算法在医疗、工业、遥感、娱乐等场景落地应用。

在这里插入图片描述

# 切换到工作目录
%cd /home/aistudio/work

# 解压下载好的PaddleSeg
!unzip PaddleSeg.zip

# 安装PaddleSeg依赖
%cd PaddleSeg
!pip install -r requirements.txt

二.数据集处理

PaddleSeg使用单通道的标注图片(灰度标注图),每一种像素值代表一种类别,像素标注类别需要从0开始递增,例如0,1,2,3表示有4种类别。

建议标注图像使用PNG无损压缩格式的图片,支持的标注类别最多为256类。

通常标注图片是单通道的灰度图,显示是全黑效果,无法直接观察标注是否正确。 在原来的灰度标注图中注入调色板,就可以得到伪彩色的标注图。 灰度标注图和伪彩色标注图的对比如下。

在这里插入图片描述

# 解压数据集
%cd /home/aistudio/data/data170514

!unzip -o GOALS2022-Train.zip
!unzip -o GOALS2022-Validation.zip

# 移动到PaddleSeg/data/mine 目录下 - 训练集
! mv Train/Image /home/aistudio/work/PaddleSeg/data/mine/
! mv Train/Layer_Masks /home/aistudio/work/PaddleSeg/data/mine/

# 移动到PaddleSeg/data/mine 目录下 - 测试集
! mv GOALS2022-Validation/Image /home/aistudio/work/PaddleSeg/data/mine/test

生成train.txt和valid.txt 和 灰度标注图

import cv2
class Pre(object):
    def __init__(self):
        self.dataPath = '/home/aistudio/work/PaddleSeg/data/mine/'
    def run(self):
        # 生成train.txt和valid.txt
        trainFile = open(self.dataPath + 'train.txt', 'w')
        vaildFile = open(self.dataPath + 'valid.txt', 'w')
        for i in range(1,101):
            name = str(i).zfill(4)
            if i <= 90:
                trainFile.write('Image/'+name+'.png Image_Label/'+name+'.png')
                trainFile.write('\n')
            else:
                vaildFile.write('Image/'+name+'.png Image_Label/'+name+'.png')
                vaildFile.write('\n')
            
            # 将标签图片转为标准标准图片
            image = cv2.imread(self.dataPath+'Layer_Masks/'+name+'.png')

            # 像素值为0的是RNFL(类别 0)
            # 像素值为80的是GCIPL(类别 1)
            # 像素值为160的是脉络膜(类别 2)
            # 像素值为255的是其他(类别3)。
            image[image == 80] = 1
            image[image == 160] = 2
            image[image == 255] = 3
            image = image[:,:,1]
            cv2.imwrite(self.dataPath+'Image_Label/'+name+'.png', image)

pre = Pre()
pre.run()
# 灰度标注图转换为伪彩色标注图 (非必须)
%cd /home/aistudio/work/PaddleSeg

!python tools/gray2pseudo_color.py  data/mine/Image_Label data/mine/Image_Masks2

三.训练

本项目选用PP-LiteSeg模型训练学习
在这里插入图片描述

配置文件在configs/qick_start/mine.yml中。其他模型的配置方案可以参考 configs目录下其他文件

batch_size: 10  #设定batch_size的值即为迭代一次送入网络的图片数量,一般显卡显存越大,batch_size的值可以越大。如果使用多卡训练,总得batch size等于该batch size乘以卡数。
iters: 2000    #模型训练迭代的轮数

train_dataset:  #训练数据设置
  type: Dataset #指定加载数据集的类
  dataset_root: data/mine #数据集路径
  train_path: data/mine/train.txt  #数据集中用于训练的标识文件
  num_classes: 4  #指定类别个数(背景也算为一类)
  mode: train #表示用于训练
  transforms: #模型训练的数据预处理方式。
    - type: ResizeStepScaling #将原始图像和标注图像随机缩放为0.5~2.0倍
      min_scale_factor: 0.5
      max_scale_factor: 2.0
      scale_step_size: 0.25
    - type: RandomPaddingCrop #从原始图像和标注图像中随机裁剪512x512大小
      crop_size: [512, 512]
    - type: RandomHorizontalFlip  #对原始图像和标注图像随机进行水平反转
    - type: RandomDistort #对原始图像进行亮度、对比度、饱和度随机变动,标注图像不变
      brightness_range: 0.5
      contrast_range: 0.5
      saturation_range: 0.5
    - type: Normalize #对原始图像进行归一化,标注图像保持不变

val_dataset:  #验证数据设置
  type: Dataset #指定加载数据集的类
  dataset_root: data/mine #数据集路径
  val_path: data/mine/valid.txt  #数据集中用于验证的标识文件
  num_classes: 2  #指定类别个数(背景也算为一类)
  mode: val #表示用于验证
  transforms: #模型验证的数据预处理的方式
    - type: Normalize #对原始图像进行归一化,标注图像保持不变

optimizer: #设定优化器的类型
  type: sgd #采用SGD(Stochastic Gradient Descent)随机梯度下降方法为优化器
  momentum: 0.9 #设置SGD的动量
  weight_decay: 4.0e-5 #权值衰减,使用的目的是防止过拟合

lr_scheduler: # 学习率的相关设置
  type: PolynomialDecay # 一种学习率类型。共支持12种策略
  learning_rate: 0.01 # 初始学习率
  power: 0.9
  end_lr: 0

loss: #设定损失函数的类型
  types:
    - type: CrossEntropyLoss  #CE损失
  coef: [1, 1, 1] # PP-LiteSeg有一个主loss和两个辅助loss,coef表示权重,所以 total_loss = coef_1 * loss_1 + .... + coef_n * loss_n

model:  #模型说明
  type: PPLiteSeg  #设定模型类别
  backbone:  # 设定模型的backbone,包括名字和预训练权重
    type: STDC2
    pretrained: https://bj.bcebos.com/paddleseg/dygraph/PP_STDCNet2.tar.gz
%cd /home/aistudio/work/PaddleSeg/

!export CUDA_VISIBLE_DEVICES=0 # 设置1张可用的卡

!python train.py \
       --config configs/quick_start/mine.yml \
       --save_interval 500 \
       --do_eval \
       --use_vdl \
       --save_dir output

上述训练命令解释:

–config指定配置文件。

–save_interval指定每训练特定轮数后,就进行一次模型保存或者评估(如果开启模型评估)。

–do_eval开启模型评估。具体而言,在训练save_interval指定的轮数后,会进行模型评估。

–use_vdl开启写入VisualDL日志信息,用于VisualDL可视化训练过程。

–save_dir指定模型和visualdl日志文件的保存根路径。

在这里插入图片描述
在这里插入图片描述

四.评估

!python val.py \
       --config configs/quick_start/mine.yml \
       --model_path output/best_model/model.pdparams
2022-09-30 23:11:30 [INFO]	
---------------Config Information---------------
batch_size: 10
iters: 5000
loss:
  coef:
  - 1
  - 1
  - 1
  types:
  - type: CrossEntropyLoss
lr_scheduler:
  end_lr: 0
  learning_rate: 0.01
  power: 0.9
  type: PolynomialDecay
model:
  backbone:
    pretrained: https://bj.bcebos.com/paddleseg/dygraph/PP_STDCNet2.tar.gz
    type: STDC2
  type: PPLiteSeg
optimizer:
  momentum: 0.9
  type: sgd
  weight_decay: 4.0e-05
train_dataset:
  dataset_root: data/mine
  mode: train
  num_classes: 4
  train_path: data/mine/train.txt
  transforms:
  - max_scale_factor: 2.0
    min_scale_factor: 0.5
    scale_step_size: 0.25
    type: ResizeStepScaling
  - crop_size:
    - 512
    - 512
    type: RandomPaddingCrop
  - type: RandomHorizontalFlip
  - brightness_range: 0.5
    contrast_range: 0.5
    saturation_range: 0.5
    type: RandomDistort
  - type: Normalize
  type: Dataset
val_dataset:
  dataset_root: data/mine
  mode: val
  num_classes: 4
  transforms:
  - type: Normalize
  type: Dataset
  val_path: data/mine/valid.txt
------------------------------------------------
W0930 23:11:30.606279 19642 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 11.2
W0930 23:11:30.606314 19642 gpu_resources.cc:91] device: 0, cuDNN Version: 8.2.
2022-09-30 23:11:31 [INFO]	Loading pretrained model from https://bj.bcebos.com/paddleseg/dygraph/PP_STDCNet2.tar.gz
2022-09-30 23:11:31 [INFO]	There are 265/265 variables loaded into STDCNet.
2022-09-30 23:11:31 [INFO]	Loading pretrained model from output/best_model/model.pdparams
2022-09-30 23:11:31 [INFO]	There are 367/367 variables loaded into PPLiteSeg.
2022-09-30 23:11:31 [INFO]	Loaded trained params of model successfully
2022-09-30 23:11:31 [INFO]	Start evaluating (total_samples: 10, total_iters: 10)...
10/10 [==============================] - 2s 189ms/step - batch_cost: 0.1886 - reader cost: 0.0511
2022-09-30 23:11:33 [INFO]	[EVAL] #Images: 10 mIoU: 0.8708 Acc: 0.9874 Kappa: 0.9247 Dice: 0.9289
2022-09-30 23:11:33 [INFO]	[EVAL] Class IoU: 
[0.8646 0.7588 0.8711 0.9888]
2022-09-30 23:11:33 [INFO]	[EVAL] Class Precision: 
[0.9387 0.888  0.9391 0.993 ]
2022-09-30 23:11:33 [INFO]	[EVAL] Class Recall: 
[0.9163 0.8391 0.9232 0.9957]

五.预测生成图片

!python predict.py \
       --config configs/quick_start/mine.yml \
       --model_path output/best_model/model.pdparams \
       --image_path data/mine/test/Image \
       --save_dir output/result \
       --custom_color 0 0 0 80 80 80 160 160 160 255 255 255
2022-09-30 23:12:16 [INFO]	
---------------Config Information---------------
batch_size: 10
iters: 2000
loss:
  coef:
  - 1
  - 1
  - 1
  types:
  - type: CrossEntropyLoss
lr_scheduler:
  end_lr: 0
  learning_rate: 0.01
  power: 0.9
  type: PolynomialDecay
model:
  backbone:
    pretrained: https://bj.bcebos.com/paddleseg/dygraph/PP_STDCNet2.tar.gz
    type: STDC2
  type: PPLiteSeg
optimizer:
  momentum: 0.9
  type: sgd
  weight_decay: 4.0e-05
train_dataset:
  dataset_root: data/mine
  mode: train
  num_classes: 4
  train_path: data/mine/train.txt
  transforms:
  - max_scale_factor: 2.0
    min_scale_factor: 0.5
    scale_step_size: 0.25
    type: ResizeStepScaling
  - crop_size:
    - 512
    - 512
    type: RandomPaddingCrop
  - type: RandomHorizontalFlip
  - brightness_range: 0.5
    contrast_range: 0.5
    saturation_range: 0.5
    type: RandomDistort
  - type: Normalize
  type: Dataset
val_dataset:
  dataset_root: data/mine
  mode: val
  num_classes: 4
  transforms:
  - type: Normalize
  type: Dataset
  val_path: data/mine/valid.txt
------------------------------------------------
W0930 23:12:16.691648 19915 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 11.2
W0930 23:12:16.691681 19915 gpu_resources.cc:91] device: 0, cuDNN Version: 8.2.
2022-09-30 23:12:17 [INFO]	Loading pretrained model from https://bj.bcebos.com/paddleseg/dygraph/PP_STDCNet2.tar.gz
2022-09-30 23:12:17 [INFO]	There are 265/265 variables loaded into STDCNet.
2022-09-30 23:12:17 [INFO]	Number of predict images = 100
2022-09-30 23:12:17 [INFO]	Loading pretrained model from output/best_model/model.pdparams
2022-09-30 23:12:17 [INFO]	There are 367/367 variables loaded into PPLiteSeg.
2022-09-30 23:12:17 [INFO]	Start to predict...
100/100 [==============================] - 16s 157ms/step

–config 指定配置文件

–model_path 训练中最好的模型

–image_path 带测试图片目录

–save_dir 输出保存的图片路径

–custom_color 分割自定义颜色,赛题要求的颜色值

OCT层分割结果存储在Layer_Segmentations文件夹中,每个样本的分割结果以png图像格式存储。每个样本对应一个层分割结果图像。分割结果图像命名与输入的待分割OCT图像命名前缀一致。分割图像中,像素值为0代表RNFL区域、像素值为80代表GCIPL区域、像素为160代表脉络膜区域、像素值为255代表其他区域

最终比赛结果在图片在 output/result/pseudo_color_prediction 目录下

六.提交文件格式

目前按照官方格式提交会出现异常,格式如下
在这里插入图片描述

results.zip 文件放置在 work 根目录,仅供参考

在这里插入图片描述

七.总结

通过PaddleSeg可以解决分割任务,本项目采用的配置文件的方式来训练,PaddleSeg还支持采用API方式,具体请参考

优化方向可以通过配置不同的模型(例如 UNet,DeepLab),微调yml配置来提高精度

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐