日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【天池赛事】零基础入门语义分割-地表建筑物识别 Task2:数据扩增方法

發布時間:2024/10/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【天池赛事】零基础入门语义分割-地表建筑物识别 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 還可以組合多個數據擴增操作得到更加復雜的數據擴增操作:

    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'] show_img_mask(img_aug, mask_aug)

    5 PyTorch數據讀取

    由于本次賽題我們使用 Pytorch 框架講解具體的解決方案,接下來將是解決賽題的第一步使用 Pytorch 讀取賽題數據。在 Pytorch 中數據是通過 Dataset 進行封裝,并通過 DataLoder 進行并行讀取。所以我們只需要重載一下數據讀取的邏輯就可以完成數據的讀取。

    • Dataset:數據集,對數據進行讀取并進行數據擴增;
    • DataLoder:數據讀取器,對 Dataset 進行封裝并進行批量讀取;
    import torch.utils.data as D import torchvision.transforms as TIMAGE_SIZE = 512class TianChiDataset(D.Dataset):def __init__(self, paths, rles, transform, test_mode=False):self.paths = pathsself.rles = rlesself.transform = transformself.len = len(paths)self.test_mode = test_modeself.as_tensor = T.Compose([T.ToPILImage(),T.Resize(IMAGE_SIZE),T.ToTensor(),T.Normalize([0.625,0.448,0.688], [0.131,0.177,0.101]),])# get data operationdef __getitem__(self, index):img = cv2.imread(self.paths[index])if not self.test_mode:mask = rle_decode(self.rles[index])augments = self.transform(image=img, mask=mask)return self.as_tensor(augments['image']), augments['mask'][None]else:return self.as_tensor(img), ''def __len__(self):'''Total number of samples in the dataset'''return self.len 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, False ) loader = D.DataLoader(dataset, batch_size=10, shuffle=True, num_workers=0 ) for batch_id, data in enumerate(loader):image, target = dataprint(image.shape)print(target.shape)break

    torch.Size([10, 3, 512, 512])
    torch.Size([10, 1, 512, 512])

    6 小結

    本章對數據擴增方法進行簡單介紹,并介紹并完成 OpenCV 數據擴增、 albumentations 數據擴增和Pytorch 讀取賽題數據的具體操作。

    總結

    以上是生活随笔為你收集整理的【天池赛事】零基础入门语义分割-地表建筑物识别 Task2:数据扩增方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。