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

Как сортировать генеративные художественные шаблоны по красоте (простой пример кластеризации с python и sklearn)

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

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

Вступление

Некоторое время назад я создал этот небольшой скрипт для преобразования чисел в шаблоны. Я не собираюсь подробно объяснять, как работает скрипт, но он вдохновлен Элементарными клеточными автоматами Стивена Вольфрама , которые преобразуют числа, такие как 30, в двоичные (00011110), а затем интерпретируют цифры как включение или выключение 8 различных основных правил (в этом случае активировано 4 правила, правило 4, 5, 6 и 7), которые определяют, когда включать и выключать пиксель на изображении.

Некоторое время назад я создал || этот || небольшой скрипт для преобразования чисел в шаблоны. Я не собираюсь подробно объяснять, как работает скрипт, но он вдохновлен || Элементарными клеточными автоматами Стивена Вольфрама||, которые преобразуют числа, такие как 30, в двоичные (00011110), а затем интерпретируют цифры как включение или выключение 8 различных основных правил (в этом случае активировано 4 правила, правило 4, 5, 6 и 7), которые определяют, когда включать и выключать пиксель на изображении.

Используя это, я могу генерировать бесконечное количество различных шаблонов, проблема в том, что большинство из них не очень интересны, и у меня нет времени проверять их один за другим. Вот почему в этом посте я объясняю, как я пытался автоматизировать процесс поиска самых интересных/красивых клеточных автоматов.

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

Моя цель – сгруппировать узоры по их красоте. Я делаю это с помощью алгоритма кластеризации, основанного на особенностях, часто приписываемых красоте, таких как фрактальная размерность и эффективность сжатия. Вы можете прочитать больше об этих функциях здесь: Forsythe, Alex и др. “Предсказание красоты: фрактальная размерность и визуальная сложность в искусстве”. .

Код

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

Определение атрибутов кластеризации

Сначала я определяю ранее упомянутые атрибуты, фрактальную размерность (код, взятый из здесь ) и оценку сжатия (вес необработанного изображения tiff по сравнению с его весом, сжатым в виде изображения gif).

from fractaldimension import fractal_dimension
import cv2
import os

def fractalDimension(number):
    im = cv2.imread('images/'+str(number)+'.tiff', cv2.IMREAD_GRAYSCALE)
    newDimension = fractal_dimension(im, 0.9)
    return newDimension

def compressionScore(number):
    statinfo = os.stat('images/'+str(number)+'.gif')
    gif = statinfo.st_size # size of the file
    
    statinfo = os.stat('images/'+str(number)+'.tiff')
    tiff = statinfo.st_size # size of the file
    
    return tiff/gif

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

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

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

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

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

from sklearn.cluster import AgglomerativeClustering
import matplotlib.pyplot as plt
from matplotlib import cm

# Applying clustering algorithm
clustering = AgglomerativeClustering(n_clusters=5).fit(df[['Fractal Dimension','Compression Eficciency']].values)
df["cluster"] = clustering.labels_

# Plotting results
fig, ax = plt.subplots()
cmap = cm.get_cmap('gist_rainbow')
ax = df.plot(kind='scatter', x='Fractal Dimension', y='Compression Eficciency',cmap=cmap, c='cluster',ax=ax)
plt.show()
дескарга (5).png

Результаты

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

Кластер 0 (нулевые шаблоны)

Кластер 0 (нулевые шаблоны)

Кластер 1

дескарга (1).png

Кластер 2

дескарга (2).png

Кластер 3

Кластер 3

Кластер 4 (Сумасшедшие и хаотические паттерны)

дескарга (1).png