飞桨学习赛:眼底OCT层分割(GOALS挑战赛任务一)基于PaddleSe
基于PaddleSeg,快速实现OCT层分割任务。 任务score: 8.2752
零.写在最前
该项目源于《飞桨学习赛:眼底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配置来提高精度
此文章为搬运
原项目链接
更多推荐
所有评论(0)