Когда я начал изучать распознавание изображений, это был первый настоящий проект, над которым я когда-либо работал, и это было весело. Поэтому я решил начать свой первый пост о машинном обучении с этого проекта. Проект направлен на поиск доминирующего цвета изображения. Но вы, должно быть, думаете, зачем нам это?
Представьте, что вам нужно обобщить самые важные моменты футбольного матча, и вы компьютерный ученый, как бы вы решили эту проблему? Если вам нравится смотреть футбол, вы можете сами решить, какие моменты наиболее важны. Но что, если вы не любите футбол? :) Да, я не люблю футбол и я компьютерщик. Ура! Все, что мне нужно сделать, это найти доминирующий цвет для каждого кадра видео. И вы можете предположить, что если момент важен, ваша камера покинет игровую площадку и сфокусируется на футболисте. Итак, если преобладает зеленый цвет, это означает, что это не важная рамка, и вы можете удалить ее. Конечно, это может быть не так просто, но этот проект должен быть базовым проектом для изучения кластеризации K-средних.
В этом проекте я написал код с использованием python3 с OpenCV. OpenCV (библиотека компьютерного зрения с открытым исходным кодом) выпущена под лицензией BSD и, следовательно, бесплатна как для академического, так и для коммерческого использования. Я использовал кластеризацию k-средних для кластеризации цветов вместо использования гистограммы для каждого цвета пикселя.
Кластеризация K-средних
Кластеризация K-средних - это метод обучения без учителя. Если в образцах наборов данных есть метки, мы предпочитаем использовать контролируемый метод, но в реальном мире в большинстве случаев у нас нет меток, и поэтому мы предпочитаем методы кластеризации, известные как неконтролируемые методы. Цель этого алгоритма - найти группы в данных, количество групп которых представлено переменной K. Алгоритм работает итеративно, чтобы назначить каждую точку данных одной из K групп на основе предоставленных функций. Точки данных группируются на основе сходства функций. Алгоритм кластеризации K -средний дает следующие результаты:
- Центроиды кластеров K, которые можно использовать для маркировки новых данных
- Метки для обучающих данных (каждая точка данных назначается одному кластеру)
Вместо того, чтобы определять группы перед просмотром данных, кластеризация позволяет вам находить и анализировать группы, которые были сформированы органически. В разделе «Выбор 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-средних и вычислили гистограмму, чтобы получить следующий результат: