Рецепт идеальной разметки в Computer Vision

За два года команда RnD CV из SberDevices выложила в открытый доступ три датасета для задач компьютерного зрения: HaGRID, EasyPortrait и Slovo. Чтобы достичь максимальной точности обработки данных, полученных с краудсорсинговых платформ, мы применили методы агрегации, которые позже объединили в фреймворк.

Привет, Хабр! На связи Карина Кванчиани и Александр Капитанов из SberDevices. В этой статье мы расскажем о фреймворке агрегации разметки данных, который использует наша команда и коллеги из других подразделений. AggregateMe помогает привести несколько разметок к одной и повысить её качество в случае, если исполнители где-то ошиблись. Скоро фреймворк появится в открытом доступе, а здесь расскажем, как он работает.

Начало проектирования фреймворка

Наша команда делала разные датасеты для проектов сервиса видеоконференций Jazz, генерации картинок по тексту Kandinsky и проекта распознавания русского жестового языка.

Разработка фреймворка агрегации и разметки данных началась с HaGRID — самого большого и x`разнородного набора данных жестов. Этот набор был размечен обрамляющими прямоугольниками (bounding box) для задач детекции. Вторым важным набором стал Easy Portrait, где разметка выполнена значительно сложнее, включая сегментационные маски для портретной сегментации (portrait segmentation) и анализа лиц (face parsing). Третий набор данных Slovo состоял из видео, размеченных временными интервалами, каждое из которых демонстрировало определённый жест на русском жестовом языке, а временной интервал указывал на начало и конец каждого жеста.

f205d097e416b0e841998744183a9dd6.jpg

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

Способы разметки в Computer Vision

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

  • Нейросети не всегда обеспечивают точную разметку и могут допускать даже очень простые ошибки, которые человек бы не допустил. Это повлияет на обучаемую модель. 

  • Второй момент — если нейронная сеть успешно размечает данные, возникает вопрос: нужны ли они вообще, если сетка и так хорошо предсказывает этим данным метки?

Другой способ — ручная разметка. Её можно разделить на несколько типов:

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

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

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

Методы агрегации разметки

Одной из главных фичей краудсорсинга является перекрытие. Это означает, сэмплы одних и тех же данных могут размечаться несколькими специалистами, чтобы в дальнейшем можно было агрегировать их ответы. Для задач классификации обычно используется метод мнения большинства. Такой подход позволяет получить итоговый ответ, который будет более надёжным и точным, чем если бы данные размечал один человек.

2049d0d1d1021c6c2114a32083a9d5f1.jpg

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

Ошибки в разметке есть всегда. Главная сложность методов агрегации — правильно их обработать. Мы начинали проектировать методы как раз с анализа ошибок. Дальше посмотрим, что мы выявили при создании трёх ранее описанных наборов данных.

7597e3a3e3ee528ca76233820b30658b.jpg

Анализ ошибок разметки

Начнём с разметки, где данные аннотировались при помощи боксов, и каждая рука выделялась отдельно.

03ff0c81049b8ccd4b785228e18fe8be.jpg

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

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

a7f4ad83f8563515c285def62bf65d50.png

При работе с временными интервалами ошибки аналогичны тем, что встречаются при работе с боксами: неправильное местоположение интервалов, ошибочные метки, пропуски. Типичной ошибкой является объединение двух отдельных действий в один интервал.

a9693c7db91a38622646133be9d57892.jpg

Обзор пайплайна

Чтобы улучшить качество и консистентность, разметку нужно провести через несколько методов агрегации: hard, soft и drop. Hard-агрегация основана на жёстких правилах согласованности разметок, soft-агрегация — на статистически значимых тенденциях, даже если они не полностью совпадают, drop-агрегация — на основе аномальности или ошибочности аннотаций отдельных исполнителей.

Hard-агрегация

Разметка начинается с hard-агрегации. Основная цель метода — проверить всю разметку, полученную с краудсорсинга для одного сэмпла, и оценить, насколько она согласована, чтобы привести её к итоговому виду.

bf596d6be6c1cc1b857475dce742fef0.jpg

Hard-агрегация для разметки боксами

Для оценки согласованности разметки в боксах делаем следующее:

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

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

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

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

5. Сравниваем разметки между собой с помощью IoU (Intersection over Union) и сопоставляем полученные значения с порогом (threshold). Если значение IoU превышает threshold, то можем просто усреднить координаты боксов каждой группы, чтобы получить уверенный ответ.

Intersection over Union — это метрика, которая проверяет две разметки между собой, насколько они идентичны. Для этого берём пересечения боксов, масок или интервалов и делим это значение на их объединение.

2a151ab3275d55e1febecdfcf2b57534.jpg

Hard-агрегация для интервальной разметки

Алгоритм hard-агрегации для интервалов схож с тем, что используется для боксов, поскольку типы ошибок похожи:

  1. Проверяем количество интервалов.

  2. Делим интервалы на группы. Метод кластеризации здесь будет не 1D, как для боксов, а 2D.

  3. Убеждаемся, что в каждой группе правильное количество интервалов.

  4. Проверяем, все ли метки корректно расставлены.

  5. Проводим проверку IoU для оценки точности совпадения интервалов внутри групп.

52b506cdc598b724f7249dbb749cf355.jpg

Hard-агрегация для масок

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

fe440e12496c4a583fa50cd31d4bc558.jpg

Здесь нельзя каждую отдельно размеченную маску рассматривать как самостоятельную сущность. Поэтому hard-агрегация для масок выглядит просто: мы только проверяем совпадение с помощью метрики IoU.

Drop- и soft-агрегация

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

Например, у нас четыре разметчика, и один из них ошибся. Мы анализируем комбинации разметок трёх из четырёх, чтобы увидеть, проходят ли они hard-агрегацию. Если результаты удовлетворительны, то в большинстве случаев 75% уверенности достаточно для качественной разметки.

3d08a39ccc7b071acbff6921519cd801.jpg

А что происходит, если разметка не проходит ни через hard-, ни через drop-агрегацию? Вероятно, это указывает, что в данных присутствует не одна, а несколько ошибок. В таком случае применяем более сложный метод — soft-агрегацию.

Soft-агрегация применяется, когда уже известно о наличии ошибок. Цель — привести разметку к такому согласованному виду, чтобы дальше она успешно прошла через hard-агрегацию с более жёсткими условиями для проверки и 100% уверенностью в качестве разметки.

ed1249d12b4b914f4f4957531768b1ed.jpg

Рассмотрим процесс для каждого типа разметки по отдельности.

Soft-агрегация для разметки боксами

  1. Первым делом избавляемся от мусорной разметки. Удаляем слишком маленькие боксы, которые не могут содержать в себе объект и дубликаты.

  2. Делим разметку на группы, как в hard-агрегации. Затем удаляем боксы, которые не вошли ни в одну из групп.

Может возникнуть вопрос: почему мы вносим изменения в исходную разметку? разве так можно? Здесь мы вводим понятие уверенности или confidence. Например, в HaGRID уровень уверенности был равен 0.7. Это значит, чтобы признать группу боксов полной и достоверной, в неё должны войти как минимум 70% от всех предложенных боксов. Допустим, у нас есть пять различных разметок. Тогда группа считается полной, если в ней присутствуют четыре из пяти боксов. Три из пяти — это всего 60%, и это недостаточно для уверенности, что бокс находится там, где группа. Следовательно, боксы, которые не смогли сформировать полную группу (один или два бокса) мы можем исключить, предполагая, что разметчики ошиблись.

  1. Меняем неправильные метки на правильные.

Чтобы узнать, правильная ли метка, мы смотрим на каждую группу. Так как метки относятся к общей группе, все должны быть одинаковыми. Если они разные, заменяем метки меньшинства на метку большинства. Большинством здесь считается не 50%, как это принято, а 70%, чтобы увеличить итоговую точность разметки. И так получаем группы с едиными метками.

  1. Добавляем пропущенные боксы.

Так как наша цель — привести разметку в согласованный вид, чтобы она прошла через hard-агрегацию, группы нужны полные. Это значит, что если изначально было пять разметок, то идеальная группа должна содержать пять боксов. Однако если боксов оказывается четыре, мы добавляем недостающие. Это делается просто: берём все боксы, которые уже в группе есть, усредняем их координаты и добавляем бокс в группу. Ответ от этого не поменяется.

  1. Проверяем разметку на соответствие критериям hard-агрегации после всех корректировок.

  2. Если hard-агрегация не проходит, смотрим на комбинации как в drop-агрегации.

1ddd1179362e61591b551d4cdc1a55d8.jpg

Soft-агрегация для интервальной разметки

Шаги работы с разметкой примерно похожи на действия с боксами:

  1. Избавляемся от слишком маленьких или дублирующихся интервалов.

  2. Делим разметку на группы и удаляем те интервалы, которые ни в какую группу не попали.

  3. Заменяем метки.

  4. Добавляем пропущенные интервалы, тем самым проводим разметку в более консистентный вид.

  5. Проверяем на hard-агрегацию.

  6. Проверяем комбинации, если мы не прошли с помощью всех разметок.

922879b677b465d35f42d8af4db6882f.jpg

Soft-агрегация для масок

Для сегментационных масок процесс будет проще, потому что каждая отдельная маска не рассматривается как отдельная сущность. По сути, soft-агрегация для масок — это просто комбинация hard- и drop-агрегации.

8f9b5a0f7b83599d13d55081fb0e9723.jpg

Если разметка не прошла через soft-агрегацию, можно делать следующее:

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

  • Исключить разметку из набора данных. Если ошибок слишком много, это может указывать на проблемы с исходным изображением.

  • Доработать вручную: просмотреть самостоятельно, где встречаются ошибки. Обычно случаи, в которых разметчики ошибаются — это особенно интересные примеры. И может быть важно, чтобы модель правильно предсказывала результаты для них.

Теперь перейдём к фреймворку и посмотрим, как он работает на примере разметки боксами.

AggregateMe: фреймворк агрегации разметки

Обычно разметка с крауда приходит примерно в таком формате:

725dbac11109a90467b8c5c730dbb3bc.jpg

Мы знаем имя картинки, которая размечалась. assignment_id — это идентификатор задания, по которому потом можно принять или отклонить результаты разметки с краудсорсинга. В третьей колонке сама разметка — координаты боксов и лейбл для каждого из них.

Задаём параметры:

  • confidence — 70%;

  • threshold — порог для IoU;

  • метод кластеризации и параметры для него;

  • два порога для того, чтобы находить слишком маленькие боксы или маски (point_threshold) и дополнительный для дубликатов.

8d6d68f7be404e1186b27384deb880c5.jpg

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

Далее создаём экземпляр класса annotation_data и указываем тип разметки (боксы, маски, интервалы) и два порога.

9b4e2178c2a0dd6dde2117358b48e0dc.jpg

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

В результате обработки получаем список групп, где каждая группа соответствует разметке одного сэмпла данных. Для каждой группы известно название этого сэмпла, и в базе данных (data) хранится список всех разметок, которые были получены. Разметка включает в себя координаты боксов, метку объекта и ID разметчика.

107587a54b4eec3161d850c0bcc81baa.jpg

Дальше всё просто — инициализируем метод агрегации, указываем метод кластеризации, его параметры и получаем результаты.

6bc53f27a6229b47129ce0a9e399bf83.jpg

Функция get_results просто последовательно применяет различные методы агрегации, о которых мы говорили выше.

Допустим, мы взяли разметку и попробовали прогнать её через hard-агрегацию. Если не получилось, пробуем drop-агрегацию, если не получилось — soft. Если с последней не вышло, записываем результаты в категорию fail, чтобы в дальнейшем мы могли перенастроить параметры и эта разметка успешно сагрегировалась.

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

Посмотрим, как это выглядит на практике.

  1. Результаты hard-агрегации

В процессе hard-агрегации ошибок не было. Мы взяли множество боксов, усреднили их координаты и получили итоговые данные.

23deeaf9aae54aeec24681f592b6be28.jpg

  1. Результаты drop-агрегации

На примере иллюстраций слева и справа видно, что один из разметчиков ошибочно нарисовал бокс там, где кисть руки не видна полностью. Мы удалили этот бокс и с помощью hard-агрегации скорректировали разметку.

6a8811643919b74d5a1d9b84d7cbd9e9.jpg

  1. Результаты soft-агрегации

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

d20d8e9715e25ecda713597aa2eb144f.jpg

Теперь проанализируем примеры, которые не сагрегировались.

  1. Fail results

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

6b0bd8d8782be69b12d8f5b3798b3661.jpg

Чтобы улучшить итоговый результат, мы внесли изменения в параметры. Если изначально использовали 70% для confidence и 65% для threshold, теперь попробуем понизить threshold. Так получилось  сагрегировать разметку для второй картинки.

784a2d32c7997b7052490b42319056d8.jpg

Первая разметка всё ещё не сагрегировалась. После анализа визуализации мы выяснили: чтобы улучшить качество разметки, достаточно снизить threshold до 0.5. А после того, как снизили уровень confidence с 70% до 50%, у нас получилось успешно сагрегировать и первую разметку.

de357c6759605aea57556786898e1c94.jpg

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

Итоги

  1. Ошибки в разметке — основная проблема краудсорсинг-платформ. Исполнители могут неверно размещать или пропускать боксы, ставить грубые маски или неверно определять временные интервалы. Это становится проблемой, когда несколько разметок одного сэмпла нужно объединить в одну итоговую.

  2. Чтобы улучшить качество и консистентность разметки, её нужно провести через несколько методов агрегации — hard, soft и drop, каждый из которых основан на различных правилах согласования.

  3. Мы использовали алгоритмы агрегации для разметки собственных датасетов HaGRID, EasyPortrait и Slovo. В итоге мы обобщили эти методы в фреймворк AggregateMe, который планируем сделать доступным в виде OpenSource-решения.

  4. Фреймворк адаптирует различные форматы разметки, исправляет ошибки и обеспечивает единое качественное представление данных. В случае несогласованности между разметками AggregateMe использует более гибкие методы для устранения различий.

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

  6. Параметры агрегации, такие как confidence, пороги для IoU, размеры боксов и масок, а также алгоритмы кластеризации могут варьироваться в зависимости от задачи. Важно подходить к настройке параметров индивидуально, чтобы максимизировать количество успешно агрегированных примеров. Это ключ к созданию более точных и надёжных данных для других аналитических задач и обучения моделей.

© Habrahabr.ru