- PVSM.RU - https://www.pvsm.ru -

Нейронными сетями уже никого не удивишь. Практически каждый человек знает, что такое машинное обучение, линейная регрессия, random forest. Каждый год тысячи людей проходят курсы по машинному обучению на ODS [1] и Coursera [2]. Любой школьник за пару недель теперь может освоить keras и клепать нейроночки. Но в нейронных сетях, как и во всем машинном обучении, помимо создания хорошего алгоритма, необходимы данные, на которых алгоритм будет обучаться.
Разрешите представиться, меня зовут Куцев Роман. Я работаю в RnD команде в Prisma AI и занимаюсь созданием датасетов под наши задачи.
Итак, вдруг поступает продуктовый запрос: нам срочно нужна нейронка, которая будет отличать Киркорова от Фейсa (конечно, пример вымышленный, мы такой ерундой не занимаемся).
Спрашиваю у Антона (главный по нейронкам), в каком виде нужны данные, в ответ слышу: “Две папки, в одной изображения Фейсa, в другой Киркорова, желательно где-то по 500 изображений на класс, и чтобы 299х299 были”.
Где найти данные?
Очевидно, что никто раньше не занимался задачей классификации Киркорова и Фейса. Поэтому придется самим создать такой датасет.
Пайплайн такой:
Для скачивания воспользуемся Google Images Download [6].
В терминале пишем:
googleimagesdownload -k ‘Киркоров’ -l 1000 -t photo -s '>400*300' -o 'Kirkorov'
googleimagesdownload -k ‘репер Face’ -l 1000 -t photo -s '>400*300' -o 'Face'
(на самом деле все не так просто, за один запрос можно скачать только 100 изображений, поэтому приходится выкачивать с разными настройками)
Сразу ресайзнем изображения до размера 299х299, для этого я набросал такую функцию:
from PIL import Image
import multiprocessing, time, os
def resize_img(img_path):
img = Image.open(os.path.join('Kirkorov',img_path))
img = img.resize((299,299), Image.ANTIALIAS)
img.save(os.path.join('Kirkorov_resize',img_path))
num_processes = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes=num_processes)
st = time.time()
pool.map(resize_img, os.listdir('Kirkorov'))
print("Execution time: ", time.time()-st)
Посмотрев на изображения, видим, что в основном скачались нужные изображения, но местами присутствует мусор.




Отлично, первые два пункта готовы, остался третий.
Если вы до сих пор не знаете, что такое Яндекс Толока, то советую прочитать эту [7] и эту [8] статью.
В двух словах: Толока — фриланс биржа на стероидах, где заказчик создает задание, загружает данные и фрилансеры его выполняют. Конечно, есть и другие инструменты [9] для разметки, но для данной задачи удобнее всего воспользоваться Толокой.
Как начать пользоваться Яндекс Толокой:




Проект готов. Теперь можно добавить пул заданий [12]. В данной статье я не буду создавать пул обучения (надеясь на то, что фрилансеры способны сразу выполнить наше наисложнейшее задание). Но вы всегда создавайте в своем задании пул обучения. Это позволит:
Придумываем название пула (оно видно только нам). Задаем цену 0.01$ за страницу заданий. Жадный Яндекс берет комиссию 0.005$. Время на задание: 10 минут. Перекрытие: 3 (каждая наша фотография будет показываться трем разным людям). Включим "КОНТЕНТ ДЛЯ ВЗРОСЛЫХ", а то мало-ли что плохого мы из интернета могли скачать. И активируем "ОТЛОЖЕННАЯ ПРИЕМКА", чтобы не дать денег тем фрилансерам, которые будут плохо выполнять задание.

Далее идет пункт: "ТРЕБОВАНИЯ К ПОЛЬЗОВАТЕЛЯМ", в котором мы можем предъявить требования к исполнителям. В нашем случае исполнитель должен быть из России и владеть русским языком. Каждый исполнитель имеет свой рейтинг и мы можем выбрать исполнителей только с хорошим рейтингом. Выберем 80% лучших исполнителей.

Самым важным и самым сложным в плане освоения является блок контроля качества [13]. Отдельное его описание потянет на целую статью, так что рекомендую ознакомиться с ним самостоятельно. В нашем проекте я выбрал ограничение на быстрые ответы. Если исполнитель 3 раза из 5 отвечает быстрее, чем за 40 секунд, то система его заблокирует.

Отлично, мы на финишной прямой, осталось чуть-чуть. Сохраняем пул.
В созданном пуле скачиваем пример загрузочного файла. Загружаем наши изображения на Яндекс Диск или к себе на сервер, чтобы они были доступны по ссылке. В поле "INPUT:image" вставляем URL на наши изображения. Пример:
INPUT:image
http://kucev.ru/Kirkorov/Kirkorov-pink_17_ 21787_l_jpg.jpg
http://kucev.ru/Kirkorov/Kirkorov-green_82_ hqdefault_jpg.jpg
http://kucev.ru/Kirkorov/Kirkorov-pink_25_ hqdefault_jpg.jpg
Загружаем полученный tsv файл на Яндекс Толоку. Указываем сколько изображений будет показываться исполнителю за один раз.

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

Теперь нам надо проверить, что со стороны исполнителя все отображается правильно. Для этого создаем новый аккаунт на sandbox.toloka.yandex.ru [10], только теперь в качестве исполнителя. В аккаунте заказчика выбираем вкладку "Пользователи" и добавляем наш новый аккаунт исполнителя в список доверенных пользователей.

Отлично, если наш пул запущен, то теперь из тестового аккаунта исполнителя доступно наше задание.

Нажимаем "Продолжить". Вот так будет выглядеть наша страничка для исполнителей:

Проверяем, что все работает правильно и никаких багов не возникает.




import pandas as pd
data = pd.read_csv('assignments_v0(14.05.18).tsv',sep = 't')
data['OUTPUT:output'] = data['OUTPUT:output'].map({'NO':0,'YES':1})
data_groupby = data.groupby('INPUT:image').sum()
Получили:
data_groupby['OUTPUT:output'].value_counts()
3.0 634
0.0 445
2.0 57
1.0 23
Используя метод голосования, и считая, что на фото Киркоров, если хотя бы два исполнителя проголосовали за него, получили 634 + 57 = 691 фото.

Подводя итог, хочется сказать, что:
Из огромных минусов: нельзя на Толоке размечать персональные данные, так как с исполнителями не подписываются никакие NDA и это будет являеться нарушением 152-ФЗ и GDPR.
Если вам интересна тема по созданию датасетов, то ставьте плюсы и в следующей статье я расскажу, как создавать датасеты для приложения sticky-ai [15].
Автор: Куцев Роман
Источник [16]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/obrabotka-izobrazhenij/282177
Ссылки в тексте:
[1] ODS: https://habrahabr.ru/company/ods/blog/322626/
[2] Coursera: https://www.coursera.org/learn/vvedenie-mashinnoe-obuchenie/home/welcome
[3] ImageNet: http://www.image-net.org/
[4] COCO: http://cocodataset.org/#home
[5] openimages: https://storage.googleapis.com/openimages/web/index.html
[6] Google Images Download: https://github.com/hardikvasa/google-images-download
[7] эту: https://habr.com/company/yandex/blog/305956/
[8] эту: https://habr.com/company/yandex/blog/358462/
[9] инструменты: https://habr.com/company/newprolab/blog/352572/
[10] sandbox.toloka.yandex.ru: https://sandbox.toloka.yandex.ru/
[11] toloka.yandex.ru: https://toloka.yandex.ru/
[12] пул заданий: https://yandex.ru/support/toloka-requester/concepts/pool-main.html
[13] блок контроля качества: https://yandex.ru/support/toloka-requester/concepts/control.html
[14] убил: https://pikabu.ru/story/plokhoy_kod_ubivaet_4456988
[15] sticky-ai: https://sticky-ai.com/
[16] Источник: https://habr.com/post/358574/?utm_source=habrahabr&utm_medium=rss&utm_campaign=358574
Нажмите здесь для печати.