В один из весенних вечеров 2020 года я прочитал статью о нейросети face-depixelizer. После изучения, оказалось, что это своего рода фронтэнд для движка PULSE. Который базируется на нейросети StyleGAN (генерирует лица со случайными чертами).

В этом туториале по шагам расскажу и покажу, как я установил Ubuntu на Windows 10 (WSL), настроил окружение для экспериментов с PULSE, закинул очередную исходную фотографию и получил неплохой результат.
Результат восстановления исходного изображение в PULSE
Анимация морфинга и видео-туториал — далее.


Что нам дано



Face-Depixelizer — фронтэнд для работы с PULSE.

PULSE — движок на нейросети StyleGAN. Смысл его в том, что он восстанавливает изображения лица человека из нечёткой фотографии. И, кстати, это научная работа для CFV.

StyleGAN — генеративная состязательная нейросеть от NVidia, генерирует случайное лицо несуществующего человека (на самом деле будет забавно, если такой чел уже существует).


PULSE, наконец-то, примерно нам скажет, как выглядит тот самый человек, который моргнул на этом фото!


Возьмёмся за PULSE



Мне стало интересно, что же под капотом PULSE и, вообще, как его можно завести локально.
Для интереса, диагонально просмотрев научную статью, я стал думать, как с чего начать и как это всё установить (при том что ни разу не ставил себе «нейросети»).

А начал я с того, что как можно скорее, пока не упал гитхаб (если вы понимаете о чём я), перешёл к проекту PULSE. Где автор указал такой вариант установки: анаконда и питон. Т.е. во всяком случае требуются платформо-зависимые пакеты (библиотеки). Я по большей части — пользователь Windows, чем Linux. Но, всё равно, хотелось бы запустить без правок и утомительного подбора библиотек. А без Linux этого никак не сделать.

Некоторое время назад часть айти-специалистов холиварили про линукс в винде. И скажу я вам, что, по мне — зря. Вещь удобная, хотя до сих пор не доделанная.
WSL — подсистема Windows для Linux позволяет разработчикам запускать среду GNU/Linux, включая большинство программ командной строки, служебных программ и приложений, непосредственно в Windows без каких-либо изменений, избавляя от необходимости использовать отдельную виртуальную машину.

Т.е. это доступ к командной строке linux из винды. Терминал с линуксом запускается так же просто, как cmd. Удобно.

Приступим


Для работы с терминалом здесь и в видео буду использовать Windows Terminal (из Windows Store).

Кратко говоря


Проверяем требования


  • NVidia видеокарта с поддержкой CUDA (нейросеть StyleGAN использует CUDA). Список поддерживаемых видеокарт здесь
  • Экспериментальные NVidia драйвера с поддержкой CUDA в WSL2 (пока не лагает, играл).
  • Windows 10 version 2004 build 20150 и выше (пока она доступна в Windows Insider Program на раннем доступе), с обновлениями компонентов. С чего начать и как установить здесь
  • Как установить WSL2 (4.19.121 и выше; опять же пока только в раннем доступе Windows) для установки linux системы.
  • Ubuntu 18.04 для WSL2 из Windows Store.

Подготавливаем Ubuntu


  • Устанавливаем cmake
  • Устанавливаем unzip, понадобится для распаковки проектов из гитхаба
  • Устанавливаем NVidia CUDA Toolkit.

Проверяем работоспособность CUDA


  1. Скачиваем примеры CUDA
  2. Компилим и запускаем.

Устанавливаем окружение


Скачиваем и устанавливаем анаконду.

Устанавливаем PULSE


  1. Скачиваем с гитхаба PULSE
  2. Редактируем pulse.yml:

    • Добавляем каналы anaconda, conda-forge
    • Удаляем ссылки на конкретные сборки
  3. Устанавливаем окружение PULSE, используя отредактированный файл
  4. Проверяем работоспособность Pytorch и CUDA Toolkit в Python.

Экспериментируем


  1. Используя pip, обновляем jupyter notebook до последней версии
  2. Подгоняем изображение (в issue пишут, что PULSE работает с квадратным изображением 1024*1024 и тремя каналами RGB, т.е. без прозрачности)
  3. Увеличиваем\уменьшаем количество шагов и погрешность
  4. ...
  5. PROFIT!


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

Как говорится: «лучше один раз увидеть, чем сто раз услышать». На видео все шаги, начиная с обновления WSL2 и установки Ubuntu.



А теперь…

Подробнее


Требования


В очередной раз повторю требования (… и после сотого редактирования, в сотый раз вспомню Фаулера):

  • Windows 10 version 2004 build 20150 и выше
  • WSL2 (версия 4.19.121 и выше)
  • Ubuntu 18.04 для WSL2 — сам дистрибутив из Windows Store. Устанавливается после наката всех обновлений Windows 10 Insider в т.ч. WSL2
  • NVidia Driver WSL — экспериментальная версия драйверов с поддержкой новой версии WSL2. Требуется согласие на участие в экспериментальной программе NVidia. Но не всякая карта подойдёт.

Подготовка ОС


Windows 10

Цель: Windows 10 version 2004 build 20150 и выше

Предподготовка:

  1. Запускаем обновления
  2. После чего, при помощи приложения winver, проверяем текущую версию винды
  3. Если версия вашей винды ниже Windows 10 версии 2004 build 20150, то потребуется выполнить нижеследующие шаги
  4. А если всё ок, поздравляю, вам не придётся вступать в Windows Insider Program! Смело приступайте к следующему этапу!

Что делаем:

  1. Вступаем в Windows Insider Program
  2. Далее, в параметрах системы «Обновление и безопасность»:
    • Вкладка «Программа предварительной оценки» (если пустой экран, см. секцию «Решение проблем», ниже):

      1. Параметры оценки: «Ранний доступ»
      2. Нажимаем «Начать».
    • Вкладка «Центр обновления Windows»:

      1. В «Дополнительно» обязательно разрешаем «При обновлении получать обновления для других продуктов Майкрософт» (это для установки WSL2 4.19.121 и выше)
      2. Обновляемся.

Проверка: запускаем winver. В открывшемся диалоговом окне смотрим версию.

NVidia Driver CUDA WSL

Цель: Установка последней версии NVidia Driver CUDA WSL

Что делаем:

  1. Заходим на страницу
  2. Если ещё не зарегались, регаемся; соглашаемся на участие в экспериментальной программе
  3. Скачиваем и устанавливаем.

Проверка: будет на этапе «проверка работоспособоности CUDA»

WSL2

Цель: WSL2 версии 4.19.121 и выше

Предподготовка:

  1. Обновляем винду до Windows 10 version 2004 build 20150 и выше, если не обновилии по шагам выше
  2. Если, после выполнения в терминале:

    wsl --update
    будет выведено содержимое справки (а-ля wsl --help), то у вас старая версия. Тогда приступаем к выполнению шагов ниже
  3. Если выведется версия от 4.19.121 и выше, то пропускаем этот этап.

Что делаем:

  1. Запускаем PowerShell с правами админа и последовательно выполняем:
    • Включаем дополнительный компонент «Подсистема Windows для Linux»:

      dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    • Затем, включаем компонент «Virtual Machine Platform»:

      dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
    • Перезагружаемся.
  2. Обновляем WSL:

    wsl --update
  3. Далее, устанавливаем вторую версию WSL — как дефолтную для всех будущих дистрибутивов:
    Для этого запускаем PowerShell с правами админа и выполняем:

    wsl --set-default-version 2

Проверка: команда:

wsl --update
[после установки обновления] выведет версию 4.19.121 и выше.

Ubuntu 18.04 на WSL2

Цель: Ubuntu 18.04 на WSL2

Предподготовка: если на WSL ранее была установлена Ubuntu 18.04 (нижеследующую ветку я не проверял, но было бы неплохо, если вы укажете в комментариях, кто сталкивался, помогло ли):

  • Проверяем её в списке:

    wsl --list --all -v
  • Для этого дистрибутива переключаем версию WSL на ver.2:

    wsl --set-version Distro 2

    Например:

    wsl --set-version Ubuntu-18.04 2
  • Перезагружаемся.

Что делаем:

  1. Заходим в Windows Store
  2. Ищем Ubuntu 18.04 и устанавливаем

Проверка: открываем терминал, выполняем:

wsl --list --all -v

видим Ubuntu 18.04 Version 2

Подготовка Ubuntu


Предподготовка

  1. Обновляем индексы пакетов:

    sudo apt update
  2. Устанавливаем cmake (для установки dlib):

    sudo apt install cmake
  3. Для распаковки zip архивов устанавливаем, к примеру, утилиту unzip:

    sudo apt install unzip

Устанавливаем CUDA Toolkit

  1. Добавляем CUDA в индекс пакетов:

    sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
    
    sudo sh -c 'echo "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/cuda.list'
    
    sudo apt update
  2. Устанавливаем CUDA Toolkit:

    sudo apt install -y cuda-toolkit-11-0

Проверяем работоспособность CUDA Toolkit


Для этого запускаем примеры (информативна программа deviceQuery):

  1. Скачиваем:

    wget https://github.com/NVIDIA/cuda-samples/archive/master.zip
  2. Разархивируем:

    unzip master.zip
  3. Переходим и билдим (всё):

    make
  4. Запускаем:

    ./bin/x86_64/linux/release/deviceQuery

    Приложение выведет список совместимых устройств.

Устанавливаем Anaconda

  1. Скачиваем дистрибутив по ссылке
  2. Запускаем:

    bash Anaconda3-2020.02-Linux-x86_64.sh

    Во время инсталляции:

    1. Соглашаемся на лицензию
    2. Оставляем PREFIX
    3. Соглашаемся на инициализацию
  3. Перезапускаем терминал, либо выполняем:

    source ~/.bashrc

Настройка окружения в анаконде


Настраиваем PULSE

  1. Скачиваем:

    wget https://github.com/adamian98/pulse/archive/master.zip
  2. Разархивируем:

    unzip master.zip
  3. Создаём бэкап pulse.yml:

    cp pulse.yml pulse.yml.bak
  4. Фиксим pulse.yml:

    1. Добавляем каналы (это источники пакетов):
      • conda-forge
      • anaconda
    2. Убираем все референсы на конкретную версию пакета.
      Пример: из строки "zstd=1.3.7=h5bba6e5_0" убираем последнюю часть, начиная со знака равенства: "=h5bba6e5_0". В итоге получим "zstd=1.3.7".

      Делаем это либо руками, либо через утилиту sed:

      sed '/==/b; s/=\([^=]*\)$//' pulse.yml > pulse1.yml

      Примечание: первая часть означает, мол, если видим "==", то прыгаем в конец regexp скрипта
  5. Создаём окружение по файлу pulse1.yml:

    conda env create -f pulse1.yml
  6. Может быть и такое, что версия какого-то файла не найдена NotResolverPackage. Для примера возьмём libfortran 3.0.1:

    1. Гуглим conda libfortran
    2. В Anaconda Cloud в Files видим эту самую версию (3.0.1), но, к сожалению, она для osx-64
    3. Продолжаем поиск в Anaconda Cloud, видим в канале cloud-forge только предыдущую версию 3.0.0-1 для linux-64. Подходит!
    4. Заменяем в файле pulse1.yml libfortran=3.0.1 на libfortran=3.0.0=1
    5. Ещё раз выполняем:

      conda env create -f pulse1.yml
    6. Если пошла инсталляция, отлично!
    7. Если требуются другие пакеты, обязательно обращаем внимание на каналы, по необходимости добавляем.
  7. Ждём, когда установится
  8. После чего активируем:

    conda activate pulse

Проверяем работоспособность Pytorch и CUDA в python

  1. Этот скрипт:

    from __future__ import print_function
    import torch
    x = torch.rand(5, 3)
    print(x)

    Должен вывести что-то подобное:

    tensor([[0.3380, 0.3845, 0.3217],
    	[0.8337, 0.9050, 0.2650],
    	[0.2979, 0.7141, 0.9069],
    	[0.1449, 0.1132, 0.1375],
    	[0.4675, 0.3947, 0.1426]])
  2. А этот:

    import torch
    torch.cuda.is_available()

    Выведет:

    True

На этом этапе, по идее, можно остановиться. Но я пошёл дальше и для экспериментов установил jupyter notebook.
Jupyter Notebook – невероятно мощный инструмент для интерактивной разработки и представления проектов в области наук о данных.


Работа с PULSE



Приступим


  1. Активируем окружение pulse:

    conda activate pulse
  2. Устанавливаем юпитер:

    pip install jupyter
  3. Запускаем:

    jupyter notebook
    И далее:
    1. Создаём новую тетрадь New->Python3 (notebook)
    2. Вставляем туда код из файла
    3. Кидаем в корень проекта исходный файл, переименовав его в source.png:

      cp /mnt/c/Users/ПОЛЬЗОВАТЕЛЬ/Desktop/face1.png source.png
    4. Запускаем. Ждём

Заметки

  1. Очень вероятно, потребуется изменение числа шагов до 500-800, а также изменение eps
  2. Изображение должно быть:
    1. Квадратным, говорят, лучше 1024*1024
    2. В формате PNG
    3. С тремя каналами (RGB) а не с четырьмя RGBA
  3. Если выдает ошибку: "Could not find a face that downscales correctly within epsilon", учитываем следующее:

    Необходимо изменить steps и\или eps, таким образом, чтобы по достижению числа шагов (steps), значение eps было не менее L2. Ниже пояснение.

    Результат сопровождается выводом достигнутых параметров:

    BEST (400) | L2: 0.0013 GEOGROSS: | TOTAL: | time: ...

    Где 400 — это (заданное) достигнутое число шагов (steps), L2 — интересуемая величина, она должна быть меньше, чем заданная eps (как я понял, это — точность оптимизации; товарищи AI-разработчики, подскажите, что это?).

    Так вот, к примеру, необходимо увеличить что-то одно или всё вместе: steps (поставить больше 400) и\или eps (поставить eps=0,0013 и больше, т.е. должно быть так, что eps>=L2).
  4. Если есть желание посмотреть промежуточные фотографии для каждого шага, добавляем параметр -save_intermediate
    Изображения сохраняются в папку runs/: в папке HR — high resolution, в папке LR — low resolution )

Возможные проблемы — ниже.

Решение проблем


Если вы не только столкнулись с ошибками, но и решили их, пишите, добавлю сюда.

Белый экран в Windows Insider Program

Вариант: вы под другим пользователем, не хватает привилегий.
Решение: см. ссылку. Но у меня решилось без изменений реестра.

Не запускаются CUDA samples

Варианты:

  1. Ваша видеокарта не поддерживается
  2. Вы не накатили последнюю версию WSL2
  3. Вы не установили последнюю (экспериментальную) версию драйверов NVidia Driver CUDA WSL

При запуске jupyter notebook выкидывает ошибку

Ошибка: Start : This command cannot be run due to the error: The system cannot find the file specified.
Решение: копируем строку подключения в браузер (с другими решениями не разбирался).

При запуске PULSE постоянно вываливается ошибка

Ошибка: Google Quota Exceeded
Решение: копируем исходный файл у меня и кидаем в корень — в папку cache (создаём, если её нет).

Либо:

  1. Скачиваем файл по первой google ссылке из PULSE.py
  2. Переименовываем его по шаблону md5hash_synthesis.pt, где md5hash — md5 хэш скаченного файла (в нынешней версии это 6b943ee69b8491ac40e8e9ced6175659_synthesis.pt)
  3. Кидаем в папку cache (создаём, если её нет в корне директории, где лежит PULSE)

При запуске PULSE, либо проверке Pytorch выкидывает ошибку

Ошибка: ModuleNotFoundError: No module named 'torch'
Решение: если вы проверяли pytorch и он работает, то это означает, что вы не активировали окружение pulse. Для этого выполните следующую команду:

conda activate pulse

Заключение


Следующим этапом хотелось бы изучить StyleGAN и, базирующиеся на ней, другие «нейросети».
Был бы рад почитать ваши отзывы по статье, рекомендации (в т.ч. по изложению, т.к. это первая моя публичная статья), поправки.

Всем спасибо за чтение!

Список литературы и ссылки на утилиты, драйвера


  1. Инструкция по установке NVidia Driver для CUDA на WSL
  2. Драйвера NVidia для CUDA под WSL
  3. Список поддерживаемых CUDA видеокарт
  4. Примеры CUDA
  5. Инструкция по установке WSL2 на Windows 10
  6. Справка и знакомство с Windows Insider Program — ранний доступ к версиям Windows
  7. Инструкция по установке Anaconda на Linux систему
  8. Список дистрибутивов Anaconda
  9. Jupyter Notbook — аналитика и эксперименты
  10. Репозиторий PULSE
  11. Репозиторий Face-Depixelizer
  12. Репозиторий StyleGAN