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

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

Решение:
Первым делом нужно составить ТЗ для фрилансеров, которые будут размечать изображения. Так как нам нужно очень высокое качество, то будем размечать изображения в фотошопе.
Спойлер
Если очень хорошее качество нам не нужно, либо выделяемый объект очень простой, то такую разметку можно производить с помощью ломаных линий (polygon vertices). Такой тип разметки доступен на Amazon Mechanical Turk и Яндекс.Толоке, где рабочая сила очень дешевая.
Можно составить ТЗ в виде 10-ти страничного PDF документа, но:
- Фрилансеры обычно не читают ТЗ, а пролистывают.
- В документе сложно описать подробно алгоритм как правильно и быстро надо размечать.
- На составление самого документа уходит очень много времени.
Поэтому сейчас мы полностью отказались от ТЗ в виде PDF документа, а предоставляем задание в
виде обучающего видео. После такого нововведения:
- В 2 раза выросла производительность фрилансеров (так как в видео представлен самый быстрый и оптимальный способ разметки).
- В 3 раза сократились вопросы, задаваемые фрилансерами (так как на видео показан каждый шаг).
- В 2 раза получилось уменьшить стоимость разметки (так как цена часа работы не изменилась, но фрилансеры размечают в два раза быстрее).
Особое внимание надо уделить методу разметки в фотошопе. Фотошоп — очень гибкая программа, в которой производить разметку можно разными способами. Поэтому желательно заранее определить какое качество разметки вам нужно, изучить разные инструменты выделения, сравнить их между собой и выбрать тот, с помощью которого обработка изображения происходит быстрее всего.
Пример:
Есть два способа выделения:
Способ А занимает 5 мин на изображение.
Способ Б занимает 10 мин на изображение.
При способе А за час фрилансер размечает 12 изображений, поэтому цена за изображение будет 150 / 12 = 12.5 руб.
При способе Б за час фрилансер размечает 6 изображений, поэтому цена за изображение будет 150 / 6 = 25 руб.
Итак, мы нашли лучший способ выделения и записали видеоинструкцию, что дальше?
Осталось найти фрилансеров. Есть много бирж фрилансеров, таких как Fl.ru, Weblancer, Фриланс.ру.
Но в последнее время мы используем фриланс-биржу WORK-ZILLA, потому что:
- Там довольно дешевая рабочая сила.
- Много исполнителей.
- Удобный интерфейс для создания заданий.
Для того, чтобы создать задание:
Регистрируемся, пополняем баланс, нажимаем «Дать задание», выбираем «Дизайн»->»Обработка фото».

Заполняем заголовок и описание, определяем время на выполнение задания. Обработав несколько пришельцев, я заметил, что на одно изображение в среднем уходит 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 сегментировать пришельцев не собирается, но на этом примере я хотел показать вам, как просто и с минимальными затратами можно создать свой датасет под любую задачу, будь это детекция пешеходов для беспилотного автомобиля или определение лесов на спутниковых снимках.
- computer vision
- deep learning
- segmentation
- dataset
- фрилансеры
- разметка изображений
- Python
- Data Mining
- Обработка изображений
- Big Data
- Машинное обучение
Подготовка датасета для машинного обучения: 10 базовых способов совершенствования данных

У Колумбийского университета есть хорошая история о плохих данных. Проект в сфере здравоохранения был нацелен на снижение затрат на лечение пациентов с пневмонией. В нём использовалось машинное обучение (machine learning, ML) для автоматической сортировки записей пациентов, чтобы выбрать тех, у кого опасность смертельного исхода минимальна (они могут принимать антибиотики дома), и тех, у кого опасность смертельного исхода высока (их нужно лечить в больнице). Команда разработчиков использовала исторические данные из клиник, а алгоритм был точным.
Но за одним важным исключением. Одним из наиболее опасных состояний при пневмонии является астма, поэтому врачи всегда отправляют астматиков в отделение интенсивной терапии, что приводило к минимизации уровня смертности для этих пациентов. Благодаря отсутствию смертельных случаев у астматиков в данных алгоритм предположил, что астма не так уж опасна при пневмонии, и во всех случаях машина рекомендовала отправлять астматиков домой, несмотря на то, что для них риск осложнений при пневмонии был наибольшим.
ML сильно зависит от данных. Это самый критически важный аспект, благодаря которому и возможно обучение алгоритма; именно поэтому машинное обучение стало столь популярным в последние годы. Но вне зависимости от терабайтов информации и экспертизы в data science, если ты не можешь понять смысл записей данных, то машина будет практически бесполезной, а иногда и наносить вред.
Проблема в том, что во всех массивах данных есть изъяны. Поэтому подготовка данных является очень важным этапом процесса машинного обучения. Если вкратце, то подготовка данных (data preparation) — это набор процедур, помогающий сделать массив данных более пригодным для машинного обучения. В более широком смысле под подготовкой данных также понимают создание подходящего механизма сбора данных. И эти процедуры потребляют подавляющее большинство времени, тратящегося на машинное обучение. Иногда до построения первого алгоритма проходят месяцы!
Можете посмотреть наше 14-минутное видео о подготовке данных:
Как данные подготавливают для машинного обучения
Подготовка массива данных часто оказывается проектом «сделай сам»
Если бы мы рассматривали сферическое машинное обучение в вакууме, то всей подготовкой данных должен был бы заниматься отдельный дата-саентист. И так поступать совершенно правильно. Если у вас в команде нет дата-саентиста, занимающегося очисткой всех данных, то у вас нет и машинного обучения. Но как мы говорили в истории о структуре команд data science, жизнь компаний, не способных позволить себе наличие собственного дата-саентиста, непроста. Им приходится обучать работать в этой сфере собственных инженеров ИТ. Кроме того, подготовка массива данных не сводится только к компетенциям дата-саентиста. Проблемы с массивами данных для машинного обучения проистекают из структуры организации, её сложившихся рабочих процессов и того, придерживаются ли инструкций работники, отвечающие за ведение учёта.
Как работают команды data science
Да, можно полностью положиться в подготовке массивов данных на дата-саентиста, однако если вы заранее будете знать некоторые техники, то это существенно облегчит нагрузку на этого человека, которому предстоит совершать почти геракловы подвиги.
Давайте рассмотрим самые распространённые проблемы с массивами данных и способы их решения.
0. Как собирать данные для машинного обучения, если у вас их нет
Возможность экспериментов с ML зависит от того, собирали ли вы данные в течение многих лет. Некоторые организации настолько успешно копят записи в течение десятков лет, что теперь для их перевозки в облако им требуется грузовик, потому что полосы пропускания Интернет-канала недостаточно.
Молодые организации сталкиваются с нехваткой данных, однако, к счастью, есть способы превратить этот минус в плюс.
Во-первых, используйте для начала работы с ML опенсорсные массивы данных. Существуют целые горы данных для машинного обучения, а некоторые компании (например, Google) с готовностью делятся ими. О возможностях использования публичных массивов данных мы поговорим чуть позже. Хотя такие возможности существуют, реальную ценность обычно представляют данные, полученные из бизнес-решений и действий вашей собственной компании.
Во-вторых, у вас есть шанс собирать данные правильным образом. Компании, начавшие собирать данные ещё с бумажных бухгалтерских книг и закончившие файлами .xlsx и .csv, скорее всего, будут испытывать бОльшие трудности с подготовкой данных, чем гордые обладатели маленького, но удобного для ML массива данных. Если знаешь задачи, которые должно решать машинное обучение, то можно заранее подстроить под них механизм сбора данных.
А что насчёт big data? Это очень популярный термин, кажется, что «большими данными» должны заниматься все. Изначально нацеливаться на big data — это хорошая задумка, однако big data — это не про петабайты. Это о возможности их правильной обработки. Чем больше массив данных, тем сложнее правильно использовать его и делать правильные выводы. Наличие большого количества древесины не означает, что вы обязательно сможете превратить её в склад, заполненный стульями и столами. Поэтому в общем случае новичкам рекомендуется начинать с малого и снижать сложность данных.
1. Формулировать задачу на ранних этапах
Понимание того, что вы хотите прогнозировать, поможет вам решить, какие данные важнее собирать. При формулировании задачи нужно выполнять исследование данных и пытаться думать в категориях классификации, кластеризации, регрессии и ранжирования, о которых мы говорили в нашей статье о применении машинного обучения в бизнесе. Если говорить доступным языком, эти задачи можно разделить следующим образом:
Классификация. Вам нужно, чтобы алгоритм отвечал на простые двоичные вопросы «да или нет» (кошки или собаки, плохо или хорошо, овцы или козы, и так далее), или чтобы он выполнял многоклассовую классификацию (трава, деревья или кусты; кошки, собаки или птицы, и так далее.) Также нужно размечать правильные ответы, чтобы алгоритм мог на них учиться. Прочитайте наше руководство о том, как выполнять разметку данных в организации.
Кластеризация. Вам нужно, чтобы алгоритм находил правила классификации и количество классов. Основное отличие от задач классификации заключается в том, что вы не знаете групп и принципов их разделения. Например, это обычно происходит, когда нужно сегментировать клиентов и выработать отдельный подход к каждому сегменту в зависимости от его качеств.
Регрессия. Вам нужно, чтобы алгоритм выдавал какое-то числовое значение. Например, если вы тратите слишком много времени на подбор подходящей цены на свой продукт, потому что она зависит от множества факторов, алгоритмы регрессии могут помочь в вычислении этого значения.
Ранжирование. Некоторые алгоритмы машинного обучения ранжируют объекты по различным признакам. Ранжирование активно используется для рекомендаций фильмов в сервисах потокового воспроизведения видео или для отображения продуктов, которые покупатель может с высокой вероятностью приобрести, исходя из его предыдущих запросов поиска и покупок.
Вероятно, задачу вашего бизнеса можно решить в рамках этой простой сегментации и вам можно начать соответствующим образом адаптировать массив данных. Как правило, на этом этапе стоит избегать слишком сложных задач.
2. Создать механизмы сбора данных
Создание культуры управления данными в организации — это, вероятно, самая сложная часть всего процесса. Мы вкратце раскрыли этот пункт в статье о стратегии машинного обучения. Если вы стремитесь использовать ML для прогностической аналитики, первым делом нужно решить проблему фрагментации данных.
Например, если взглянуть на технологии сферы туризма — одной из ключевых областей опыта нашей компании — то фрагментация данных здесь является одной из важнейших проблем аналитики. В гостиничном бизнесе отделы, отвечающие за физические свойства, узнают довольно интимные подробности о своих гостях. Отели знают номера кредитных карт гостей, выбираемые ими удобства, иногда домашние адреса, используемые услуги в номере и даже напитки и еду, заказанные во время проживания. Однако веб-сайт, на котором люди бронируют номера, может работать с ними как с совершенно незнакомыми пользователями.
Эти данные накапливаются в разных отделах и даже в разных точках сбора в рамках одного отдела. У маркетологов может быть доступ к CRM, но клиенты в ней не связаны с веб-аналитикой. Если у вас множество каналов привлечения, сопровождения и удержания, объединить все потоки данных в централизованное хранилище возможно не всегда, но в большинстве случаев это вполне можно реализовать.
Обычно сбор данных является задачей дата-инженера — специалиста, отвечающего за создание инфраструктур данных. Однако на ранних этапах можно задействовать разработчика ПО, имеющего опыт работы с базами данных.
Существует два основных типа механизмов сбора данных.
Data Warehouse и ETL
Первый — это размещение данных в warehouse. Эти хранилища обычно создаются для структурированных (или SQL) записей, то есть сохранённых в стандартных табличных форматах. Можно с уверенностью сказать, что к этой категории относятся данные о продажах, зарплатах и CRM. Ещё один традиционный атрибут работы с warehouse — преобразование данных перед загрузкой их в хранилища. Ниже мы подробнее рассмотрим техники преобразования данных, но в общем случае это значит, что вы знаете, какие данные вам нужны и как они должны выглядеть, поэтому перед сохранением выполняете всю необходимую обработку. Такой подход называется Extract, Transform and Load (ETL).
Проблема такого подхода заключается в том, что вы заранее не всегда знаете, какие данные будут полезными, а какие нет. Поэтому warehouse обычно используются для доступа к данным при помощи интерфейсов business intelligence, визуализирующих метрики, которые нам нужно отслеживать. Но существует и другой путь.
Data Lakes и ELT
Data lake («озёра данных») — это хранилища, способные хранить и структурированные, и неструктурированные данные, в том числе изображения, видео, аудиозаписи, файлы PDF, и так далее. Но даже если данные структурированы, перед сохранением они не преобразуются. Данные загружаются в своём исходном виде, а решение о том, как их использовать и обрабатывать, принимается по необходимости. Такой подход называется Extract, Load and Transform.
Подробнее о различиях между ETL и ELT можно прочитать в нашей статье. Так что же вам выбрать? В общем случае следует использовать оба подхода. Считается, что data lake лучше подходят для машинного обучения. Но если вы уверены, по крайней мере, в части данных, стоит хранить их подготовленными, поскольку их можно использовать для аналитики ещё до того, как вы начнёте проект data science.
И помните о том, что современные поставщики услуг облачных data warehouse поддерживают оба подхода.
Учёт человеческого фактора
Ещё одним аспектом является человеческий фактор. Сбор данных может быть монотонным занятием, обременяющим ваших работников и утомляющим их инструкциями. Если люди постоянно должны вручную вести учёт, они могут решить, что их задачи — ещё одна бюрократическая причуда, поэтому пустят их на самотёк. Например, у Salesforce есть хороший набор инструментов для отслеживания и анализа действий торгового персонала, однако ручной ввод данных и логирование действий отталкивает продавцов.
Эту проблему можно решить при помощи систем роботизированной автоматизации процесса (RPA). Алгоритмы RPA — это простые, управляемые правилами боты, способные выполнять монотонные и повторяющиеся задачи.
3. Проверьте качество данных
Первый вопрос, которым нужно задаться: доверяете ли вы своим данным? Даже самые изощрённые алгоритмы машинного обучения не могут работать с некачественными данными. Подробно о качестве данных мы говорили в отдельной статье; в целом вам следует учитывать несколько ключевых моментов.
Насколько ощутимы человеческие ошибки? Если данные собираются или размечаются людьми, то проверьте подмножество данных и определите частоту возникновения ошибок.
Существуют ли технические проблемы с передачей данных? Например, некоторые записи могут дублироваться из-за ошибки на сервере, может произойти сбой хранилища или кибератака. Оцените, насколько эти события повлияли на ваши данные.
Сколько пропущенных значений в ваших данных? Хотя способы работы с пропущенными записями существуют (о них мы поговорим ниже), оцените, насколько критично их количество.
Адекватны ли данные вашей задаче? Если вы продавали бытовую технику в США, а теперь планируете расшириться и на Европу, то можно ли использовать те же данные для прогнозирования наличия и спроса?
Есть ли дисбаланс в данных? Представьте, что мы хотите уменьшить риски в цепочках поставок и отфильтровать тех поставщиков, которых вы считаете ненадёжными; при этом вы используете набор атрибутов (например, местоположение, размер, рейтинг и так далее). Если в размеченном массиве данных 1500 записей помечено как надёжные, и только 30 считаются ненадёжными, то у модели не будет достаточного количества примеров, чтобы обучиться информации о ненадёжных поставщиках.
4. Форматируйте данные, чтобы они были согласованными
Под форматированием данных иногда понимают сам используемый формат файлов. И не так уж сложно преобразовать массив данных в формат файлов, лучше всего соответствующий вашей системе машинного обучения.
Но мы говорим о согласованности форматов самих записей. Если вы собираете данные из разных источников или ваш массив данных вручную дополнялся разными людьми, стоит убедиться, что все переменные для конкретных атрибутов записаны согласовано. Такими переменными могут быть форматы дат, суммы денег (4.03 или $4.03, или даже 4 dollars 3 cents), адреса и так далее. Формат ввода должен быть одинаков для всего массива данных.
У согласованности данных есть и другие аспекты. Например, если у вас в атрибуте есть заданный числовой интервал от 0.0 до 5.0, то убедитесь, что в массиве отсутствуют значения 5.5.
5. Снижайте объём данных
Есть искушение добавлять в массив как можно больше данных, ведь нам нужны «большие данные»! Но такой подход неверен. Да, разумеется, вам нужно собрать все возможные данные. Но если вы подготавливаете массив данных с учётом конкретной задачи, лучше снизить его объём.
Как только вы узнаете, каким является целевой атрибут (значение, которое вы хотите спрогнозировать), дальше вами будет руководить здравый смысл. Вы можете предполагать, какие значения критически важны, а какие добавят массиву данных новые размерности и сложность, никак не влияя на прогнозирование.
Такой подход называется сэмплированием атрибутов.
Например, вы хотите спрогнозировать, какие покупатели склонны делать крупные покупки в вашем онлайн-магазине. Возраст покупателя, его местонахождение и гендер могут лучше предсказывать покупки, чем его номер кредитной карты. Но это работает и в другую сторону. Подумайте, какие ещё значения вам потребуется собирать, чтобы раскрыть другие зависимости. Например, добавление процента отказов может повысить точность прогнозирования конверсии.
На этом этапе важную роль играет опыт в соответствующей сфере. Возвращаясь к истории из начала статьи, надо сказать, что не все дата-саентисты знают, что астма может приводить к осложнениям при пневмонии. То же самое работает и с уменьшением крупных массивов данных. Если вы не наняли гения, имеющего опыт и в основах здравоохранения, и в data science, то высока вероятность, что дата-саентист с трудом поймёт, какие значения действительно важны для массива данных.
Ещё один подход называется сэмплированием записей. Он подразумевает, что вы просто удаляете записи (объекты) с отсутствующими, ошибочными или менее репрезентативными значениями, чтобы сделать прогноз более точным. Эту технику также можно использовать на поздних этапах, когда вам нужен прототип модели, чтобы понять, выдаёт ли выбранный метод машинного обучения нужные результаты, и определить ROI вашего проекта ML.
Также можно уменьшать объём данных, выполняя их агрегирование в более масштабные записи при помощи разделения всех данных атрибутов на несколько групп и вычисляя значение для каждой группы. Вместо того, чтобы изучать продукты, самые покупаемые в заданный день на протяжении пяти лет существования онлайн-магазина, можно агрегировать их в еженедельные или ежемесячные показатели. Это поможет уменьшить размер данных и время вычислений без существенных потерь в точности прогнозов.
6. Выполните очистку данных
Так как отсутствующие значения могут осязаемо снизить точность прогнозирования, сделайте эту проблему приоритетной. С точки зрения машинного обучения, предполагаемые или аппроксимируемые значения «более точны» для алгоритма, чем просто отсутствующие. Даже если вы не знаете точного значения, существуют способы лучшего «угадывания» отсутствующего значения или обхода этой проблемы. Как очищать данные? Выбор правильного подхода тоже сильно зависит от данных и сферы деятельности:
- Замена отсутствующих значений подставными, например, n/a для категорических значений или 0 для числовых значений.
- Замена отсутствующих числовых значений средними значениями.
- В случае категорических значений можно использовать наиболее часто используемые элементы.
7. Создавайте новые признаки из уже существующих
Некоторые значения в вашем массиве данных могут быть сложными и разбиение их на несколько частей поможет в выявлении более специфических взаимосвязей. Этот процесс противоположен снижению объёму данных, так как вам нужно добавлять новые атрибуты на основании имеющихся.
Например, если показатели продаж зависят от дня недели, то отделение дня недели от даты в новое категорическое значение (Mon; 06.19.2017) может предоставить алгоритму более подходящую информацию.
8. Объединение данных транзакций и атрибутов
Данные транзакций состоят из событий, фиксирующих определённые моменты, например, какой была цена на ботинки, и время, когда пользователь с этим IP нажал на кнопку Buy now.
Данные атрибутов более статичны, например, это демография или возраст пользователей, они не имеют прямой связи с конкретными событиями.
Возможно, у вас есть множество источников данных или логов, где хранятся эти типы данных. Оба типа могут усиливать друг друга, повышая точность прогнозов. Например, если вы отслеживаете показания датчика станка, чтобы обеспечить прогнозируемое техобслуживание, то с большой вероятностью вы генерируете логи данных транзакций, но можно добавить в них и такие качества, как модель оборудования, партия и его местоположение, чтобы поискать зависимости между поведением оборудования и его атрибутами.
Также можно агрегировать данные транзакций в атрибуты. Допустим, вы собираете логи сессий работы с веб-сайтом, чтобы назначать разным пользователям разные атрибуты, например, исследователь (в среднем посещает 30 страниц, редко покупает), читатель обзоров (от начала до конца изучает страницу обзоров), мгновенный покупатель и так далее; тогда вы можете использовать эти данные, например, для оптимизации кампаний ретаргетинга или прогнозирования жизненного цикла клиента.
9. Ремасштабируйте данные
Ремасштабирование данных относится к группе процедур нормализации данных, нацеленных на улучшение качества массива данных уменьшением размерностей и устранением ситуаций, когда одно из значений перевешивает другие. Что это значит?
Представьте, что вы управляете сетью центров по продаже автомобилей и большинство атрибутов в вашем массиве данных является или категорическим (описание моделей и типов кузовов — седан, хэтчбек, вэн и так далее), или содержат числа из 1-2 разрядов, допустим, длительность пользования автомобилем в годах. Однако цены состоят из 4-5 разрядов ($10000 или $8000), а вам нужно спрогнозировать среднее время продажи автомобиля в зависимости от его характеристик (модель, сколько лет им пользовались, тип кузова, цена, состояние и так далее). Хотя цена является важным критерием, она не должна перевешивать все остальные из-за того, что имеет большее значение.
В данном случае можно использовать нормализацию (min-max normalization). При нормализации числовые значения преобразуются в интервалы, например, от 0.0 до 1.0, где 0.0 обозначают минимальные, а 1.0 — максимальные значения для выравнивания веса атрибута цены с другими атрибутами в массиве данных.
Немного более простым подходом является десятичное масштабирование. При нём данные масштабируются перемещением запятой в десятичной дроби с теми же целями.
10. Дискретизация данных
Иногда можно повысить эффективность прогнозов, превратив числовые значения в категорические. Этого можно достичь, например, разделив весь интервал значений на несколько групп.
При отслеживании значений возраста нет особой разницы между 13 и 14 годами или между 26 и 27 годами. Следовательно, их можно преобразовать в соответствующие возрастные группы. Превратив значения в категорические, вы упрощаете работу алгоритма и делаете прогнозы более релевантными.
Публичные массивы данных
Ваши частные массивы данных отражают специфику вашего уникального бизнеса и потенциально могут содержать все релевантные атрибуты, которые потребуются для прогнозов. Но когда же можно использовать публичные массивы данных?
Публичные массивы данных берутся у организаций и бизнесов, которые готовы ими делиться. Эти массивы обычно содержат информацию об общих процессах в широком диапазоне сфер жизни, например, медицинские данные, исторические климатические данные, метрики транспортирования, коллекции текстов и переводов, записи об использовании оборудования и так далее. Хотя они не помогают выявлять зависимости между данными в вашем собственном бизнесе, их можно использовать для глубокого понимания вашей отрасли и её ниш, а иногда и сегментов клиентов.
Подробнее об открытых источника данных можно прочитать в нашей статье про лучшие публичные массивы данных и ресурсы, хранящие эти данные.
Ещё один способ применения публичных массивов данных — в стартапах и бизнесах, использующих техники машинного обучения для выпуска продуктов на основе ML. Если вы получаете рекомендации о достопримечательностях города и ресторанах на основании генерируемого пользователями контента, то вам не нужно размечать тысячи изображений для обучения алгоритма распознавания изображений, сортирующего присылаемые пользователями фотографии. Существует созданный Google массив данных Open Images. Похожие массивы данных существуют для распознавания речи и текста. Также на GitHub можно найти коллекцию публичных массивов данных. Часть публичных массивов является коммерческой и распространяется платно.
Поэтому даже если вы собирали данные в течение многих лет, стоит поискать что-то ещё. Возможно, существуют массивы, которые вы можете использовать без подготовки.
Заключение: вам всё равно нужен дата-саентист
Описанные в статье способы подготовки данных просты и понятны. Однако вам всё равно нужно найти дата-саентистов и дата-инженеров, если требуется автоматизация механизмов сбора данных, создание инфраструктуры и масштабирование до сложных задач машинного обучения.
Смысл в том, что глубокое понимание сферы деятельности и задач поможет в правильном структурировании значений ваших данных. Если вы находитесь на этапе сбора данных, возможно, будет разумно пересмотреть существующие подходы к получению и форматированию информации.
- разметка данных
- data labeling
- computer vision
- машинное обучение
- data annotation
- dataset
- Training Data
- разметка датасета
- Data Mining
- Обработка изображений
- Big Data
- Машинное обучение
- Искусственный интеллект
Как создать нейросеть с помощью chatGPT

ChatGPT – прекрасное средство для создания и обучения нейронных сетей, подготовки датасетов и проведения экспериментов.
erid: LjN8KTEeS
ООО «ИТ Медиа»

erid: LjN8KXX2o
ИТ Медиа

Многие слышали о нашумевшей нейронной сети chatGPT от OpenAI, которая способна решать множество текстовых задач: отвечать на вопросы, генерировать идеи и т. д. ChatGPT успешно используется для программирования, так как умеет писать код, находить ошибки в коде, комментировать код и многое другое. Логично, что мы, как Университет искусственного интеллекта, специализируемся на искусственном интеллекте и, естественно, решили попробовать использовать chatGPT для генерации и обучения нейронных сетей и проведения экспериментов. У нас это получилось: chatGPT не только применима, но и значительно упрощает работу по генерации архитектуры нейронных сетей и проведению экспериментов. Ниже приводен пример решения задачи классификации водителей на внимательных, засыпающих, отвлекающихся на телефон и т. п. — классификация изображений на 10 классов. Типовая задача, решать ее мы будем комплексно, начиная с подготовки датасета, который необходим для обучения нейронных сетей. В нашем случае это zip-архив, который надо скачать, подготовить, превратить в обучающие выборки, нормировать и преобразовать перед тем, как подать в нейронную сеть. Часто это гораздо больший рутинный труд для разработчика, чем само обучение нейронной сети. Мы сделаем и то, и другое исключительно с помощью запросов к chatGPT — вся статья представляет собой только запросы в chatGPT, без единой строчки рукописного кода – это был важный критерий. Приводим успешные запросы и пару ошибок для примера. При работе с chatGPT важно уметь правильно задать системе запрос. Она умная и отлично понимает даже сложные комплексные запросы, но иногда человек формулирует запрос так, что системе он не понятен. Поэтому важный скил программирования с помощью chatGPT – промт-инжиниринг, умение правильно поставить задачу. Вообще работа с chatGPT похожа на работу с очень умным junior’ом, который знает всё, что только можно знать в Интернете, но некоторые задачи понимает не так, как нужно. И, повторяю, результат зависит от умения правильно поставить ему задачу. Важный момент: мы будем обсуждать машинное обучение, создание нейронных сетей, поэтому аудитория может разделиться на две части. Первая – те, кто разбирается в машинном обучении и в библиотеке Keras. Для них будут интересны и сами запросы к chatGPT, которые мы сформулировали, и код, который она создает. Вторая часть аудитории – это разработчики, которые не разбираются в машинном обучении и Keras. Скорее всего, им будет не совсем понятно, что происходит (что такое слои, что такое эпохи, что такое батчи), но будет интересен сам формат запросов к chatGPT и то, как мы их формулируем. Возможно, в дальнейшем вы захотите либо изучать машинное обучение, либо программировать с помощью chatGPT, и тогда вам будет полезно посмотреть, какие бывают запросы, как мы их переструктурируем в случае ошибки, даже если вы не до конца будете понимать код созданной нейронной сети на Keras. Рассказываем, как устроены наши данные и как их нужно подготовить для подачи в сеть.
Запрос № 1 к chatGPT:
Напиши подготовку тренировочных данных для нейронной сети по классификации изображений, для чего напиши код скачивания датасета при помощи gdown по этой ссылке и код разархивации датасета из zip-формата в директорию ‘content/cars’. Датасет не поделен на train и test. Он состоит из 10 папок (название каждой соответствует названию категории), каждый файл необходимо открыть при помощи Image.open, не используй генератор. Добавь в код масштабирование данных и приведи y_train к формату one hot encoding. Используй LabelEncoder для кодирования строковых меток в целые числа. Определи список названий классов и количество классов. Создай простую keras-модель на получившихся данных. Ответ chatGPT: import os import gdown import zipfile from PIL import Image from sklearn.preprocessing import LabelEncoder from sklearn.utils import shuffle from sklearn.model_selection import train_test_split import numpy as np from keras.utils import to_categorical from keras.models import Sequential from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D # Скачиваем датасет url = ‘ https://storage.yandexcloud.net/aiueducation/marketing/datasets/reality.zip' ; gdown.download(url, ‘reality.zip’, quiet= False ) # Распаковываем набор данных with zipfile.ZipFile( «reality.zip»,»r» ) as zip_ref: zip_ref.extractall( «content/cars» ) # Загружаем изображения и ярлыки X = [] y = [] classes = os.listdir( «content/cars» ) for i, class_name in enumerate ( classes ): for image_name in os.listdir( «content/cars/» + class_name): image = Image. open ( «content/cars/» + class_name + «/» + image_name) image = image.resize(( 64, 64 )) X.append(np.array(image)) y.append(class_name) # Масштабируем данные X = np.array(X) / 255.0 # Кодируем ярлыки label_encoder = LabelEncoder() y = label_encoder.fit_transform(y) # Приводим ярлыки к формату One-hot encoding num_classes = len(np.unique(y)) y = to_categorical(y, num_classes) # Перемешиваем данные X, y = shuffle(X, y) # Делим набор данных на тренировочную и тестовую выборки X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Создаем простую модель keras model = Sequential() model.add(Conv2D( 32 , ( 3, 3 ), activation= ‘relu’ , input_shape=( 64, 64, 3 ))) model.add(MaxPooling2D(( 2, 2 ))) model.add(Flatten()) model.add(Dense(num_classes, activation= ‘softmax’ )) model. compile (optimizer= ‘adam’ , loss= ‘categorical_crossentropy’ ,
metrics=[ ‘accuracy’ ])
Запрос № 2 к chatGPT:

Теперь напиши, как дополнить этот код, чтобы запустить обучение модели на 10 эпохах, построй график точности по эпохам. Ответ chatGPT: import matplotlib.pyplot as plt # Обучаем модель history = model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test)) # Рисуем график точности по эпохам обучения plt.plot(history.history[ ‘accuracy’ ]) plt.plot(history.history[ ‘val_accuracy’ ]) plt.title( ‘Model accuracy’ ) plt.ylabel( ‘Accuracy’ ) plt.xlabel( ‘Epoch’ ) plt.legend([ ‘Train’ , ‘Test’ ], loc= ‘upper left’ ) plt.show()
Текстовый комментарий chatGPT: «Добавив этот код, мы запускаем обучение модели на 10 эпохах. Мы сохраняем результат обучения в переменной history, чтобы построить график точности модели по эпохам. Мы используем plt.plot() для отображения истории обучения из history.history[‘accuracy’] (точность на обучающем наборе) и history.history[‘val_accuracy’] (точность на тестовом наборе). И далее добавляем легенду и отображаем график».
Запрос № 3 к сhatGPT:
Это слишком простая модель. Создай более мощную модель, код запуска обучения, график точности, проверь в цикле различные batch_size (32, 64, 128). Ответ chatGPT: from keras.layers import Dropout, BatchNormalization # Создаем более мощную модель model = Sequential() model.add(Conv2D(32, (3, 3), activation= ‘relu’ , input_shape=( 64, 64, 3 ))) model.add(BatchNormalization()) model.add(MaxPooling2D(( 2, 2 ))) model.add(Conv2D( 64 , ( 3, 3 ), activation= ‘relu’ )) model.add(BatchNormalization()) model.add(MaxPooling2D(( 2, 2 ))) model.add(Conv2D( 128 , ( 3, 3 ), activation= ‘relu’ )) model.add(BatchNormalization()) model.add(MaxPooling2D(( 2, 2 ))) model.add(Flatten()) model.add(Dropout( 0.5 )) model.add(Dense(num_classes, activation= ‘softmax ‘ )) model. compile (optimizer= ‘adam’ , loss= ‘categorical_crossentropy’ ,
metrics=[ ‘accuracy’ ]) batch_sizes = [ 32, 64, 128 ] for batch_size in batch_sizes: # Обучаем модель history = model.fit(X_train, y_train, epochs=10, batch_size=batch_size,
validation_data=(X_test, y_test)) # Рисуем график точности по эпохам обучения plt.plot(history.history[ ‘accuracy’ ]) plt.plot(history.history[ ‘val_accuracy’ ]) plt.title( f ‘Model accuracy with batch size ‘) plt.ylabel( ‘Accuracy’ ) plt.xlabel( ‘Epoch’ ) plt.legend([ ‘Train’ , ‘Test’ ], loc= ‘upper left’ ) plt.show()

Получилось не совсем то, что мы хотели: код, созданный chatGPT, не проверяет точность при разных batch_size, а дообучает модель на их разных размерах. Необходимо было более точно составить запрос.
Запрос № 4 к chatGPT:
Сделай код запуска этой модели в цикле с разными размерами batch_size (32, 64, 128), выведи график точности по каждому запуску. Ответ chatGPT: batch_size_list = [ 32, 64, 128 ] for batch_size in batch_size_list: # Создаем более мощную модель model = Sequential() model.add(Conv2D( 32 , ( 3, 3 ), activation= ‘relu’ , input_shape=( 64, 64, 3 ))) model.add(BatchNormalization()) model.add(MaxPooling2D(( 2, 2 ))) model.add(Conv2D(64, ( 3, 3 ), activation= ‘relu’ )) model.add(BatchNormalization()) model.add(MaxPooling2D(( 2, 2 ))) model.add(Conv2D( 128 , ( 3, 3 ), activation= ‘relu’ )) model.add(BatchNormalization()) model.add(MaxPooling2D(( 2, 2 ))) model.add(Flatten()) model.add(Dropout( 0.5 )) model.add(Dense(num_classes, activation= ‘softmax’ )) model. compile (optimizer=’adam’, loss= ‘categorical_crossentropy’ , metrics=[ ‘accuracy’ ]) # Обучаем модель history = model.fit(X_train, y_train, epochs=10, batch_size=batch_size,
validation_data=(X_test, y_test))
# Рисуем график точности по эпохам обучения plt.plot(history.history[‘accuracy’], label= f ‘batch size : ‘ ) plt.title( ‘Model accuracy with different batch sizes’ ) plt.ylabel( ‘Accuracy’ ) plt.xlabel( ‘Epoch’ ) plt.legend(loc= ‘upper left’ ) plt.show()

Таким образом, мы получили (хоть и не с первого раза) то, что хотели (почти). Стоило добавить, что графики нужно было отрисовывать по точности на проверочной выборке.
Запрос № 5 к chatGPT:
- Использование более мощной модели: использование большего количества сверточных слоев, нейронов и слоев связи.
- Использование более большого датасета: использование большего количества данных для обучения модели может увеличить точность.
- Дополнительная аугментация данных: использование аугментации данных, такой как повороты, масштабирование и другие, может помочь модели обобщаться на новые данные.
- Использование сверточных сетей, предварительно обученных (Transfer Learning): использование предварительно обученных сверточных сетей может существенно увеличить точность модели.
- Использование другой оптимизации и другой функции потерь для обучения модели: использование более эффективных алгоритмов оптимизации, таких как Adam, RMSprop или Adagrad и использование более подходящей функции потерь для задачи классификации, такой как categorical_crossentropy или sparse_categorical_crossentropy, может помочь улучшить точность модели.
- Использование регуляризации: использование регуляризации, такой как L1 и L2, может помочь предотвратить переобучение модели.
- Использование стандартизации данных: использование стандартизации данных может помочь сделать данные более однородными и улучшить точность модели.
Запрос № 6
Сделай в цикле проверку точности последней модели с разными оптимизаторами и выведи график сравнения полученных точностей.
Ответ chatGPT:
from keras import optimizers
optimizer_list = [ ‘adam’, ‘sgd’, ‘rmsprop’, ‘adagrad’ ]
for optimizer in optimizer_list:
Как за 75 долларов собрать датасет из 50 тысяч изображений: опыт стартапа Neatsy
Разбор кейса сбора большого датасета через краудсорсинг с поэтапным описанием.
Роман Куцев
дата-инженер в компании Neatsy
Привет! Я — Роман Куцев, дата-инженер в компании Neatsy. Мы с командой разрабатываем приложение, с помощью которого можно с первого раза заказать в интернете комфортную обувь. Наша идея — помочь людям подбирать обувь онлайн, а интернет-магазинам не терять деньги на возвратах. Чтобы осуществить задумку, нам нужно было обучить нейросеть — собрать и разметить 50 тысяч фотографий ног разного размера. Расскажу, как мы решали задачу, какие набили шишки и почему краудсорсинг — удобный инструмент для сбора данных.
Обратиться к 200 знакомым, собрать 3000 фотографий и попасть в два чёрных списка
Итак, перед нами задача: собрать датасет из 50 тысяч фотографий, чтобы научить алгоритм автоматически строить 3D-модель стопы и определять её размер даже при плохом освещении и на пёстрой плитке. Мы составили требования к съёмке с учётом разных условий:
- освещение: искусственное, дневной свет, сумерки;
- фон: паркет, линолеум, пушистый ковер, разноцветная плитка — годилось всё;
- цвета кожи: от светлых до тёмных;
- ракурсы ног: под разными углами, сверху, снизу, сбоку.
Мне уже приходилось искать исполнителей для разметки данных: до Neatsy я работал в Prisma, где тоже нужно было собирать данные для обучения нейронных сетей. В Prisma нам повезло: наш разработчик Вячеслав Тарасов параллельно преподавал в Воронежском государственном университете, и у него был доступ к большому числу студентов. Не знаю, как он их мотивировал — хорошей оценкой или «автоматом», но студенты присылали нужные фото и видео, и мы успешно собирали данные.
Практика Data Science: где искать датасеты и что с ними делать — отвечают эксперты
У команды Neatsy не было доступа к студентам, поэтому мы нашли другой способ: публиковали сториз, звонили и писали всем друзьям, знакомым и родным, безбожно отвлекали их от дел, просили заснять свои ноги и отправить нам. Мы были как секта сетевого маркетинга. Двое наших знакомых даже добавили нас в чёрный список.
Осознать, что всё не так просто
Увы, стратегия оказалась проигрышной. Во-первых, на наш клич отозвались всего 200 человек, потому что круг знакомых всё-таки ограничен.
Во-вторых, такой метод отнимал слишком много сил и времени. Нужно написать каждому и рассказать, что сделать; дождаться данных, скачать и перепроверить. На одного человека уходило в среднем 20 минут. Потребовалось бы около восьми рабочих дней, чтобы собрать 200 видео. А нам нужно было больше, чем 200 видео.
Поясню, почему мы собирали видео, а не фото. Если обучать нейронную сеть на тех же данных, которые ожидаются в реальной жизни, качество её работы будет выше. А мы планировали обучить нейронную сеть сегментировать ноги по видеопотоку. Поэтому кадры, нарезанные из видео, были предпочтительнее фотографий.
В общей сложности мы собрали около 3000 изображений. В принципе, для проверки гипотез и создания MVP этого достаточно. Но чтобы создать продукт, который работает в любом месте и на каждом человеке, данных надо намного больше.
Встать на нужные рельсы
Набив шишки, мы решили пойти по другому пути и отдать задачу в Яндекс.Толоку. Вот несколько моментов, которые были нам на руку:
- Передача авторских прав. Юристы в международных компаниях часто беспокоятся о чистоте и прозрачности передачи прав на результаты интеллектуальной деятельности. В Толоке всё было просто и однозначно: результаты разметки принадлежат заказчику. Словом, можно спать спокойно.
- Гибкое масштабирование. Нам понравилось, что Толока работает как биржа: мы дали задание — его выполняют, не дали — исполнители занимаются другими заданиями и ничего от нас не ждут. Это намного удобнее, чем нанимать штат разметчиков, которым не будет хватать нагрузки: рано или поздно актуальные задачи могут закончиться.
- Огромное количество исполнителей. На краудсорсинговых платформах ежедневно работают десятки тысяч исполнителей. Мы подсчитали, что с нашей задачей, которую штат разметчиков будет делать три недели, разметчики на краудсорсинговой платформе справятся за день.
- Стоимость разметки. Забегу вперёд и скажу, что мы получили огромный объём фотографий за пять дней, потратив на это меньше 100 долларов.
Теперь к делу — расскажу, как мы собирали данные и что из этого вышло.
Грамотно настроить пайплайн
Основное правило краудсорсинга гласит: большую задачу нужно декомпозировать — то есть разбить на множество маленьких подзадач. Мы прикинули, из каких этапов будет состоять проект, и разделили его на четыре части.
1. Сбор видео
Первым делом мы попросили толокеров снять ноги на видео и показали видеопример: лучше один раз увидеть, чем сто раз услышать. В первой инструкции мы клали на пол любую пластиковую карточку, предполагая, что карточка в кадре поможет улучшить точность построения 3D-скана. Но прироста в точности это не дало, так что мы отмели эту идею, и финальные условия стали такими:
- продолжительность записи — 20–60 секунд (нам нужно около 30 секунд видео от одного толокера, чтобы на выходе получить 30–50 различных кадров от каждого);
- камеру навести на ноги без носков и обуви, с подвёрнутыми до икр штанами;
- помещение не должно быть слишком тёмным;
- видео снять с самых разных ракурсов: мы просили менять высоту, и угол съёмки.
Вот как выглядела инструкция:
Она неспроста такая подробная: чем чётче вы всё распишете, тем точнее разметчики выполнят задание и тем умнее будет нейросеть.
За 2 дня и 17 часов мы собрали 2472 ролика. Чтобы видеозаписи были как можно разнообразнее, мы установили ограничение на количество заданий. Один толокер мог прислать нам только одно видео.
Задание было с отложенной приёмкой: мы отправляли полученные видео на проверку следующей группе исполнителей и спрашивали, верно ли записан ролик. После этого первой группе исполнителей выплачивали деньги — только тем, чьи ролики были приняты.
2. Проверка видео и фото
На этом этапе исполнители определяли, соответствует ли техническому заданию присланный первыми толокерами контент. Но сначала пользователи проходили обучение, и доступ открывался только тем, кто хорошо выполнял задания. Работало это так: мы просили проверить 30 видео (для каждого из которых знали правильный ответ) и считали число правильных ответов у исполнителя. Если точность была больше 85%, мы допускали его к основному заданию.
Вот как выглядела инструкция на этом этапе:
Обратите внимание на первый абзац: очень важно говорить исполнителям, для чего они работают. Понимая, что их труд уходит не впустую, они активнее включаются и качественнее выполняют задания
Также было важно настроить правила контроля качества: от них зависит и качество датасета, и мотивация исполнителей — можно выявлять и блокировать тех, кто плохо выполняет задания, и поощрять тех, кто исправно работает. Чтобы поощрять хороших исполнителей, мы платили больше денег за задания, которые были выполнены более качественно, а чтобы отсеивать недобросовестных исполнителей, использовали ханипоты и блокировку за слишком быстрые ответы. Ханипоты — это «проверочные» задания, для которых мы заранее знаем правильный ответ. Внешне они не отличаются от остальных, но по ответам на эти задания можно определить, насколько хорошо толокер выполняет задачу.
Из 2472 видео мы приняли 1507. За каждый принятый ролик мы заплатили 0,025 доллара, ещё 7,41 — за проверку всех роликов. То есть всего к этому этапу проекта мы потратили 45 долларов. На мой взгляд, это очень круто.
3. Раскадровка видео
Следующий этап — разбивка видео на кадры. Мы сделали это автоматически, не привлекая толокеров. Я использовал программу FFmpeg, которая очень быстро работает с картинками и видео. В процессе участвовал каждый десятый кадр, и из 1507 видео мы собрали 156 576 кадров, получив в три раза больше изображений, чем планировали.
Ищем свободное парковочное место с Python и глубоким обучением
Но для качественного обучения нейронной сети нужен вариативный датасет: в нём должны быть непохожие друг на друга картинки. В нашем случае в датасете получилось много кадров-близнецов, оставив которые, мы не добились бы повышения качества, а только потратили много денег на разметку. Поэтому я удалил их автоматически, используя библиотеку ImageHash. Для каждого изображения я получил хэш — набор чисел, который характеризует изображение. Алгоритм составления хэша так устроен, что похожие картинки будут иметь похожий хэш, а разные — разный. Кластеризовав хэши, я нашёл все похожие изображения и оставил только по одному кадру в каждом кластере. На следующем этапе толокеры проверяли 57 тысяч кадров.
4. Проверка кадров — финальный этап в Толоке
Завершающий этап работы в Толоке — проверка кадров. Иногда во время съёмки может дёрнуться рука, и на видео появляются размытые кадры. Мы удалили размытые и отобрали чёткие изображения, на которых видна стопа человека. Вот как это выглядело:
Весь процесс в Толоке я менеджерил в одиночку. Вначале проект довольно трудно настроить (написать интерфейс, инструкции, выстроить контроль качества), но, когда он налажен, всё идёт само по себе и не требует постоянного внимания.
5. Бонус: досбор контента на Amazon Mechanical Turk
На тот момент в Толоке работали в основном жители России и стран СНГ, и мы получали фото ног с достаточно светлой кожей. Нам же хотелось, чтобы нейронная сеть могла работать в том числе и на более смуглой коже. Сейчас такой проблемы уже нет — в Толоке появились исполнители из Индии и Африки, но тогда нам пришлось собирать другие оттенки через платформу Amazon Mechanical Turk.
Мы создали одно задание, в котором просили людей заснять свои ноги, загрузить видео на файлообменник и прислать нам ссылку. Задание было с отложенной приёмкой, проверкой занимался наш стажёр.
Если сравнивать цены, стоимость одного видео в Amazon была выше, чем в Толоке — 0,1 доллара. Что касается качества — некоторые исполнители, как и в Толоке, присылали неправильные видео, но мы их отклоняли и не платили за эти задания.
Оглянуться и сделать выводы
Вот наши результаты:
- собрали: 156 576 кадров;
- применили в деле: 50 994 изображения;
- потратили времени: 5 дней;
- потратили денег: 75 долларов.
Мы боялись, что в Толоке никто не захочет выполнять нашу странную задачу. Но к счастью, этот страх не оправдался, и мы получили то, за чем пришли. Мы переживали, что толокеры будут халтурить и неправильно выполнять задания, но с помощью инструментов контроля качества нам удалось сделать так, чтобы люди присылали то, что нужно. И самое главное — мы собрали необходимые данные меньше чем за неделю!
А на днях мы наконец закончили разработку и выпустили приложение в свет. Но это уже совсем другая история.

Следите за новыми постами по любимым темам
Подпишитесь на интересующие вас теги, чтобы следить за новыми постами и быть в курсе событий.