Рубрики
Без рубрики

AI-РАЗДЕЛИТЕЛЬ ЦВЕТОВ

Создание цветового детектора с использованием алгоритмов AI и ML

Автор оригинала: Dharvi.

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

Итак, извлечение цвета из изображений. Звучит здорово, ха!

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

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

Немного углубившись в это, и некоторые поиски в Интернете привели меня к мысли, что наши собственные алгоритмы на основе искусственного интеллекта и ML могут быть полезны здесь. Такой алгоритм, как кластеризация “KMeans”, идеально подходит для такого рода ситуаций, когда у нас нет никакого представления о том, как цвета будут распределены внутри этого изображения.

Если вы не знакомы с алгоритмом кластеризации K Means, посмотрите на эту ссылку K Means Clustering

Итак, теперь у меня была информация о том, как решить эту проблему. Теперь пришло время КОДИРОВАТЬ!!! Итак, я начал с:-

  • Анаконда (я написал код в блокноте Jupyter)
  • Установил OpenCV с помощью самой Анаконды (это было очень просто. Поверь мне)
  • Другие библиотеки и пакеты, которые я использовал, включают в себя:- SKLearn, Matplotlib, Numpy, Коллекции, skimage (можно использовать, хотя я этого не делал) и модуль ОС.
  • Прыгнул писать в код и результаты были просто вау !!! Вы можете взглянуть на мой репозиторий, для которого есть ссылка AI-COLOR-DETECT или просто следуйте дальше, я вставлю фрагменты кода здесь с объяснением:-

ПОСЛЕДОВАЛИ ШАГИ:-

  • Загрузите необходимые библиотеки и пакеты
  • Загрузите изображение, над которым мы будем работать (ваше может быть любым, я выбрал красивых бабочек)
  • Идентификация цвета
  • Проверка нашего творения

ШАГ – 1

Здесь мы загрузим все необходимые библиотеки и пакеты из python, которые включают KMeans из sklearn.clusters, matplotlib.pyplot, numpy, cv2, из collections import Counter, os (если вы хотите получить доступ к изображению в каком-либо другом каталоге)

Снимок экрана 2020-08-09 в 11.29.45 вечера.png

ШАГ – 2

Здесь мы загрузим наше изображение (над которым мы будем работать), чтобы просто взглянуть на него! По умолчанию изображение загружается в виде массива numpy в канале BGR с помощью OpenCV, а не RGB, поэтому цвет изображения немного отличается от оригинала.

Снимок экрана 2020-08-09 в 11.31.01 вечера.png
Снимок экрана 2020-08-09 в 11.32.53 вечера.png

Как я уже говорил, цвет изображения немного отличается от оригинального, так что давайте преобразуем его в оригинальный внешний вид, не так ли? Мы будем использовать cv2.cvtColor, что означает преобразование в цветовой формат. Он принимает два аргумента: изображение, которое должно быть преобразовано, и каналы из/в, которые мы хотим преобразовать изображение. В нашем случае от BGR до RGB.

Снимок экрана 2020-08-09 в 11.35.52 вечера.png

ШАГ – 3

Здесь мы определим функции таким образом, чтобы сделать наш код модульным. Первая функция предназначена для преобразования кодов RGB в шестнадцатеричные коды, чтобы нам было легко отображать эти цвета, вторая функция предназначена для чтения изображения через OpenCV и, конечно же, преобразования его в канал RGB из BGR, и последняя функция-это то, в чем заключается вся магия. Наш алгоритм кластеризации KMeans сделает свое волшебство и выделит цвета в виде предсказаний.

  • ФУНКЦИЯ 1: Преобразование кодов RGB в шестнадцатеричные коды

  • ФУНКЦИЯ 2: Считывание изображения в пространство RGB

  • ФУНКЦИЯ 3: K означает кластеризацию и круговую диаграмму

Давайте разберемся, что эта функция делает шаг за шагом.

  • Шаг 1: Преобразуйте изображение в массив 2 на 2 numpy, потому что это форма массива K, которую алгоритм ожидает в качестве входных данных.
 modified_image = image.reshape(image.shape[0]*image.shape[1], 3)
  • Шаг 2: Извлечение цветовых кластеров с помощью алгоритма KMeans, основанного на количестве цветов, необходимых для извлечения из изображения. Здесь color_count является одним из наших аргументов функции, мы можем дать ей любое целое числовое значение.
clf = KMeans(n_clusters = color_count)
  • Шаг 3: Установите модель на наше измененное изображение, чтобы получить некоторые прогнозы значений цвета на основе кластеров.
predictions = clf.fit_predict(modified_image)
  • Шаг 4: Создайте счетчик для прогнозов, в основном это означает, сколько раз кластер был замечен. Для определения Collections.counter посмотрите на эту ссылку Collections.counter
counts = Counter(predictions)
  • Шаг 5: Извлечение центров кластеров, т. е. извлечение цветовых кодов или прогнозов для кластеров (простым способом)
center_colors = clf.cluster_centers_
  • Шаг 6: Извлеките значения кода RGB и преобразуйте их в шестнадцатеричные коды. Сначала это может показаться запутанным, но когда вы сравните его с приведенным выше кодом и извлеченными значениями, вы поймете, что мы используем ключи счетчика, которые на самом деле являются кластерами (например, 5 относится к кластеру 5), и используем его в центрах кластеров, которые мы выбрали выше, которые в основном являются кодами RGB для кластеров, а затем преобразуем их в шестнадцатеричные коды и сохраняем их в списке hex_colors и сохраняем цвета RGB в другом списке, называемом rgb_colors.

  • Шаг 7: Постройте круговую диаграмму, если наша диаграмма отображения аргументов верна.

if (display_chart):
        plt.figure(figsize = (8, 6))
        plt.pie(counts.values(), labels = hex_colors, colors = hex_colors)
  • Шаг 8: Возвращайте значения из функции. Я вернул все переменные, которые вы можете вернуть, любые значения, которые вы хотите проверить.
return counts, hex_colors,center_colors, predictions

ШАГ-4

Ого! наконец-то мы здесь. Момент истины. Давайте проверим наше творение.

  • Считайте изображение с помощью нашей функции read_image().
loaded_image = read_image('butterfly.jpeg')
  • Установите аргументы для нашей большой функции fetch_colors ().
color_count = 10
display_chart  = True
  • Запустите алгоритм
colors_fetched_counts, colors_fetched, center_colors, predictions = fetch_colors(loaded_image, color_count, display_chart)

ПРЕВОСХОДНО!!!! Наш собственный экстрактор цветов готов, и это тоже со статистикой

Скриншот 2020-08-10 в 12.15.46 утра.png

Изображение, на котором я тестировал код

Изображение, на котором я тестировал код

Давайте распечатаем выбранные цвета:

print(colors_fetched)
>>['#efe2ca',
 '#23201c',
 '#5898d4',
 '#f8f5f1',
 '#909b79',
 '#954b16',
 '#f6dd86',
 '#efdba7',
 '#e49d11',
 '#365979']

Фу!!! Итак, мы все закончили, но подождите….. После того, как вы изучили его, что, по вашему мнению, может быть его вариантами использования? Ну комментируйте и делитесь своими идеями . В то же время я поделюсь тем, что я чувствую, например:-

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

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

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