Создаем свой датасет с пришельцами

в 10:36, , рубрики: big data, computer vision, data mining, dataset, deep learning, python, segmentation, машинное обучение, обработка изображений, разметка изображений, фрилансеры

Создаем свой датасет с пришельцами - 1

Сегментацией людей с помощью нейронных сетей уже никого не удивишь. Есть много приложений, таких как Sticky Ai, Teleport Live, Instagram, которые позволяют выполнять такую сложную задачу на мобильном телефоне в реалтайме.

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

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

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

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

Создаем свой датасет с пришельцами - 2

Решение:
Первым делом нужно составить ТЗ для фрилансеров, которые будут размечать изображения. Так как нам нужно очень высокое качество, то будем размечать изображения в фотошопе.

Спойлер

Если очень хорошее качество нам не нужно, либо выделяемый объект очень простой, то такую разметку можно производить с помощью ломаных линий (polygon vertices). Такой тип разметки доступен на Amazon Mechanical Turk и Яндекс.Толоке, где рабочая сила очень дешевая.

Можно составить ТЗ в виде 10-ти страничного PDF документа, но:

  1. Фрилансеры обычно не читают ТЗ, а пролистывают.
  2. В документе сложно описать подробно алгоритм как правильно и быстро надо размечать.
  3. На составление самого документа уходит очень много времени.

Поэтому сейчас мы полностью отказались от ТЗ в виде PDF документа, а предоставляем задание в
виде обучающего видео. После такого нововведения:

  • В 2 раза выросла производительность фрилансеров (так как в видео представлен самый быстрый и оптимальный способ разметки).
  • В 3 раза сократились вопросы, задаваемые фрилансерами (так как на видео показан каждый шаг).
  • В 2 раза получилось уменьшить стоимость разметки (так как цена часа работы не изменилась, но фрилансеры размечают в два раза быстрее).

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

Пример:
Есть два способа выделения:
Способ А занимает 5 мин на изображение.
Способ Б занимает 10 мин на изображение.

При способе А за час фрилансер размечает 12 изображений, поэтому цена за изображение будет 150 / 12 = 12.5 руб.
При способе Б за час фрилансер размечает 6 изображений, поэтому цена за изображение будет 150 / 6 = 25 руб.

Итак, мы нашли лучший способ выделения и записали видеоинструкцию, что дальше?

Осталось найти фрилансеров. Есть много бирж фрилансеров, таких как Fl.ru, Weblancer, Фриланс.ру.
Но в последнее время мы используем фриланс-биржу WORK-ZILLA, потому что:

  1. Там довольно дешевая рабочая сила.
  2. Много исполнителей.
  3. Удобный интерфейс для создания заданий.

Для того, чтобы создать задание:
Регистрируемся, пополняем баланс, нажимаем "Дать задание", выбираем "Дизайн"->"Обработка фото".

Создаем свой датасет с пришельцами - 3

Заполняем заголовок и описание, определяем время на выполнение задания. Обработав несколько пришельцев, я заметил, что на одно изображение в среднем уходит 4 минуты. Т.е. за час выходит 15 изображений, поэтому устанавливаем цену за одно изображение 150 / 15 = 10 руб.

Создаем свой датасет с пришельцами - 4

Сразу после публикации задания исполнители начинают предлагать свои услуги.

Создаем свой датасет с пришельцами - 5

Выбираем самого красивого по аватарке опытного по отзывам и утверждаем в качестве исполнителя, выдаем изображения. Как видим, поиск фрилансера у нас занял менее 15 минут.

Создаем свой датасет с пришельцами - 6

На следующее утро исполнитель прислал работу.

Создаем свой датасет с пришельцами - 7
Создаем свой датасет с пришельцами - 8

Как теперь ее проверить?

Конечно, можно каждое изображение открыть в фотошопе и посмотреть насколько хорошо все выделено, но что делать, если на тебя одновременно работает 20 человек, и каждый присылает по 40 изображений в день?

Автоматизировать! Для облегчения проверки мною был реализован на питоне такой скрипт:

import cv2
import numpy as np
import os
import shutil
from __future__ import print_function
from tqdm import tqdm_notebook as tqdm

#функция, которая рисует фон как в фотошопе
def generate_checkerboard(shape, size):
    res = np.ones(shape, dtype=np.float32)
    for i in range(0, shape[0] // size + 1):
        for j in range(0, shape[1] // size + 1):
            if (i + j) % 2 == 0:
                res[i * size:i * size + size, j * size:j * size + size] = 0.7
    return np.stack([res] * 3, axis=2)

path = '01_Починок Сергей_13'
files_im = filter(lambda x: x[-4:] == '.jpg', os.listdir(path  + '/images'))
files_masks = filter(lambda x: x[-4:] == '.png', os.listdir(path  + '/masks'))

print('Кол-во изображений: %s' % len(files_im))
print('Кол-во масок: %s' % len(files_masks))
if len(files_im) != len(files_masks):
    print('Кол-во изображений и масок не совпадает')
    raise Exception('bad count')   
#создаем папку res, в которую будут записываться коллажи 
os.makedirs(path + '/res')

for idd in tqdm(map(lambda x: x[:-4], files_im)):
    print(idd)
    mask = cv2.imread(path + '/masks/' + idd + ".png") / 255.
    im = cv2.imread(path + '/images/' + idd + ".jpg")
    checkerboard = generate_checkerboard(im.shape[:2], 40) * 255
    cv2.imwrite(path + '/res/' + idd + ".jpg",
                np.concatenate([im, im * (1 - mask), im * mask + (1 - mask) * checkerboard],axis=1))

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

Запускаем скрипт и получаем такие коллажи:

Создаем свой датасет с пришельцами - 9
Создаем свой датасет с пришельцами - 10
Создаем свой датасет с пришельцами - 11
Создаем свой датасет с пришельцами - 12
Создаем свой датасет с пришельцами - 13
Создаем свой датасет с пришельцами - 14
Создаем свой датасет с пришельцами - 15
Создаем свой датасет с пришельцами - 16
Создаем свой датасет с пришельцами - 17
Создаем свой датасет с пришельцами - 18

Просмотрев изображения, замечаем, что одно изображение исполнитель выделил не очень хорошо.

Создаем свой датасет с пришельцами - 19

Просим подправить изображение.

Создаем свой датасет с пришельцами - 20

После того, как фрилансер исправил все наши замечания, подтверждаем работу и расписываем благодарный отзыв фрилансеру.

Создаем свой датасет с пришельцами - 21

Итог:
Предположим, что для обучения нейронной сети нужно будет 2000 изображений пришельцев.
Тогда, чтобы собрать такой датасет, надо будет потратить всего 2000 х 10 = 20000 руб, а если учесть, что в среднем один фрилансер обрабатывает по 40 изображений в день и одновременно над разметкой трудятся 10 человек, то создание датасета займет 2000 / (10 х 40) = 5 дней.

P.S.
Конечно, мы пока не столкнулись с инопланетянами, никто из команды Prisma AI сегментировать пришельцев не собирается, но на этом примере я хотел показать вам, как просто и с минимальными затратами можно создать свой датасет под любую задачу, будь это детекция пешеходов для беспилотного автомобиля или определение лесов на спутниковых снимках.

Автор: kucev

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js