在进行深度学习时,数据增强(或者说预处理)通常是模型训练之前的关键步骤。以下是对于医疗图像数据增强时的一点心得。
方法一:
使用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
未完待续。。。