Недавно я путешествовал по Южной Америке и провел некоторое время в Колумбии. В Боготе я наткнулся на интересное произведение искусства в своем гостиничном номере. Произведение было простым: портрет андрогинного персонажа с чертой лица, наложенной красным, слегка перекошенной в том направлении, куда смотрят глаза.

Как программист, который с любопытством следит за художественным движением NFT, я сразу же начал задаваться вопросом, могу ли я написать программу, которая могла бы автоматически генерировать что-то подобное. «Это может быть следующий NFT!» — подумал я, представив тысячи людей с таким же искусством, как их аватарка в твиттере.

Для тех, кто не обращал внимания, в прошлом году наблюдался всплеск популярности генеративного искусства благодаря появлению NFT (AKA Non-Fungible-Tokens). К настоящему времени вы, вероятно, видели изображения мультяшных обезьян, гуляющие по Интернету, в Нью-Йорк Сити и в других местах коллективного сознания. Что такое NFT, спросите вы? ДЕЛАТЬ

Компьютерное искусство не ново и возникло вместе с компьютером. Коллекция Cartoon Monkeys, также известная как BAYC (Яхт-клуб скучающих обезьян), использует компьютерную программу для произвольной сборки нарисованных вручную компонентов различными способами. Это позволяет создателю создавать тысячи разных похожих изображений, используя лишь несколько ключевых компонентов (например, шляпы, глаза, рты, рубашки и т. д.).

Другие типы программ используются для случайного создания более абстрактного произведения искусства без каких-либо компонентов, нарисованных вручную. На веб-сайте artblocks.io размещена их коллекция, которую люди могут приобрести в виде NFT. Некоторые из них — простые разноцветные закорючки, а другие — красивые морские существа. Возможности безграничны. Это заставляет задуматься, является ли искусство исключительно человеческим. Есть ли какая-то форма искусства, которую машины не могут сделать? Раньше я думал, что художники невосприимчивы к тому, что компьютеры заменяют рабочие места, но, возможно, я ошибался.

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

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

В качестве первоначального прототипа я решил написать программу на Python, используя Библиотеку изображений PIL. Хотя Python и библиотека изображений PIL менее мощны, чем Processing, они позволили мне быстро выполнить итерацию и создать первоначальный прототип для проверки моей идеи.

Я начал с импорта библиотек, необходимых для создания этой программы:

import face_recognition
from PIL import Image, ImageDraw
import random

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

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

image = face_recognition.load_image_file("input_image.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)

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

out = Image.fromarray(image)
draw = ImageDraw.Draw(out, 'RGBA')
for face_landmarks in face_landmarks_list:
    for facial_feature in face_landmarks.keys():
        feature_points = face_landmarks[facial_feature]
        draw.line(feature_points, 
                  width=trace_width,     
                  fill=trace_color_1)

Далее снова рисуем линии, но другим цветом, немного смещая:

for face_landmarks in face_landmarks_list:
    for facial_feature in face_landmarks.keys():
        feature_points = face_landmarks[facial_feature]
        skewed_feature_points = list(map(lambda pair: 
                               (pair[0]+ dir*trace_distance, 
                                pair[1] + trace_distance/2), 
                                feature_points))
        draw.line(skewed_feature_points,
                  width=trace_width, 
                  fill=trace_color_2,
                  joint='curve')

Наконец, мы добавляем желтый ореол над головой, в верхней части носа:

if (facial_feature == "nose_bridge"):
          topOfNose = face_landmarks[facial_feature][0]
          bottomOfNose = face_landmarks[facial_feature][len(face_landmarks[facial_feature])-1]
          diameter = (topOfNose[1] - bottomOfNose[1])*(-3)
          topLeft = (topOfNose[0] , topOfNose[1] - diameter/2)
          bottomRight = (topOfNose[0] + diameter, topOfNose[1] + diameter/2)
          ellipseBox = [topLeft, bottomRight]

И вот оно, у нас есть собственное сгенерированное произведение искусства!

Следующим шагом будет создание пользовательского интерфейса, который позволит пользователю сделать селфи и превратить его в произведение искусства. Позже мы могли бы подключиться к блокчейну, чтобы «чеканить» искусство как NFT.

Оставайтесь с нами для части 2.