Стегоанализ и машинное обучение
- воскресенье, 2 февраля 2020 г. в 00:24:05
Привет, Хабр.
Хочу представить вам небольшой проект, который я написал вместо во время сессии.
Суть такова: это классификатор, определяющий наличие стеганографии в изображении. Сразу стоит отметить, что классификатор получился довольно простым: он работает с методом LSB, где заменяется один последний бит 8-битного RGB изображения, и проверялся только на полностью заполненных стегоконтейнерах.
Поиграть с тем, что получилось, можно тут. Примеры картинок (кстати, принимаются только png) есть здесь.
Дело в том, что стегоанализ можно рассматривать как задачу двухклассовой классификации машинного обучения. Каждый объект (картинку) необходимо описать набором признаков для дальнейшей обработки. Для этого будет использоваться алгоритм SPAM (Subtractive Pixel Adjacency Model of covers). Суть этого алгоритма состоит в том, что по различным направлениям считается разность цветов соседних пикселей , а затем вычисляются условные вероятности:
где принадлежат множеству чисел .
Таким образом получается вектор признаков для каждого изображения. Эти данные подаются на вход алгоритму машинного обучения.
Чтобы обучить классификатор, я использовал около 1000 картинок, скрытое сообщение содержалось примерно в 200 из них. Сами сообщения — случайные наборы символов (предполагается, что сообщение было зашифровано перед помещением в стегоконтейнер).
В качестве классификатора используется Catboostclassifier. Это библиотека для градиентного бустинга на основе деревьев решений.
Изначально использовался другой алгоритм с деревьями — RandomForest, но Catboost, как оказалось, дает те же результаты на порядок быстрее. Из других преимуществ — простота использования, мне не понадобилось настраивать вручную параметры для лучшей сходимости.
Сначала я хотел описать всё только на словах, но быстро понял, что без схемы во всем известном графическом редакторе не обойтись:
Пройдемся по её элементам:
Все, что проделано в этой статье, нуждается в доработке, а возможно и переработке с нуля. Но даже такой студенческий проект неплохо работает у меня, во всяком случае, поэтому мне захотелось им поделиться. Далее я планирую улучшать алгоритм, в первую очередь метод извлечения признаков.
Возможно, что у вас есть свои мысли по развитию проекта, прошу написать их в комментариях вместе с другими предложениями и/или замечаниями.
Весь код реализован на языке Python 3 версии. Полный код проекта выложен на github. Ну и ещё раз, ссылка на результат работы.
Также хочу выразить благодарность пользователю PavelMSTU за советы при разработке проекта и рекомендации по оформлению статьи.