Pull to refresh

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

Reading time5 min
Views15K


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


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


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


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


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



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


Спойлер

Если очень хорошее качество нам не нужно, либо выделяемый объект очень простой, то такую разметку можно производить с помощью ломаных линий (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. Удобный интерфейс для создания заданий.

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



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



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



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



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




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


Конечно, можно каждое изображение открыть в фотошопе и посмотреть насколько хорошо все выделено, но что делать, если на тебя одновременно работает 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))

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


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











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



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



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



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


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


Понравилась статья? Еще больше контента на темы разметки, Data Mining и ML вы можете найти в нашем Telegram канале “Где данные, Лебовски?”


  • Как подготовиться к сбору данных, чтобы не провалиться в процессе?
  • Как работать с синтетическими данными в 2024 году?
  • В чем специфика работы с ML проектами? И как разметить 1500 пузырьков руды на одном фото и не сойти с ума?

Обо всем этом читайте в “Где данные, Лебовски?”

Tags:
Hubs:
+11
Comments4

Articles

Change theme settings