В этой статье описывается, как реализовать проект быстрой передачи стилей и шаг за шагом реализовать онлайн-обучение через локальный компьютер и сервис UCloud AI Train. После обучения осуществляется перенос стиля на входные изображения и вывод в виде изображений. В этой статье также сравнивается время/цена при использовании локального компьютера и UCloud AI Train.
В предыдущей статье было представлено использование Pytorch для достижения эффектов, подобных PRISMA. Однако большие ребята в области комментариев сказали, что скорость работы на их собственных компьютерах была слишком низкой. На моей машине в то время изображение часто занимало пять или шесть минут, время для завершения. Это связано с тем, что каждый раз, когда мы вводим два изображения в систему, мы должны сначала обработать файл стиля, чтобы обучить сеть, которая может эффективно генерировать изображения.Этот шаг не зависит от целевого изображения. Если мы сможем сначала сгенерировать эту модель, сохранить ее, а затем каждый раз, когда приходит новое изображение, мы не будем переобучать модель, что может сильно сократить время выполнения.
По сути, PRISMA изначально давала лишь несколько стилей на выбор.Обучив заранее, можно сильно сэкономить на стоимости сервера, а также сократить время ожидания пользователей. Существует также множество статей и кодов для повышения квалификации, таких какPerceptual Losses for Real-Time Style Transfer and Super-Resolutionи на ЧжихуГлубокое обучение на практике: использование Tensorflow для быстрой передачи стилей
На этот раз мы будем следовать этому подходу, чтобы добиться более быстрого применения предварительно обученного переноса стиля изображения. Основная часть кода в этой части использует код @何志源大神 на Zhihu, но сеть изменена с VGG 16 на VGG 19, а для тестирования и сравнения используются некоторые другие сети.
Для большинства задач машинного обучения мы можем разделить его на две части: обучение и выполнение. В этой статье также объясняются эти две части по отдельности. В части обучения передайте файл изображения стиля и указанные параметры и используйте TensorFlow для создания файла модели.В части выполнения передайте целевое изображение и создайте соответствующее преобразованное изображение. Наконец, реализован простой API для вызова.
тренироваться
Обучение задачам машинного обучения — это процесс извлечения признаков из данных, который часто требует поддержки большого количества наборов данных. Прежде чем выбрать набор данных, я должен объяснить, что задача передачи стиля на самом деле очень похожа на распознавание изображений. В начальном переносе стиля есть две основные точки прорыва: во-первых, использование глубокого обучения для получения текстуры изображения, в то время как предыдущая работа полностью моделировалась вручную. С другой стороны, текстура изображения описывается локальными статистическими признаками. Например, следующая картинка:
Мы можем думать об этом изображении как о текстуре яблока, которое можно описать как [зеленое или красное, с круглым узором с точкой посередине] с точки зрения геометрии. Их можно рассматривать как локальные особенности. В задаче распознавания объектов используется большое количество распознавателей локальных признаков, например VGG 19. Таким образом, мы можем рассмотреть возможность прямого использования модели распознавания объектов и набора данных для извлечения локальных текстур или локальных признаков. В частности, мы используем набор данных COCO, набор данных, который можно использовать для классификации изображений и сегментации фона.
После того, как это прояснится, мы можем официально начать нашу тренировку. Процесс обучения можно разделить на следующие этапы:
- Скачать файл набора данных
- Скачать файл модели сети
- Написать/скачать обучающий код
- Тренируйтесь на месте / используйте сервис UCloud AI Train для обучения
Сначала мыздесь (~13 ГБ)Загрузите сжатый пакет набора данных. Разархивируйте его, и вы получитеtrain 2014
папка.
Кроме того, поскольку используется сеть VGG 19, нам также необходимо загрузить ее сетевую модель, которую можно найти вздесьСкачать, если вам интересно поэкспериментировать с другими сетями, вы также можетеPretrained ModelsИщите такие модели, как ResNet, Inception и т. д., чтобы попробовать. В этой статье используются сети VGG 19 и VGG 16.
Я также поместил соответствующие наборы данных и файлы моделей в облако Baidu, и скорость загрузки в Китае должна быть выше.Скачать здесь
Я вставил код обученияgithubСначала мы клонируем код:
git clone https://github.com/stevefermi/style-transfer.git
Затем создайте новый файл в этом каталоге с именемpretrained
папка. Загрузите набор данных, который мы получилиtrain 2014
иvgg_19.ckpt(或vgg_16.ckpt,类似)
в эту папку. В результате структура папок выглядит следующим образом:
- style transfer
- pretrained
- train2014
- vgg_19.ckpt
- train.py
- eval.py
- conf
- others...
Затем выполните его в каталоге передачи стилей.python train.py
Вы можете начать обучение. будет выбран по умолчаниюconf/mosaic.yml
Картина как стилистический стиль. Если вы хотите тренировать изображения разных стилей, укажите с -c:python train.py -c conf/candy.yml
Вот и все.
Если вы хотите визуализировать процесс обучения в режиме реального времени, TensorFlow предоставляет очень полезный компонент TensorBoard. Войдите в папку моделей, созданную в процессе обучения, и используйтеtensorboard --logdir=mosaic
, введите в браузере127.0.0.1:6006
Вы можете просмотреть различные сводки, предоставленные нам в TensorBoard, включая различные потери, как показано ниже:
Если вы используете мощную видеокарту NVIDIA (около GTX 1060 и выше), вы можете включить ускорение CUDA, что может значительно сократить время вычислений. С моей GTX 1070+память 16G+процессор i7 6700 каждый шаг занимает около 0,6 секунды. Для получения хорошего результата требуется около 10-12 часов. Если вы не можете ждать, вы можетескачатьФайл обученной модели. Конечно, с развитием облачных вычислений обучение на сервере стало более дешевым и экономичным решением. Далее мы попытаемся использовать услугу UAI-Train, предоставляемую UCloud. UAI предоставляет решение с одной картой / четырьмя картами для P40. Цена составляет 0,17 / 0,6 юаня за минуту. По сравнению с покупкой машины для проведения обучения. , стоимость снижена.
Процесс обучения UAI в UCloud можно разделить на следующие этапы:
- Регистрация аккаунта и проверка настоящего имени
- Организовать файловую структуру
- Загрузить набор данных в UFile
- Упакуйте изображение кода и загрузите его
- Создать тренировочное задание
- Просмотр TensorBoard, загрузка файла обученной модели
Первым шагом является регистрация учетной записи и проверка реального имени. Сначала зарегистрируйте учетную запись UCloud.После регистрации и проверки настоящего имени вы можете получить открытый и закрытый ключ в месте, показанном на рисунке ниже:
После его получения нам также необходимо создать образ Docker для хранения нашего кода и данных. Выберите, чтобы войти в UHub в меню выше, и создайте образ Docker.
На втором этапе организуем структуру файла и поместим нашpretrained
Папка была вынесена отдельно и переименованаdata
папку и назовите исходную папку передачи стилей какcode
Папка (конечно можно и не менять название, но структуру каталогов лучше оставить прежней).
Третий шаг — загрузить набор данных в UFile. Сначала мы создаем UFile Bucket. Поскольку мы загружаем много файлов (~ 580 000), нам нужно использовать инструменты управления файлами для их загрузки, поэтому нам нужно загрузить их вздесьВыберите для загрузки инструмент управления файлами, подходящий для вашей системы.
После скачивания модифицируем содержимое config.cfg и меняем public_key и secret_key на свои. Тогда мы можем запустить
./filemgr-win64.exe --action mput --bucket demobucket --key key --dir train2014 --prefix train2014/ --trimpath <path to train2014 folder>
Если результат такой, как показано на рисунке:
Это означает, что наш набор данных начал загружаться, что может занять от 30 минут до часа, в зависимости от скорости интернета. Поскольку мы упаковали файл контрольных точек (ckpt) модели VGG в Docker-образ кода, нам больше не нужно загружать этот файл модели на этом шаге.
Четвертый шаг — упаковать образ кода и загрузить его. Этот шаг является решающим.
4.1 Для загрузки пакета требуется SDK службы UAI-Train.Убедившись, что git установлен, вы можете использовать следующую команду в каталоге:
git clone https://github.com/ucloud/uai-sdk.git
cd uai-sdk
sudo python setup.py install # 视情况决定需不需要使用sudo
и воляuaitrain_tool/tf/tf_tool.py
Скопируйте файл на тот же уровень, что и папка с кодом, окончательный код и структура данных выглядят следующим образом:
- code
- train.py
- others...
- data
- train2014
- others...
- tf_tool.py
4.2 Начать упаковку. После размещения tf_tool.py и организации файловой структуры можно приступать к упаковке. Мы можем создать файл .bat (Windows) или сценарий .sh (Linux), чтобы облегчить нашу упаковку, следующим образом:
python tf_tool.py pack --public_key=<public_key> --private_key=<private_key> --code_path=./code/ --mainfile_path=train.py --uhub_username="<username>" --uhub_password="<password>" --uhub_registry=<your_image_name> --uhub_imagename=<your_image_name> --uhub_imagetag=<your_image_tag> --internal_uhub=false --ai_arch_v=tensorflow-1.3.0 --test_data_path=./data --test_output_path=./data/models --train_params="" --python_version=python-3.6.2 --os=ubuntu-16.04
некоторые изtest_data_path
иtest_output_path
Относится к расположению набора данных и экспортированного файла модели при локальном тестировании. Рекомендуется использовать абсолютный путь. Вам нужно заменить открытый/закрытый ключ закрытым ключом, который вы получили ранее, и заменить uhub-registry своим собственным именем изображения. uhub_username и пароль — это пароль учетной записи UCloud. image_tag — это файл тегов, который может записывать такую информацию, как номер версии.
Инструмент упаковки UCloud перейдет вdata
Эта папка смонтирована в контейнере/data/data
папку, поэтому нам также необходимо соответствующим образом изменить пути в наших файлах обучения и конфигурации. соответственноtrain.py
В строке 39pretrained/train2014
превратиться в/data/data/train2014
и в conf/mosaic.ymlloss_model_file: "pretrained/vgg_19.ckpt" # the path to the checkpoint
превратиться вloss_model_file: "/data/data/vgg_19.ckpt" # the path to the checkpoint
И, на что стоит обратить особое внимание, не забудьте изменить путь, по которому модель сохраняется как/data/output
. В нашем коде, это строка 23training_path
изменить наtraining_path = os.path.join('/data/output', FLAGS.naming)
После этого мы можем запустить наш инструмент упаковки. Запустите предыдущий скрипт, если он вернет:
Это просто доказывает, что наш процесс упаковки правильный.
4.3 Просмотр результатов упаковки. После упаковки мы видим, что он автоматически генерируется в каталогеuaitrain_cmd.txt
и другие документы. Этот файл содержит команды для локального тестирования и развертывания.После запуска создаются следующие файлы:
CMD Used for deploying: /data/train.py
CMD for CPU local test: sudo docker run -it -v D:\Learn\tensorflow\uai-prisma\data:/data/data -v D:\Learn\tensorflow\uai-prisma\data\models:/data/output style_transfer-cpu:v0.1 /bin/bash -c "cd /data && /usr/bin/python /data/train.py --work_dir=/data --data_dir=/data/data --output_dir=/data/output --log_dir=/data/output"
CMD for GPU local test: sudo nvidia-docker run -it -v D:\Learn\tensorflow\uai-prisma\data:/data/data -v D:\Learn\tensorflow\uai-prisma\data\models:/data/output uhub.ucloud.cn/style_transfer/style_transfer:v0.1 /bin/bash -c "cd /data && /usr/bin/python /data/train.py --num_gpus=1 --work_dir=/data --data_dir=/data/data --output_dir=/data/output --log_dir=/data/output"
Пятый шаг — создать задачу обучения ИИ. Вернитесь в консоль UCloud и выберите сервис обучения ИИ. При создании задачи обучения ИИ, поскольку данные необходимо загрузить в Ufile, необходимо заполнить адрес и открытый/секретный ключ, аuaitrain_cmd.txt
в этом файлеCMD Used for deploying
Содержимое может быть скопировано в него.
Шестой шаг – просмотр тренировочного процесса и результатов. После создания тренировочного задания вы можете просмотреть журнал тренировочного процесса в фоновом режиме. Журнал будет обновляться каждые 5 секунд.Если вы обнаружите какие-либо проблемы в это время, вы можете остановить задачу и запустить ее снова после модификации.
В логе мы видим, что UAI-Train сначала скачает необходимые для обучения файлы, а затем начнет процесс обучения. Убедившись, что он загружается нормально, вы можете расслабиться, выпить кофе, сделать перерыв и вернуться :D
Во время выполнения задачи справа от задачи появится кнопка TensorBoard, без какой-либо настройки, нажмите эту кнопку, мы можем увидеть детали TensorBoard:
Пройдя около 40 000 шагов, мы, наконец, получили предварительно обученную модель, которую хотели, и к этому времени потери в основном сходились. Наша программа обучения автоматически остановится после завершения и сохранит модель в папке моделей. При самостоятельных тренировках вы можете использовать TensorBoard для просмотра результата в режиме реального времени.Если потери не сильно меняются, их можно остановить, когда они относительно стабилизируются.
После обучения мы можем посмотреть стоимость процесса обучения, и посмотреть соответствующий лог и файл модели в UFile:
Я немного сравнил время и стоимость UAI-Train на моей GTX 1070, в режиме одной карты, для справки.
окрестности | Среднее время на шаг | Стоимость | общее время |
---|---|---|---|
GTX 1070 | 0.6 | Одна карта стоит около 3000 юаней. | 4 часа |
Единая карта УАИ | 0.47 | около 30 юаней | 3,2 часа |
воплощать в жизнь
Когда у вас есть модель, реализовать ее намного проще. нашел в кодеeval.py
файл и используйте следующую команду:
python eval.py --model_file .\models\mosaic\fast-style-model.ckpt-done --image_file .\img\test.jpg
Среди них image_file может быть указан как другое изображение, и может быть сгенерировано изображение после переноса стиля. После выполнения мы можем увидеть время, затраченное на этот вывод:
Видно, что в основном его можно выполнить примерно за 1 секунду, что является большим улучшением по сравнению с предыдущим, для которого требовалось почти 10 минут. За счет увеличения количества шагов итерации эффект тоже очень хороший:
Если вас не устраивает эффект, вы также можетеconf/*.yml
Измените соответствующий файл вstyle_weight
значение . Уменьшите, если текстур слишком много, чтобы найти содержимое изображения.style_weight
значение, наоборот, если текстур слишком мало, его можно увеличитьstyle_weight
значение . Найдите оптимальный диапазон, постоянно настраивая и экспериментируя.
Моменты, на которые следует обратить внимание
В месте входа и выхода файла обратите внимание на чтение и запись из точки монтирования. Например, входной путь модели/data/output
, входной путь/data/data/train2014
. Если он не соответствует, файл не может быть прочитан или обученная модель не может быть загружена в UFile.