医疗图像的数据增强心得

在进行深度学习时,数据增强(或者说预处理)通常是模型训练之前的关键步骤。以下是对于医疗图像数据增强时的一点心得。

方法一:

使用numpy的包来完成图像的翻转,切割,增加噪声的操作。(高斯噪声和椒盐噪声用skimage包来实现)

import numpy as np
import skimage
def horiz_flip(imgs, segs, dice):
    Fate = random.randint(1, 100)
    if dice>=Fate:
        imgs = np.flip(imgs, 1) # Flip horizontally
        segs = np.flip(segs, 1)
        # res2 = np.flip(img, 0)  # Flip vertically
        # res3 = np.flip(img, -1) # Flip horizontally and vertically
        return imgs, segs
    else: return imgs, segs
 
def add_noise(img):
    Fate = random.randint(1,100)
    if Fate <= 40:
        return img
    elif Fate<=70:
        "Gaussian noise"
        img = skimage.util.random_noise(img, mode='gaussian', var=0.02)
        return img
    else:
        "salt noise"
        img = skimage.util.random_noise(img, mode='s&p')
        return img

def random_crop(image, seg, crop_shape, padding=None):
    oshape = np.shape(image)
 
    if padding:
        oshape = (oshape[0] + 2 * padding, oshape[1] + 2 * padding)
        npad = ((padding, padding), (padding, padding),(0, 0))
        npad_seg = ((padding, padding), (padding, padding))
        print(oshape)
        print(npad)
        image_pad = np.lib.pad(image, pad_width=npad, mode='constant', constant_values=0)
        seg_pad = np.lib.pad(seg, pad_width=npad_seg, mode='constant', constant_values=0)
 
        nh = random.randint(0, oshape[0] - crop_shape[0])
        nw = random.randint(0, oshape[1] - crop_shape[1])
 
        image_crop = image_pad[nh:nh + crop_shape[0], nw:nw + crop_shape[1]]
        seg_crop = seg_pad[nh:nh + crop_shape[0], nw:nw + crop_shape[1]]
        return image_crop, seg_crop
    else:
        print("WARNING!!! nothing to do!!!")
        return image

方法2:

使用albumentations包来实现,这个package是我最近才发现的package。这个包的功能非常强大,可以实现更多增强效果。

from albumentations import *
def SSR(img, seg):
    """非破坏性转换"""
    img = Compose([
    # # 随机裁剪
    RandomSizedCrop(min_max_height=(224, 224), height=224, width=224, interpolation=cv2.INTER_NEAREST, p=1),

    # 非破坏性转换
    VerticalFlip(p=1), # 随机垂直翻转
    RandomRotate90(p=1), # 随机旋转90度
    # 非刚体转换
    OneOf([
        ElasticTransform(p=0.5, interpolation=cv2.INTER_NEAREST), # 弹性变换
        GridDistortion(p=1, interpolation=cv2.INTER_NEAREST), # 网格畸变
        OpticalDistortion(p=1, distort_limit=2, shift_limit=0.5, interpolation=cv2.INTER_NEAREST) # 光学畸变
        ], p=0.8),
    # 非空间性转换
    RandomBrightnessContrast(p=0.5), # 随机改变亮度对比度
    ])(image=img, mask=seg)
    return img

我认为这其中的光学畸变是一个很好的增强方式,X光的图片在诊断的时候就可能出现类似改变,因此可能这个操作比较合理,之后有机会也会详细讲。但是这样的变换对模型的影响也比较大,建议仅仅加入少量这样的数据。

方法三:

使用opencv的包来完成以上变换,opencv也是一个非常常用的包。

import cv2

未完待续。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值