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

Я уже писал о кластеризации K-средних, поэтому предполагаю, что на этот раз вы знакомы с алгоритмом. Если нет, то это углубленное введение, которое я написал.

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

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

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

Итак, как мы это сделаем? Я рада, что вы спросили.

Как создавать фильтры изображений с помощью кластеризации K-средних

Прежде всего, всегда полезно помнить, что изображение - это просто вектор пикселей. Каждый пиксель представляет собой кортеж из трех целочисленных значений от 0 до 255 (беззнаковый байт), которые представляют значения RGB цвета этого пикселя.

Мы хотим использовать кластеризацию K-средних, чтобы найти k цветов, которые лучше всего характеризуют изображение. Это просто означает, что мы можем рассматривать каждый пиксель как отдельную точку данных (в трехмерном пространстве) и кластеризовать их.

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

Кстати, я не думаю, что функция vector_of_pixels должна использовать список Python. Я уверен, что должен быть какой-то способ сгладить массив numpy, я просто не смог его найти (по крайней мере, тот, который делал бы это в том порядке, в котором я хотел).
Если вы что-нибудь придумаете, дайте мне знать в комментариях!

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

Например, на нашей картинке всего три цвета: два красноватых и один зеленоватый. Если мы поместим это в 2 кластера, все красноватые пиксели приобретут какой-то другой оттенок красного (сгруппируясь вместе), а другие превратятся в какой-то зеленоватый.

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

Результаты

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

Начнем с изображения кошки и применим фильтр с разными значениями для k. Вот исходное изображение:

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

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

Теперь давайте посмотрим на результат кластеризации только по 2, 5 и 10 различным цветам.

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

Вы заметили тенденцию? Каждый добавляемый нами цвет имеет убывающую отдачу. Разница между наличием 2 цветов и 5 намного больше, чем разница между 5 и 10. Однако с 10 цветами плоские области меньше, и у нас больше детализации. Переходим к 15 и 24 цветам!

Хотя ясно, что это отфильтрованное изображение, с 24 цветами (10% от исходного количества) мы представляем кошку достаточно хорошо и с определенным уровнем детализации.

Переходим к другому изображению: вот оригинал (256 разных цветов), а вот сжатый (снова 24 цвета).

Интересно отметить, что «сжатое» изображение весит 18 КБ, а несжатое - 16 КБ. Я действительно не знаю, почему это так, поскольку компрессоры - довольно сложные звери, но я хотел бы прочитать ваши теории в комментариях.

Выводы

Мы смогли создать новые изображения, используя только 10% исходных цветов, которые были очень похожи на них. У нас также есть несколько классных фильтров благодаря кластеризации K-средств. Можете ли вы придумать какое-нибудь другое забавное приложение для кластеризации? Как вы думаете, могли ли другие методы кластеризации дать более интересные результаты?

Если вы хотите ответить на любой из этих вопросов, не стесняйтесь обращаться ко мне в Twitter, Medium или Dev.to.

Вы заинтересованы в том, чтобы начать карьеру в области науки о данных? Вы хотите стать отличным профессионалом в области машинного обучения? Ознакомьтесь с моим списком рекомендованной литературы: « 3 книги по машинному обучению, которые помогут вам повысить уровень специалиста по данным ». Один из них фактически научил меня тому, что я знаю о кластеризации K-средств.

Первоначально опубликовано на http://www.datastuff.tech 2 июня 2019 г.