颅内血管分割随笔

这篇博客记录了使用Unet网络进行颅内血管分割的过程。在20套nii格式的三维数据上,通过切片和加窗处理,将数据转换为适合训练的格式。训练中遇到了dice分数始终低位徘徊的问题,最终发现是数据类型转换(float64到float32)导致的。在解决这个问题后,模型在2.0.0版本的TensorFlow上得以正常训练,但未使用数据增强和扩充。后续调整网络结构后,训练集和验证集的表现得到改善。
摘要由CSDN通过智能技术生成

这次分割的颅内血管数据是nii格式的三维数据,由于只有20套,所以打算切片再用简单的unet分割。途中遇到很多问题,简单记录一下~

数据处理

nii格式的文件读取专用库之一:

import nibabel as nib
img = nib.load(filename).get_fdata()

这样就能获取nii文件的三维数据内容了。但是获取到的三维数组内容是0-3000多的CT值,如果保存为png图片则要转换成0-255的uint8格式的数据则需要进行加窗。当选取窗位900,窗宽1200时比较适合。因此所有数据全转换成uint8的png切片。在训练之前将数据归一化,0-255的数据归一化到0-1。

Unet网络

用最简单的unet网络先分割一下:

def get_unet_2(height,width,n_chanel):
    inputs = Input((height, width, n_chanel))

    conv1 = Conv2D(16, 3, activation='relu', padding='same', kernel_initializer='he_normal')(inputs)
    conv1 = Conv2D(16, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv1)
    pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)

    conv2 = Conv2D(32, 3, activation='relu', padding='same', kernel_initializer='he_normal')(pool1)
    conv2 = Conv2D(32, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv2)
    pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)

    conv3 = Conv2D(64, 3, activation='relu', padding='same', kernel_initializer='he_normal')(pool2)
    conv3 = Conv2D(64, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv3)
    pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)

    conv4 = Conv2D(128, 3, activation='relu', padding='same', kernel_initializer='he_normal')(pool3)
    conv4 = Conv2D(128, 3, activation='relu', padding='same', kernel_initializer='he_normal')(conv4)
    drop4 = Dropout(0.5)(conv4)
    pool4 = MaxPooling2D(pool_size=(2, 2))(drop4)

    conv5 = Conv2D(256, 3, activation='relu', padding='same', kernel_initializer='he_normal')(pool4)
    conv5 = Conv2D(
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值