- PVSM.RU - https://www.pvsm.ru -
В России модно грустить. Популярная культура под разными соусами толкает нам депресняк: всякие майки "Россия для грустных", фестивали "боль", подборки "Russian doomer music" на ютубе и так далее. Рунет завален однотипными постпанком, панельками и серостью, которые тем не менее довольно много людей видят чем-то родным и уютным, ощущают частью своего культурного кода. Мне стало интересно, сможет ли ИИ если не победить то хотя бы возглавить эту моду и затронуть струны душ рашн думеров. Ведь что может быть более бессмысленно и тоскливо чем нейросеть, рисующая гипертрофированно-хтоническую Россию? Так появился проект нейроссия [1].
Во ВКонтакте очень много пабликов где старательно собраны, отфильтрованы, а иногда и структурированы грустные российские пейзажи, так что выбор источника данных как-то сам собой пал на родную российскую соцсеть. Вообще, кажется что ВК очень классный источник данных, многие тематические паблики наполняются из предложенных записей, и картинок в них гораздо больше, чем, например, в инстаграме, где механизма предложки нет. Начал я с эталонных примеров русской хтони - пабликов ЭЕ [2] и Панельки [3].
Чтобы выкачать фотки, лайки и комменты я воспользовался python-библиотечкой vk_api [4]. Этот модуль позволяет работать с методами api вконтакта [5], а также обрабатывать капчу и двухфакторную аутентификацию. В качестве примера приведу скрипт скачивающий фоточки из последнего поста на стене сообщества:
import os
import vk_api
import urllib.request
def captcha_handler(captcha):
print (f"url: {captcha.get_url()}n")
key = input("Enter captcha code: ")
return captcha.try_again(key)
def auth_handler():
code = input("Enter 2FA code: ")
return (code, True)
def save_post_pictures(post, imgfolder, imres):
pictures = []
if not os.path.exists(imgfolder):
os.makedirs(imgfolder)
for attachment in post['attachments']:
if attachment['type'] == 'photo':
photo = attachment['photo']
for size in photo['sizes']:
if size['type'] == imres:
url = size['url']
filename = ('_'.join(url.split('/')[-2:])).split('?')[0]
urllib.request.urlretrieve(url, os.path.join(imgfolder, filename))
pictures.append(filename)
return pictures
phone = input("phone ")
password = input("password ")
domain = 'plattenbauten' # vk.com/plattenbauten
sess = vk_api.VkApi(phone, password, captcha_handler=captcha_handler, auth_handler=auth_handler)
sess.auth()
api = sess.get_api()
posts = api.wall.get(domain=domain, count=1)['items']
save_post_pictures(posts[0], domain, 'z') # https://vk.com/dev/photo_sizes - z максимальный размер
Так я накачал чуть больше чем 100к фоточек из нескольких пабликов. Дальше встал вопрос, как их отфильтровать. Для фильтрации я использовал детектор EfficientDet [6] (чтобы выкинуть из датасета фотки с людьми, машинами, котиками и.т.д, оставив только пейзажи), а также совсем чуть-чуть NLP в лице NLTK [7] чтобы обработать подписи к фотографиям - сделать стемминг [8] слов и найти по тегам то что не нашёл детектор. В итоге осталось около 10к фотографий.
Я использовал архитектуру Stylegan2 с аугментациями дискриминатора. Аугментации (повороты, отзеркаливания, кропы) позволяют получать чуть лучшие результаты на маленьких датасетах. Вот в этом репозитории [9] оригинальный код, а вот здесь [10] - моя наколеночная модификация для запуска в Google Colab и генерации видео по ключевым кадрам (об этом дальше).
У этой реализации стайлгана есть одна особенность - на вход ему нужны данные в формате .tfrecord (как их получить из картинок описано в readme [9]). А особенность заключается в том, что картинки записываются в tfrecord-ы без сжатия, что в условиях работы на Colab может быть критично. Так, например, датасет из 10 тысяч картинок разрешения 1024х1024, будучи сконвертированным в .tfrecord забьёт диск Колаба под завязку. Говорят, что есть модификация stylegan2 [11] которая использует сжатие в .tfrecord-ах, но я её пока не проверял.
Обучение на Google Colab в бесплатной версии идёт со скоростью примерно полчаса на эпоху для разрешения 1024х1024. Когда уже на первых эпохах на генерируемых сеткой картинках проступила родная цветовая гамма, вспомнился мем про "отчего так в России берёзы шумят".
В какой-то момент проект из гиковских прикольчиков превратился в прикольчики творческие. Возникла идея привлечь к этому друзей-музыкантов и сделать генеративное видео с генеративной музыкой (впоследствие трансформировавшаяся в вариативный стрим на платформе mubert [12]). Хотелось чтобы переходы в видео были хоть немного осмысленными и согласующимися с музыкой.
Латентный вектор это промежуточное сильно сжатое представление картинки, в котором скрыты все выученные нейросетью свойства. Наверное, можно было заморочиться и найти в латентном векторе (размерности 512) компоненты отвечающие за тот или иной параметр картинки (чтобы например плавно менять освещение, сохраняя структуру картинки), но я решил что проще сгенерировать видео по ключевым кадрам. Если плавно переходить от вектора соответствующего одной картинке (ключевому кадру) к вектору соответствующему другой, то картинки также будут плавно перетекать одна в другую. Для этого я поменял несколько строк в скрипте generate.py [13] так, чтобы на вход он принимал папку с латентными векторами выбранных картинок, и список, в котором эти картинки должны появляться в видео.
С появлением таких архитектур как stylegan, генеративное искусство набирает обороты - некоторые даже успешно продают генеративные картины за сотни денег [14], не написав ни строчки кода. Надеюсь, эта статья натолкнёт кого-то ещё на идеи применения нейросетей в искусстве, тем более что сервисы типа Colab существенно снижают порог вхождения и затраты для получения интересных результатов.
Нейроссия в ВК [1]
Python-обёртка api вконтакте [15]
Автор: Ilya Belikov
Источник [16]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/vkontakte/360255
Ссылки в тексте:
[1] нейроссия: https://vk.com/neurussia
[2] ЭЕ: https://vk.com/yebenya
[3] Панельки: https://vk.com/plattenbauten
[4] vk_api: https://github.com/python273/vk_api
[5] методами api вконтакта: https://vk.com/dev/methods
[6] EfficientDet: https://github.com/xuannianz/EfficientDet
[7] NLTK: https://www.nltk.org/
[8] стемминг: https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B5%D0%BC%D0%BC%D0%B8%D0%BD%D0%B3
[9] этом репозитории: https://github.com/NVlabs/stylegan2-ada
[10] вот здесь: https://github.com/ferluht/stylegan2-ada-colab
[11] есть модификация stylegan2: https://github.com/skyflynil/stylegan2
[12] вариативный стрим на платформе mubert: https://play.mubert.com/e629b746a8af3c14ca582a65c
[13] generate.py: https://github.com/ferluht/stylegan2-ada-colab/blob/main/stylegan2-ada/generate.py#L27
[14] успешно продают генеративные картины за сотни денег: https://www.christies.com/features/A-collaboration-between-two-artists-one-human-one-a-machine-9332-1.aspx
[15] Python-обёртка api вконтакте: https://github.com/python273/vk_api%20
[16] Источник: https://habr.com/ru/post/535854/?utm_source=habrahabr&utm_medium=rss&utm_campaign=535854
Нажмите здесь для печати.