keras 图像分割 图像增强函数的使用

在使用keras 进行图像分割时,当数据量不大时,我们需要进行图像增加。在keras 中有专门的函数可以进行增强。这里进行简单的介绍一下。

keras 中图像增强的函数是ImageDataGenerator 类

keras.preprocessing.image.ImageDataGenerator(featurewise_center=False,  
                                             samplewise_center=False, 
                                             featurewise_std_normalization=False, 
                                             samplewise_std_normalization=False, 
                                             zca_whitening=False, 
                                             zca_epsilon=1e-06, 
                                             rotation_range=0, 
                                             width_shift_range=0.0, 
                                             height_shift_range=0.0, 
                                             brightness_range=None, 
                                             shear_range=0.0, 
                                             zoom_range=0.0, 
                                             channel_shift_range=0.0, 
                                             fill_mode='nearest', 
                                             cval=0.0, 
                                             horizontal_flip=False, 
                                             vertical_flip=False, 
                                             rescale=None, 
                                             preprocessing_function=None, 
                                             data_format=None, 
                                             validation_split=0.0, 
                                             dtype=None)

通过实时数据增强生成张量图像数据批次。数据将不断循环(按批次)。这里如果是其他的问题我们可以直接使用这个函数来进行增强很方便。但是在进行图像分割时需要一个问题,那就是有data 和 label 两类。你需要同时对这个数据进行处理。比如旋转什么的。因此在这里简单的介绍一下。

IMAGE_LIB = '../input/2d_images/'
MASK_LIB = '../input/2d_masks/'
SEED=42
all_images = [x for x in sorted(os.listdir(IMAGE_LIB)) if x[-4:] == '.tif']

x_data = np.empty((len(all_images), IMG_HEIGHT, IMG_WIDTH), dtype='float32')
for i, name in enumerate(all_images):
    im = cv2.imread(IMAGE_LIB + name, cv2.IMREAD_UNCHANGED).astype("int16").astype('float32')
    #im = cv2.resize(im, dsize=(IMG_WIDTH, IMG_HEIGHT), interpolation=cv2.INTER_LANCZOS4)
    im = (im - np.min(im)) / (np.max(im) - np.min(im))
    x_data[i] = im

y_data = np.empty((len(all_images), IMG_HEIGHT, IMG_WIDTH), dtype='float32')
for i, name in enumerate(all_images):
    im = cv2.imread(MASK_LIB + name, cv2.IMREAD_UNCHANGED).astype('float32')/255.
    #im = cv2.resize(im, dsize=(IMG_WIDTH, IMG_HEIGHT), interpolation=cv2.INTER_NEAREST)
    y_data[i] = im

这样就把数据读入进去了也进行简单的处理。当然你可以看一下这个数据是什么样。

fig, ax = plt.subplots(1,2, figsize = (8,4))
ax[0].imshow(x_data[0], cmap='gray')
ax[1].imshow(y_data[0], cmap='gray')
plt.show()

下面进行数据的增强

def my_generator(x_train, y_train, batch_size):
    data_generator = ImageDataGenerator(
            width_shift_range=0.1,
            height_shift_range=0.1,
            rotation_range=10,
            zoom_range=0.1).flow(x_train, x_train, batch_size, seed=SEED)
    mask_generator = ImageDataGenerator(
            width_shift_range=0.1,
            height_shift_range=0.1,
            rotation_range=10,
            zoom_range=0.1).flow(y_train, y_train, batch_size, seed=SEED)
    while True:
        x_batch, _ = data_generator.next()
        y_batch, _ = mask_generator.next()
        yield x_batch, y_batch

当然这里具体的增强方法,你可以参考上面的函数,具体的添加一下方法。

当然你也可以具体看一下是什么样。

image_batch, mask_batch = next(my_generator(x_train, y_train, 8))
fix, ax = plt.subplots(8,2, figsize=(8,20))
for i in range(8):
    ax[i,0].imshow(image_batch[i,:,:,0])
    ax[i,1].imshow(mask_batch[i,:,:,0])
plt.show()

最后在keras中呢整个网络设计好了以后。可以直接调用

hist = model.fit_generator(my_generator(x_train, y_train, 8),
                           steps_per_epoch = 200,
                           validation_data = (x_val, y_val),
                           epochs=10, verbose=2,
                           callbacks = [weight_saver, annealer])

这样就可以调用了。这里的一些具体的参数。你可以按照自己的要求进行设置。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在PyTorch图像分割中,常用的损失函数是二进制交叉熵(BCE)和Dice损失。二进制交叉熵损失函数在分割和其他分类任务中被默认选择。它通过计算预测值和真实标签之间的差异来衡量模型的性能。而Dice损失函数是一种常用的评估分割模型性能的指标,它衡量预测结果和真实标签之间的相似度。 此外,还有一些改进的损失函数被用于处理多类分割任务。例如,组合损失函数是Dice损失和修正的BCE函数的组合,它可以处理输入和输出不平衡的情况。这个损失函数在处理多器官分割时特别有用。另外,Focal损失函数是一种用于对抗极端不平衡数据集的方法,它通过引入一个额外的常数来惩罚假阳性或假阴性。 在PyTorch中,这些损失函数可以通过相应的模型库的后端函数来实现,这些函数包含了用于反向传播算法的梯度计算。你可以根据具体的任务需求选择合适的损失函数,并将其作为模型训练的目标函数。 总结起来,PyTorch图像分割中常用的损失函数包括二进制交叉熵(BCE)、Dice损失、组合损失和Focal损失。这些损失函数的选择取决于具体的任务和数据集特点。 #### 引用[.reference_title] - *1* [基于PyTorch的损失函数(语义分割)](https://blog.csdn.net/weixin_42990464/article/details/104260043)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [医学图象分割常用损失函数(附Pytorch和Keras代码)](https://blog.csdn.net/qq_44864833/article/details/129065009)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值