Зачастую на производстве или в других ситуациях задач автоматизации каких-то монотонных действий возникает необходимость проверки качества полученной продукции. С первого взгляда — учи классификатор и задача решена, но, к сожалению, реалистичные задачи очень часто имеют несбалансированные данные, которые не размечены никоим образом, но которых достаточно много. Очевидным решением кажутся алгоритмы группировки без учителя (unsupervised). Но тогда остается вопрос нахождения правильных фич, что является проблематичным в условии сложных, многомерных данных. И, что более важно, аномалии будут проявляться в абсолютно случайных местах из-за ваших фичей, что с сильно меньшей вероятностью даст вам нечто полезное.
Детекция аномалий представляет один из вариантов задачи детекции. В общем случае этой задачи мы находим некое распределение нашего датасета или пытаемся зафитить данный датасет в наше распределение. При работе с натуральными (физичными) табличными данными зачастую эта задача является довольно простой из-за того, что значительная часть экспериментальных данных можно привести к нормальному распределению. В ситуациях многомерных данных, в частности работы с изображением, такая задача становится намного сложнее.
Для того, чтобы ее применить в случае многомерных данных, нам необходимо провести feature engineering и провести понижение размерности до той, которая позволит нам либо напрямую, либо косвенно работать с известными нами распределениями.
SVD/PCA
SVD — Singular Value Decomposition или Сингулярное Разложение — это математическая операция разложения прямоугольной матрицы на набор сингулярных матриц. Как и значительная часть разложений в ряд, мы знаем, что самая значимая часть ряда находится в начале. PCA — Principal Component Analysis в рамках этой статьи будем рассматриваться как SVD расширенный на весь датасет. Использование данных методик и других разложений в ряд позволяет уменьшить объем, занимаемый изображением, что позволяет их использовать в алгоритмах сжатия, задав последние из элементов ряда нулем. Что интересно же для нас, в этих значениях обычно хранятся в том числе редко встречаемые фичи — аномалии. Так как данная методика работает на идеи понижения размерности, не рекомендуется повышать количество параметров до количества изображений, так как тогда каждый компонент PCA будет представлять одно из изображений. Данная методика хороша, если вам необходимо сделать быстрый анализ изображений примерно одного рода, например, изображений одного и того же объекта с производственной линии.
AutoEncoder
Расширением идеи с понижением размерности на нейронные сети является использование автоэнкодера для детекции аномалий. Автоэнкодер можно представить в качестве двух отдельных сетей — энкодера и декодера. Основная задача автоэнкодера — это понизить размерность изображения и восстановить максимально похожее на первоначальное.
Энкодер представляет из себя сеть для понижения размерности первоначального изображения и предоставления его в качестве некого скрытого распределения. Исходя из того, что аномалии редки в нашем датасете и они каким-то значимым образом отличаются от остального датасета, аномалия будет сильно выделятся на этом распределении.
Задача декодера в обычной системе автоэнкодера состоит из восстановления изображения в первоначальное из скрытого распределения созданного энкодером. Так как аномалии редки, наш декодер научится восстанавливать нормальное для этого датасета изображение из нормального для этого датасета распределения. Это означает, что при попытке подать на вход декодера распределение, содержащее аномалию, он не сможет правильно восстановить изображение. Это результирует в большой ошибке между начальным и финальным изображением. По этой ошибке мы можем построить карту разниц, которая и будет картой аномалий для каждого изображения.
PaDiM
Рассмотрим еще один подход с участием нейронных сетей для детекции аномалий.
PaDiM расшифровывается как Patch Distribution Modeling Framework for Anomaly Detection and Localization и была предложена Defard et al.
Модель состоит из нескольких частей: предобученной сверточной нейронной сети для получения эмбеддингов и набора из многомерных гауссовых распределений, представляющих нормальный класс. Использование предобученной сети позволяет не тратить время на обучение и не требует дополнительных данных, в то же время для построения гауссовых распределений требуется только одиночный пробег по датасету, что позволяет экономить время на обучении и по сути делает эту модель plug-and-play.
Основная идея данной архитектуры заключается в том, что мы, используя предобученную на ImageNet или других хороших датасетах сеть, вытаскиваем на разных уровнях сети карту фич. Для примера, одна из распространенных реализаций этой архитектуры использует ResNet-50, где извлечение фич производится после каждого Residual Block. После чего мы фитим все карты, полученные нами во время прохода по всему датасету, в нормальное многомерное распределение. После чего, во время инференса высчитывается расстояние Махаланобиса между новым изображением и выученным распределением.
На момент написания этой статьи PaDiM и его модификации показывали SOTA или близкие к SOTA результаты на нескольких датасетах.
Работа с данными
Также хочется обратить внимание на классический математический подход — сведение задачи к уже известной. Описанные выше методики полезны всегда, начиная от самого начала производства, заканчивая моментами, когда у вас накоплены террабайты данных. Может вполне возникнуть ситуация, когда у вас есть небольшое количество данных, отмеченных как аномалии и огромное количество неразмеченных данных. Мы можем прибегнуть к различным методикам аугментации данных. При достаточно грамотной аугментации мы можем свести задачу детекции аномалий к классическим задачам классификации и/или детекции.
Самое простой тип аугментации, который полезен при условии низкой вариативности в параметрах объектов (например, цвета) — это вращение. Напоминаю, что операция свертки не является инвариантной для поворота. Это значит, что поворот на несколько градусов уже позволит обучить сеть новым аномалиям
Второй тип аугментации, который можно предложить для решения этой задачи — это перенос стиля (Style Transfer) или адаптация домена (Domain Adaptation). В этих задачах нам могут помочь как модификации вышеупомянутого Автоэнкодера, например, вариации условного автоэнкодера, так и другие генерационные сети наподобие GAN/StyleGan/CycleGan. Изучение этих методик я оставлю для интересующегося читателя.
Заключение / TL DR
В ситуации, когда надо решать задачу с детекцией аномалий совсем без размеченных данных, используйте PaDiM. Если хотите реализовать самостоятельно — делайте автоэнкодер. Если у вас есть немного размеченных данных и данные не сильно отличаются друг от друга — просто повращайте немного и используйте классические методы аугментации. При высокой вариативности используйте DL генерационные методы.
Статья написана Артемом Васильевым.
Всех желающих приглашаем на открытый урок "Anomaly Detection", на котором разберем постановку задачи, нахождение аномалий в разных распределениях, SVD-feature extraction, Autoencoder, PaDiM. Регистрация здесь.