Хотите научиться дополнению данных с помощью созданной Facebook библиотеки для изображений, видео, аудио и текста, чтобы улучшить свои проекты машинного обучения?
Поскольку предстоит многое изучить, это будет серия из четырех разделов о том, как использовать Augly для увеличения данных. Я не совсем уверен, сколько статей в конечном итоге будет, но я постараюсь охватить каждый аспект, который я считаю применимым.
- Увеличение изображения
- Увеличение видео
- Аудио Увеличение
- Увеличение текста
В будущем я обязательно сделаю еще одну серию, сравнивающую прирост производительности нейронной сети с использованием 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")
У нас есть много способов визуализировать эти изображения:
- Imshow Matplotlib -> Мой предпочтительный метод
matplotlib.pyplot.imshow(cat_img)
- Использование дисплея IPython -> Только ноутбуки
IPython.display.display(cat_img)
- Метод show PIL -> Не очень хорошо, так как создает новое окно :(
cat_img.show()
Сохранение преобразованного изображения
Это просто, просто добавив параметр output_path, ваше изображение будет сохранено по вашему желанию.
cat_img = imaugs.scale("laying_cat.jpg", output_path="small_cat.jpg", factor=1.)
Преобразования
Я разделю преобразования на четыре категории:
- Операции — Масштаб, Вращение, Обрезка, Накладка
- Фильтры — Размытие, Шум, Фильтр
- Наложения — наложение эмодзи, наложение мемов, наложение текста, наложение изображений
- Пользовательский — создание пользовательских конвейеров преобразования с использованием 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. Так что обязательно загляните к ним в будущем.