Хотите научиться дополнению данных с помощью созданной Facebook библиотеки для изображений, видео, аудио и текста, чтобы улучшить свои проекты машинного обучения?

Поскольку предстоит многое изучить, это будет серия из четырех разделов о том, как использовать Augly для увеличения данных. Я не совсем уверен, сколько статей в конечном итоге будет, но я постараюсь охватить каждый аспект, который я считаю применимым.

  1. Увеличение изображения
  2. Увеличение видео
  3. Аудио Увеличение
  4. Увеличение текста

В будущем я обязательно сделаю еще одну серию, сравнивающую прирост производительности нейронной сети с использованием Augly по сравнению с использованием других инструментов и без использования увеличения данных в различных наборах данных (без MNIST, я обещаю). Итак, продолжайте.

Начиная с основ

Настраивать

В настоящее время я работаю над машиной Ubuntu 20.04 LTS с установленной версией augly 0.1.10, ImageMagick и использую Python 3.8.8.

Для этой настройки нет особой причины, но если вы столкнетесь с некоторыми трудностями при выполнении, попробуйте обновить свою версию augly или выбрать конкретную версию Python выше 3.6, поскольку augly использует классы данных.

Показ вашего изображения

AugLy может использовать изображения разными способами, но, на мой взгляд, проще всего использовать путь к изображению как строку. Множество функций в AugLy могут напрямую обрабатывать путь к изображению и автоматически преобразовывать его в формат изображения PIL.

В этом уроке я буду работать с двумя изображениями:

# let's take a look at them
import augly.image as imaugs
cat_img = imaugs.scale("laying_cat.jpg") # factor = 0.5 as default
umbrellas_img = imaugs.scale("umbrellas.jpg")

У нас есть много способов визуализировать эти изображения:

  1. Imshow Matplotlib -> Мой предпочтительный метод matplotlib.pyplot.imshow(cat_img)
  2. Использование дисплея IPython -> Только ноутбуки IPython.display.display(cat_img)
  3. Метод show PIL -> Не очень хорошо, так как создает новое окно :( cat_img.show()

Сохранение преобразованного изображения

Это просто, просто добавив параметр output_path, ваше изображение будет сохранено по вашему желанию.

cat_img = imaugs.scale("laying_cat.jpg", output_path="small_cat.jpg", factor=1.)

Преобразования

Я разделю преобразования на четыре категории:

  1. Операции — Масштаб, Вращение, Обрезка, Накладка
  2. Фильтры — Размытие, Шум, Фильтр
  3. Наложения — наложение эмодзи, наложение мемов, наложение текста, наложение изображений
  4. Пользовательский — создание пользовательских конвейеров преобразования с использованием PIL.

Операции

  • Шкала

small_cat_img = imaugs.scale("laying_cat.jpg", factor=0.1)

Это создаст копию изображения размером 10% от исходного.

Если у вас уже загружено изображение, вы также можете использовать объект вместо имени файла.

# this
small_cat_img = imaugs.scale("laying_cat.jpg", factor=0.1)

# is the same as this
cat_img = imaugs.scale("laying_cat.jpg", factor=1.0)
small_cat_img = imaugs.scale(cat_img, factor=0.1)
  • Вращение
# simple rotation
ANGLE = 45
imaugs.scale(cat_img, degrees=ANGLE)

# applying skew
imaugs.skew(cat_img, skew_factor=ANGLE)

# even simpler flips 
imaugs.vflip(cat_img)
imaugs.hflip(cat_img)

  • Обрезать
# you can control the crop coordinates with
# point x1, y1 (top left)
# point x2, y2 (bottom right)

# the standard is x1 = y1 = 0.25, x2 = y2 = 0.75
imaugs.crop(umbrella_img)

# getting another crop
imaugs.crop(umbrellas_img,  x1 = 0.55, y1= 0.25, x2 = 0.75, y2 = 0.85)

  • Подушечка
# you can control padding with w_factor and h_factor, 
# which is the padding size in percentage of the image size
imaugs.pad(umbrella_img)

# if you change the padding factors you'll get stuff like
# notice that the padding height stays the same
imaugs.pad(umbrellas_img, w_factor=0.05)

Фильтр

  • Размытие
# blurring works with a radius (similar to CSS), the standard is 2.0 pixels
imaugs.blur(cat_img)
imaugs.blur(cat_img, radius=10)

  • Шум
imaugs.random_noise(input_img)
imaugs.random_noise(input_img, mean=0, var=0.5)
imaugs.random_noise(input_img, mean=-0.4)

  • Фильтры, вы можете добавить любой фильтр PIL, который вам нравится. Проверьте их здесь
from PIL import ImageFilter

imaugs.apply_pil_filter(input_img, filter_type=ImageFilter.CONTOUR )
imaugs.apply_pil_filter(input_img, filter_type=ImageFilter.EDGE_ENHANCE )
imaugs.apply_pil_filter(input_img, filter_type=ImageFilter.MaxFilter(9) )

  • Наложение изображений
imaugs.overlay_image("umbrellas.jpg", "laying cat.jpg") # bad overlay
imaugs.overlay_image("umbrellas.jpg", "laying cat.jpg", 
            overlay_size=0.7, opacity=0.3, x_pos=0, y_pos=0) # good overlay

  • Оверлейные эмодзи

Вы можете проверить все доступные смайлики, они разделены по категориям

imaugs.overlay_emoji(cat_img) # standard overlay
imaugs.overlay_emoji(cat_img,
    emoji_path=os.path.join(
          augly.utils.EMOJI_DIR, 
          "animals_and_nature", 
          "penguin.png")) # choosing the emoji
imaugs.overlay_emoji(
    cat_img,
    emoji_path=os.path.join(
        augly.utils.EMOJI_DIR, 
        "activity", 
        "horse_racing.png"), 
    x_pos=np.random.random(), 
    y_pos=np.random.random()) # using random positions, ran it twice

  • Формат мема

Вы можете проверить все доступные шрифты

imaugs.meme_format(cat_img)
imaugs.meme_format(
    cat_img, 
    text="work from\nhome", 
    font_file=os.path.join(
        augly.utils.FONTS_DIR, 
        "CaviarDreams_Italic.ttf")) # using custom fonts
imaugs.meme_format(cat_img, 
    text="Very good meme", 
    caption_height=20, 
    meme_bg_color=(0,0,0), 
    text_color=(255,255,255)) # using custom bg

  • Оверлей Скриншот

Есть два доступных скриншота. Интернет и мобильные устройства.

imaugs.overlay_onto_screenshot(
    cat_img, 
    template_filepath=os.path.join(
        augly.utils.SCREENSHOT_TEMPLATES_DIR, 
        "mobile.png"))
imaugs.overlay_onto_screenshot(
    cat_img, 
    template_filepath=os.path.join(
        augly.utils.SCREENSHOT_TEMPLATES_DIR, 
        "web.png"))

Создание конвейера

Для создания пайплайнов у вас есть два основных пути

1. Функциональная основа

Все преобразования, которые я показал до сих пор, были сделаны с использованием функционального подхода, и с их помощью довольно легко построить конвейер дополнений.

import PIL

def simple_pipeline(image: PIL.Image.Image) -> PIL.Image.Image:
    image = imaugs.random_noise(image, mean=-0.05, var=0.02)
    image = imaugs.skew(image, skew_factor=0.4)
    image = imaugs.blur(image)
    return image

simple_pipeline(umbrellas_img)

Как видите, все преобразования были применены к изображению.

Чтобы добавить некоторую случайность в процесс, можно создать такой конвейер.

def pipeline_with_prob(
    image: PIL.Image.Image, threshold: float = 0.5
) -> PIL.Image.Image:
    transforms = [imaugs.skew, imaugs.random_noise, imaugs.blur]
    args = [{"skew_factor":0.4},{"mean":-0.05, "var":0.02},{"radius": 0.2}]
    for i, transform in enumerate(transforms):
        if np.random.random() > threshold:
            image = transform(image, **args[i])
    return image

pipeline_with_prob(umbrellas_img) # ran it three times

в первом прогоне применялся только random_noise, во втором прогоне применялся только skew, а в третьем прогоне применялись и blur, и skew.

Как вы можете видеть, это довольно быстро становится довольно шумным, поэтому вы можете использовать

2. На основе класса

Все преобразования, которые я показал ранее, доступны в виде классов, и у них есть параметр вероятности p, который помогает при создании конвейера.

THRESHOLD = .5

pipeline = imaugs.Compose([
    imaugs.Skew(p=THRESHOLD),
    imaugs.RandomNoise(p=THRESHOLD),
    imaugs.Blur(p=THRESHOLD),
    ]
)

pipeline(umbrellas_img) # ran it three times

Это самый чистый подход, и его очень легко интегрировать с преобразованиями PyTorch (см. https://pytorch.org/vision/stable/transforms.html)

import torchvision.transforms as transforms

THRESHOLD = .5

pipeline = transforms.Compose([
    imaugs.Skew(p=THRESHOLD),
    imaugs.RandomNoise(p=THRESHOLD),
    imaugs.Blur(p=THRESHOLD),
    transforms.ToTensor()
    ]
)
type(pipeline(umbrellas_img)) # Output: torch.Tensor
pipeline(umbrellas_img)

это обертка

Спасибо, что прочитали эту статью. Я буду использовать этот пакет для некоторых из своих следующих статей, которые будут посвящены тому, как увеличение данных влияет на задачи машинного обучения, и другим возможностям AugLy. Так что обязательно загляните к ним в будущем.