零基础入门语义分割-TASK02数据扩增
参考源: Datawhale
本章对语义分割任务中常见的数据扩增方法进行介绍,并使用OpenCV和albumentations两个库完成具体的数据扩增操作。
本章主要内容为数据扩增方法、OpenCV数据扩增、albumentations数据扩增和Pytorch读取赛题数据四个部分组成。
数据扩增方法
什么是数据扩增
数据扩增(Data Augmentation)是不可少的环节。
1.数据扩增可以增加训练集的样本
2.也可以有效环节模型过拟合的情况
3.可以给模型带来的更强的泛化能力
4.数据扩增可以扩展样本空间,从而丰富样本,给予不同角度、不同状态下的样本用作训练
数据扩增怎么做
数据扩增是对读取进行数据增强的操作,所以需要在数据读取的时候完成。
此外由于数据扩增有一定的随机性,相同的图片经过数据扩增可能得到不同的图片
方法
对于图像分类,数据扩增方法可以分为两类:
标签不变的数据扩增方法:数据变换之后图像类别不变;
标签变化的数据扩增方法:数据变换之后图像类别变化;
而对于语义分割而言,常规的数据扩增方法都会改变图像的标签。如水平翻转、垂直翻转、旋转90%、旋转和随机裁剪,这些常见的数据扩增方法都会改变图像的标签,即会导致地标建筑物的像素发生改变。
OpenCV数据扩增
使用OpenCV完成图像加噪数据扩增;
使用OpenCV完成图像旋转数据扩增;
albumentations数据扩增
albumentations是基于OpenCV的快速训练数据增强库,拥有非常简单且强大的可以用于多种任务(分割、检测)的接口,易于定制且添加其他框架非常方便。
如图下所示的色彩变换效果图(同时也可以进行空间变换,暂不展示了):
对图像分类、语义分割、物体检测和关键点检测都支持,速度较快。
参考源:https://github.com/albumentations-team/albumentations
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
)
loader = D.DataLoader(
dataset, batch_size=10, shuffle=True, num_workers=0)
参考链接: