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

Представьте, что вам нужно обобщить самые важные моменты футбольного матча, и вы компьютерный ученый, как бы вы решили эту проблему? Если вам нравится смотреть футбол, вы можете сами решить, какие моменты наиболее важны. Но что, если вы не любите футбол? :) Да, я не люблю футбол и я компьютерщик. Ура! Все, что мне нужно сделать, это найти доминирующий цвет для каждого кадра видео. И вы можете предположить, что если момент важен, ваша камера покинет игровую площадку и сфокусируется на футболисте. Итак, если преобладает зеленый цвет, это означает, что это не важная рамка, и вы можете удалить ее. Конечно, это может быть не так просто, но этот проект должен быть базовым проектом для изучения кластеризации K-средних.

В этом проекте я написал код с использованием python3 с OpenCV. OpenCV (библиотека компьютерного зрения с открытым исходным кодом) выпущена под лицензией BSD и, следовательно, бесплатна как для академического, так и для коммерческого использования. Я использовал кластеризацию k-средних для кластеризации цветов вместо использования гистограммы для каждого цвета пикселя.

Кластеризация K-средних

Кластеризация K-средних - это метод обучения без учителя. Если в образцах наборов данных есть метки, мы предпочитаем использовать контролируемый метод, но в реальном мире в большинстве случаев у нас нет меток, и поэтому мы предпочитаем методы кластеризации, известные как неконтролируемые методы. Цель этого алгоритма - найти группы в данных, количество групп которых представлено переменной K. Алгоритм работает итеративно, чтобы назначить каждую точку данных одной из K групп на основе предоставленных функций. Точки данных группируются на основе сходства функций. Алгоритм кластеризации K -средний дает следующие результаты:

  1. Центроиды кластеров K, которые можно использовать для маркировки новых данных
  2. Метки для обучающих данных (каждая точка данных назначается одному кластеру)

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

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

Для получения дополнительной информации вы можете прочитать это сообщение в блоге.

Подробности проекта

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

Сначала мы прочитаем данные изображения с помощью функции cv2.imread () из OpenCV как cv2. После считывания изображения с помощью cv2 наш цветовой канал изображения приходит к нам как Сине-зеленый-красный. Но нам нужен красный-зеленый-синий в качестве цветового канала изображения, поэтому мы преобразуем его в требуемый канал с помощью функции cv2.cvtcolor (). . Теперь у нас есть трехмерные параметры в данных изображения: номер строки X номер столбца X номер цветового канала. Но нам не нужна информация о строках и столбцах по отдельности. Кроме того, трудно иметь дело с 3-D матрицей, поэтому мы reshape () изображение и делаем его данными 2-D Matrix. Это была часть подготовки для изображений, и теперь мы готовы продолжить кластеризацию. Поскольку мы будем импортировать K-средние сверху нашего кода, мы можем легко использовать его, указав только n_clusters, который изначально представляет номер кластера. После этого мы будем использовать функцию fit (), чтобы применить алгоритм кластеризации K-средних к нашим предварительно обработанным данным изображения, и результат вернется к объектам clt. Мы используем функцию find_histogram (), чтобы ограничить количество гистограмм желаемым количеством кластеров. Вы можете найти полную информацию о функциях find_histogram () и plot_colors2 () в этой статье ниже. Поскольку мы не хотим находить гистограмму для всего пикселя и всей цветовой палитры, мы хотели бы ограничить ее желаемым количеством кластеров. Функция plot_colors2 () подготовит полосу и поместит на нее цвета, как показано на изображении ниже:

Гистограмма - это точное графическое представление распределения числовых данных. Это оценка распределения вероятностей непрерывной переменной. Когда мы подходим к функции find_histogram (), она принимает один параметр, который является обученным объектом clt и возвращает информацию гистограммы. нп. Функция arange (0, len (np.unique (clt.labels _)) + 1) будет возвращать равномерно распределенные значения в пределах заданного интервала. В нашем примере, поскольку у нас есть 3 кластера, значение numLabels будет [0 1 2 3]. После этого мы рассчитаем гистограмму в соответствии со значениями numberLabels и меток кластера. clt.labels_ - это массив, который включает метки кластера для каждого пикселя. После вычисления значения гистограммы мы рассчитаем соотношение полученных нами значений гистограммы, потому что работать с числами сложнее, чем с отношениями.

После вычисления соотношений гистограмм мы перейдем к функции plot_colors2 (). Эта функция построит полосу, которая отображает цвета в соответствии с кластерами и гистограммой. Сначала мы готовим трехмерную матрицу, все значения равны нулю. Затем мы наносим на график относительный процент каждого кластера. Функция cv2.rectangle () рисует простой, толстый или заполненный прямоугольник с правой стороны. Мы заполняем прямоугольник цветами с точки зрения соотношений гистограмм. Ниже вы можете найти весь код, упомянутый выше, или версию Github можно найти здесь.

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