MICCAI2023STS-基于2D全景图像的牙齿分割任务非官方baseline


★★★ 本文源自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/
#最后提交文件即可。

此文章为搬运
原项目链接

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值