Пример использования: кластеризация изображений с использованием алгоритма K-средних

Таким образом, в этой статье будет показано, как реализовать сверточную нейронную сеть (CNN) для извлечения функций с помощью PyTorch. Кроме того, я покажу вам, как кластеризовать изображения на основе их характеристик, используя алгоритм K-средних. Наслаждаться!

Вступление

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

Как известно, компьютеры обрабатывают числа. То, что они видят, отличается от нас. Следовательно, все, что обрабатывается компьютером, должно быть представлено в виде чисел.

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

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

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

Когда мы конвертируем трехмерную матрицу в одномерный вектор, вектор будет состоять из 786,432 значений. Это огромное количество!

Если мы будем использовать их все, наш компьютер будет медленнее обрабатывать данные. Следовательно, нам нужен метод для извлечения этих функций, и именно здесь на помощь приходит сверточная нейронная сеть (CNN).

Сверточная нейронная сеть

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

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

Преимущество модели CNN в том, что она может улавливать особенности независимо от местоположения. Следовательно, эта нейронная сеть является идеальным типом для обработки данных изображения, особенно для извлечения признаков [1] [2].

Алгоритм K-средних

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

Мы можем использовать алгоритм под названием K-Means. Сначала K-средние инициализируют несколько точек, называемых центроидом. Центроид - это ориентир для данных, которые попадают в группу. Мы можем инициализировать центроид сколько угодно.

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

Чтобы измерить расстояние, мы можем использовать формулу, называемую евклидовым расстоянием. Формула выглядит так:

Теперь мы знаем концепции CNN и K-Means. Приступим к реализации!

Реализация

Данные

В этом случае мы будем использовать набор данных от AI Crowd для конкурса под названием AI Blitz 7: Stage Prediction. Вы можете получить доступ к набору данных здесь.

Набор данных состоит из папки, содержащей изображения, и файла CSV, в котором показан пример для отправки в AI Crowd. В папке 1799 изображений, внутри нее нет метки. Следовательно, это проблема неконтролируемого обучения, в частности кластеризации.

Код для загрузки набора данных выглядит так.

Постройте модель

Сразу после загрузки данных мы можем построить модель. Модель основана на архитектуре VGG-16 и уже предварительно обучена с помощью ImageNet. Код выглядит так,

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

Как мы можем использовать эти функции в PyTorch на основе схемы, приведенной выше? Для этого мы можем использовать оператор точки (.). Мы делаем это для каждого слоя, упомянутого выше.

После извлечения каждого слоя мы создаем новый класс с именем FeatureExtractor, который наследует nn.Module от PyTorch. Код для этого выглядит так.

После того, как мы это сделаем, мы получим такую ​​схему.

Извлечение функций

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

Кластеризация

Теперь у нас есть возможности. Следующий шаг - сгруппировать его в группы. Для этого мы воспользуемся библиотекой scikit-learn. Код выглядит так.

Сохранить результат

Отлично! У нас уже есть ярлыки. Последний шаг - сохранить результат в DataFrame. Код выглядит так.

Заключение

Отличная работа! Вы уже выполнили извлечение признаков с помощью CNN, а также кластеризацию с использованием K-средних. Надеюсь, статья была вам полезна, и если вы хотите что-то спросить, вы можете связаться со мной в LinkedIn.

использованная литература

[1] Симонян К., Зиссерман А. (2015). Очень глубокие сверточные сети для распознавания крупномасштабных изображений. ArXiv: 1409.1556 [Cs]. Http://arxiv.org/abs/1409.1556

[2] VGG16 - сверточная сеть для классификации и обнаружения. (2018, 20 ноября). Https://neurohive.io/ru/popular-networks/vgg16/