Albummentations 개요: 고급 이미지 보강을 위한 오픈 소스 라이브러리
PyTorch 및 Tensorflow 파이프라인과의 확장 및 통합에 대한 코드 스니펫을 사용합니다.
By 올가 체르니 츠카, 선임 기계 학습 엔지니어
기본 PyTorch 및 TensorFlow 오그멘터에는 큰 단점이 있습니다. 이미지와 해당 분할 마스크, 경계 상자 또는 키포인트 위치를 동시에 보강할 수 없습니다. 따라서 함수를 직접 작성하거나 타사 라이브러리를 사용하는 두 가지 옵션이 있습니다. 나는 둘 다 시도했고 두 번째 옵션이 더 좋습니다 🙂
왜 알부민인가?
알부민 내가 시도한 첫 번째 라이브러리였으며 다음과 같은 이유로 계속 사용했습니다.
- 오픈 소스이며,
- 직관적이고
- 빠른,
- 이상 60가지 증강,
- 잘 기록 된,
- 그리고 가장 중요한 것은 이미지와 해당 분할 마스크, 경계 상자 또는 키포인트 위치를 동시에 증가시킬 수 있다는 것입니다.
유사한 라이브러리가 두 개 더 있습니다. 이미지 과 증강기. 불행히도 아직 시도하지 않았기 때문에 비교를 제공할 수 없습니다. 지금까지는 Albumentations로 충분했습니다.
짧은 튜토리얼
이 짧은 자습서에서는 몇 줄의 코드로 쉽게 분할 및 개체 감지 작업을 위해 이미지를 보강하는 방법을 보여줍니다.
이 튜토리얼을 따르려면:
- 앨범 설치. 오래된 버전은 버그가 있을 수 있으므로 최신 버전인지 확인하는 것이 좋습니다. 버전 '1.0.0'을 사용하고 있으며 잘 작동합니다.
- 아래 라벨이 있는 테스트 이미지를 다운로드하세요. 그냥 임의의 이미지입니다 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입니다.
실물. 허가를 받아 다시 게시했습니다.
관련 :
지난 30 일 동안의 주요 기사
|
|
PlatoAi. Web3 재창조. 데이터 인텔리전스 증폭.
액세스하려면 여기를 클릭하십시오.