Повестка дня

В этой статье мы стремимся разработать инструмент разделения изображений. В основном мы сосредоточимся на двух методах — трансферном обучении и кластеризации. Мы также реализуем трансферное обучение на наборе данных.

Трансферное обучение

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

Давайте попробуем понять это на примерах из реального мира:

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

Преимущества трансферного обучения

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

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

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

Существует множество различных алгоритмов кластеризации, которые можно использовать, включая кластеризацию k-средних, иерархическую кластеризацию и DBSCAN.

кластеризация k-средних

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

Вот краткое изложение шагов алгоритма k-средних:

  1. Выберите количество кластеров, k.
  2. Произвольно инициализируйте k центроидов.
  3. Назначьте каждую точку данных ближайшему центроиду.
  4. Пересчитайте центроиды как среднее значение точек в каждом кластере.
  5. Переназначьте каждую точку данных ближайшему центроиду.
  6. Повторяйте шаги 4 и 5, пока кластеры не перестанут меняться.

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

DBSCAN (пространственная кластеризация приложений с шумом на основе плотности)

DBSCAN (Пространственная кластеризация приложений с шумом на основе плотности) — это алгоритм кластеризации на основе плотности, который используется для идентификации кластеров точек, которые плотно упакованы вместе. Это особенно полезно для идентификации кластеров произвольной формы и для обнаружения выбросов или точек, не принадлежащих ни к одному кластеру.

Одним из преимуществ DBSCAN является то, что он не требует от пользователя указания количества кластеров заранее, так как количество кластеров определяется автоматически на основе плотности точек. Он также относительно устойчив к шуму и может обрабатывать наборы данных с большим количеством отсутствующих или неправильных данных. Однако DBSCAN может быть чувствителен к выбору параметров MinPts и Eps и может плохо работать для наборов данных с сильно различающимися плотностями.

Алгоритм DBSCAN можно абстрагировать, выполнив следующие шаги:

  1. Найдите все соседние точки в пределах eps и определите основные точки или посещенные с более чем соседями MinPts.
  2. Для каждой точки ядра, если она еще не назначена кластеру, создайте новый кластер.
  3. Найдите рекурсивно все точки, связанные с плотностью, и назначьте их тому же кластеру, что и основная точка.
    Точкиa и b называются связными по плотности, если существует точка c, которая имеет достаточное количество точек в его соседи и обе точки a и b находятся в пределах расстояния в секунду. Это цепной процесс. Таким образом, если b является соседом c, c является соседом d, d является соседом e, который, в свою очередь, является соседом a, подразумевает, что b является соседом a.
  4. Повторите оставшиеся непосещенные точки в наборе данных. Те точки, которые не принадлежат ни к одному кластеру, являются шумом.

Иерархическая кластеризация

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

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

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

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

Развитие

Зависимости

Проект создается с помощью:

Керас: pip3 install keras

Нумпи: pip3 install numpy

Scikit Learn: pip install sklearn

OpenCV: pip install opencv-python

Тензорный поток: pip install tensorflow

Импорт необходимых библиотек

Загрузить модель

В качестве нашей модели мы использовали предварительно обученную модель vgg16.

VGG16 — модель сверточной нейронной сети, предложенная К. Симоняном и А. Зиссерманом из Оксфордского университета в статье Очень глубокие сверточные сети для крупномасштабного распознавания изображений. Точность модели достигает 92,7 % в тестах Top-5 в ImageNet, который представляет собой набор данных из более чем 14 миллионов изображений, принадлежащих к 1000 классам. Это была одна из известных моделей, представленных на ILSVRC-2014.

vgg16 состоит в основном из пяти частей —

  1. свертка
  2. Объединение
  3. Уплощение
  4. Плотный или полностью связанный
  5. Выбывать

Свертка

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

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

Вот пример операции свертки с ядром 3x3 и входным изображением 7x7.

Источник: www.superdatascience.com

Объединение

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

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

Источник: computerciencewiki.org

Сведение

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

Плотный или полносвязный слой

Слой, который мы называем полносвязным слоем, мы превратили нашу матрицу в вектор и передали его в полностью связанный слой, такой как нейронная сеть.

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

Нейронная сеть с множеством сверточных слоев

Выпадение

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

Загрузить данные

Набор данных изображений собак и кошек, который мы использовали из доступного здесь, содержит 12,5 тыс. изображений собак и кошек. Мы использовали по 4 изображения из обеих категорий в качестве нашего набора данных для кластеризации.

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

Векторы объектов

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

feature_vector.py — это функция для извлечения вектора признаков из одного изображения, а feature_vectors.py — это функция, которая использует feature_vector.py для извлечения всего вектора признаков для всех изображений.

Отдельно

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

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

n_cluster — количество образов кластера, которые нужно разделить
cluster_path — путь вывода результатов
path_to_files — путь к образам, которые нужно разделить

Объединение всех функций

Давайте объединим все функции, чтобы получить результаты.

Ввод

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

Результаты

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

Кластер_0

Кластер_1

Заключение

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

Весь код этого проекта можно найти в моем профиле на GitHub.