零基础入门语义分割-地表建筑物识别-Task02:数据扩增方法(3天)

本章对语义分割任务中常见的数据扩增方法进行介绍,并使用OpenCV和albumentations两个库完成具体的数据扩增操作。

2 数据扩增方法
本章主要内容为数据扩增方法、OpenCV数据扩增、albumentations数据扩增和Pytorch读取赛题数据四个部分组成。

2.1 学习目标
理解基础的数据扩增方法
学习OpenCV和albumentations完成数据扩增
Pytorch完成赛题读取
2.2 常见的数据扩增方法
数据扩增是一种有效的正则化方法,可以防止模型过拟合,在深度学习模型的训练过程中应用广泛。数据扩增的目的是增加数据集中样本的数据量,同时也可以有效增加样本的语义空间。

需注意:

不同的数据,拥有不同的数据扩增方法;

数据扩增方法需要考虑合理性,不要随意使用;

数据扩增方法需要与具体任何相结合,同时要考虑到标签的变化;

对于图像分类,数据扩增方法可以分为两类:

标签不变的数据扩增方法:数据变换之后图像类别不变;
标签变化的数据扩增方法:数据变换之后图像类别变化;
而对于语义分割而言,常规的数据扩增方法都会改变图像的标签。如水平翻转、垂直翻转、旋转90%、旋转和随机裁剪,这些常见的数据扩增方法都会改变图像的标签,即会导致地标建筑物的像素发生改变。

2.3 OpenCV数据扩增
OpenCV是计算机视觉必备的库,可以很方便的完成数据读取、图像变化、边缘检测和模式识别等任务。为了加深各位对数据可做的影响,这里首先介绍OpenCV完成数据扩增的操作。

首先读取原始图片

img = cv2.imread(train_mask[‘name’].iloc[0])
mask = rle_decode(train_mask[‘mask’].iloc[0])

plt.figure(figsize=(16, 8))
plt.subplot(1, 2, 1)
plt.imshow(img)

plt.subplot(1, 2, 2)
plt.imshow(mask)

垂直翻转

plt.figure(figsize=(16, 8))
plt.subplot(1, 2, 1)
plt.imshow(cv2.flip(img, 0))

plt.subplot(1, 2, 2)
plt.imshow(cv2.flip(mask, 0))

水平翻转

plt.figure(figsize=(16, 8))
plt.subplot(1, 2, 1)
plt.imshow(cv2.flip(img, 1))

plt.subplot(1, 2, 2)
plt.imshow(cv2.flip(mask, 1))

随机裁剪

x, y = np.random.randint(0, 256), np.random.randint(0, 256)

plt.figure(figsize=(16, 8))
plt.subplot(1, 2, 1)
plt.imshow(img[x:x+256, y:y+256])

plt.subplot(1, 2, 2)
plt.imshow(mask[x:x+256, y:y+256])

2.4 albumentations数据扩增
albumentations是基于OpenCV的快速训练数据增强库,拥有非常简单且强大的可以用于多种任务(分割、检测)的接口,易于定制且添加其他框架非常方便。

albumentations也是计算机视觉数据竞赛中最常用的库:

GitHub: https://github.com/albumentations-team/albumentations
示例:https://github.com/albumentations-team/albumentations_examples
与OpenCV相比albumentations具有以下优点:

albumentations支持的操作更多,使用更加方便;
albumentations可以与深度学习框架(Keras或Pytorch)配合使用;
albumentations支持各种任务(图像分流)的数据扩增操作
albumentations它可以对数据集进行逐像素的转换,如模糊、下采样、高斯造点、高斯模糊、动态模糊、RGB转换、随机雾化等;也可以进行空间转换(同时也会对目标进行转换),如裁剪、翻转、随机裁剪等。

import albumentations as A

水平翻转

augments = A.HorizontalFlip(p=1)(image=img, mask=mask)
img_aug, mask_aug = augments[‘image’], augments[‘mask’]

随机裁剪

augments = A.RandomCrop(p=1, height=256, width=256)(image=img, mask=mask)
img_aug, mask_aug = augments[‘image’], augments[‘mask’]

旋转

augments = A.ShiftScaleRotate(p=1)(image=img, mask=mask)
img_aug, mask_aug = augments[‘image’], augments[‘mask’]
albumentations还可以组合多个数据扩增操作得到更加复杂的数据扩增操作:

trfm = A.Compose([
A.Resize(256, 256),
A.HorizontalFlip(p=0.5),
A.VerticalFlip(p=0.5),
A.RandomRotate90(),
])

augments = trfm(image=img, mask=mask)
img_aug, mask_aug = augments[‘image’], augments[‘mask’]
plt.figure(figsize=(16, 8))
plt.subplot(1, 2, 1)
plt.imshow(augments[‘image’])

plt.subplot(1, 2, 2)
plt.imshow(augments[‘mask’])aug

2.5 Pytorch数据读取
由于本次赛题我们使用Pytorch框架讲解具体的解决方案,接下来将是解决赛题的第一步使用Pytorch读取赛题数据。在Pytorch中数据是通过Dataset进行封装,并通过DataLoder进行并行读取。所以我们只需要重载一下数据读取的逻辑就可以完成数据的读取。

Dataset:数据集,对数据进行读取并进行数据扩增;
DataLoder:数据读取器,对Dataset进行封装并进行批量读取;
定义Dataset:

import torch.utils.data as D
class TianChiDataset(D.Dataset):
def init(self, paths, rles, transform):
self.paths = paths
self.rles = rles
self.transform = transform
self.len = len(paths)

def __getitem__(self, index):
    img = cv2.imread(self.paths[index])
    mask = rle_decode(self.rles[index])
    augments = self.transform(image=img, mask=mask)
    return self.as_tensor(augments['image']), augments['mask'][None]

def __len__(self):
    return self.len

实例化Dataset:

trfm = A.Compose([
A.Resize(IMAGE_SIZE, IMAGE_SIZE),
A.HorizontalFlip(p=0.5),
A.VerticalFlip(p=0.5),
A.RandomRotate90(),
])

dataset = TianChiDataset(
train_mask[‘name’].values,
train_mask[‘mask’].fillna(’’).values,
trfm
)
实例化DataLoder,批大小为10:

loader = D.DataLoader(
dataset, batch_size=10, shuffle=True, num_workers=0)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
天池赛事的零基础入门语义分割-地表建筑物识别任务是一个面向初学者的语义分割竞赛。任务的目标是利用机器学习和计算机视觉技术,对卫星图像中的地表建筑物进行标记和识别。 在这个任务中,参赛者需要使用给定的训练数据集进行模型的训练和优化。训练数据集包含了一系列卫星图像和相应的像素级标注,标注了地表建筑物的位置。参赛者需要通过分析训练数据集中的图像和标注信息,来构建一个能够准确地识别地表建筑物的模型。 参赛者需要注意的是,语义分割是指将图像中的每个像素进行分类,使得同一类别的像素具有相同的标签。因此,在地表建筑物识别任务中,参赛者需要将地表建筑物区域与其他区域进行区分,并正确地进行标记。这对于初学者来说可能是一个挑战,因此需要掌握基本的图像处理和机器学习知识。 参赛者可以根据自己的理解,选择合适的算法和模型来完成这个任务。常见的方法包括卷积神经网络(CNN),通过设计适当的网络结构和训练方式,提高模型的准确性和泛化能力。同时,数据预处理和数据强技术也是提高模型性能的关键。参赛者可以通过对数据进行强和充,提高模型的鲁棒性和识别能力。 最后,参赛者需要使用训练好的模型对测试数据集进行预测,并生成预测结果。这些预测结果将用于评估参赛者模型的性能和准确度。评估指标通常包括像素级准确度(Pixel Accuracy)和平均交并比(Mean Intersection over Union),参赛者需要根据这些指标来评估和改进自己的模型。 总之,通过参加这个任务,初学者可以通过实践和挑战来提高自己的图像处理和机器学习技能,并掌握语义分割的基本概念和方法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值