Практика рисования фигуры SVG вручную — Введение в D3.js
Стенограмма урока «Практика рисования фигуры SVG вручную»
попробуйте лучше ознакомиться с этими путями SVG. Итак, я хотел, чтобы мы вместе создали смайлик, [СМЕЕТСЯ], поэтому я собираюсь взять свой iPad, чтобы вы могли видеть, что я рисую.[00:00:26] И затем, вы можете выложить координаты xy того, что, по вашему мнению, должно произойти, чтобы нарисовать смайлик, позвольте мне на самом деле поднять свой iPad. И это будет, конечно, мне и, И вот мы идем, хорошо, так что давайте сделаем это вместе, так какой смайлик мы должны нарисовать?
[00:01:12] [СМЕЕТСЯ] Должны ли мы просто нарисовать, Довольно простую, как эта, или на самом деле, я думаю, что вы, ребята, думаете об этом? [СМЕЕТСЯ] Поддержите меня кивком или большим пальцем вверх, улыбкой для ободрения, спасибо. [СМЕЕТСЯ] И ладно, давайте попробуем нарисовать вот это, [ЗВУК] Если вы хотите пофантазировать, интересно, как бы вы нарисовали форму сердца, если кто-нибудь вычислит путь SVG для этих форм сердца.
[00:01:51] Ради этого упражнения давайте просто нарисуем что-то вроде этого. Так что я не буду рисовать вокруг него круг, а давайте нарисуем только глаза и рот вместе, хорошо. Так у меня это сейчас в системе координат, 100 пикселей на 100 пикселей, И так, допустим это 50 пикселей, так давайте нарисуем первый глаз, допустим это тоже 50 пикселей.
[00:02:34] Итак, как выглядит этот глаз, давайте раскроем его, и я думаю, что это означает, что мы могли бы захотеть перейти к тому, как выглядит эта точка?
>> Около 25?
>> О, спасибо, позиция x в 25, а затем позиция y, как это выглядит?
[00:03:00]
>> 25 может тоже?
>> 25, может быть, тоже, ладно, и мы просто проведем прямую линию сюда, так что это вторая линия. Итак, у него должна быть та же координата x, но тогда что мы должны сделать для y, так как мы сказали, что это 25 на 25.
[00:03:21] Итак, этот должен быть, мы должны дать его-
>> [НЕРАЗБОРЧИВО]
>> Что ты сказал?
>> Пять или десять, в зависимости от того, как далеко ты хочешь зайти.
>> Хорошо, давайте уменьшим его на 10 пикселей и назовем это 35. Хорошо, давайте вставим это, 25, и, если вы следуете за нами, пожалуйста, тоже запишите это в блокнот.
[00:03:58] И я лично думаю, что это весело, так же, как смотреть, как работает блокнот. [СМЕЕТСЯ] И 35, подождите, ладно, так это потому, что, подождите, извините, так что, если вы видели это, если вы следите за блокнотом, вы удалите эту строку, в которой говорится, что трансформируется. Так что я не думаю, что нам это нужно, поэтому просто удалите эту строку, и если вы еще не прикоснулись к блокноту, я опубликую это изменение.
[00:04:42] Тогда просто перезагрузите и вы сможете это увидеть. И затем, давайте нарисуем эту другую сторону, чтобы у нас была та же самая координата Y, и на самом деле это очень интересно, потому что то, что мы собираемся делать дальше, находится в той же строке пути, мы собираемся сказать: хорошо, нарисуйте эту линию, возьмите ручку и переместите ее в это новое место, где будет наш второй глаз.
[00:05:27] Итак, мы собираемся сказать переместите его на, поэтому, если мы хотим, чтобы он был, я думаю, симметричным, мы хотим, чтобы он был на 75. Итак, мы говорим переместите его на 75, 25, линия два, а затем мы просто сказали 75, 35. Итак, давайте подтвердим, что это выглядит так, как мы хотели, поэтому мы говорим перейти к 75, 25, а затем провести линию прямо вниз к 75, 35.
[00:06:11] Посмотрите, что произойдет, и чтобы выполнить ячейку, нажмите Shift, введите, а затем вы можете выполнить ячейку. И затем у нас есть эти две милые маленькие точки глаз, [СМЕЕТСЯ], и это работает именно так, как мы надеялись. Так что теперь нам просто нужно изобразить эту маленькую улыбку, так что давайте изобразим эту улыбку вместе.
[00:06:34] Итак, для этой улыбки нам тоже нужна кривая. Итак, опять же, нам действительно нужно снова взять перо и затем переместить его в это новое положение. Итак, давайте сделаем это, но сначала выясним, какой должна быть эта новая позиция. Итак, давайте выясним xy для этого, если вы хотите выделить некоторые позиции, где, по вашему мнению, это должно быть.
[00:07:03] Вы видите это, позвольте мне использовать другой цвет, так что дайте мне знать, где, по вашему мнению, должна быть эта позиция.
>> 75, 30, 75, 15?
>> 75, подождите, подождите 75, 15 на самом деле я думаю, вы имеете в виду, что x равно 15, а y равно 75?
>> Да,
>> Круто, спасибо, так ты сказал 15, ты сказал 15, да, и 75?
[00:07:37] Хорошо, пусть будет так: позвольте мне использовать другой цвет, позвольте мне использовать те же цвета, что и в наших примерах. Итак, вы сказали 15, 75, а затем давайте напишем нашу кривую два, и на самом деле давайте сначала заполним самый конец. Итак, давайте сначала сделаем это, так что если мы хотим, чтобы это было совершенно симметрично, потому что это 15, 75, это означает, потерпите меня, поскольку я действительно плохо вычисляю на месте, 100 минус 15 равно 85.
[00:08:23] Пожалуйста, поправьте меня, [СМЕЕТСЯ] звучит правильно, правда? Итак, мы закончим на 85, 75, а затем нарисуем опорные точки. Так что мы говорим только ради того, чтобы я сказал, да, хорошо, так что давайте нарисуем несколько опорных точек. Давайте нарисуем один здесь, а затем давайте нарисуем еще один здесь, так что я думаю, что это примерно то место, где нам нужно, чтобы кривая шла туда, где она есть, да.
[00:09:10] Как вы думаете, как это выглядит? [СМЕЕТСЯ]
>> Это должно быть симметрично между вашими кривыми или это имеет значение?
>> На самом деле это не имеет значения, я имею в виду, это действительно зависит от того, какую улыбку вы хотите. Думаю, прямо сейчас мы собираемся сделать улыбку симметричной, но если вы хотите асимметричную улыбку, это тоже нормально.
[00:09:34] Отлично, мы можем это сделать, должны ли мы это делать? Хорошо, дай мне координаты синего цвета, который ты хочешь, синей опорной точки, упс. Хорошо.
>> 20, 100.
>> 20, 100, спасибо, Дэвид, хорошо, а затем наш несимметричный фиолетовый якорь, координатная контрольная точка. Где мы должны иметь это, поскольку это несимметрично, любой, кто хочет [СМЕЕТСЯ], добровольно улыбнется?
[00:10:19]
>> 85, 90.
>> Круто, 85, 90, посмотрим что получится. Хорошо, давайте введем это и посмотрим, что произойдет. Итак, у нас есть M15, 75, C20, 100, 85, 90, 85, 75, ох, посмотрите на это. [Аплодисменты] Это наш асимметричный смайлик. [СМЕЕТСЯ] Я думаю, вы выглядите довольными, но некоторые из вас находятся в тени, так что я не могу точно сказать.
[00:11:09] [СМЕХ] Но да, вот оно, да, это наши три линии, и в зависимости от того, где, ну, как мы играем с цифрами, например, если мы это сделаем, то мы получить немного наклонный смайлик. Поскольку мы вытянули опорную точку до упора, чтобы она была похожа на ноль, мы поместили опорную точку в этот угол.
[00:11:34] И если мы проделаем то же самое с другой опорной точкой, и если мы потянем ее до конца в другие 100 углов, то мы увидим это. Если мы вместо этого, вы знаете, что было бы забавно, если бы мы потянули опорную точку вверх, чтобы вместо того, чтобы опускаться в этот угол, что, если мы потянем эту опорную точку вверх.
[00:12:01] Итак, давайте попробуем как 40 или что-то в этом роде, И теперь у нас больше нет смайлика, у нас есть небольшая волнистость. Итак, да, вот почему я думаю, что путь, путь SVG, такой мощный, и именно поэтому я особенно думаю, что кривая к команде настолько мощная, потому что вы, вероятно, можете себе представить, если нам нравится, и с кривой к, мы можем рисовать, и вы вроде формы кривой.
[00:12:32] И затем, если вы просто начнете соединять эти команды вместе, тогда вы действительно сможете создать любую форму, которую захотите. И если вам нужно, например, создать пользовательскую фигуру в Illustrator, а затем экспортировать ее, то потенциально вы можете это сделать. Иногда они экспортируют его немного странно, но вы потенциально можете прочитать эту строку пути, которую они вам дадут.
[00:12:57] И тогда вы могли бы как-то расшифровать, что происходит, и это было бы действительно здорово.
Растущие эмодзи с условными нейронными клеточными автоматами
Растущий смайлик StampCA. Поиграйте с кодовой базой самостоятельно.
Когда ребенок рождается, он не появляется из ниоткуда — он начинается как отдельная клетка. Эта семенная клетка содержит всю информацию, необходимую для репликации и превращения во взрослую особь. В биологии мы называем этот процесс морфогенезом : превращение семени в структурированный дизайн.
Конечно, если есть крутой биологический феномен, кто-то пытался воспроизвести его на искусственной земле. В одном семействе работ исследуются нейронные клеточные автоматы (NCA), в которых группа клеток взаимодействует со своими соседями, создавая крутые эмерджентные конструкции. Регулируя поведение клеток, мы можем влиять на них, чтобы они росли так, как мы хотим. NCA были обучены создавать целую кучу вещей, таких как самовосстанавливающиеся изображения, паттерны, мягкие роботы и дизайны Minecraft.
Общим в этих работах является то, что один NCA представляет собой один дизайн. Вместо этого я хотел исследовать условных NCA, которые представляют функции создания дизайна, а не отдельные проекты. Аналогия здесь — трансляция ДНК — наша биология не просто определяет наши тела, они определяют систему, которая транслирует ДНК в тела. Измените ДНК, и тело изменится соответственно.
Этот пост представляет StampCA, условный NCA, который действует как сеть перевода. В StampCA исходная ячейка получает вектор кодирования, который определяет, в какой дизайн она должна вырасти. Миры StampCA могут имитировать генеративные возможности традиционных сетей изображений, таких как GAN с цифрами MNIST и автокодировщик, производящий эмодзи. Поскольку информация о дизайне хранится в состоянии ячейки, миры StampCA могут 1) поддерживать морфогенетический рост многих дизайнов и 2) выращивать их все в одном мире.
В конце я выскажу некоторые мысли о том, как NCA связаны с работой в консетях, об их потенциале в эво-дево и искусственной жизни, и почему я очень рад их перспективам.
Нервно-клеточные автоматы: как они работают?
Во-первых, давайте рассмотрим, как работает NCA в целом. Идеи здесь взяты из этой превосходной статьи Distill Мордвинцева и др. др. Пойдите, проверьте это для хорошего всестороннего объяснения.
Основная идея NCA заключается в моделировании мира ячеек, которые локально адаптируются к своим соседям. В NCA мир представляет собой сетку ячеек. Скажем, 32 на 32. Каждая ячейка имеет состояние, которое представляет собой вектор длиной 64. Первые четыре компонента соответствуют RGBA, а остальные используются только внутри.
На каждом временном шаге все ячейки будут локально корректировать свои состояния. Важно отметить, что клетки могут видеть только состояние себя и своих непосредственных соседей. Эта информация передается нейронной сети, которая затем соответствующим образом обновляет состояние ячейки. NCA будет повторяться в течение 32 временных шагов.
Один временной шаг NCA. Каждая ячейка обновляет свое состояние на основе состояний своих соседей, как это определено сверточной нейронной сетью. Основная идея здесь состоит в том, чтобы изучить набор локальных правил, которые в совокупности образуют глобальную структуру. Клетки могут видеть только своих соседей, поэтому им нужно полагаться на свое локальное окружение, чтобы понять, что делать. Опять же, аналогия в биологическом развитии — отдельные клетки адаптируют свою структуру в зависимости от своих соседей, создавая функциональное животное, если рассматривать его как единое целое.
На практике мы можем определить NCA как слой свертки 3×3, многократно применяемый рекурсивно. Это сверточное ядро представляет собой рецептивное поле клетки — каждая клетка обновляет свое собственное состояние на основе состояний своих соседей. Это повторяется много раз, пока не будет получен окончательный результат. Поскольку все дифференцируемо, мы можем подключить нашу любимую функцию потерь и оптимизировать.
Творчески подходя к нашим целям, мы можем обучать NCA различным моделям поведения. Классическая цель состоит в том, чтобы начать с обнуления каждой ячейки, кроме одной начальной ячейки, и вырастить желаемый дизайн за N временных шагов. Мы также можем обучать NCA, которые поддерживает проекты , используя старые состояния в качестве отправной точки, или NCA, которые Здесь много места для игр.
Общим недостатком здесь является необходимость переобучения NCA, если мы хотим производить другой дизайн. Мы успешно изучили алгоритм, локально генерирующий глобальный план — теперь мы можем изучить алгоритм, локально генерирующий много глобальных дизайнов?
StampCA: условные нейронные клеточные автоматы
Один из способов рассматривать биологическое развитие как систему двух факторов: ДНК и трансляции ДНК. ДНК производит код; затем система трансляции создает белки соответственно. В общем, одна и та же система перевода присутствует у всего живого. Это позволяет эволюции игнорировать общую тяжелую работу (как собирать белки) и сосредоточиться на вариациях, которые важны для их вида (какие белки создавать).
Цель условного NCA в том же направлении: отделить систему, в которой выращивает дизайнов, от системы, в которой кодирует дизайнов. Ключевое отличие состоит в том, что кодировки зависят от дизайна, тогда как система роста является общей для всех дизайнов.
Оказывается, формулировка NCA дает нам простой способ сделать это, который мы будем называть StampCA. В типичном NCA мы инициализируем сетку всеми нулями, кроме исходной ячейки. Вместо того, чтобы инициализировать эту исходную ячейку константой, давайте установим ее состояние равным 9.0074 кодирующий вектор. Таким образом, конечное состояние NCA становится функцией параметров его нейросети наряду с заданной кодировкой.
StampCA — это NCA, в котором начальное число обусловлено изученным кодированием.Вооружившись этим, мы можем построить цель типа автоэнкодера. Учитывая желаемый дизайн, сеть кодировщика сначала сжимает его в вектор кодирования. Этот вектор кодирования используется в качестве начального состояния в NCA, которое затем повторяется до тех пор, пока не будет создан окончательный проект. Затем мы оптимизируем все, чтобы окончательный дизайн соответствовал желаемому дизайну.
Правильно обученный StampCA изучает общие правила морфогенеза, которые могут вырастить произвольное распределение дизайнов. Есть два основных преимущества перед NCA с одним дизайном:
- StampCA могут выращивать новые дизайны без дополнительного обучения
- Многие дизайны могут расти в одном и том же мире
Давайте рассмотрим несколько примеров на наборах данных Emoji и MNIST.
Автоэнкодер StampCA: выращивание смайликов
Первоначальная статья Distill обучала NCA выращивать смайлики, так что давайте последовать их примеру. Мы возьмем набор данных из ~ 3000 смайликов 32×32 из этого репозитория шрифтов. Наша цель здесь — обучить StampCA, который может выращивать любые смайлики в наборе данных.
После четырехчасового обучения на графическом процессоре Colab вот результаты:
Смайлики StampCA растут. Воспроизведите эти результаты самостоятельно.
В общем, правильно делает! Одна сеть может выращивать множество видов смайликов.
Для правильной работы сети StampCA необходимо решить две основные проблемы: ячейки должны обмениваться информацией о кодировании друг с другом, а ячейки должны выяснить, где они находятся относительно центра.
Модель роста ряби.
Интересно, что характер роста всех смайликов примерно одинаков — из центрального семени исходят волны, которые затем приобретают нужный цвет. Поскольку клетки могут взаимодействовать только со своими непосредственными соседями, информация должна перемещаться локально, что может объяснить такое поведение. Рябь может содержать информацию о том, где каждая ячейка находится относительно исходного начального числа, и/или информацию об общем кодировании.
Отличительной особенностью StampCA является то, что несколько дизайнов могут расти в одном мире. Это работает, потому что все проекты используют одну и ту же сеть, просто у них разные начальные семена. Поскольку NCA по определению влияют только на своих локальных соседей, два семени не будут мешать друг другу, если они расположены достаточно далеко друг от друга.
Размещение семян вдоль пути.
Разные конструкции могут расти в одном и том же мире.
Если семена размещены слишком близко, странное поведение.
StampCA GAN: Изучение поддельного MNIST
Приятным моментом в условных NCA является то, что они могут аппроксимировать любую функцию преобразования вектора в изображение. В эксперименте с эмодзи мы использовали потерю в стиле автоэнкодера для обучения NCA, которые могли восстанавливать изображения. На этот раз давайте взглянем на цель GAN: по заданному случайному вектору вырастить типичную цифру MNIST.
Хорошо, в идеальном мире эта установка была бы довольно простой. Настройка GAN включает сеть генератора и сеть дискриминатора. Генератор пытается создать поддельные конструкции, в то время как дискриминатор пытается отличить настоящий дизайн от подделки. Мы обучаем эти сети в тандеме, и со временем генератор учится создавать реалистично выглядящие подделки.
Оказалось, что это было немного сложно обучить, поэтому я решил использовать хак. Общеизвестно, что GAN трудно стабилизировать, поскольку генератор и дискриминатор должны иметь одинаковую мощность.
Вместо этого уловка заключалась в том, чтобы сначала обучить традиционный генератор нейронной сетью с прямой связью. Этот генератор учится принимать случайный вектор и выводить реалистичную цифру MNIST. Затем мы обучаем NCA имитировать поведение генератора. Это более стабильная задача для решения NCA, и в конечном итоге он учится в основном соответствовать производительности генератора.
Цифры StampCA MNIST растут. В отличие от эмодзи, нам не нужно предоставлять набор данных для кодирования->декодирования.
Цифры MNIST генерируются с нуля с целью GAN. Воспроизведите эти результаты самостоятельно.
MNIST StampCA растет, следуя кривой цифр, по сравнению с рябью Emoji StampCA.
Преимущество этих StampCA, обученных GAN, заключается в том, что нам больше не нужен набор данных базовых изображений. Поскольку GAN могут создавать дизайны с нуля, каждая цифра, полученная из этого MNIST StampCA, является поддельным дизайном.
Другим интересным наблюдением является то, как MNIST StampCA увеличивает свои цифры. В Emoji StampCA мы увидели своего рода волнообразное поведение, когда смайлики вырастали наружу из центрального семени. В случае MNIST рост более точно следует пути цифры. Это особенно заметно при генерации цифр «0», так как центр полый.
Размещение семян вдоль пути.
Много цифр MNIST в одном мире. Обратите внимание на артефакт «бродяги», исходящий от 9-значного числа, напоминающий клеточные автоматы, такие как «Игра жизни» Конвея.
Если семена размещены слишком близко, странное поведение.
Во-первых, вы можете воспроизвести эти эксперименты с помощью этих блокнотов Colab, здесь для Emojis и здесь для MNIST.
Целью этого поста было представить условные NCA и показать, что они существуют как инструмент. Я не уделял особого внимания оптимизации производительности, поэтому не тратил много времени на настройку гиперпараметров или сетевых структур. Если вы поиграетесь с моделями, я уверен, что вы можете улучшить результаты здесь.
NCA на самом деле просто причудливая сверточная сеть, в которой одно и то же ядро применяется снова и снова. Если смотреть на вещи таким образом, то можно легко подключить NCA к любым задачам на основе изображений, которые вас интересуют.
Интересная часть NCA заключается в том, что становится легко определять цели, которые сохраняются с течением времени. В этой работе мы заботились о NCA, которые соответствовали внешнему виду изображения после определенного количества временных шагов. Мы могли бы также выполнить более сложные задачи: например, превратиться в эмодзи свиньи через 50 временных шагов, а затем превратиться в эмодзи коровы через 100.
Другим аспектом, отличающим NCA, являются ограничения их местоположения. В NCA гарантируется, что ячейка может взаимодействовать только со своими непосредственными соседями. Мы воспользовались этим, поместив несколько семян в один и тот же мир, так как мы можем быть уверены, что они не будут мешать друг другу. Локальность также означает, что мы можем увеличить размер мира NCA до произвольного размера, и это не изменит поведение ни в каком месте.
Забегая вперед, мы можем провести кучу более странных экспериментов, связывая NCA с целями, основанными на задачах. Мы могли бы рассматривать NCA как определяющее многоклеточное существо и обучать его выращивать и захватывать различные места для еды. Мы также можем рассматривать NCA как системы связи, поскольку клетки должны формировать каналы для передачи информации из одной точки в другую. Наконец, есть большой потенциал в рассмотрении NCA как системы evo-devo: представьте, что NCA определяет растение, которое динамически регулирует свой рост в зависимости от окружающей среды, с которой оно сталкивается.
Код для этих экспериментов доступен на этих ноутбуках. Не стесняйтесь кричать на меня в Твиттере с любыми мыслями.
Приложение
Цитировать как:
@article{frans2021stampca, title = "StampCA: Растущие эмодзи с помощью условных нейронных клеточных автоматов", автор = "Франс, Кевин", журнал = "kvfrans.com", год = "2021", url = "http://kvfrans.com/stampca-conditional-neural-cellular-automata/" }
Почему запись в блоге, а не статья? Мне нравятся визуализации, которые позволяет формат блога, и я не думаю, что здесь требуется полное научное сравнение — основная идея заключается в том, что такие виды условного NCA возможны, а не в том, что предложенный метод является оптимальной установкой.
Что почитать
«Выращивание нейронных клеточных автоматов», Мордвинцев и др. . Эта статья послужила первоначальным источником вдохновения для этой работы в NCA. Они показывают, что вы можете построить дифференцируемый клеточный автомат из сверточных единиц, а затем обучить эти NCA выращивать смайлики. При правильных целях эти смайлики также стабильны с течением времени и могут самостоятельно восстанавливать любые повреждения. Так как это на Distill, есть куча крутых интерактивных элементов, с которыми можно поиграть.
«Самоорганизующиеся текстуры», Никлассон и др. . Эта статья о Distill является продолжением предыдущей. Они показывают, что вы можете обучать NCA создавать стили или активировать определенные начальные слои. Дрейф NCA приводит к крутым динамическим паттернам, которые перемещаются и устойчивы к ошибкам.
«Выращивание 3D-артефактов и функциональных машин с помощью нейронных клеточных автоматов», Sudhakaran et al. В этом документе традиционная установка NCA переносится на 3D. Они обучают 3D NCA выращивать структуры Minecraft и могут сохранять все хорошие свойства самовосстановления в этой области.
« Регенерация мягких роботов с помощью нейронных клеточных автоматов» , Horibe et al. В этом документе рассматриваются NCA, которые определяют мягких роботов, которые тестируются в 2D и 3D на передвижение. Самое интересное здесь то, что они рассматривают регенерацию в контексте достижения определенного поведения — роботы получают повреждения, а затем им дают возможность восстановиться, чтобы продолжить движение. Ключевые отличия заключаются в том, что все оптимизируется путем эволюции, и изучается отдельная сеть роста и генерации.
«Бесконечные самые красивые формы» Шона Б. Кэрролла. Эта книга посвящена эволюционному развитию (эво-дево) с биологической точки зрения. Он показывает, как геном определяет систему, которая растет сама через множество взаимодействующих систем, таких как гены-репрессоры и оси организации. Можно возразить, что величайшим аспектом жизни на Земле являются не тысячи видов, а то, что все они имеют общую генетическую систему, которая может породить тысяч видов. Здесь много вдохновения в том, как мы должны создавать искусственные системы: чтобы создать хороший дизайн, мы должны сосредоточиться на создании систем, которые могут производят дизайнов.
«Коллектор нейронных клеточных автоматов», Ruiz et al. В этой статье рассматривается аналогичная проблема использования NCA для создания нескольких проектов. Вместо того, чтобы кодировать информацию о конкретном проекте в состоянии ячейки, они пытаются создать уникальные сетевые параметры для каждого проекта. Хитрость в том, что вы можете производить эти параметры через вторичную нейронную сеть, чтобы обойти переобучение.
Подписаться на @kvfrans
Для ОИИ нам нужны задачи получше. Для лучших задач нам нужна открытость. (Примечания АЛОЭ 2022)
– 7 минут чтения
Чтобы извлечь информацию из языковых моделей, оптимизируйте причинную реакцию
– 7 минут чтения
CLIPDraw: исследование синтеза текста в рисунок
– 7 минут чтения
CLIPDraw синтезирует новые рисунки из текста. Поиграйте с кодовой базой самостоятельно. Меня всегда интересовало искусство с помощью ИИ. Для меня визуальное искусство — это очень человеческая вещь: я не могу представить, как компьютер заново открывает наши собственные культурные концепции без
.Кевин Франс
Кевин Франс