Для того чтобы не очень удачное фото могло заиграть новыми яркими красками, приходится долго редактировать его в Photoshop или использовать возможности нейронных сетей. Сегодня мы создадим виртуальную машину VirtualBox с ОС Lubuntu 16.04, установим и запустим на ней нейронки Real-ESRGAN и GFPGAN и с их помощью дадим вторую жизнь старым фотографиям.
Установка и использование Real-ESRGAN и GFPGAN
В новых версиях Real-ESRGAN и GFPGAN нет особых требований к видеокартам ( однако поддержка Nvidia CUDA не помешает), и они могут работать на вполне обычном «железе». Для обработки фотографий с помощью этих инструментов ваш компьютер должен соответствовать перечисленным ниже требованиям:
- он должен работать под управлением 64-разрядной версии Linux не ниже Ubuntu 16.04;
- иметь не менее 768 МБ реально свободной оперативы, не используемой ни видеоадаптером, ни ОС;
- свободное дисковое пространство не менее 15 ГБ.
Операционная система
У вас 32-разрядная Windows? Ничего страшного, безвыходных ситуаций нет! Кто сказал, что компьютер нельзя виртуализировать? Установите гипервизор VirtualBox, создайте в нем виртуальную машину и не забудьте указать в ее настройках следующие параметры:
- ОС: Linux/Ubuntu (64 бит);
- Объем оперативной памяти: 1024 Мбайт (не менее, лучше больше);
- Дисковое пространство: 20 Гбайт
- Настройка сетевого адаптера: NAT (с выходом в Интернет).
Последнюю версию VirtualBox для 32-разрядной Windows можно скачать по этой ссылке.
Следует помнить, что для того чтобы установить 64-разрядную гостевую операционную систему, нужно, чтобы процессор на вашем компьютере был 64-разрядным и поддерживал аппаратную виртуализацию Intel VT-x или AMD-V.
РЕКОМЕНДУЕМ:
Как обмануть нейронную сеть
Не каждый дистрибутив Linux подойдет для виртуальной машины с достаточно скромными параметрами. Так, версия Ubuntu с 1 ГБ ОЗУ не сможет запустить даже программу установки. Кроме того, мы не можем тратить оперативную память на украшение рабочего стола, каждый мегабайт ОЗУ нужен для выполнения основной задачи. Мне по производительности больше всего понравился Bodhi Linux 4.5, дистрибутив на базе Ubuntu 16.04, с облегченным рабочим столом Moksha. Но у него есть свои заморочки с установкой и настройкой, поэтому, возможно, вам будет проще использовать Lubuntu 16.04, вариант Ubuntu с рабочим столом LXDE. Я его тоже опробовал, он вполне подходит для решения наших задач.
По этой ссылке можно скачать образ диска с 64-битным дистрибутивом Lubuntu 16.04.
Уверен, что с установкой вы справитесь самостоятельно. После установки не забудьте обновить содержимое репозитория:
1 |
sudo apt update |
Если вы планируете использовать машину не только в качестве увеличителя фотографий, то можно обновить установленное ПО:
1 |
sudo apt upgrade |
Но для реализации наших целей данный этап не обязателен.
Итак, теперь у вас есть 64-разрядная ОС Linux. Давайте начнем устанавливать на нее прикладные программы. Чтобы вам было легче в последующих шагах, я в общих чертах описал, что должно получиться в итоге.
На этом рисунке черным цветом выделены каталоги, зеленым — главные исполняемые файлы и сценарии, голубым — символические ссылки, синим — файлы данных. Серым выделены рабочие каталоги, которые, вообще говоря, можно создавать по своему усмотрению. Обратите внимание, что вся структура файлов находится в каталоге пользователя, поэтому для ее создания не требуется специальных привилегий.
Среда выполнения
Для работы Real-ESRGAN и GFPGAN требуется версия Python не ниже 3.7. Если ваш компьютер удовлетворяет этому требованию, то данный раздел можно пропустить. Но если вы хотите собрать целый программный комплекс, чтобы потом быстро развернуть его на различных дистрибутивах Linux, то я предлагаю не отвлекаться и следовать описанным здесь шагам.
К примеру, Ubuntu 16.04 идет с Python 3.5, который в значительной степени интегрирован с ОС, и изменение версии может привести к неприятным последствиям. Поэтому давайте соберем Python 3.8 и установим его в качестве отдельного пользовательского интерпретатора, не затрагивающего системный интерпретатор.
Сначала установите из репозиториев дополнительные пакеты, которые нужны для сборки интерпретатора и его дополнений, в соответствии с рекомендациями разработчиков для твоей версии операционной системы. Для Ubuntu 16.04 это можно выполнить следующей командой:
1 2 3 4 |
sudo apt install build-essential gdb lcov pkg-config \ libbz2-dev libffi-dev libgdbm-dev liblzma-dev \ libncurses5-dev libreadline6-dev libsqlite3-dev libssl-dev \ lzma lzma-dev tk-dev uuid-dev zlib1g-dev |
Из сети будет загружено 63,5 Мбайт архивов. В более новых версиях в этот список надо добавить пакет libgdbm-compat-dev.
Затем загрузи с официального сайта исходные тексты интерпретатора (26 Мбайт) и распакуй их:
1 2 |
wget https://www.python.org/ftp/python/3.8.18/Python-3.8.18.tgz tar -xzf Python-3.8.18.tgz |
Потом сконфигурируй их для установки интерпретатора в пользовательский каталог ~/.local, скомпилируй и выполни установку:
1 2 3 4 |
cd Python-3.8.18 ./configure --prefix=$HOME/.local --enable-optimizations make make install |
Проверь, как прошла установка:
1 2 3 4 |
$ ~/.local/bin/python3.8 --version Python 3.8.18 $ ~/.local/bin/pip3.8 --version pip23.0.1 from ~/.local/lib/python3.8/site-packages/pip (python 3.8) |
Если всё в порядке, можешь удалить исходные тексты интерпретатора и рабочие файлы:
1 2 3 |
cd .. rm -fr Python-3.8.18 Python3.8.18.tgz |
В дистрибутивах Ubuntu путь ~/.local/bin присутствует в переменной окружения PATH и является приоритетным. Поэтому запускать интерпретатор можно без указания путевого префикса. В иных случаях можно либо добавить указанный путь в начало значения переменной PATH, либо запускать исполняемые файлы по полному имени: ~/.local/bin/python3.8, ~/.local/bin/pip3.8. В дальнейшем изложении будет использоваться сокращенный вариант, а ты разберись, какой требуется в твоей операционной системе, и действуй соответственно.
Нужная версия Python теперь тоже в наличии. Но прежде чем переходить к установке основных программ «фотоувеличителя», надо убедиться, что рабочей памяти компьютера для этого достаточно. Узнать имеющиеся ресурсы можно с помощью такой команды:
1 |
free -h |
Сложи значение в последней колонке строки Mem (available) со значением в последней колонке строки Swap (free). Если получилось больше 2560 Мбайт (2,5 Гбайт), то следующий раздел можешь пропустить. В противном случае придется увеличить виртуальную память операционной системы.
Увеличение виртуальной памяти
Как ты знаешь, виртуальная память Linux представлена физической оперативной памятью и памятью страничной подкачки на внешнем носителе — выделенном разделе жесткого диска или в специальном swap-файле. Если во время работы приложения оперативная память исчерпывается, операционная система задействует механизм подкачки, перемещая неиспользуемые страницы на внешний носитель и загружая с него страницы c данными, которым требуется обработка. Продолжительную активную работу в таком режиме хорошо характеризуют слова из песни В. С. Высоцкого: «это не езда, а ерзанье».
Но в нашем случае увеличение и использование виртуальной памяти — оправданный способ решения поставленной задачи, и вот почему. При настройке «фотоувеличителя» я обнаружил, что исчерпание памяти возникает в следующих ситуациях:
- при установке дополнительных модулей Python (о них речь пойдет ниже), когда программа pip использует оперативную память в качестве буфера и нет никаких проблем в том, чтобы позволить операционной системе
- кешировать загружаемые из сети данные на диск;
- при инициализации нейронных сетей и формировании файлов с результатами работы, что является незначительным фрагментом общего объема работы.
Для основного процесса обработки изображений заявленных 768 Мбайт свободной оперативной памяти вполне достаточно.
При установке на виртуальную машину с 1024 Мбайт ОЗУ операционной системы Lubuntu 16.04 автоматически создается раздел подкачки размером около гигабайта. Для работы «фотоувеличителя» этого мало. Поэтому создадим swap-файл размером 2048 Мбайт (2 Гбайт) и добавим его к имеющейся виртуальной памяти (все команды запускаем от рута):
1 2 3 4 5 6 |
swapoff -a dd if=/dev/zero of=/swapfile bs=1024k count=2048 chmod 0600 /swapfile mkswap /swapfile swapon -a swapon /swapfile |
Приведенная выше последовательность команд начинается с отключения памяти подкачки (swapoff), чтобы ее можно было без изменений выполнять на операционных системах, использующих не раздел, а файл подкачки /swapfile. Кстати, в этом случае последняя команда сообщит об ошибке swapon failed: Device or resource busy, поскольку файл подкачки уже будет задействован предыдущей командой. Проконтролировать, какие именно хранилища подкачки используются, можно с помощью команды swapon без параметров.
Нейросети «фотоувеличителя»
Проекты GFPGAN и Real-ESRGAN используют вспомогательные ресурсы:
- BasicSR, Basic Surer-resolution — программное обеспечение для восстановления качества фото- и видеоматериалов;
- FaceXLib — реализации алгоритмов для работы с лицами людей на фотографиях (обнаружение, выравнивание, выделение основных элементов и прочее).
За реализацию всей скучной математики нейронных сетей на центральных и графических процессорах отвечает пакет PyTorch. Установим эти вспомогательные пакеты Python:
1 2 |
pip3.8 install basicsr --cache ~/pipcache pip3.8 install facexlib --cache ~/pipcache |
Кеш используется для того, чтобы загрузка пакетов не начиналась заново, если по каким‑то причинам она будет прервана, а продолжалась с места остановки.
Имей в виду, что BasicSR со всеми своими зависимостями занимает больше 4 Гбайт и загрузка этих данных из сети даже в сжатом виде может потребовать значительного времени.
Не исключено прерывание процесса с сообщением об ошибке:
1 2 3 4 |
Collecting torch >= 1.7 ERROR: Exception: ... MemoryError |
Это значит, что надо вернуться к предыдущему разделу и проверить использование памяти. Возможно, ты перезагружал компьютер и забыл снова подключить файл подкачки.
По завершении установки вспомогательных пакетов содержимое каталога ~/.local увеличится до 5 Гбайт, а в кеше ~/pipecache будет находиться 2,4 Гбайт данных, которые теперь можно удалить:
1 |
rm -fr ~/pipcache |
Установим основное программное обеспечение GFPGAN и Real-ESRGAN прямо из Git-репозиториев:
1 2 3 4 |
sudo apt install git mkdir ~/GAN && cd ~/GAN git clone https://github.com/xinntao/Real-ESRGAN.git git clone https://github.com/TencentARC/GFPGAN.git |
Это не займет много времени, а после завершения установки в каталоге ~/GAN появятся подкаталоги GFPGAN и Real-ESRGAN, занимающие 25 и 24 Мбайт соответственно.
Чтобы предотвратить в дальнейшем установку дополнительного модуля Python и использовать уже имеющиеся файлы, создадим ссылку на рабочий каталог gfpgan.
1 2 |
cd ~/.local/lib/python3.8/site-packages ln -s ../../../../GAN/GFPGAN/gfpgan |
Теперь давай настроим установленное программное обеспечение:
1 2 3 4 5 |
cd ~/GAN/GFPGAN python3.8 setup.py develop cd ~/GAN/Real-ESRGAN python3.8 setup.py develop ln -s ../GFPGAN/gfpgan |
Последняя команда создает в каталоге Real-ESRGAN ссылку, чтобы избежать дублирования весов моделей GFPGAN.
На этом установка и настройка программного обеспечения «фотоувеличителя» завершена. Осталось выполнить последний шаг подготовительного этапа — загрузить «модели», то есть веса нейронных сетей, заранее вычисленные в ходе их обучения. Если этого не сделать, то при первом использовании программ GFPGAN и Real-ESRGAN они будут загружены автоматически. Но можно сохранить контроль над процессом и вручную выполнить следующие команды:
1 2 3 4 5 |
$ cd ~/GAN $ wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.3.pth -P GFPGAN/gfpgan/weights $ wget https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_Resnet50_Final.pth -P GFPGAN/gfpgan/weights $ wget https://github.com/xinntao/facexlib/releases/download/v0.2.2/parsing_parsenet.pth -P GFPGAN/gfpgan/weights $ wget https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth -P Real-ESRGAN/weights |
Будь внимателен при указании пути к целевому каталогу. Если допустишь опечатку, wget без предупреждения создаст новый подкаталог и выполнит загрузку данных в него. Естественно, потом программное обеспечение «фотоувеличителя» не сможет обнаружить такой файл.
Файлы с весами для нейронных сетей GFPGAN и Real-ESRGAN имеют следующие размеры:
GFPGANv1.3.pth — 332 Мбайт;
detection_Resnet50_Final.pth — 104 Мбайт;
parsing_parsenet.pth — 81 Мбайт;
RealESRGAN_x4plus.pth — 64 Мбайт.
Борьба с прогрессом
Казалось бы, теперь‑то все готово к тому, чтобы заняться обработкой фотографий. Действительно, у меня настроенный по описанной методике «фотоувеличитель» сразу же заработал. Но когда я через несколько дней проверял инструкцию при работе над этой статьей, повторно выполняя все действия, меня поджидал сюрприз. Программное обеспечение GFPGAN отказывалось работать, сообщая об ошибке:
1 2 |
ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'OpenSSL 1.0.2g 1 Mar 2016'. See: https://github.com/urllib3/urllib3/issues/2168 |
Вот тебе на! Оказалось, что, приняв решение об использовании устаревшей операционной системы, мы вступили на скользкую дорожку. За эти несколько дней Python-модуль google-auth, по какой‑то причине входящий в состав зависимостей программного обеспечения «фотоувеличителя», обновился до версии 2.0.5 и решил запретить использование устаревших криптографических протоколов, подняв требования к системной библиотеке OpenSSL. Но для Ubuntu 16.04 ожидать обновлений уже не приходится.
Собирать эту библиотеку из исходников, как мы сделали с Python 3.8? Это, конечно, один из вариантов. Но, если хорошенько подумать, зачем нам google-auth и сетевая безопасность на виртуальной машине, которая создавалась специально для локальной обработки фотографий? Лучше пойдем другим путем и установим устаревший модуль google-auth версии 1.26.6:
1 2 3 |
$ pip3.8 install urllib3=1.26.16 ERROR: ... google-auth 2.23.1 requires urllib>=2.0.5 Successfully installed urllib3-1.26.16 |
Не будет работать google-auth? Не очень‑то и хотелось! Главное, что сам «фотоувеличитель» после этого запускается. Однако как быть в дальнейшем? Прогресс ведь не остановишь, и поезд с модулями Python будет все дальше уходить от Ubuntu 16.04. Поэтому рекомендую тебе сохранить установленный набор программ в архиве GAN_U1604.tgz:
1 2 |
cd ~ tar -zcf GAN_U1604.tgz .local GAN |
Имея снимок работающего варианта «фотоувеличителя», тебе не составит труда при необходимости развернуть его на свежеустановленной виртуальной машине. Тем самым ты сбережешь себе не только нервы, но и время, необходимое для загрузки данных из сети и последующей настройкуи
Обмен файлами с виртуалкой
Возможно, у тебя возник вопрос, как настроить обмен файлов между виртуальной машиной и компьютером с гипервизором. VirtualBox предлагает использовать дополнение, пробрасывающее папки файловой системы компьютера в виртуальную машину. Но я предпочитаю более универсальный способ — сетевой обмен по протоколу FTP. Почти любая операционная система, установленная на виртуальной машине, содержит в своем составе тот или иной FTP-клиент, а поднять на компьютере FTP-сервер и настроить брандмауэр — задача, которую нужно решить один раз. Кстати, я использую сервер, который реализует утилита «Швейцарский файловый нож», запуская его при необходимости:
1 |
C:\> sfk.exe ftpserv -port=21 -rw D:\FTP |
В таком варианте использования сервер открывает полный доступ к каталогу D:\FTP при вводе любого имени пользователя и пароля, поэтому после передачи файлов его работу нужно завершить комбинацией клавиш [Ctrl] + [C].
РЕКОМЕНДУЕМ:
DAN джейлбрейк ChatGPT
Кстати, не забудь перед передачей файлов переключить в настройках виртуальной машины сетевой адаптер из режима «NAT» в режим «Виртуальный адаптер хоста».
Редактирование фотографий
Итак, все ингредиенты собраны и смешаны, можно приступать к волшебству. Не откладывая дела в долгий ящик, сразу выполним увеличение фотографии с отстирыванием и разглаживанием одежды присутствующих на ней персонажей, а заодно проработаем детали их лиц. В этом нам поможет Real-ESRGAN, который сам обратится за дополнительными услугами художника к GFPGAN. Исходные фотографии (файлы в формате JPEG или PNG) поместим в каталог ~/GAN/in, а результат пусть сохраняется в каталоге ~/GAN/out. Обработка запускается следующим образом:
1 2 |
cd ~/GAN/Real-ESRGAN python3.8 inference_realesrgan.py -i ../in -o ../out -t 64 --fp32 --face_enhance |
В ходе инициализации «увеличителя» появится серия сообщений с предупреждениями, а при небольшом объеме оперативной памяти начнется активный страничный обмен с файлом подкачки. Но через минуту‑другую ситуация должна стабилизироваться, а на экране побегут поползут отсчеты обработанных блоков:
1 2 3 4 5 6 7 8 9 10 11 |
[W NNPACK.cpp:64] Could not initialize NNPACK! Reason: Unsupported hardware. Tile 1/42 Tile 2/42 ... Tile 41/42 Tile 42/42 |
На предупреждение, что инициализировать NNPACK невозможно, не стоит обращать внимания, мы ведь знаем, что у нас нет подходящего графического ускорителя. На компьютере без Nvidia CUDA обработка одной фотографии может затянуться на несколько десятков минут. Но ведь работает!
Вернемся к командной строке, запускающей обработку. Первые два параметра программы inference_realesrgan.py указывают на исходные материалы и результат. С помощью параметра -t задается размер окна обработки фрагмента изображения. Если этого не сделать, то начала обработки можно и не дождаться, потому что после длительного обмена с файлом подкачки программа сообщит об ошибке. Еще один обязательный в спартанских условиях параметр —fp32 заставляет использовать 32-битные, а не 16-битные данные, потому что поддержка данных половинной длины на CPU не реализована. Если его не указать, то появится сообщение об ошибке:
1 |
Error "slow_conv2d_cpu" not implemented for 'Half' |
Последний параметр —face_enhance, как ты, наверное, догадался, призывает Real-ESRGAN воспользоваться GFPGAN для улучшения проработки обнаруженных на фотографиях лиц. Если хочешь, ты можешь обработать фотографию только приложением GFPGAN. Оно найдет на фотографии лица людей, вырежет их оттуда и попробует сделать более реалистичными. Командная строка в этом случае будет выглядеть так:
1 2 |
cd ~/GAN/GFPGAN python3.8 inference_gfpgan.py -i ../in -o ../out |
В выходном каталоге, помимо файлов с улучшенными лицами, будут созданы файлы, содержащие рядом исходный материал и результат, чтобы можно было наглядно оценить проделанную программой работу.
Если тебе лень набирать команды вручную, можешь взять сценарии оболочки gfpgan.sh и resrgan.sh. Помести их в каталог ~/GAN и используй так:
123 cd ~/GAN/bin/sh gfpgan.sh in out/bin/sh resrgan.sh in out
Заключение
Итак, мы построили настоящий локальный нейросетевой фотоувеличитель. Он ни в коей мере не зависит от внешних сетевых ресурсов и может работать на самом обычном компьютере. Программное обеспечение Real-ESRGAN и GFPGAN вместе со средой исполнения Python 3.8 можно упаковать и сохранить на тот случай, если понадобится заняться фотографиями, а прогресс вместе с библиотеками Python ушел вперед и требует новых вычислительных мощностей.
Что можно сказать о результатах работы «фотоувеличителя»? Как ты сам теперь можешь убедиться, качество выдаваемых им результатов в большинстве случаев вызывает лишь удивление и восхищение. Но когда информации недостаточно (исходные материалы низкого качества), нейронные сети начинают додумывать отсутствующие элементы, и это приводит к неожиданным или даже шокирующим эффектам. В таких случаях спасти ситуацию может предварительная ретушь исходного образца, выполненная традиционными методами в обычных графических редакторах. Таким образом, новые технологии удачно дополняют хорошо известные средства и расширяют их возможности.