Это реализация бумаги Pytorch. Нейронный алгоритм художественного стиля Леона А. Гатиса, Александра С. Экера и Матиаса Бетге. Код основан на нейронном стиле Джастина Джонсона.
В статье представлен алгоритм объединения содержания одного изображения со стилем другого изображения с использованием сверточных нейронных сетей. Вот пример, который отображает художественный стиль звездной ночи на ночную фотографию кампуса Стэнфорда:
Применение стиля разных изображений к одному и тому же изображению контента дает интересные результаты. Здесь мы воспроизводим рисунок 2 из бумаги, которая делает фотографию Tubingen в Германии в различных стилях:
Вот результаты применения стиля различных произведений искусства к этой фотографии моста Золотых Ворот:
Алгоритм позволяет пользователю компромисс относительно веса терминов реконструкции стиля и контента, как показано в этом примере, где мы переносят стиль автопортрета Пикассо 1907 года на Брэд Питт:
Изменяя размер изображения в стиле перед извлечением функций стиля, мы можем управлять типами художественных функций, которые передаются из изображения стиля; Вы можете контролировать это поведение с помощью флага -style_scale . Внизу мы видим три примера рендеринга моста «Золотые ворота» в стиле звездной ночи. Слева направо, -style_scale составляет 2,0, 1,0 и 0,5.
Вы можете использовать более одного изображения в стиле для смешивания нескольких художественных стилей.
По часовой стрелке из верхнего слева: «Звездная ночь» + «Крик», «Крик» + «Композиция VII», «Сидя обнаженная» + «Композиция VII» и «сидящий обнаженная» + «Звездная ночь»
При использовании изображений нескольких стилей вы можете контролировать степень, в которой они смешаны:
Если вы добавите флаг -original_colors 1 то выходное изображение сохранит цвета исходного изображения.
Зависимости:
Необязательные зависимости:
После установки зависимостей вам нужно запустить следующий сценарий для загрузки модели VGG:
python models/download_models.py
Это загрузит оригинальную модель VGG-19. Оригинальная модель VGG-16 также будет загружена. По умолчанию используется исходная модель VGG-19.
Если у вас меньший графический процессор памяти, то использование модели NIN ImageNet будет лучше и даст немного хуже, но сопоставимые результаты. Вы можете получить подробную информацию о модели от BVLC Caffe Modelzoo. Модель NIN загружается при запуске сценария download_models.py .
Вы можете найти подробные инструкции по установке для Ubuntu и Windows в руководстве по установке.
Основное использование:
python neural_style.py -style_image <image.jpg> -content_image <image.jpg>
Использование Cudnn с моделью NIN:
python neural_style.py -style_image examples/inputs/picasso_selfport1907.jpg -content_image examples/inputs/brad_pitt.jpg -output_image profile.png -model_file models/nin_imagenet.pth -gpu 0 -backend cudnn -num_iterations 1000 -seed 123 -content_layers relu0,relu3,relu7,relu12 -style_layers relu0,relu3,relu7,relu12 -content_weight 10 -style_weight 500 -image_size 512 -optimizer adam
Чтобы использовать несколько изображений в стиле, передайте список, разделяемый запятыми, как это:
-style_image starry_night.jpg,the_scream.jpg .
Обратите внимание, что пути к изображениям не должны содержать символ ~ для представления вашего домашнего каталога; Вместо этого вы должны использовать относительный путь или полный абсолютный путь.
Параметры :
-image_size : максимальная длина боковой (в пикселях) сгенерированного изображения. По умолчанию 512.-style_blend_weights : вес для смешивания стиля нескольких изображений стиля, как разделенный запятой список, такой как -style_blend_weights 3,7 . По умолчанию все изображения стиля одинаково взвешены.-gpu : индексированный идентификатор GPU для использования; Для установки режима процессора -gpu к c .Параметры оптимизации :
-content_weight : сколько взвешивать термин реконструкции контента. По умолчанию 5e0.-style_weight : сколько взвесить термин реконструкции стиля. По умолчанию 1e2.-tv_weight : Вес регуляризации общей вариации (TV); Это помогает сгладить изображение. По умолчанию 1e-3. Установите 0, чтобы отключить регуляризацию телевидения.-num_iterations : по умолчанию 1000.-init : метод генерации сгенерированного изображения; один из random или image . По умолчанию является random , что использует шумовую инициализацию, как в статье; image инициализируется с изображением контента.-init_image : заменяет изображение инициализации на изображение пользователя.-optimizer : алгоритм оптимизации для использования; Либо lbfgs или adam ; По умолчанию lbfgs . L-BFGS имеет тенденцию давать лучшие результаты, но использует больше памяти. Переход на Адам уменьшит использование памяти; При использовании Adam, вероятно, нужно будет играть с другими параметрами, чтобы получить хорошие результаты, особенно веса стиля, вес контента и скорость обучения.-learning_rate : скорость обучения для использования с оптимизатором ADAM. По умолчанию 1e1.-normalize_gradients : если этот флаг присутствует, градиенты стиля и содержания с каждого слоя будут нормализованы L1.Параметры вывода :
-output_image : имя выходного изображения. По умолчанию out.png .-print_iter : Печать PRENT GROST Every print_iter итерации. Установите на 0, чтобы отключить печать.-save_iter : Сохраните изображение каждые итерации save_iter . Установите 0, чтобы отключить сохранение промежуточных результатов.Параметры слоя :
-content_layers : разделенная запятая список имен слоев для использования для реконструкции контента. По умолчанию relu4_2 .-style_layers : разделенный запятой список названий слоев для использования для реконструкции стиля. По умолчанию relu1_1,relu2_1,relu3_1,relu4_1,relu5_1 .Другие варианты :
-style_scale : масштаб для извлечения функций из изображения стиля. По умолчанию 1,0.-original_colors : если вы установите это на 1, то выходное изображение сохранит цвета изображения содержимого.-model_file : Путь к файлу .pth для модели VGG Caffe. По умолчанию-оригинальная модель VGG-19; Вы также можете попробовать оригинальную модель VGG-16.-pooling : тип объединения слоев для использования; один из max или avg . По умолчанию max .. Модели VGG-19 используют максимальные слои, но в статье упоминается, что замена этих слоев средними слоями объединения может улучшить результаты. Я не смог получить хорошие результаты, используя средний объединение, но вариант здесь.-seed : целочисленное значение, которое вы можете указать для повторяемых результатов. По умолчанию это значение является случайным для каждого запуска.-multidevice_strategy : разделенный запятой список индексов слоев для разделения сети при использовании нескольких устройств. Смотрите масштабирование мульти-GPU для получения более подробной информации.-backend : nn , cudnn , openmp или mkl . По умолчанию nn . mkl требует бэкэнда MKL Intel.-cudnn_autotune : при использовании бэкэнда Cudnn проведите этот флаг, чтобы использовать встроенный Autotuner Cudnn, чтобы выбрать лучшие алгоритмы свертки для вашей архитектуры. Это сделает первую итерацию немного медленнее и может принять немного больше памяти, но может значительно ускорить бэкэнд Cudnn. Проблема: программа исчерпывает память и умирает
Решение: попробуйте уменьшить размер изображения: -image_size 256 (или ниже). Обратите внимание, что различные размеры изображений, вероятно, потребуют нерезовых значений для -style_weight и -content_weight для оптимальных результатов. Если вы работаете на графическом процессоре, вы также можете попытаться запустить с -backend cudnn чтобы уменьшить использование памяти.
Проблема: -backend cudnn медленнее, чем бэкэнд по умолчанию.
Решение: добавьте флаг -cudnn_autotune ; Это будет использовать встроенный Autotuner Cudnn для выбора лучших алгоритмов свертки.
Проблема: Получите следующее сообщение об ошибке:
Missing key(s) in state_dict: "classifier.0.bias", "classifier.0.weight", "classifier.3.bias", "classifier.3.weight". Unexpected key(s) in state_dict: "classifier.1.weight", "classifier.1.bias", "classifier.4.weight", "classifier.4.bias".
Решение: из -за смешивания с местоположениями слоя, более старые модели требуют, чтобы исправление было совместимо с более новыми версиями Pytorch. Включенный скрипт donwload_models.py автоматически выполнит эти исправления после загрузки моделей.
По умолчанию, neural-style-pt использует бэкэнд nn для свертков и L-BFG для оптимизации. Они дают хорошие результаты, но оба могут использовать много памяти. Вы можете уменьшить использование памяти со следующим:
-backend cudnn чтобы использовать бэкэнд Cudnn. Это будет работать только в режиме GPU.-optimizer adam , чтобы использовать Adam вместо L -BFGS. Это должно значительно уменьшить использование памяти, но может потребовать настройки других параметров для хороших результатов; В частности, вы должны играть с уровнем обучения, весом контента и весом стиля. Это должно работать как в режимах процессора, так и в графическом процессоре.-image_size 256 чтобы сгенерировать изображение в половине размера по умолчанию.С настройками по умолчанию, нейронная стиль-PT использует около 3,7 ГБ памяти графического процессора в моей системе; Переход на Адам и Куднн уменьшает след за графическим процессором примерно до 1 ГБ.
Скорость может сильно различаться в зависимости от бэкэнда и оптимизатора. Вот несколько раз для выполнения 500 итераций с -image_size=512 на Tesla K80 с различными настройками:
-backend nn -optimizer lbfgs : 117 секунд-backend nn -optimizer adam : 100 секунд-backend cudnn -optimizer lbfgs : 124 секунды-backend cudnn -optimizer adam : 107 секунд-backend cudnn -cudnn_autotune -optimizer lbfgs : 109 секунд-backend cudnn -cudnn_autotune -optimizer adam : 91 секундыВот те же тесты на GTX 1080:
-backend nn -optimizer lbfgs : 56 секунд-backend nn -optimizer adam : 38 секунд-backend cudnn -optimizer lbfgs : 40 секунд-backend cudnn -optimizer adam : 40 секунд-backend cudnn -cudnn_autotune -optimizer lbfgs : 23 секунды-backend cudnn -cudnn_autotune -optimizer adam : 24 секунды Вы можете использовать несколько устройств ЦП и графических процессоров для обработки изображений при более высоких разрешениях; Различные уровни сети будут рассчитаны на разных устройствах. Вы можете контролировать, какие устройства графического процессора и процессора используются с флагом -gpu , и вы можете контролировать, как разделить слои на устройствах, используя флаг -multidevice_strategy .
Например, на сервере с четырьмя графическими процессорами вы можете дать флагу -gpu 0,1,2,3 для обработки на графических процессорах 0, 1, 2 и 3 в этом порядке; Также предоставляя флаг -multidevice_strategy 3,6,12 вы указываете, что первые два слоя должны быть рассчитаны на GPU 0, слои от 3 до 5 должны быть рассчитаны на GPU 1, слои от 6 до 11 должны быть рассчитаны на графическом процессоре 2, а оставшиеся слои должны быть рассчитаны на GPU 3. Вам необходимо будет настроить -multidevice_strategy для достижения максимального уровня.
Мы можем достичь очень высоких качественных результатов при высоком разрешении, объединив обработку мульти-GPU с многомасштабной генерацией, как описано в документе , контролирующих факторы восприятия при переносе нервного стиля Леоном А. Гатисом, Александром С. Экером, Матиасом Бетге, Аароном Херцманном и Эли Шехтманом.
Вот изображение 4016 x 2213, сгенерированное на сервере с восемью графическими процессорами Tesla K80:
Сценарий, используемый для генерации этого изображения, можно найти здесь.
Изображения инициализируются белым шумом и оптимизируются с использованием L-BFG.
Мы выполняем реконструкции стиля, используя слои conv1_1 , conv2_1 , conv3_1 , conv4_1 и conv5_1 и реконструкции контента с использованием слоя conv4_2 . Как и в статье, пять потерь реконструкции стиля имеют одинаковые веса.
Если вы найдете этот код полезным для вашего исследования, пожалуйста, укажите его, используя предоставленную цитату.