【天池赛事】零基础入门语义分割-地表建筑物识别 Task2:数据扩增方法
【天池賽事】零基礎入門語義分割-地表建筑物識別
-
Task1:賽題理解與 baseline(3 天)
– 學習主題:理解賽題內容解題流程
– 學習內容:賽題理解、數據讀取、比賽 baseline 構建
– 學習成果:比賽 baseline 提交 -
Task2:數據擴增方法(3 天)
– 學習主題:語義分割任務中數據擴增方法
– 學習內容:掌握語義分割任務中數據擴增方法的細節和使用
– 學習成果:數據擴增方法的實踐 -
Task3:網絡模型結構發展(3 天)
– 學習主題:掌握語義分割模型的發展脈絡
– 學習內容: FCN、 Unet、 DeepLab、 SegNet、 PSPNet
– 學習成果:多種網絡模型的搭建 -
Task4:評價函數與損失函數(3 天)
– 學習主題:語義分割模型各種評價函數與損失函數
– 學習內容: Dice、 IoU、 BCE、 Focal Loss、 Lovász-Softmax
– 學習成果:評價/損失函數的實踐 -
Task5:模型訓練與驗證(3 天)
– 學習主題:數據劃分方法
– 學習內容:三種數據劃分方法、模型調參過程
– 學習成果:數據劃分具體操作 -
Task6:分割模型模型集成(3 天)
– 學習主題:語義分割模型集成方法
– 學習內容: LookaHead、 SnapShot、 SWA、 TTA
– 學習成果:模型集成思路
Task2:數據擴增方法
- 1 學習目標
- 2 常見的數據增廣方法
- 3 OpenCV數據增廣
- 4 數據增廣
- 5 PyTorch數據讀取
- 6 小結
本章對語義分割任務中常見的數據擴增方法進行介紹,并使用 OpenCV 和 albumentations 兩個庫完成具體的數據擴增操作。主要內容為數據擴增方法、 OpenCV 數據擴增、 albumentations 數據擴增和 Pytorch 讀取賽題數據四個部分組成。
1 學習目標
? 理解基礎的數據擴增方法
? 學習 OpenCV 和 albumentations 完成數據擴增
? Pytorch 完成賽題讀取
2 常見的數據增廣方法
數據擴增是一種有效的正則化方法,可以防止模型過擬合,在深度學習模型的訓練過程中應用廣泛。數據擴增的目的是增加數據集中樣本的數據量,同時也可以有效增加樣本的語義空間。
需注意:
對于圖像分類,數據擴增方法可以分為兩類:
而對于語義分割而言,常規的數據擴增方法都會改變圖像的標簽。如Vertical Flip(垂直翻轉),Horizontal Flip(水平翻轉),Random Rotate 90(隨機旋轉90度),Transpose(轉置),Shift Scale Rotate(移位刻度旋轉),Random Size Crop(隨機剪裁)。
3 OpenCV數據增廣
OpenCV 是計算機視覺必備的庫,可以很方便的完成數據讀取、圖像變化、邊緣檢測和模式識別等任務,這里首先介紹 OpenCV 完成數據擴增的操作。
import numpy as np import pandas as pd import pathlib, sys, os, random, time import numba, cv2, gc from tqdm import tqdm_notebookimport matplotlib.pyplot as plt %matplotlib inlineimport warnings warnings.filterwarnings('ignore')from tqdm.notebook import tqdmimport albumentations as Aimport rasterio from rasterio.windows import Windowdef rle_encode(im):'''im: numpy array, 1 - mask, 0 - backgroundReturns run length as string formated'''pixels = im.flatten(order = 'F')pixels = np.concatenate([[0], pixels, [0]])runs = np.where(pixels[1:] != pixels[:-1])[0] + 1runs[1::2] -= runs[::2]return ' '.join(str(x) for x in runs)def rle_decode(mask_rle, shape=(512, 512)):'''mask_rle: run-length as string formated (start length)shape: (height,width) of array to return Returns numpy array, 1 - mask, 0 - background'''s = mask_rle.split()starts, lengths = [np.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])]starts -= 1ends = starts + lengthsimg = np.zeros(shape[0]*shape[1], dtype=np.uint8)for lo, hi in zip(starts, ends):img[lo:hi] = 1return img.reshape(shape, order='F') train_mask = pd.read_csv('data/train_mask.csv',sep='\t',names=['name','mask']) train_mask['name'] = train_mask['name'].apply(lambda x: 'data/train/' + x) # 讀取原始圖片 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,cmap='gray') plt.savefig('aug-1.png') # 垂直翻轉 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),cmap='gray') # 隨機裁剪 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],cmap='gray')4 數據增廣
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 轉換、隨機霧化等;也可以進行空間轉換(同時也會對目標進行轉換),如裁剪、翻轉、隨機裁剪等。
def show_img_mask(img,mask):plt.figure(figsize=(16,8))plt.subplot(1,2,1)plt.imshow(img)plt.subplot(1,2,2)plt.imshow(mask,cmap='gray')plt.show() import albumentations as A# 水平翻轉 augments = A.HorizontalFlip(p=1)(image=img, mask=mask) img_aug, mask_aug = augments['image'], augments['mask'] show_img_mask(img_aug, mask_aug) # 隨機裁剪 augments = A.RandomCrop(p=1, height=256, width=256)(image=img, mask=mask) img_aug, mask_aug = augments['image'], augments['mask'] show_img_mask(img_aug, mask_aug) # 旋轉 augments = A.ShiftScaleRotate(p=1)(image=img, mask=mask) img_aug, mask_aug = augments['image'], augments['mask'] show_img_mask(img_aug, mask_aug)
albumentations 還可以組合多個數據擴增操作得到更加復雜的數據擴增操作:
5 PyTorch數據讀取
由于本次賽題我們使用 Pytorch 框架講解具體的解決方案,接下來將是解決賽題的第一步使用 Pytorch 讀取賽題數據。在 Pytorch 中數據是通過 Dataset 進行封裝,并通過 DataLoder 進行并行讀取。所以我們只需要重載一下數據讀取的邏輯就可以完成數據的讀取。
- Dataset:數據集,對數據進行讀取并進行數據擴增;
- DataLoder:數據讀取器,對 Dataset 進行封裝并進行批量讀取;
torch.Size([10, 3, 512, 512])
torch.Size([10, 1, 512, 512])
6 小結
本章對數據擴增方法進行簡單介紹,并介紹并完成 OpenCV 數據擴增、 albumentations 數據擴增和Pytorch 讀取賽題數據的具體操作。
總結
以上是生活随笔為你收集整理的【天池赛事】零基础入门语义分割-地表建筑物识别 Task2:数据扩增方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rsync错误
- 下一篇: Java动态代理的两种实现方法:JDK动