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

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

В большом проекте по сортировке этих ресурсов была подзадача, которую нам и предстояло решить, — распознавание объектов по цвету. Встал выбор: обучить нейросетевой классификатор или обойтись более простыми алгоритмами классического компьютерного зрения. Рассказываем, что из этого вышло.

Дано: высокая скорость, схожие оттенки, совместимость с кодом C#

Решение нужно было встроить в сложный инженерный автомат для сортировки. В него выгружается сырье, которое устройство последовательно отправляет в шахту. Там под действием силы тяжести объекты пролетают через датчик регистрации и попадают в узел с несколькими камерами машинного зрения, которые ведут фотосъемку. Хорошая новость — каждый объект снимали сразу несколько камер, а нам нужно было агрегировать данные и улучшить итоговый результат. Хороша эта новость потому, что на объектах сложной формы (а мы работали именно с ними) важная для классификации информация может проявиться только на одном из ракурсов.

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

Может показаться, что для решения задачи не нужны сложные алгоритмы машинного обучения — достаточно пороговых значений по интенсивности пикселей. Нет, это не тот случай. Дело в том, что в нашей задаче были очень похожие классы объектов, например, несколько оттенков коричневого. Гистограммы распределения цветов для них сильно пересекаются, что исключает возможность применения простых алгоритмов. Для примера приведем гистограмму распределения средней интенсивности пикселей в канале красного по всем снимкам из выборки (см. рис. 1).

Рис 1. Распределение среднего значения интенсивности в канале R для двух соседних классов
Рис 1. Распределение среднего значения интенсивности в канале R для двух соседних классов

Еще несколько вводных. Во-первых, решение должно работать в реальном времени. Алгоритмы должны отрабатывать за короткий промежуток между падением первого и второго объектов — примерно 200 миллисекунд. Во-вторых, модель должна работать в связке с C# кодом — это обусловлено особенностями ПО для работы с автоматом сортировки. Поэтому для инференса моделей используется ONNX Runtime, для которого есть API на C#. Здесь главной сложностью был перенос кода препроцессинга и генерации признаков c Python на C#.

Классификация фотографий

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

Вариантов несколько:

  • Attention-механизм в нейронных сетях.

  • Конкатенация изображений вдоль одной из осей (работа с объединенной картинкой как с одним изображением).

  • Усреднение Confidence c разных, независимо обработанных изображений.

  • Конкатенация не картинки, а фич, полученных с каждой отдельной фотографии.

Начнем с механизма Attention. Мы вдохновились идеей Attention и использовали кастомный блок — получилось что-то вроде Channel Attention блока, где в виде каналов выступали отдельные изображения. Он применялся на предпоследнем слое сети для вычисления веса каждого изображения, перед Fully Connected слоем для расчета логитов. Схему можно оценить на рис. 2: F — Flatten — размерность скрытого состояния, Imgs — размерность, равная количеству изображений.

Рис 2. Схема агрегации изображений через Attention
Рис 2. Схема агрегации изображений через Attention

C конкатенацией все просто: совмещаем несколько фотографий в одну и используем привычные алгоритмы классификации. Причем можно пойти чуть дальше и объединять не исходные изображения, а полученные признаки для классических алгоритмов либо эмбеддинги для нейронных сетей (эмбеддинг — процесс преобразования данных в числовой вектор — прим. ред.).

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

Нейронные сети

Здесь и далее в качестве агрегированной метрики будем использовать Weighted-Average Precision.

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

Мы валидировали модель в формате K-Fold CV c K = 3. Результаты будут представлены в формате {mean_precision} ± {std} по валидационным фолдам.

С помощью нейросетей можно достичь достаточно высокой эффективности:

  • MobileNetV2 с блоком Attention показал результат 0,903±0,009

  • MobileNetV2 c усреднением Confidence имеет precision 0,905±0,015.

Пример Confusion Matrix приведен на рис. 3. Видно, что основная сложность заключается в классификации соседних классов, т. е. очень похожих объектов. Например, 1Brn и 2Brn, 3Col и 4Col.

Рис 3. Результаты нейросетевого подхода на примере MobileNetV2
Рис 3. Результаты нейросетевого подхода на примере MobileNetV2

 MobileNetV2 в виде Backbone и конкатенация признаков на предпоследнем Fully Connected слое: результат — 0,896±0,021. Из минусов — увеличенное число параметров модели (и без того большая матрица весов увеличилась в несколько раз).

Классические алгоритмы

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

Мы использовали следующие входные признаки:

I. Квантили распределения интенсивности пикселей по каждому из каналов изображения.

II. Начальные и центральные моменты распределения интенсивности пикселей по каждому каналу нескольких первых порядков.

III. Значения центроидов кластеров в K-Means (для некоторого заранее заданного K).

IV. Различные комбинации отношений статистик по цветовым каналам.

V. Результаты библиотеки Color Thief, которая определяет палетку цветов на изображении (спойлер: работает довольно медленно, плюс ее сложно перенести на C#).

Классическим ML-алгоритмом для компьютерного зрения считается SVM — он простой, быстрый и стабильный. Для экспериментов мы взяли еще несколько быстрых моделей, например, LightGBM и логистическую регрессию. Кроме того, задачи, в которых важен цвет, зачастую удобно решать не в RGB, а в HSV (где «Hue» означает «цветовой тон» или «оттенок»), поэтому, экспериментируя, мы переходили к другой цветовой модели.

Результаты собраны в табл. 1 (список используемых признаков в таблице обозначен номером из списка выше).

Табл.1 Результаты работы классических алгоритмов

Модель

Признаки

Агрегация

Комментарий

Результат

LGBM

I, II, III

конкатенация фичей (4)

 —

0,835 ± 0,007

LGBM

I, II, III, IV

усреднение (3)

 —

0,844 ± 0,022

LGBM

I, II, III, V

усреднение (3)

 —

0,845 ± 0,011

LGBM

I, II, III

усреднение (3)

 —

0,854 ± 0,003

LGBM

I, II, III

конкатенация фотографий (2)

 —

0,858 ± 0,012

LGBM

I, II, III

усреднение (3)

Делаем нормировку на уровень черного и вычитаем фон

0,874 ± 0,005

SVM

I, II, III

конкатенация фотографий (2)

Переводим изображение в HSV

0,885 ± 0,006

LR

I, II, III

конкатенация фичей (4)

 —

0,888 ± 0,007

LR

I, II, III, V

усреднение (3)

 —

0,892 ± 0,022

LR

I, II, III, IV

усреднение (3)

 —

0,892 ± 0,016

LR

I, II, III

усреднение (3)

Делаем нормировку на уровень черного и вычитаем фон

0,893 ± 0,017

SVM

I, II

усреднение (3)

Переводим изображение в HSV

0,893 ± 0,009

LR

I, II, III

конкатенация фотографий (2)

Переводим изображение в HSV

0,894 ± 0,003

LR

I, II, III

усреднение (3)

Переводим изображение в HSV

0,895 ± 0,004

LR

I, II, III

усреднение (3)

 —

0,895 ± 0,022

LR

I, II

конкатенация фотографий (2)

 —

0,896 ± 0,008

SVM

I, II, III, IV

усреднение (3)

 —

0,897 ± 0,016

SVM

I, II, III

усреднение (3)

Делаем нормировку на уровень черного и вычитаем фон

0,898 ± 0,008

SVM

I, II, III, IV

усреднение (3)

 —

0,898 ± 0,014

SVM

I, II, III

усреднение (3)

Переводим изображение в HSV

0,899 ± 0,007

SVM

I, II, III

усреднение (3)

 —

0,906 ± 0,011

SVM

I, II, III

усреднение (3)

Делаем нормировку на уровень черного и вычитаем фон

0,906 ± 0,06

SVM

I, II, III

усреднение (3)

 —

0,907 ± 0,005

SVM

I, II

усреднение (3)

 —

0,912 ± 0,003

SVM

I, II

конкатенация фотографий (2)

 —

0,913 ± 0,007

По результатам моделирования можно сделать следующие выводы:

  • SVM — безоговорочный лидер среди моделей.

  • Лучше использовать максимально простые статистические признаки.

  • Более сложные фичи не повышают эффективность системы.

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

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

Наш ответ — классический алгоритм

Как вы уже поняли, отличия по метрикам не критичны, но в итоге мы решили использовать в проде SVM. Во-первых, он чуть лучше нейросети — 0,913 против 0,905 в пользу классической модели. Во-вторых, он работает стабильнее: на нескольких прогонах одних и тех же объектов на реальном автомате разброс по качеству сортировки получился ниже, чем у нейронной сети. Напомним, почему результаты при разных пробросах в принципе отличаются: объекты просто падают через узел регистрации и могут поворачиваться разными сторонами, что влияет на процесс распознавания.

Тем не менее, у классических алгоритмов есть и минусы:

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

О бизнес-результатах нужно говорить с точки зрения общей автоматизации. Если кратко: после всех этапов сортировки заказчик получает несколько номенклатур объектов готовой продукции. Для каждой из них есть требования по количественному содержанию того или иного типа объектов. Если требование выполняется, считается, что сортировка номенклатуры выполняется автоматически. Например, есть номенклатуры A, B и C c массовыми долями 50, 30 и 20% соответственно. Требования по качеству проходят только A и B, соответственно, процент автоматизации будет 80%.

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


Авторы:

Иван Камшуков, специалист машинного обучения центра машинного обучения компании «Инфосистемы Джет»,

Александр Скрябин, руководитель отдела управления проектами центра машинного обучения компании «Инфосистемы Джет».

Комментарии (2)


  1. aamonster
    28.09.2023 20:50
    +5

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


  1. IamSVP
    28.09.2023 20:50
    +1

    так а в итоге что подается на вход в SVM? Как конкатенировали фотографии? Была нормализация? С самого начала или по батчам?!