Не хватает изображений для обучения модели? Вот как в несколько раз увеличить размер набора данных с помощью синтетических изображений с помощью методов композиции изображений.

Хорошо известно, что качество и количество набора данных, используемых для обучения вашей модели, будут иметь прямое влияние на производительность модели. Доступность обширного универсального набора данных может заключить сделку, и вы сможете перейти к следующему этапу конвейера машинного обучения / глубокого обучения. Но часто вы можете оказаться в ситуации, когда нужный вам набор данных просто недоступен. Или данных, которые у вас есть, недостаточно для обучения сверхмощной модели. Что ты теперь делаешь?

Существует так много ресурсов, которые могут помочь вам создать новый настраиваемый набор данных любого класса объектов, который вам нужен. Но если бы мне пришлось описать процесс создания набора данных одним словом, я бы назвал его «громоздким», «трудоемким» и «разочаровывающим» и - я знаю, что использовал более одного слово, но вы поняли!

Особенно когда дело доходит до рисования масок сегментации, я просто не хочу аннотировать больше, чем несколько изображений! Не поймите меня неправильно, я знаю, что создание набора данных - очень, очень, очень важный шаг, но разве нет выхода?

Увеличение данных - отличный способ увеличить разнообразие наборов данных, которые видит ваша модель, но, опять же, есть предел того, насколько это может помочь. Как насчет того, чтобы сделать еще один шаг?

Что такое синтетический набор данных?

Создание любого типа данных (изображения, аудио, текста и т. Д.) «Искусственно» или «программно» приводит к тому, что мы называем синтетическим набором данных. Эти данные не собираются естественным путем или обычно и не маркируются вручную, поэтому безопасно ли использовать их для обучения вашей модели? Даст ли это хорошие результаты?

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

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

В этом уроке я собираюсь создать синтетические изображения для выходного класса dog. На самом деле в Интернете есть множество существующих наборов данных, которые включают класс собак (например, COCO), но какой вред в создании большего количества изображений этих милых даров природы? :П

1. Импорт

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

import os
import numpy as np
import skimage.io as io
import skimage.transform as transform
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
%matplotlib inline

2. Объект - передний план.

Есть 2 способа сделать это -

(A) Создайте свой собственный набор данных

Во-первых, давайте возьмем изображение собаки, доступное в Интернете. Есть несколько веб-сайтов, которые позволяют вам использовать изображения бесплатно, например, pexels, flickr, unsplash - выбирайте сами. Я собираюсь использовать тот, что ниже.

Затем вам нужно будет немного вручную отделить собаку от фона. Ага, извините - бесплатного питания нет. Но в конечном итоге, я обещаю, это определенно меньше усилий, чем создание всего набора данных.

Я знаю несколько инструментов для выполнения этой работы: Photoshop (платный) или GIMP (бесплатный). Или вы даже можете использовать надежный Microsoft Paint! Окончательный результат выглядит так, как показано ниже.

Прочтите изображение. Затем вырежьте слой переднего плана из этого изображения и установите оставшиеся пиксели на ноль. Альтернативой кодированию на этом этапе является добавление черного фона с помощью инструмента, который вы использовали (GIMP / Paint / Photoshop), при сегментировании самого изображения. Но, тем не менее, вот как извлечь объект переднего плана в Python - простое определение порога пикселей.

# Read the image
I = io.imread('./dogSeg.jpg')/255.0
# Cut out the foreground layer
foreground = I.copy()
foreground[foreground>=0.9]=0 # Setting surrounding pixels to zero
plt.axis('off')
plt.imshow(foreground)
plt.show()

(Б) Использовать существующий набор данных

Если вы не хотите начинать с нуля, другой вариант - использовать изображения из уже доступного набора данных.

Я собираюсь использовать здесь набор данных COCO для демонстрации. Поскольку в COCO уже есть категория объектов собака, будет легко получить изображение и его маску. Набор данных COCO содержит 4385 (поезд) и 177 (val) изображений для категории собака.

Вы можете сослаться на весь код этого процесса в моем репозитории GitHub для этого руководства. Я не буду повторять код этого шага в этой публикации.

Если вас интересует работа с набором данных изображений COCO и создание генератора данных для обучения вашей модели сегментации изображений, у меня есть подробное руководство здесь.

3. Увеличьте передний план

Давайте немного поиграем с собакой (игра слов). В своем коде я использовал случайные повороты, случайное масштабирование, случайные переводы и случайные горизонтальные перевороты, но вы можете использовать и что-то еще.

Вывод кода показан ниже. Посмотрите, как оно отличается от исходного изображения!

После применения всех этих изменений к переднему плану давайте извлечем маску сегментации из изображения.

4. Предпосылки

Теперь вам нужно новое фоновое изображение. Используйте бесплатные веб-сайты, о которых я упоминал ранее, чтобы получить широкий выбор фонов. Вы можете выбрать любое изображение в мире (посмотрите, как я отправил свою собаку на Луну, на изображении дисплея в этой статье), но я рекомендую сохранить его как можно более реалистичным.

Я собираюсь использовать эти 4 изображения в качестве фона для этого урока.

Выберем фон случайным образом.

# Random selection of background from the backgrounds folder
background_fileName = np.random.choice(os.listdir("./backgrounds/"))
background = io.imread('./backgrounds/'+background_fileName)/255.0

5. Наконец: скомпонуйте передний план и задний план.

Пришло время добавить изображение вашей собаки на задний план!

Эта функция дает следующий результат. Я знаю, что это не идеально, но неплохо!

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

И выполняя эти функции в цикле со всеми фонами, мы получаем хороший набор изображений!

В этом уроке я использовал 1 передний план с 4 фонами. Если вы используете несколько передних планов в случайном порядке с несколькими фонами, вы можете создать много-много изображений! Возможно, вы могли бы объединить два или более передних плана на заднем плане. Проявите творческий подход - поиграйте с размерами, углами, передним планом и фоном, чтобы создать потрясающий синтетический набор данных в соответствии с вашими потребностями. Здесь также есть много соображений по дизайну, но, приложив немного усилий, вы можете сделать гораздо больше и создать более точные наборы данных.

Наконец, вы можете найти весь код этого руководства в моем репозитории GitHub.

В качестве следующего шага по этой теме ознакомьтесь с этим красивым учебником по созданию наборов данных синтетических изображений с помощью Unity 3D.

Что ж, на этом все. Спасибо, что дочитали до конца статьи. Надеюсь, из этого вышло что-то хорошее. Есть мысли, вопросы, комментарии? Дайте мне знать в ответах ниже!

Если вас интересуют наборы данных изображений для семантической сегментации, ознакомьтесь с моим сообщением ниже:



Или вы хотите разбогатеть в мгновение ока, используя машинное обучение для акций? Эта статья (НЕ) для вас!



Может ли модель машинного обучения буквально читать графики котировок акций?