Chia sẻ thư viện augmentation

object-detection
image-segmentation
computer-vision

#1

Mình xin chia sẻ một library được phát triển bởi một gosu trên Kaggle :smile: Library này đã giúp họ chiến thắng rất nhiều trong những cuộc thi Computer vision, đặc biệt là những phần thi Segmentation.

1. Tính năng

  • Base là OpenCV
  • Tốc độ xử lý nhanh, đạt hiệu quả cao trong những task như segmentation, object detection,…
    • Shift, scale, rotate, transpose, rot90 rất hữu ích trong mảng satellite imagery.
    • ShiftRGB, ShiftHSV, Contrast, Brightness, Gamma, CLAHE, Gaussian Blur cho việc augment color.
    • Elastic and Grid augmentations rất hữu ích cho medical imagery.
    • Motion blur, perspective transformation hay được sử dụng cho self-driving car.
  • Dễ sử dụng
  • Dễ custom
  • Dễ sử dụng cho các framework deep learning

2. Cách sử dụng và ví dụ

Mình xin lấy ví dụ bằng pytorch như sau

from albumentations import (
    Compose, Resize, HorizontalFlip, Normalize, CenterCrop, Rotate
)
import cv2


def preprocess_demo(image_size, p1=1.0):
    return Compose([
        Resize(image_size+20, image_size+20, p=1.0),
        Rotate(30),
        HorizontalFlip(),
        CenterCrop(image_size, image_size, p=1.0),
        Normalize(
            [0.5, 0.5, 0.5],
            [0.5, 0.5, 0.5],
        ),
    ], p=p1)


class MuraDataset(Dataset):
    def __init__(self, df: pd.DataFrame, transform=preprocess_demo(image_size=320), mode="train"):
        """

        :param df: Should have two columns as ["fname", "label"]
        :param transform: augmentation function
        :param mode: train or test
        """
        self.mode = mode
        self.fnames = df.fname.values
        if self.mode == "train":
            self.labels = df.label.values
        self.transform = transform

    def __len__(self):
        return len(self.fnames)

    def __getitem__(self, idx):
        fname = self.fnames[idx]
        # Read the image. Should use opencv
        img = cv2.imread(fname)
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        if self.transform:
            img = self.transform(image=img)["image"]
            img = np.transpose(img, (2, 0, 1))

        if self.mode == "train":
            label = self.labels[idx]
            return img, label
        else:
            return img, 0
  
  • Trong đoạn code trên, p1 là xác suất để thực hiện augment đó. Việc điều chỉnh xác suất này giúp bạn trong trường hợp sử dụng nhiều hơn một tập augment. Nếu bạn chỉ sử dụng 1 tập augmentation, hãy để nó bằng 1.0 nhé :smiley:

  • Trong những hàm augment mặc định của library, chúng đều có xác suất thực hiện là 0.5, bạn có thể điều chỉnh theo ý muốn.

  • Hàm transform có thể nhận một hay nhiều data một lúc. Bạn có thể thực hiện augment nhiều ảnh thay vì một. Ví dụ:

aug = preprocess_demo(image_size, p1=1.0)
# Define data dưới dạng dictionary
data = {
    "image1": img1,
    "image2": img2,
    "image3": img3,
}

augmented = aug(**data)
augmented_img1 = augmented["image1"]
augmented_img2 = augmented["image2"]
augmented_img3 = augmented["image3"]
  • Bạn có thể sử dụng DualTransform với bài toán segmentation khi mà bạn cần augment imagemask

3. Hiệu năng

Hiệu năng nhìn chung là nhanh hơn so với torchvision của pytorch Sau đây là bảng so sánh (source từ đây). Đơn vị tính bằng giây, càng nhỏ càng tốt.


#2

Em cũng có dùng … nhưng thực sự đoạn augmentation này ngốn CPU quá, kiểu bottleneck!


#3

Bottleneck ở đấy có nhiều nguyên nhân lắm:

  • CPU k đủ mạnh
  • Sử dụng nhiều augmentation nặng
  • Ổ cứng

Mình dùng khá nhiều thư viện augmentation thì thấy cái này vẫn là OK nhất về tốc độ và tính linh hoạt của nó