★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>
赛题介绍
目前,随着计算机辅助设计(CAD)技术的发展,以及受到经济水平的提升和人口老龄化趋势等诸多因素的影响,牙科的发展正呈现与日俱增的重要性和迫切性。为此,我们突破了制作数据集存在种种限制,公开了首例集合3000多张标记的牙齿全景图像,旨在使研究人员能够使用深度学习方法准确分割牙齿区域。基于此数据集,杭州电子科技大学、浙江传媒学院联合杭州牙科集团、杭州钱塘牙科共同举办MICCAI 2023半监督牙齿分割挑战赛,诚邀各方学者广泛参与,为推动牙齿分割算法的发展集思广益,从而找到稳健的基于半监督的牙齿分割方法,以促进基于CAD的牙科的发展。
数据集与标签文件
一.环境搭建
import numpy as np
import cv2
import matplotlib.pyplot as plt
import os
# 切换到工作目录
%cd /home/aistudio/work
# 解压下载好的PaddleSeg
!unzip PaddleSeg.zip
!mv PaddleSeg /home/aistudio
# 安装PaddleSeg依赖
%cd PaddleSeg
!pip install -r requirements.txt
!rm -rf /home/aistudio/PaddleSeg/data/mine/*
#解压数据集
%cd /home/aistudio/data/data221837
!unzip -o train.zip
!unzip -o image.zip
! mv train/image /home/aistudio/PaddleSeg/data/mine/
! mv train/mask /home/aistudio/PaddleSeg/data/mine/
! mv image /home/aistudio/PaddleSeg/data/mine/Test
初赛训练数据集简介
train数据集包含2000张图片以及2000个标签图
# file_name=os.listdir('/home/aistudio/PaddleSeg/data/mine/image')
# image = cv2.imread('/home/aistudio/PaddleSeg/data/mine/mask/A-104.png')
#处理Mask
!mkdir /home/aistudio/PaddleSeg/data/mine/Image_Label
class Pre(object):
def __init__(self):
self.dataPath = '/home/aistudio/PaddleSeg/data/mine/'
self.testPath='/home/aistudio/PaddleSeg/output/result/pseudo_color_prediction/'
def run(self):
# 生成train.txt和valid.txt
trainFile = open(self.dataPath + 'train.txt', 'w')
vaildFile = open(self.dataPath + 'valid.txt', 'w')
file_name=os.listdir('/home/aistudio/PaddleSeg/data/mine/image')
i=0
for name in file_name:
if i <= 1800:
trainFile.write('image/'+name+' Image_Label/'+name)
trainFile.write('\n')
else:
vaildFile.write('image/'+name+' Image_Label/'+name)
vaildFile.write('\n')
# 将标签图片转为标准标准图片
#image = cv2.imread(self.dataPath+'Layer_Masks/'+name+'.png')
print(name)
image = cv2.imread(self.dataPath+'mask/'+name)
# 像素值为0的是RNFL(类别 0)
# 像素值为80的是GCIPL(类别 1)
image[image == 0] = 0
image[image > 0] = 1
image = image[:,:,1]
cv2.imwrite(self.dataPath+'Image_Label/'+name, image)
i=i+1
def run_test(self):
file_name=os.listdir(self.testPath)
for name in file_name:
# 将标签图片转为标准标准图片
#image = cv2.imread(self.dataPath+'Layer_Masks/'+name+'.png')
print(name)
image = cv2.imread(self.testPath+name)
image[image == 0] = 0
image[image > 0] = 1
image = image[:,:,1]
cv2.imwrite(self.testPath+'../'+'infers/'+name, image)
pre = Pre()
pre.run()
三.训练
模型
模型使用了早期的网络U-net。刚刚发现了官方baseline用的也是U net。这另一方面说明了图像类任务主要是预处理和后处理,比赛而言模型大部分时候不会改。
- 医学图像的语义较为简单,每一个部分都是人的很小一部分。不同的器官也会用不同的器械。器官本身结构固定,所以对于一个语义分割任务只有那么几类,不像是自动驾驶,室外场景会碰到各种不同的类别。进而高级语义信息和底层特征都很重要。这样就是U net的特点,高层特征和底层特征融合,这样网络兼顾两者。
- 数据量少。本数据只有100张图片,模型参数不宜多。
U net的结构如下图,是一个U型的结果。左右是encoder,包含若干的卷积、降采样层。右方是decoder上采样,同时会把左面的特征进行拼接。右侧反卷集,最后恢复到图像原始形状。
配置文件我已放到家目录下面,后面直接复制到对应路径,覆盖掉原始的配置文件。
首先是改了cityscapes,用于读取数据。
batch_size: 4
iters: 2000
train_dataset:
type: Dataset
dataset_root: data/mine
train_path: data/mine/train.txt
transforms:
- type: ResizeStepScaling
min_scale_factor: 0.5
max_scale_factor: 2.0
scale_step_size: 0.25
- type: RandomPaddingCrop
crop_size: [1024, 512]
- type: RandomHorizontalFlip
- type: RandomDistort
brightness_range: 0.4
contrast_range: 0.4
saturation_range: 0.4
- type: Normalize
num_classes: 4
mode: train
val_dataset:
type: Dataset
dataset_root: data/mine
val_path: data/mine/valid.txt
transforms:
- type: Normalize
num_classes: 4
mode: val
optimizer:
type: sgd
momentum: 0.9
weight_decay: 4.0e-5
lr_scheduler:
type: PolynomialDecay
learning_rate: 0.01
end_lr: 0
power: 0.9
loss:
types:
- type: CrossEntropyLoss
coef: [1]
然后是修改了适配的模型yml
_base_: '../_base_/cityscapes.yml'
batch_size: 4
iters: 2000
model:
type: UNet
num_classes: 4
use_deconv: False
pretrained: Null
!cp /home/aistudio/unet_cityscapes_1024x512_160k.yml /home/aistudio/PaddleSeg/configs/unet
!cp /home/aistudio/cityscapes.yml /home/aistudio/PaddleSeg/configs/_base_
%cd /home/aistudio/PaddleSeg/
!export CUDA_VISIBLE_DEVICES=0 # 设置1张可用的卡
!python train.py \
--config configs/unet/unet_cityscapes_1024x512_160k.yml \
--save_interval 500 \
--do_eval \
--use_vdl \
--save_dir output
# !python train.py \
# --config configs/unet_3plus/unet_3plus_cityscapes_1024x512_160k.yml \
# --save_interval 500 \
# --do_eval \
# --use_vdl \
# --save_dir output
# !python train.py \
# --config configs/unet_plusplus/unet_plusplus_cityscapes_1024x512_160k.yml \
# --save_interval 500 \
# --do_eval \
# --use_vdl \
# --save_dir output
四.评估
!python val.py \
--config configs/unet/unet_cityscapes_1024x512_160k.yml \
--model_path output/best_model/model.pdparams
五.A榜图片
!python predict.py \
--config configs/unet/unet_cityscapes_1024x512_160k.yml \
--model_path output/best_model/model.pdparams \
--image_path data/mine/Test \
--save_dir output/result \
--custom_color 0 0 0 1 1 1
六.提交比赛结果
pre.run_test()
!mkdir /home/aistudio/PaddleSeg/output/result/infers
# !rm -rf /home/aistudio/PaddleSeg/output/result/added_prediction
# !mv /home/aistudio/PaddleSeg/output/result/pseudo_color_prediction/* /home/aistudio/PaddleSeg/output/result/infers
%cd /home/aistudio/PaddleSeg/output/result/
!rm -rf infers/.ip*
!zip -r infers.zip infers
#!zip -r result.zip /home/aistudio/PaddleSeg/output/result/
#最后提交文件即可。
此文章为搬运
原项目链接