【天池赛事】零基础入门语义分割-地表建筑物识别 Task2:数据扩增方法
【天池賽事】零基礎(chǔ)入門語義分割-地表建筑物識別
-
Task1:賽題理解與 baseline(3 天)
– 學(xué)習(xí)主題:理解賽題內(nèi)容解題流程
– 學(xué)習(xí)內(nèi)容:賽題理解、數(shù)據(jù)讀取、比賽 baseline 構(gòu)建
– 學(xué)習(xí)成果:比賽 baseline 提交 -
Task2:數(shù)據(jù)擴(kuò)增方法(3 天)
– 學(xué)習(xí)主題:語義分割任務(wù)中數(shù)據(jù)擴(kuò)增方法
– 學(xué)習(xí)內(nèi)容:掌握語義分割任務(wù)中數(shù)據(jù)擴(kuò)增方法的細(xì)節(jié)和使用
– 學(xué)習(xí)成果:數(shù)據(jù)擴(kuò)增方法的實(shí)踐 -
Task3:網(wǎng)絡(luò)模型結(jié)構(gòu)發(fā)展(3 天)
– 學(xué)習(xí)主題:掌握語義分割模型的發(fā)展脈絡(luò)
– 學(xué)習(xí)內(nèi)容: FCN、 Unet、 DeepLab、 SegNet、 PSPNet
– 學(xué)習(xí)成果:多種網(wǎng)絡(luò)模型的搭建 -
Task4:評價(jià)函數(shù)與損失函數(shù)(3 天)
– 學(xué)習(xí)主題:語義分割模型各種評價(jià)函數(shù)與損失函數(shù)
– 學(xué)習(xí)內(nèi)容: Dice、 IoU、 BCE、 Focal Loss、 Lovász-Softmax
– 學(xué)習(xí)成果:評價(jià)/損失函數(shù)的實(shí)踐 -
Task5:模型訓(xùn)練與驗(yàn)證(3 天)
– 學(xué)習(xí)主題:數(shù)據(jù)劃分方法
– 學(xué)習(xí)內(nèi)容:三種數(shù)據(jù)劃分方法、模型調(diào)參過程
– 學(xué)習(xí)成果:數(shù)據(jù)劃分具體操作 -
Task6:分割模型模型集成(3 天)
– 學(xué)習(xí)主題:語義分割模型集成方法
– 學(xué)習(xí)內(nèi)容: LookaHead、 SnapShot、 SWA、 TTA
– 學(xué)習(xí)成果:模型集成思路
Task2:數(shù)據(jù)擴(kuò)增方法
- 1 學(xué)習(xí)目標(biāo)
- 2 常見的數(shù)據(jù)增廣方法
- 3 OpenCV數(shù)據(jù)增廣
- 4 數(shù)據(jù)增廣
- 5 PyTorch數(shù)據(jù)讀取
- 6 小結(jié)
本章對語義分割任務(wù)中常見的數(shù)據(jù)擴(kuò)增方法進(jìn)行介紹,并使用 OpenCV 和 albumentations 兩個(gè)庫完成具體的數(shù)據(jù)擴(kuò)增操作。主要內(nèi)容為數(shù)據(jù)擴(kuò)增方法、 OpenCV 數(shù)據(jù)擴(kuò)增、 albumentations 數(shù)據(jù)擴(kuò)增和 Pytorch 讀取賽題數(shù)據(jù)四個(gè)部分組成。
1 學(xué)習(xí)目標(biāo)
? 理解基礎(chǔ)的數(shù)據(jù)擴(kuò)增方法
? 學(xué)習(xí) OpenCV 和 albumentations 完成數(shù)據(jù)擴(kuò)增
? Pytorch 完成賽題讀取
2 常見的數(shù)據(jù)增廣方法
數(shù)據(jù)擴(kuò)增是一種有效的正則化方法,可以防止模型過擬合,在深度學(xué)習(xí)模型的訓(xùn)練過程中應(yīng)用廣泛。數(shù)據(jù)擴(kuò)增的目的是增加數(shù)據(jù)集中樣本的數(shù)據(jù)量,同時(shí)也可以有效增加樣本的語義空間。
需注意:
對于圖像分類,數(shù)據(jù)擴(kuò)增方法可以分為兩類:
而對于語義分割而言,常規(guī)的數(shù)據(jù)擴(kuò)增方法都會改變圖像的標(biāo)簽。如Vertical Flip(垂直翻轉(zhuǎn)),Horizontal Flip(水平翻轉(zhuǎn)),Random Rotate 90(隨機(jī)旋轉(zhuǎn)90度),Transpose(轉(zhuǎn)置),Shift Scale Rotate(移位刻度旋轉(zhuǎn)),Random Size Crop(隨機(jī)剪裁)。
3 OpenCV數(shù)據(jù)增廣
OpenCV 是計(jì)算機(jī)視覺必備的庫,可以很方便的完成數(shù)據(jù)讀取、圖像變化、邊緣檢測和模式識別等任務(wù),這里首先介紹 OpenCV 完成數(shù)據(jù)擴(kuò)增的操作。
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') # 垂直翻轉(zhuǎn) 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') # 隨機(jī)裁剪 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 數(shù)據(jù)增廣
albumentations 是基于 OpenCV 的快速訓(xùn)練數(shù)據(jù)增強(qiáng)庫,擁有非常簡單且強(qiáng)大的可以用于多種任務(wù)(分割、檢測)的接口,易于定制且添加其他框架非常方便。
albumentations 也是計(jì)算機(jī)視覺數(shù)據(jù)競賽中最常用的庫:
GitHub: https://github.com/albumentations-team/albumentations
示例: https://github.com/albumentations-team/albumentations_examples
與 OpenCV 相比 albumentations 具有以下優(yōu)點(diǎn):
? albumentations 支持的操作更多,使用更加方便;
? albumentations 可以與深度學(xué)習(xí)框架(Keras 或 Pytorch)配合使用;
? albumentations 支持各種任務(wù)(圖像分流)的數(shù)據(jù)擴(kuò)增操作
albumentations 它可以對數(shù)據(jù)集進(jìn)行逐像素的轉(zhuǎn)換,如模糊、下采樣、高斯造點(diǎn)、高斯模糊、動態(tài)模糊、 RGB 轉(zhuǎn)換、隨機(jī)霧化等;也可以進(jìn)行空間轉(zhuǎn)換(同時(shí)也會對目標(biāo)進(jìn)行轉(zhuǎn)換),如裁剪、翻轉(zhuǎn)、隨機(jī)裁剪等。
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# 水平翻轉(zhuǎn) augments = A.HorizontalFlip(p=1)(image=img, mask=mask) img_aug, mask_aug = augments['image'], augments['mask'] show_img_mask(img_aug, mask_aug) # 隨機(jī)裁剪 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) # 旋轉(zhuǎn) 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 還可以組合多個(gè)數(shù)據(jù)擴(kuò)增操作得到更加復(fù)雜的數(shù)據(jù)擴(kuò)增操作:
5 PyTorch數(shù)據(jù)讀取
由于本次賽題我們使用 Pytorch 框架講解具體的解決方案,接下來將是解決賽題的第一步使用 Pytorch 讀取賽題數(shù)據(jù)。在 Pytorch 中數(shù)據(jù)是通過 Dataset 進(jìn)行封裝,并通過 DataLoder 進(jìn)行并行讀取。所以我們只需要重載一下數(shù)據(jù)讀取的邏輯就可以完成數(shù)據(jù)的讀取。
- Dataset:數(shù)據(jù)集,對數(shù)據(jù)進(jìn)行讀取并進(jìn)行數(shù)據(jù)擴(kuò)增;
- DataLoder:數(shù)據(jù)讀取器,對 Dataset 進(jìn)行封裝并進(jìn)行批量讀取;
torch.Size([10, 3, 512, 512])
torch.Size([10, 1, 512, 512])
6 小結(jié)
本章對數(shù)據(jù)擴(kuò)增方法進(jìn)行簡單介紹,并介紹并完成 OpenCV 數(shù)據(jù)擴(kuò)增、 albumentations 數(shù)據(jù)擴(kuò)增和Pytorch 讀取賽題數(shù)據(jù)的具體操作。
總結(jié)
以上是生活随笔為你收集整理的【天池赛事】零基础入门语义分割-地表建筑物识别 Task2:数据扩增方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rsync错误
- 下一篇: CodeForces - 748F Sa