CV实践--语义分割2

数据扩增方法

  • 用途:增加数据集中样本的数据量,同时也可以有效增加样本的语义空间,防止模型过拟合。
  • 注意
    1. 不同的数据,拥有不同的数据扩增方法;
    2. 数据扩增方法需要考虑合理性,不要随意使用;
    3. 数据扩增方法需要与具体任务相结合,同时要考虑到标签的变化。

OpenCV和albumentations数据扩增

OpenCV

  1. 读取图片 cv.imread
# 首先读取原始图片 
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)
  1. 翻转 cv2.flip
# 竖直(上下)翻转 
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, 0))

plt.subplot(1, 2, 2)
plt.imshow(cv2.flip(mask, 0))
  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])

albumentations

  • albumentations 它可以对数据集进行逐像素的转换,如模糊、下采样、高斯造点、高斯模糊、动态模糊、RGB 转换、随机雾化等;也可以进行空间转换(同时也会对目标进行转换),如裁剪、翻转、随机裁剪等。
  1. 水平翻转: albumentations.HorizontalFlip
  2. 随机裁剪:albumentations.Crop
  3. 旋转:albumentations.ShiftScaleRotate
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’]
  1. 组合多个数据扩增操作
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

Pytorch 数据读取

  • 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:
import albumentations as A

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
)
# 实例化DataLoader
loader = D.DataLoader(
	dataset, batch_size=10, shuffle=True,num_workers=0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值