<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Albumentations概述:用于圖像數(shù)據(jù)增強(qiáng)的開源庫

          共 11735字,需瀏覽 24分鐘

           ·

          2021-11-14 21:30

          點(diǎn)擊下方卡片,關(guān)注“新機(jī)器視覺”公眾號(hào)

          視覺/圖像重磅干貨,第一時(shí)間送達(dá)

          作者:磐懟懟
          來源:深度學(xué)習(xí)與計(jì)算機(jī)視覺
          原生PyTorch和TensorFlow增強(qiáng)器有一個(gè)很大的缺點(diǎn)——它們不能同時(shí)增強(qiáng)圖像及其掩碼、邊界框或關(guān)鍵點(diǎn)位置。所以有兩種選擇——要么自己編寫函數(shù),要么使用第三方庫。我兩個(gè)都試過了,第二個(gè)選擇更好.

          為什么是Albumentations?

          Albumentations是我嘗試的第一個(gè)庫,我堅(jiān)持使用它,因?yàn)椋?/span>
          • 它是開源的,
          • 簡單
          • 快速
          • 擁有60多種不同的增強(qiáng)
          • 有案例
          • 而且,最重要的是,可以同時(shí)增強(qiáng)圖像及其掩碼,邊界框或關(guān)鍵點(diǎn)位置。
          還有兩個(gè)類似的庫——imgauge和Augmentor。不幸的是,我無法提供任何比較,因?yàn)槲疫€沒有嘗試過。到目前為止,Albumentations的數(shù)量已經(jīng)足夠了。

          簡短教程

          在這個(gè)簡短的教程中,我將演示如何為分割和對(duì)象檢測任務(wù)增強(qiáng)圖像—只需幾行代碼即可輕松完成。
          如果你想學(xué)習(xí)本教程:
          1. 安裝Albumentations。我真的建議你檢查一下是否有最新的版本,因?yàn)榕f的版本可能有問題。我使用的是“1.0.0”版本,它運(yùn)行良好。
          2. 下載下面帶有標(biāo)簽的測試圖像。這只是來自COCO數(shù)據(jù)集的隨機(jī)圖像。我對(duì)它做了一些修改,并以Albumentations要求的格式存儲(chǔ)了它。
          在這里下載:https://notrocketscience.blog/wp-content/uploads/2021/07/image_data.pickle.zip
          讓我們加載圖像、其二進(jìn)制像素分割掩碼和邊界框。邊界框定義為4元素列表-[x_min,y_min,width,height]。
          import pickle 
          import numpy as np 
          import matplotlib.pyplot as plt 
          import matplotlib.patches as patches

          # 加載數(shù)據(jù)
          with open("image_data.pickle""rb"as handle:
              image_data = pickle.load(handle)
              
          image = image_data["image"]
          mask = image_data["mask"]
          bbox = image_data["bbox_coco"]

          # 可視化數(shù)據(jù)
          fig, ax = plt.subplots(12, figsize=(125))
          ax[0].imshow(image)
          ax[0].set_title("Image")
          ax[1].imshow(image)
          bbox_rect = patches.Rectangle(
              bbox[:2], bbox[2], bbox[3], linewidth=2, edgecolor="r", facecolor="none"
          )
          ax[1].add_patch(bbox_rect)
          ax[1].imshow(mask, alpha=0.3, cmap="gray_r")
          ax[1].set_title("Image + BBox + Mask")
          plt.show()
          加載并可視化圖像后,你應(yīng)獲得以下信息:
          現(xiàn)在我們可以從Albumentations開始。這里的轉(zhuǎn)換定義非常類似于PyTorch和TensorFlow(Keras API):
          • 通過使用Compose對(duì)象組合多個(gè)增強(qiáng)來定義轉(zhuǎn)換。
          • 每個(gè)增強(qiáng)都有參數(shù)“p”,即要應(yīng)用的概率,另外還有增廣特定的參數(shù),如RandomCrop的“width”和“height”。
          • 使用定義的變換作為函數(shù)來增強(qiáng)圖像及其掩碼。此函數(shù)返回一個(gè)帶有鍵--“image”和“mask”的字典。
          下面是關(guān)于如何使用隨機(jī)256×256裁剪(始終)和水平翻轉(zhuǎn)(僅在50%的情況下)增強(qiáng)圖像(及其掩碼)的代碼。
          import albumentations as A

          # 定義增強(qiáng)
          transform = A.Compose([
              A.RandomCrop(width=256, height=256, p=1),
              A.HorizontalFlip(p=0.5),
          ])

          # 增強(qiáng)和可視化圖像
          fig, ax = plt.subplots(23, figsize=(1510))
          for i in range(6):
              transformed = transform(image=image, mask=mask)
              ax[i // 3, i % 3].imshow(transformed["image"])
              ax[i // 3, i % 3].imshow(transformed["mask"], alpha=0.3, cmap="gray_r")
          plt.show()
          因此,你應(yīng)該得到這樣的東西。你的增強(qiáng)圖像將不同,因?yàn)锳lbumentations會(huì)產(chǎn)生隨機(jī)變換。有關(guān)掩碼增強(qiáng)的詳細(xì)教程,請參閱原始文檔:https://albumentations.ai/docs/getting_started/bounding_boxes_augmentation/。
          用于對(duì)象檢測的邊界框增強(qiáng)。它類似于分段掩碼的增強(qiáng),但是:
          • 此外,定義“bbox_params”,其中指定邊界框的格式和邊界框類的參數(shù)coco是指coco數(shù)據(jù)集格式的邊界框-[x_min,y_min,width,height]。參數(shù)'bbox_classes'稍后將用于傳遞邊界框的類。
          • transform接受邊界框作為列表列表。此外,即使圖像中只有一個(gè)邊界框,也需要邊界框類(作為列表)。
          下面是同時(shí)對(duì)圖像及其邊界框進(jìn)行隨機(jī)裁剪和水平裁剪的代碼。
          # 定義增強(qiáng)
          transform = A.Compose([
               A.RandomCrop(width=256, height=256, p=1),
               A.HorizontalFlip(p=0.5), 
          ], bbox_params=A.BboxParams(format='coco', label_fields=["bbox_classes"]))

          # 擴(kuò)充和可視化
          bboxes = [bbox]
          bbox_classes = ["horse"]

          fig, ax = plt.subplots(23, figsize=(1510))
          for i in range(6):
              transformed = transform(
                  image=image, 
                  bboxes=bboxes, 
                  bbox_classes=bbox_classes
              )
              ax[i // 3, i % 3].imshow(transformed["image"])
              trans_bbox = transformed["bboxes"][0]
              bbox_rect = patches.Rectangle(
                  trans_bbox[:2],
                  trans_bbox[2],
                  trans_bbox[3],
                  linewidth=2,
                  edgecolor="r",
                  facecolor="none",
              )
              ax[i // 3, i % 3].add_patch(bbox_rect)
          plt.show()
          下面是結(jié)果。如果你需要一些特定的邊界框擴(kuò)展,請參閱原始文檔:https://albumentations.ai/docs/getting_started/bounding_boxes_augmentation/。
          同時(shí)增強(qiáng)多個(gè)目標(biāo)。除了允許同時(shí)增加多個(gè)掩碼或多個(gè)邊界框外,Albumentations還具有同時(shí)增加不同類型標(biāo)簽的功能,例如,掩碼和邊界框。
          調(diào)用“transform”時(shí),只需將你擁有的一切都給它:
          # 定義增強(qiáng)
          transform = A.Compose([
               A.RandomCrop(width=256, height=256, p=1),
               A.HorizontalFlip(p=0.5), 
          ], bbox_params=A.BboxParams(format='coco', label_fields=["bbox_classes"]))

          # 增強(qiáng)和可視化
          bboxes = [bbox]
          bbox_classes = ["horse"]

          fig, ax = plt.subplots(23, figsize=(1510))
          for i in range(6):
              transformed = transform(
                  image=image, 
                  mask=mask, 
                  bboxes=bboxes, 
                  bbox_classes=bbox_classes
              )
              ax[i // 3, i % 3].imshow(transformed["image"])
              trans_bbox = transformed["bboxes"][0]
              bbox_rect = patches.Rectangle(
                  trans_bbox[:2],
                  trans_bbox[2],
                  trans_bbox[3],
                  linewidth=2,
                  edgecolor="r",
                  facecolor="none",
              )
              ax[i // 3, i % 3].add_patch(bbox_rect)
              ax[i // 3, i % 3].imshow(transformed["mask"], alpha=0.3, cmap="gray_r")
          plt.show()
          你的結(jié)果將如下圖所示。這里有更詳細(xì)的文檔:https://albumentations.ai/docs/getting_started/simultaneous_augmentation/。
          Albumentations有更多的功能可用,如關(guān)鍵點(diǎn)的增強(qiáng)和自動(dòng)增強(qiáng)。它包括大約60種不同的增強(qiáng)類型
          最有可能的情況是,你將使用Albumentations作為PyTorch或TensorFlow訓(xùn)練管道的一部分,因此,我將簡要介紹如何做到這一點(diǎn)。
          PyTorch。創(chuàng)建自定義數(shù)據(jù)集時(shí),請?jiān)?/span>__init__函數(shù)中定義Albumentations transform,并在__getitem__函數(shù)中調(diào)用它。PyTorch模型要求輸入數(shù)據(jù)為張量,因此在定義“transform”(Albumentations教程中的一個(gè)技巧)時(shí),請確保添加“ToTensorV2”作為最后一步。
          from torch.utils.data import Dataset
          from albumentations.pytorch import ToTensorV2

          class CustomDataset(Dataset):
              def __init__(self, images, masks):
                  self.images = images  # 假設(shè)這是一個(gè)numpy圖像列表
                  self.masks = masks  # 假設(shè)這是一個(gè)numpy掩碼列表
                  self.transform = A.Compose([
                      A.RandomCrop(width=256, height=256, p=1),
                      A.HorizontalFlip(p=0.5),
                      ToTensorV2,
                  ])
                  
              def __len__(self):
                  return len(self.images)
                  
              def __getitem__(self, idx):
                  """返回單個(gè)樣本"""
                  image = self.images[idx]
                  mask = self.masks[idx]
                  transformed = self.transform(image=image, mask=mask)
                  transformed_image = transformed["image"]
                  transformed_mask = transformed["mask"]
                  return transformed_image, transformed_mask
          TensorFlow(KerasAPI)還允許創(chuàng)建自定義數(shù)據(jù)集,類似于PyTorch。因此,在__init__函數(shù)中定義Albumentations轉(zhuǎn)換,并在__getitem__函數(shù)中調(diào)用它。很簡單,不是嗎?
          from tensorflow import keras

          class CustomDataset(keras.utils.Sequence):
              def __init__(self, images, masks):
                  self.images = images
                  self.masks = masks
                  self.batch_size = 1
                  self.img_size = (256256)
                  self.transform = A.Compose([
                      A.RandomCrop(width=256, height=256, p=1), 
                      A.HorizontalFlip(p=0.5),
                  ])
                  
              def __len__(self):
                  return len(self.images) // self.batch_size
                  
              def __getitem__(self, idx):
                  """返回樣本batch"""
                  i = idx * self.batch_size
                  batch_images = self.images[i : i + self.batch_size]
                  batch_masks = self.masks[i : i + self.batch_size]
                  batch_images_stacked = np.zeros(
                      (self.batch_size,) + self.img_size + (3,), dtype="uint8"
                  )
                  batch_masks_stacked = np.zeros(
                      (self.batch_size,) + self.img_size, dtype="float32"
                  )
                  for i in range(len(batch_images)):
                      transformed = self.transform(
                          image=batch_images[i], 
                          mask=batch_masks[i]
                      )
                      batch_images_stacked[i] = transformed["image"]
                      batch_masks_stacked[i] = transformed["mask"]
                  return batch_images_stacked, batch_masks_stacked
          希望本教程鼓勵(lì)你下次在處理分割、對(duì)象檢測或關(guān)鍵點(diǎn)定位任務(wù)時(shí)嘗試Albumentations。

          —版權(quán)聲明—

          僅用于學(xué)術(shù)分享,版權(quán)屬于原作者。

          若有侵權(quán),請聯(lián)系微信號(hào):yiyang-sy 刪除或修改!


          —THE END—
          瀏覽 114
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产无码人妻 | 都市激情 亚洲色图 | 无码h | 免费AV网址大全 | www.91爱爱.com |