Аннотация

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

Введение

В некоторых отраслях одним из этапов контроля качества является проверка поверхности готового продукта или проверка материалов на наличие примесей с помощью SEM/EDX. Часто в этом процессе проверки задействован персонал, отвечающий за качество, который проверяет поверхности вручную.

Это требует обучения инспектора контроля качества для выявления целого ряда сложных дефектов. Это отнимает много времени, неэффективно и может привести к увеличению времени ожидания производства и даже к случайной неправильной классификации дефекта, что может привести к жалобам клиентов или сбоям на месте, что приведет к отзыву продукции. В прошлом для решения этих проблем было достаточно традиционных методов обработки изображений (Paniagua et al., 2010; Bulnes et al., 2016). Однако парадигма Индустрии 4.0 имеет тенденцию к обобщению производственных линий, требующих быстрой адаптации к новым продуктам (Озтемель и Гурсев, 2018). В этой статье я исследовал архитектуру U-Net на основе 2D-конволюционной нейронной сети для обнаружения дефектов.

Ю-нет

UNET был разработан Олафом Роннебергером и др. для сегментации биомедицинских изображений. Архитектура содержит два пути. Первый путь — это путь сжатия (также называемый кодировщиком), который используется для захвата контекста изображения. Кодер — это просто традиционный стек сверточных слоев и слоев с максимальным объединением. Второй путь — это симметричный расширяющийся путь (также называемый декодером), который используется для обеспечения точной локализации с использованием транспонированных сверток. Таким образом, это сквозная, полностью сверточная сеть (FCN), т. Е. Она содержит только сверточные слои и не содержит плотного слоя, из-за которого она может принимать изображения любого размера.

В оригинальной статье UNET описывается следующим образом:

Вот хорошая статья о реализации U-Net:

https://towardsdatascience.com/understanding-semantic-segmentation-with-unet-6be4f42d4b47

Набор данных

29th Annual Symposium of the German Association for Pattern Recognition, Weakly Supervised Learning for Industrial Optical Inspection, 2007.

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

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

Библиотеки Python:

matplotlib
xmltodict
sklearn
tensorflow
scipy

Клонирование репозитория

Клонируйте репозиторий в локальную папку:

git clone https://github.com/AdarshGouda/Surface-Defect-Detection.git
cd Surface-Defect-Detection

Вспомогательные функции помогут найти дефект и замаскировать его с помощью eclipse, расположенного в папке ./utils. Эта папка и ее содержимое будут импортированы по мере необходимости в приведенном ниже коде.

Загрузите набор данных и разархивируйте его:

wget https://resources.mpi-inf.mpg.de/conference/dagm/2007/Class1_def.zip

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

unzip -q Class1_def.zip -d .

Давайте посмотрим на изображения в папке ./Class1_def.

Обратите внимание на дефект в верхнем левом углу изображения 1.png. Вспомогательная функция в папке ./utils поможет найти эти дефекты на изображении и создать соответствующую маску в качестве метки.

Следующий блок кода в файле Surface-Defect-Detection.ipynb нанесет метку сегментации на любое изображение, которое вы, возможно, захотите протестировать. Здесь я протестировал первое изображение 1.png

Функция load_images_masks() в скрипте DataIO.py принимает необработанный файл изображения из папки Class1_def и возвращает как изображение, так и его сегментированную метку.

Как видно из приведенного выше вывода, всего имеется 150 изображений размером 512 x 512 и 1 канал (изображения в оттенках серого, а не RGB).

Далее, давайте взглянем на первые точки данных X и Y.

Как видно выше, сегментированная метка правильно определяет местоположение дефекта на исходном изображении.

Разделение между поездами и тестами

Определите дистиллированную версию U-net, чтобы упростить вычисления и обучение.

Функция потерь и коэффициент плавной кости:

Популярная функция потерь для задач сегментации изображений основана на коэффициенте кости, который, по сути, является мерой перекрытия между двумя выборками. Эта мера находится в диапазоне от 0 до 1, где коэффициент Дайса, равный 1, означает идеальное и полное перекрытие. Коэффициент Дайса изначально был разработан для двоичных данных и может быть рассчитан как:

где |А∩В| представляет общие элементы между множествами A и B, а |A||A| представляет количество элементов в наборе A (и аналогично для набора B).

В случае оценки коэффициента Дайса на предсказанных масках сегментации мы можем аппроксимировать |A∩B||A∩B| как поэлементное умножение между предсказанием и целевой маской, а затем суммировать полученную матрицу.

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

Для количественной оценки |A| и |B|, некоторые исследователи используют простую сумму, тогда как другие исследователи предпочитают использовать для этого вычисления сумму в квадрате. У меня нет практического опыта, чтобы эмпирически определить, какой из них лучше работает в широком диапазоне задач, поэтому я оставлю вас, чтобы вы попробовали оба и посмотрели, какой из них работает лучше.

Если вам интересно, в числителе при расчете коэффициента Dice есть 2, потому что наш знаменатель «двойной подсчет» общих элементов между двумя наборами. Чтобы сформулировать функцию потерь, которую можно минимизировать, мы просто используем 1-Dice1-Dice. Эта функция потерь известна как проигрыш мягких костей, потому что мы напрямую используем предсказанные вероятности вместо порогового значения и преобразования их в двоичную маску.

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

Давайте определим функцию smooth_dice_coeff() для расчета потерь и компиляции модели:

Поезд

Я выбрал размер пакета 10 с 60 эпохами. Пакет размером 10 помог мне провести обучение на RTX3070 (ноутбук).

Кривые обучения

Кривые обучения не так уж плохи. Нет признаков недообучения или переобучения — это хороший признак.

Тестирование (прогноз)

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

Заключение

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

Ссылки:

1. U-Net: сверточные сети для сегментации биомедицинских изображений https://arxiv.org/abs/1505.04597

2. Таберник Д., Шела С., Скварч Й. и соавт. Основанный на сегментации подход глубокого обучения для обнаружения поверхностных дефектов. J Intelll Manuf 31, 759–776 (2020). https://doi.org/10.1007/s10845-019-01476-x

3. Комплексная платформа глубокого обучения NVIDIA

4. Сто слоев тирамису: полностью сверточные сети DenseNet для семантической сегментации https://arxiv.org/abs/1611.09326

5. Первичный ИИ в интеллектуальном производстве: обнаружение дефектов и не только

Приложение: Код для полной U-net