У нашей команды был восхитительный опыт увеличения нашего результата F1 (почему F1 — это еще один пост в блоге) на колоссальные 8%, просто давая нашим плохо аннотированным данным билет в один конец в цифровую корзину для мусора с помощью нашего надежного и удивительный инструмент fastdup. Удивительно, как небольшая уборка может повлиять на производительность вашей модели!

В области компьютерного зрения разработка моделей машинного обучения обычно включает повторяющийся цикл обучения, тестирования и сравнения моделей, завершающийся выбором наиболее эффективной модели или набора моделей для производства. Однако эти модели могут иметь существенные недостатки при развертывании в реальных условиях. Чтобы решить эту проблему, мы представляем подход к разработке моделей, ориентированный на данные, который включает визуализацию и очистку данных с помощью fastdup и наших пользовательских инструментов ImageLoader, упрощающих визуализацию и анализ данных компьютерного зрения в jupyter. Мы демонстрируем, как этот подход может помочь избежать производственных проблем путем выявления и устранения потенциальных проблем. Наш подход позволяет специалистам по данным и инженерам по машинному обучению достигать лучших результатов, экономить время и повышать надежность своих моделей компьютерного зрения.

1. Введение

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

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

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

Здесь мы представляем наш подход с использованием общедоступного набора данных (peta), который показал те же улучшения, которых мы достигли с нашим собственным набором данных. В целом, благодаря очистке данных мы добились увеличения показателя F1 на 8 %.

Мы использовали эффективный и мощный инструмент fastdup для быстрой и эффективной кластеризации большого количества изображений. Это позволило нам присвоить идентификатор cluster_id каждому изображению, который мы в дальнейшем использовали для улучшения нашего подхода. Наша конечная цель состояла в том, чтобы извлечь табличные признаки, которые могли бы легко идентифицировать:

хорошие/плохие образы

  1. хорошие/плохие этикетки.

2. Результаты эксперимента

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

Эксперимент А — прогноз без очистки данных.

Эксперимент B — прогноз с очисткой на train и val.

Эксперимент C — прогноз с очисткой данных на train и без очистки на val.

Увидев впечатляющие результаты наших предыдущих экспериментов, мы не могли не задаться вопросом, не повезло ли нам с нашими данными. Поэтому мы решили присмотреться и перепроверить нашу удачу. Мы хотели удостовериться, что мы не увеличиваем наши оценки искусственно, случайно удаляя «жесткие» метки в процессе очистки. Для этого мы провели еще один эксперимент, чтобы специально проверить надежность нашей методологии очистки. Поступая таким образом, мы можем быть уверены, что наши данные действительно отражают лежащую в основе реальность и что наши результаты являются подлинным отражением производительности нашей модели.

Эксперимент D — прогнозирование без очистки данных на train и ручная обработка данных на val.

В ходе наших экспериментов мы обнаружили, что проблема с производительностью модели всегда связана не с самой моделью, а с проверочным набором. На самом деле вполне возможно, что модель на самом деле работает хорошо, но метка, связанная с данными, неверна. Чтобы смягчить эту возможность, мы провели тщательную ручную проверку прогнозов несоответствия между экспериментами A, B и C.

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

Хорошие компоненты, неверно предсказанные в A и правильно в B и C

Мы ожидали, что в эксперименте C мы получим лучшую оценку F1, чем в эксперименте A, но этого не произошло. Наша гипотеза заключалась в том, что модель из эксперимента C, обученная на лучших данных, лучше, чем модель из эксперимента A, обученная на неочищенных данных. Поэтому прогнозы в эксперименте C должны быть лучше, чем в эксперименте A, если мы прогнозируем одно и то же проверочное подмножество.

Вот почему мы решили добавить эксперимент D, поскольку мы взяли модель для эксперимента A и получили прогнозы из очищенного проверочного набора. При этом мы получили более точные прогнозы, потому что в этом случае плохие и сложные примеры были удалены из подмножества проверки. В таблице ниже показано, что прогноз эксперимента D стал лучше, чем эксперимент A, по крайней мере, для head_gender и head_age.

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

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

Вот несколько примеров, которые были неправильно помечены и искусственно занизили оценку эксперимента C. После исправления их метки и пересчета мы получаем эксперимент D.

Здесь мы видим человека, отмеченного как «Младше 45» и «Младше 60» (два разных аннотатора). Это «плохой» компонент, и наш алгоритм пометил его как таковой. Тем не менее, он остался в наборе проверки. Мы можем ясно видеть, что алгоритм был правильным.

Здесь мы видим изображение, предсказанное как менее 45, но истинное значение было 60. Мы вручную переопределяем эту маркировку, которая в любом случае немного двусмысленна.

Образец компонентов с плохой маркировкой

Были также примеры плохо помеченных компонентов, содержащих более 3 изображений.

Обратите внимание на столбец labels. Здесь мы подсчитываем, сколько изображений в этом кластере имеют этот ярлык. Если компонент хороший, то все изображения должны иметь одинаковые метки.

Выяснилось, что после ручной проверки и улучшения этикетки эксперимент C превзошел результаты эксперимента A. Мы обнаружили, что это произошло из-за того, что проверочный набор включал неправильно помеченные примеры, которые до сих пор оставались неочищенными.

Чтобы обеспечить более полное сравнение, мы обновили нашу таблицу, включив в нее результаты экспериментов A и C, а также некоторые примеры из неочищенного проверочного набора.

Пересчитанные результаты для экспериментов A и C после улучшения меток

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

Компоненты были предсказаны правильно в Experiment_A и неверно в Experiment_B и Experiment_C:

Компоненты были предсказаны правильно в Experiment_B и Experiment_C и неправильно в Experiment_A:

2. Метод и подробности

Для этой задачи использовался набор данных PETA (Распознавание атрибутов пешеходов на дальнем расстоянии, https://dl.acm.org/doi/10.1145/2647868.2654966 или https://paperswithcode.com/dataset/peta). Это хороший пример реального набора данных с 19000 изображений с 8705 людьми, а также с более чем 100 ярлыками, такими как пол и стиль одежды, и все они на большом расстоянии и с несколькими ярлыками (каждый объект может иметь несколько ярлыков). .

Для обучения модели и отслеживания экспериментов мы использовали CNVRG, очень хороший инструмент MLOps (https://cnvrg.io/). Мы использовали PyTorch MobileNet_v2 с весами ImageNet в качестве базовой модели, и нашей целью было настроить и настроить эту модель для нашей задачи. Мы измерили качество нашей модели с помощью оценки F1, поскольку классы в наборе данных несбалансированы.

3 Группировка похожих изображений в компоненты

Набор данных PETA состоял из 19 000 немаркированных изображений 8 705 человек, что стало проблемой для нашей команды. Чтобы сгруппировать похожие изображения, мы исследовали различные подходы и пришли к выводу, что fastdup является эффективным готовым решением (https://github.com/visual-layer/fastdup). fastdup предлагает простой API, который позволяет создавать набор лучших компонентов всего за несколько строк кода. Мы обнаружили, что использование пользовательского встраивания в виде сети ReID дало лучшие результаты (включенные в наш код), которые мы сочли наиболее эффективными из различных протестированных нами моделей. В целом кажется, что встраивание для конкретной задачи упрощает кластеризацию объектов на основе желаемых критериев. Изображения набора данных PETA имеют соотношение формы, аналогичное размеру изображения 300x170, используемому для обучения модели. С настройками fastdup по умолчанию мы смогли сгруппировать похожие изображения в 966 компонентов и визуализировать некоторые компоненты, в том числе хорошие и плохие. Примеры этих компонентов представлены ниже.

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

Образцы плохого компонента

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

4. К деталям — очистка данных

Во избежание ненужного обучения модели на некачественных данных лучше смотреть на изображения и их метки и думать, как улучшить метки и компоненты (группы) похожих изображений. Например, мы решили чистить плохие компоненты по разным порогам. Для этого мы рассчитали стандартное отклонение количества меток и добавили в наш фрейм данных новые столбцы с флагами, например «is_bad_component_std_80».

Пример кода обратного вызова для добавления новых столбцов с флагами

Используя наш собственный ImageLoader, мы могли визуализировать плохие и хорошие компоненты и максимально понимать наши данные.

Пример плохих компонентов, визуализированных с помощью Seedoo ImageLoader

Пример хороших компонентов, визуализированных с помощью Seedoo ImageLoader

Используя логику очистки компонентов, мы точно настроили модель Mobilenet_V2 с настроенным входным слоем. Для входного слоя мы устанавливаем группы с 3 вместо 1 (например, мы подаем модели сразу 3 изображения вместо 1 изображения). Тестируя нашу модель, мы получили очень многообещающие начальные результаты с оценкой F1 около 0,9, что оказалось достаточно хорошим.

Результат первой обученной модели с обрезкой компонентов по дисперсии с порогом 30

5 Добавление новых головок, обучение и последующее улучшение модели

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

Инженеры в области машинного обучения часто сталкиваются с задачей многократного обучения различных моделей. Важно отметить, что полагаться исключительно на численные оценки модели может не дать полного понимания производительности модели, и может потребоваться визуальное изучение матрицы путаницы. Наш специальный инструмент ImageLoader, разработанный в SeeDoo, позволил нам упростить оценку модели, внедрив модули для автоматического прогнозирования тестовых наборов данных, что позволяет N эпохам предоставлять прогнозы для полного набора данных проверки с лучшей моделью и экспортными показателями. Результаты были экспортированы в виде фреймов данных pandas, представленных в виде файлов HTML. Такой подход сократил время анализа с нескольких часов до нескольких минут.

Пример таблицы общих метрик, экспортируемой каждые N эпох обучения

Образцы различных матриц путаницы экспортируются каждые N периодов обучения.

Вот подробный список стратегий, которые мы применяли в нашей работе:

  1. Обрезка компонентов — когда мы манипулируем компонентами (изображениями с похожими людьми) и очищаем их в соответствии со статистикой количества меток.
    1.1. Отсечение компонента по дисперсии с некоторым порогом.
    1.2. Отсечение компонентов по геометрической дисперсии с некоторым порогом.
    1.3. Отсечение компонента по кубической дисперсии с некоторым порогом.
  2. Подрезка меток — когда мы манипулируем метками компонентов.
    2.1. Обрезка меток меток — когда мы удаляем метки на основе соотношения количества меток и пороговых значений внутри компонента.
  3. Пересечение меток — когда мы сохраняем только метки пересекающихся изображений внутри компонента.
  4. Обрезка изображений — когда мы манипулируем изображениями внутри компонентов
    4.1 Обрезка изображений на основе коэффициента подсчета меток и пороговых значений для каждого изображения (удаление изображений с редкими метками внутри компонента).

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