제퍼넷 로고

Albummentations 개요: 고급 이미지 보강을 위한 오픈 소스 라이브러리

시간

Albummentations 개요: 고급 이미지 보강을 위한 오픈 소스 라이브러리

PyTorch 및 Tensorflow 파이프라인과의 확장 및 통합에 대한 코드 스니펫을 사용합니다.


By 올가 체르니 츠카, 선임 기계 학습 엔지니어

기본 PyTorch 및 TensorFlow 오그멘터에는 큰 단점이 있습니다. 이미지와 해당 분할 마스크, 경계 상자 또는 키포인트 위치를 동시에 보강할 수 없습니다. 따라서 함수를 직접 작성하거나 타사 라이브러리를 사용하는 두 가지 옵션이 있습니다. 나는 둘 다 시도했고 두 번째 옵션이 더 좋습니다 🙂

왜 알부민인가?

 
알부민 내가 시도한 첫 번째 라이브러리였으며 다음과 같은 이유로 계속 사용했습니다.

  • 오픈 소스이며,
  • 직관적이고
  • 빠른,
  • 이상 60가지 증강,
  • 잘 기록 된,
  • 그리고 가장 중요한 것은 이미지와 해당 분할 마스크, 경계 상자 또는 키포인트 위치를 동시에 증가시킬 수 있다는 것입니다.

유사한 라이브러리가 두 개 더 있습니다. 이미지 과 증강기. 불행히도 아직 시도하지 않았기 때문에 비교를 제공할 수 없습니다. 지금까지는 Albumentations로 충분했습니다.
 

짧은 튜토리얼

 
이 짧은 자습서에서는 몇 줄의 코드로 쉽게 분할 및 개체 감지 작업을 위해 이미지를 보강하는 방법을 보여줍니다.

이 튜토리얼을 따르려면:

  1. 앨범 설치. 오래된 버전은 버그가 있을 수 있으므로 최신 버전인지 확인하는 것이 좋습니다. 버전 '1.0.0'을 사용하고 있으며 잘 작동합니다.
  2. 아래 라벨이 있는 테스트 이미지를 다운로드하세요. 그냥 임의의 이미지입니다 COCO 데이터 세트. 약간 수정하여 Albummentations에서 요구하는 형식으로 저장했습니다. 이 라이브러리는 이미지를 NumPy 배열로, 분할 마스크를 NumPy 배열로, 경계 상자를 목록으로 허용합니다.

다운로드

이미지, 이진 픽셀 단위 분할 마스크 및 경계 상자를 로드해 보겠습니다. 경계 상자는 [x_min, y_min, 너비, 높이]의 4개 요소 목록으로 정의됩니다.

import pickle
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches # load data
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"] # visualize data
fig, ax = plt.subplots(1, 2, figsize=(12, 5))
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()


이미지를 로드하고 시각화하면 다음과 같은 결과가 나타납니다.

영상. 이미지 및 레이블 시각화를 위한 코드를 실행할 때의 출력입니다.
분할 마스크는 투명한 흑백 이미지(1은 검은색, '말')로 시각화됩니다.


 

분할을 위한 마스크 확대. 이제 Albummentations부터 시작할 수 있습니다. 여기서 변환은 PyTorch 및 TensorFlow(Keras API)와 매우 유사하게 정의됩니다.

  • Compose 개체를 사용하여 여러 확장을 결합하여 변환을 정의합니다.
  • 각 증가에는 적용될 확률인 인수 'p'와 RandomCrop에 대한 '폭' 및 '높이'와 같은 추가 특정 인수가 있습니다.
  • 정의된 변환을 함수로 사용하여 이미지와 해당 마스크를 보강합니다. 이 함수는 `image` 및 `mask` 키가 있는 사전을 반환합니다.

아래는 임의의 256×256 크롭(항상) 및 수평 뒤집기(50%의 경우에만)로 이미지(및 해당 마스크)를 보강하는 방법에 대한 코드입니다.

import albumentations as A # define augmentation
transform = A.Compose([ A.RandomCrop(width=256, height=256, p=1), A.HorizontalFlip(p=0.5),
]) # augment and visualize images
fig, ax = plt.subplots(2, 3, figsize=(15, 10))
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()


결과적으로 이와 같은 것을 얻어야 합니다. Albummentations가 임의의 변형을 생성하므로 증강 이미지가 달라집니다. 마스크 확대에 대한 자세한 자습서는 다음을 참조하십시오. 원본 문서.

영상. 동시 이미지 및 마스크 증대를 위한 코드를 실행할 때의 출력입니다.
분할 마스크는 투명한 흑백 이미지로 시각화됩니다(1은 검은색, '말').


 

물체 감지를 위한 경계 상자 확대. 그러나 세그먼테이션 마스크의 확대와 유사합니다.

  • 또한 `bbox_params`를 정의하여 경계 상자의 형식과 경계 상자 클래스에 대한 인수를 지정합니다. `coco`는 COCO 데이터셋 형식의 경계 상자를 의미합니다 – [x_min, y_min, width, height]. 그리고 `bbox_classes` 인수는 나중에 경계 상자에 대한 클래스를 전달하는 데 사용됩니다.
  • `transform`은 경계 상자를 목록 목록으로 허용합니다. 또한 이미지에 단일 경계 상자가 있더라도 경계 상자 클래스(목록)가 필요합니다.

아래는 이미지와 경계 상자에 대해 RandomCrop과 HorizonalFrip을 동시에 수행하는 코드입니다.

# define augmentation
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"])) # augment and visualize images
bboxes = [bbox] #`transform` accepts bounding boxes as a list of lists.
bbox_classes = ["horse"] fig, ax = plt.subplots(2, 3, figsize=(15, 10))
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()


결과는 다음과 같습니다. 특정 바운딩 박스 확대가 필요한 경우 – 다음을 참조하십시오. 원본 문서.

영상. 동시 이미지 및 경계 상자 확장을 위한 코드를 실행할 때의 출력입니다.

 

여러 대상의 동시 증강. 동시에 허용하는 것 외에도 여러 마스크를 강화 or 여러 경계 상자, Albummentations에는 마스크 및 경계 상자와 같은 여러 유형의 레이블을 동시에 확장하는 기능이 있습니다.

`transform`을 호출할 때 단순히 가지고 있는 모든 것을 제공하십시오:

# define augmentation
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"])) # augment and visualize images
bboxes = [bbox]
bbox_classes = ["horse"] fig, ax = plt.subplots(2, 3, figsize=(15, 10))
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()


결과는 아래 이미지와 같습니다. 그리고 여기 그것에 대한 자세한 문서.

영상. 동시 이미지, 분할 마스크 및 경계 상자 확대를 위한 코드를 실행할 때의 출력입니다.
분할 마스크는 투명한 흑백 이미지로 시각화됩니다(1은 검은색, '말')..


 

그리고 더. Albummentations에는 확대와 같은 훨씬 더 많은 기능이 있습니다. 키 포인트 과 자동 기능 보강. 그리고 그것은 대략 포함한다 60가지 증강 유형 – 문자 그대로 필요한 모든 작업을 위해.

PyTorch 및 TensorFlow와의 호환성

 
PyTorch 또는 TensorFlow 학습 파이프라인의 일부로 Albummentations를 사용할 가능성이 높으므로 그 방법을 간략하게 설명하겠습니다.

파이 토치. 언제 커스텀 데이터세트 생성, `__init__` 함수에서 Albummentations 변환을 정의하고 `__getitem__` 함수에서 호출합니다. PyTorch 모델은 입력 데이터가 텐서여야 하므로 `transform`을 정의할 때 마지막 단계로 `ToTensorV2`를 추가해야 합니다. Albummentations 튜토리얼 중 하나).

from torch.utils.data import Dataset
from albumentations.pytorch import ToTensorV2 class CustomDataset(Dataset): def __init__(self, images, masks): self.images = images # assume it's a list of numpy images self.masks = masks # assume it's a list of numpy masks 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): 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 (Keras API)도 생성 가능 커스텀 데이터세트, PyTorch와 유사합니다. 따라서 `__init__` 함수에서 Albummentations 변환을 정의하고 `__getitem__` 함수에서 호출합니다. 매우 간단하지 않습니까?

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 = (256, 256) 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): """Returns a batch of samples""" 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


그게 다야! 이 튜토리얼이 다음에 세분화, 물체 감지 또는 키포인트 현지화 작업을 할 때 Albummentations를 시도하는 데 도움이 되었기를 바랍니다. 그랬다면 알려주세요!

 
바이오 : 올가 체르니 츠카 동유럽의 대규모 아웃소싱 회사의 선임 기계 학습 엔지니어입니다. 미국, 유럽 및 아시아 최고의 기업을위한 다양한 데이터 과학 프로젝트에 참여했습니다. 주요 전문 분야와 관심 분야는 Deep Computer Vision입니다.

실물. 허가를 받아 다시 게시했습니다.

관련 :


PlatoAi. Web3 재창조. 데이터 인텔리전스 증폭.
액세스하려면 여기를 클릭하십시오.

출처: https://www.kdnuggets.com/2021/07/overview-albumentations-open-source-library-advanced-image-augmentations.html

spot_img

최신 인텔리전스

spot_img

우리와 함께 채팅

안녕하세요! 어떻게 도와 드릴까요?