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

91082cb25ce89b01e8f000ef11688aee.png

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

Если провести сотню собеседований, отсмотреть пару десятков подрядчиков, видно, что многое в CV (Computer Vision) для промышленности продолжает крутиться вокруг хорошо зарекомендовавших себя детекторов: Yolo разных версий, Faster RCNN, Mask RCNN. Мы тоже во многом живём на них: безопасность на производстве контролируется Yolo-детекторами, дефекты поверхности металла в плоском прокате работают на Faster RCNN и Mask RCNN. Это уже бейзлайн, который зачастую и доходит до продуктива.

Но на месте не стоят ни архитектуры нейронок, ни подходы к решению задач.

Если посмотреть на текущие тренды, то можно выделить следующее:

● в статьях преобладают архитектуры, основанные на трансформерах;

● появляется все больше foundation-моделей;

● модели работают в открытом мире и учатся в self-supervised манере;

● инструменты для CV используют для автоматизации универсальные модели, например, CLIP, Dinov2, Segment Anything;  

● развиваются few-shot, single-shot и zero-shot подходы, unsupervised и self-supervised обучение.

О том, для чего мы применяем это, я и расскажу подробнее.

Метрики

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

И в этом нам помогают трансформеры. Архитектура трансформеров основана на механизме внимания, чтобы эффективно обрабатывать последовательные данные (изображения в этом случае тоже представляются в виде последовательности).Трансформеры используются уже давно, но всё же применяются они ещё осторожно, особенно когда в игру вступают ограничения вычислительных мощностей. Мы опробовали их на задачах контроля дефектов конвейерных лент, причем учитывался опыт, накопленный разработчиками в определении дефектов автомобилей. Такой вот трансфер подхода из одного популярного домена в металлургию. Не последний в этой статье.

Страхование конвейеров

На первых итерациях применялась модель из семейства FaseterRCNN, имплементации Detectron2 — https://github.com/facebookresearch/detectron2. В ходе множественных экспериментов модель показала себя неплохо с точки зрения полноты предсказаний, но данный эффект достигался с ущербом к точности. Это создаёт дополнительную нагрузку на оператора: человеку приходится отсматривать больший объём изображений для контроля. Со временем это может привести к отклонению предиктов «на автомате», и система потеряет свою эффективность. А если цель преобразуется в автоматическую остановку конвейера, требования к точности станут ещё жестче.

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

На этом рисунке ложное срабатывание на корд. Это критичный дефект, по которому необходимо остановить ленту.

b914e8074f6880194bfda93ca2843091.png

А получилось оно из-за такого вот примера с ребристой текстурой дефекта.

7e0712163d5dfe0546ac613cfe62fd33.png

Мы решили искать иной архитектурный подход к реализации модели — добавлять attention, чтобы улучшить точность предсказаний, но не потерять полноту. В основу реализации алгоритма взят оригинальный Detection Transformer (DETR).

54e3b10db95ff164f62e2293fcba5ff9.png0c021368c888ca47212feb258bb182be.png

DETR решает задачу детекции объектов как image-to-set. На вход модель принимает изображение, а на выходе она отдает список из всех объектов на изображении. Каждый объект содержит вероятность принадлежности к определённому классу, боксы, ограничивающие объект. На первом этапе сверточная нейросеть извлекает из изображения признаки. На втором этапе — энкодер-декодер архитектура трансформера генерирует предсказания. Self-attention механизм позволяет модели опираться на отдельные участки изображения при предсказании. Фильтрация и обработка боксов происходят с помощью венгерского алгоритма, модель не требует дополнительных пост-обработок, например, NMS. Это открывает вариации для экспериментов с уже качественными предсказаниями.

В роли претрейна для обучения модели была выбрана реализация, предоставленная авторами оригинальной статьи и выложенная в open source в зоопарке модель HuggingFace — https://huggingface.co/facebook/detr-resnet-50.

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

Вначале казалось, что обучение не сходится, график AP болтался около нуля.

ebfe4b20ddf2fa181ac4a3caaa14c35c.png

Но мы не теряли надежд.

2ed0e845e8d1265706dfbca374b2de9c.png

В итоге, после различных попыток больше чем на 120 часов на 2080 Ti, удалось заставить DETR учиться.

23d3f4250868ab2f176c04df0fdf0e24.png

Помог подбор размера батча, learning rate, очень длительный разогрев, отказ от dilated convolutions и претрейн. Ещё помог датасет для претрейна, составленный из изображений конвейерных лент с разных производств «Северстали», который мы использовали для получения своих весов для последующего обучения финальной версии модели.

Отказ от dilated convolutions вместе с auxiliary-loss позволил сэкономить половину видеопамяти и учить в два раза быстрее. А проработав датасет, убрав лишнюю синтетику, отсмотрев ложняки, мы наконец побили свой Faster RCNN Resnet 101, не потеряв в скорости.

7b949a0afa402972f7322a27f8f9d561.png

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

1fa4fb61ec36b460bd30a1c28bdb4ee5.png

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

7925c8181c4d02267156f3394ceeac78.png

Модель справляется с детекцией повреждений и необходимых для поиска артефактов (например, вода). На примерах ниже отображена работа multi-head-attention модели.

02506f054fe05693a593f68eeb8bdf51.png

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

Также мы решили воспользоваться тем, что данная архитектура не требует постобработки, а значит, есть некоторый временной вычислительный запас. Поэтому мы решили имплементировать дополнительный алгоритм фильтрации, помимо предложенного в архитектуре — weighted boxes fusion — https://arxiv.org/abs/1910.13302.

Зачастую детекторы пользуются обычным non-max suppression алгоритмом, что может подавлять и истинные предсказания. Если бы такой механизм применялся в DETR, то мы бы не могли получить предсказание модели, если бы вероятность принадлежности к классу no-Object была бы выше. Таким образом, мы решили не ограничивать выходы модели вероятностью, а ансамблировать все выходы по классам.

4a50c7f7ad5a4ee91cf1d5a7c5cefa06.png

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

1265cd00874b3a89d93e5c60702d76f4.png92071b0bbaeb6cc4be1b5a6cd6c063c0.png

В итоге мы получили алгоритм на основе DETR + weighted-fusion-boxes — более точный, но без потерь на полноту предсказаний.

Хирургическая точность, или медицина в металлургии

Второй пример переноса подхода, более характерный для одного домена, в металлургию — это использование StarDist (GitHub — stardist/stardist: StarDist — Object Detectionwith Star-convex Shapes). Данный алгоритм разрабатывался в целях сегментации или детекции клеток и их ядер на микроскопических снимках.

При условии плотного расположения объектов на изображении, классические подходы к сегментации могут некорректно обрабатывать контуры, что приводит к их объединению (например, если работать с Unet++ https://github.com/MrGiovanni/UNetPlusPlus). Если брать детекторы семейства MaskRCNN https://github.com/matterport/Mask_RCNN, то они сначала работают с боксами, а потом выстраивают маску объекта, что негативно сказывается на итоговых метриках и результатах.

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

1e0dab8a3b3b7c0c4c6377a58f671a93.png

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

79549bb105250c73e4847907b9bdcd2c.png

Разметка может проводиться классическими средствами и по классическим стандартам. Мы применяли COCO с последующей конвертацией в четыре маски: type, instance, dist, stardist. Для стратифицированного деления датасетов использовалось расстояние Вассерштейна, что позволило делить изображения не по инстансам, как делалось бы при классической детекции, а попиксельно, с учётом гистограмм распределений классов пикселей на изображении.

bb105cb5cdab19bf82373917a2d65b87.png

Данная модель обучается с использованием пяти лосс-функций. Их взвешивание и подбор данного гиперпараметра, как вес каждого лосса, достаточно сильно сказывается на результатах обучения. Дополнительно модель позволяет возвращать контуры объектов, но и тут точность выигрывает перед классическими алгоритмами, которыми обычно решают в промышленности подобные задачи. Да и вариативность бэкбонов будоражит. Мы использовали библиотеку Timm для извлечения признаков изображений, но никто не запрещает применять такие модели, как, например, SAM (о нем позже).

Как и любой другой сегментационный алгоритм, здесь требуется добавить некоторую постобработку на выходы модели. Нами использовался алгоритм голосования по большинству, что позволяло сегментировать объекты целиком, без «дырок» в виде  вкраплениий пикселей внутри объекта. Сам процесс постобработки отделен от модели, что позволяет использовать numba без каких-либо доработок со стороны разработчика.

Также стоит отметить, что модель удалось успешно конвертировать в более удобные для инференса форматы и применять half-precision без вреда для точности.

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

Данные

Foundation-модели здесь тоже сильно облегчают некоторые задачи.

Анализ датасетов

Например, мы используем Voxel51 для анализа датасетов. Помимо функционала по отрисовке ground truth и предиктов, у него есть опция кластеризовать данные. Для этого можно использовать CLIP или DINOv2. Мы использовали DINOv2.

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

Вот кластер с пересвеченными дефектами.

3499c475df40373b0a2d07fa409d3aa0.png

А вот маленький кластер, в который попадает определённый вид дефекта.

ef59cde21cf4856b4552cca456d078b3.png

А сюда попали разные вкрапления.

3006089a1e6f262f0381f0f16280e078.png

Разметка

Готовую разметку обсудили, но что, если её еще нет? Разметка — это головная боль любого DS в CV. Ну если только вы не эстет и перфекционист, любящий рисовать pixel-perfect многоугольники.

К счастью, появляющиеся foundation-модели позволяют в разы упрощать процесс разметки.

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

882d9da065f4cdbf34a169430cddcb6e.png

Есть вариант отдать разметку в human-in-the-loop сервис. Задача не выглядит очень сложной, но надо составить ТЗ, проверочные задания, и всё равно отсмотреть получившуюся разметку и повторить итерацию. В целом для такой задачи — рабочий вариант. Второй вариант — попросить помощи у экспертов с производства. Не всегда у производства есть человек с выделенным на это временем. Ну и третий вариант — посадить за разметку DS, он все сделает хорошо, заодно разберётся с корнер-кейсами, воспитает в себе «насмотренность» для данной задачи. DS наливает себе десять кружек кофе, вставляет спички в глаза и начинает размечать не покладая рук. В следующий раз у него заканчивается кофе, новый кофе заказать времени нет, так как бэклог не ждёт, и энтузиазм DS постепенно начинает угасать. DS хочет применять свой разум более рационально.

На помощь приходит уже хорошо зарекомендовавший себя Segment Anything Model. Segment Anything — та самая foundation модель, которая может сегментировать любое изображение в любом стиле, будь то картины художников или кадры с камер над конвейером.

И это дает нам гораздо более мощный инструмент.

Процесс может быть разный, но для разметки примерно следующий:

● прогоняем датасет через segment anything, сохраняем контуры в COCO или другой CVAT-совместимый формат;

● загружаем датасет в CVAT v2;

● уточняем разметку в CVAT, в котором с некоторого времени доступны различные модели, в том числе Segment Anything;

  • правим получившуюся разметку, добавляя или исключая области, размечаем оставшиеся объекты. При этом необходимости двигать точки контуров не возникнет, Segment Anything очень неплохо добавляет области в текущую маску по точкам (или убирает).

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

Если размечаемые объекты  на кадре разрежены (например: грузы, люди), то удобнее будет размечать с нуля.

Видео к статье «Новый взгляд на сталь» — Видео | ВКонтакте

vkvideo.ru

Почему бы не использовать Segment Anything напрямую? Причин использовать —  несколько. Первая — её размер и скорость инференса. Все-таки инференс на одну картинку занимает несколько секунд на карте уровня 2080Ti. А для наших задач нужен реалтайм, да и карты часто поменьше, а иногда есть смысл и их сэкономить и делать инференс на CPU (если частота кадров небольшая). Вторая — точность разметки. Всё-таки foundation модель не тюнилась на конкретные задачи, и если мы дополним авторазметку ручной, результат получится сильно лучше. Третья — DS всё равно должен знать, что у него в датасете, какие корнер-кейсы, какие выбросы, что может произойти в будущем. Полная автоматизация процесса может привести к сильному и неприятному разбросу результатов в будущем.

Синтетика

И, наконец, что если у нас нет ни готовой разметки, ни изображений, которые надо разметить?

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

Оверсемплинг не помогает сети растить обобщающую способность. Copy-paste ведёт к переобучению. К счастью, у нас есть диффузионки и множественные их модификации.

Например, если взять Stable Diffusion и поменять в ней часть, которая отвечает за guidance, и учить только эту часть, тогда мы превратим её в инструмент гармонизации изображений.

55d79bee32f15e7c4514b470c4d56ba9.png

На вход подается фон с наивно (читай, copy-paste) вставленным требуемым для нас изображением, а также маска этого изображения.

Более подробно про работу модели можно прочитать в статье [arxiv].

Общий алгоритм действий следующий:

  1. Выбираем входное изображение и маску дефекта.

  2. Выбираем выходное изображение и генерируем маску для нового дефекта.

  3. Наивно вставляем дефект по маске для нового дефекта.

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

  5. PROFIT.

Примеры работы модели:

Верхний ряд — результат работы. Это изображение, куда помещали дефект.

Нижний ряд — изображение, откуда брали дефект, маска дефекта.

1235c0c6df3a2780acae29b46661177f.png

Пример 2

4dca07485da4f10fac0a9d8eaf8b4389.png

Пример 3

68905170d85ca452798f520a05c4f7c0.png

Пример 4

148d204684cb526b130f93b8ec553ff5.png

Пример 5

0b84d75c66e52c6978504c3a1957baa5.png

Вблизи дефекты получаются неотличимы от реальных (синтетика — посередине).

31e205d2059b75f86ffbf33fcc960759.png

В целом, синтетика, особенно если её отобрать после генерации, хорошо влияет на общие метрики. Если тестировать только на реальных данных, то видно, что наихудшие метрики при использовании чисто синтетики, при использовании только реальных данных — уже сильно лучше. Но 25% синтетики добавляет еще 7 пунктов к F1.

55d0c731d3398a3e4f1fb4ec134f2635.png

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

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

© Habrahabr.ru