- BrainTools - https://www.braintools.ru -
На связи команда регионального научно-образовательного центра «Искусственный интеллект [1] и анализ больших данных» при НГТУ им. Р. Е. Алексеева.
Сегодня практически у каждого крупного производителя смартфонов есть собственные системы улучшения качества фотографий, основанные на искусственном интеллекте. Помимо этого, существует множество аналогичных открытых моделей нейросетей. Возникает вопрос: зачем тогда мы решили оживить KVADRA_T [2].
Для начала чуть подробней о сути проекта. Однажды группе ИИ-энтузиастов пришла идея: а что если обучить искусственный интеллект улучшать смартфонные снимки до профессиональных с помощью парных фотографий? Задумка понравилась. Для сбора датасета выбрали актуальные в то время Sony Xperia Z, iPhone 3GS, BlackBerry Passport и цифровую зеркалку Canon EOS 70D в качестве эталона. Модель обучили улучшать фотографии, сделанные на смартфонах, в соответствии с такими же изображениями, полученными с камеры. Проект реализовали, исходный код опубликовали на GitHub [4], а подробное описание — на [5]arXiv.org [6]. Но что же в нем интересного сейчас, почти десять лет спустя?
DPED не просто применяет косметические фильтры. Датасет способен значительно улучшать фотографии на уровне структуры изображения, детализации, динамического диапазона и цветопередачи, приближая результат именно к профессиональной зеркальной фотокамере, а не просто «улучшая» фото.
Открытый исходный код и доступность датасета DPED позволяют легко адаптировать, изменять и дорабатывать модель. Это дает большие возможности исследовательскому сообществу и разработчикам мобильных приложений. Именно гибкость и понятность архитектуры делают DPED хорошим кандидатом для дальнейших экспериментов и улучшений.
Наконец, несмотря на возраст, DPED по-прежнему демонстрирует конкурентные результаты. Нам было интересно оценить, насколько их можно улучшить, адаптировав проект для современных библиотек и «железа», а также сравнить с современными решениями, но уже на новом, актуальном датасете.
Но не будем забегать вперед: это тема следующих статей, а сейчас мы будем возвращать DPED к жизни.
Для начала необходимо запустить исходный код проекта. На момент нашей работы DPED исполнилось уже семь лет. Для машинного обучения [7] и компьютерного зрения [8] это большой срок, и мы ожидали трудности на разных этапах.
Ожидания оправдались: при попытке протестировать модель на подготовленных данных мы столкнулись с ошибками. Их причиной стали новые версии библиотек, где некоторые модули были перемещены, код переписан, функции изменили свои названия и произошло много других изменений.
Далее мы расскажем, как запустить проект и исправить ошибки [9] на относительно свежих версиях библиотек, совместимых с Python 3.11. Для начала склонируем проект себе с помощью команды:
git clone https://github.com/aiff22/DPED
В нем увидим примерно следующую структуру каталогов:
.
└── DPED
├── dped
├── load_dataset.py
├── models
├── models_orig
│ ├── blackberry_orig.data-00000-of-00001
│ ├── blackberry_orig.index
│ ├── iphone_orig.data-00000-of-00001
│ ├── iphone_orig.index
│ ├── sony_orig.data-00000-of-00001
│ └── sony_orig.index
├── models.py
├── README.md
├── results
├── ssim.py
├── test_model.py
├── train_model.py
├── utils.py
├── vgg_pretrained
├── vgg.py
└── visual_results
5 directories, 14 files
Необходимо скачать предобученную модель VGG-19 [10], умеющую классифицировать изображения по тысяче категорий объектов, и перенести ее в папку vgg_pretrained.
Затем нужен датасет [11] из патчей, на котором обучалась эта модель.
Патчи — это небольшие, чаще всего квадратные фрагменты исходного изображения, которые извлекают из полноразмерных фотографий для обучения нейросетей. Например, из одной фотографии 4000×3000 пикселей можно нарезать десятки патчей размером 100×100 пикселей. Патчи идут в парах: один с мобильного устройства, другой — с профессиональной камеры, снятый с того же ракурса. По ним модель учится восстанавливать недостающие детали, улучшать резкость, цвета и т. д. Если же отдавать для обучения снимки целиком, это увеличит затраты памяти [12] и сложность процессов.
Архив полных снимков датасета объемом 54 ГБ можно скачать с OpenDataLab [13] (зеркало [14]). Мы пробовали скачивать их через http, но спустя несколько дней загрузка обрывалась. Советуем скачивать не напрямую через браузер, а через git lfs. Но учтите, что lfs делает копию загруженных объектов: в нашем случае для скачивания суммарно потребовалось 134 ГБ свободного пространства, но зато мы смогли сделать это за час.
Git lfs устанавливается на Linux через команду git lfs install
, а на Windows — с официального сайта [15]. Затем нужно инициализировать git lfs через git lfs install --skip-smudge
, эта команда просто склонирует репозиторий и создаст ссылки на файлы. Далее можете скачать архив с оригинальными фотографиями через команду git pull —include “original_images.gz”
, если вам интересно, как формировался датасет. В нашем запуске мы эти фото не используем.
После скачивания архив с патчами нужно распаковать в папку dped, после чего в ней появятся три папки: sony, iphone и blackberry. Теперь все готово к запуску кода. Итоговая структура проекта:
.
├── dped
│ ├── blackberry
│ │ ├── test_data
│ │ │ ├── full_size_test_images
│ │ │ └── patches
│ │ │ ├── blackberry
│ │ │ └── canon
│ │ └── training_data
│ │ ├── blackberry
│ │ └── canon
│ ├── iphone
│ │ ├── test_data
│ │ │ ├── full_size_test_images
│ │ │ └── patches
│ │ │ ├── canon
│ │ │ └── iphone
│ │ └── training_data
│ │ ├── canon
│ │ └── iphone
│ └── sony
│ ├── test_data
│ │ ├── full_size_test_images
│ │ └── patches
│ │ ├── canon
│ │ └── sony
│ └── training_data
│ ├── canon
│ └── sony
├── models
├── models_orig
├── results
├── vgg_pretrained
└── visual_results
33 directories
В проекте DPED предусмотрено два основных сценария работы:
запуск предобученной модели на подготовленных данных (с уже проставленными весами),
обучение собственной модели на оригинальном датасете DPED (с нуля, или fine-tuning)
Первый сценарий позволит нам быстро убедиться, что код запускается корректно, и получить видимый результат без затрат на обучение.
При запуске test_model.py мы столкнулись с проблемой сохранения изображений: новые версии Pillow не поддерживают сохранение RGB-изображений в формате float32, а именно — в нем модель возвращала массивы. Ранее это работало, но с новыми версиями Pillow требуется преобразование изображения в тип uint8.
Мы ограничили значения пикселей диапазоном [0, 1] и масштабировали до [0, 255] с приведением к uint8. Это стандартный этап подготовки изображения к сохранению в форматах JPG/PNG, и он не влияет на итоговое качество, так как внутри модели все вычисления по-прежнему идут в float32. Файл test_model.py:
После этого улучшенные фотографии начали сохраняться в таком виде:
Причина ошибок в том, что, хоть мы ограничили значения пикселей диапазоном [0, 1] и масштабировали до [0, 255] с приведением к uint8, в процессе генерации изображения значения могут выходить за эти пределы (например, –0.03 или 1.07). Это приводит к некорректному сохранению, особенно при преобразовании в uint8. Чтобы гарантировать, что все значения остаются в допустимом диапазоне перед масштабированием, мы использовали метод .clip(0, 1) в test_model.py:
В результате мы смогли сохранить выходные изображения и перейти ко второму сценарию.
Здесь нам интересно проверить, как поведет себя модель с новым железом и новыми версиями библиотек, а также сравнить качество изображений, полученных нашей моделью, с оригинальными результатами 2017 года. Этот опыт [16] можно использовать в будущем для обучения обновленной версии модели на снимках с современных смартфонов.
В оригинальном репозитории DPED есть уже готовые модели для трех смартфонов (Sony, iPhone, BlackBerry), обученные авторами исследования. Мы протестировали их, но затем заново обучили модель самостоятельно, используя тот же датасет, но с обновленным окружением (новые версии TensorFlow, Python и т. д.) и с учетом аппаратных ограничений. Теперь обо всем по порядку.
При запуске обучения модели на предоставленном авторами статьи [5] датасете возникает ошибка scipy.misc.imread. Этот модуль устарел и был удален в версии scipy 1.12.0. Чтобы им воспользоваться, необходимо скачивать версию 1.11.0.
Для этого версия Python должна быть более поздней, чем 3.8, и более ранней, чем 3.9, а это может грозить еще большим количеством ошибок импортов и несоответствий версионности библиотек. Так что мы просто заменили метод imread из scipy на imread из библиотеки pillow или imageio. После этого ошибок с обучением у нас не возникло. Файл load_dataset.py:
from imageio import imread
misc.imread = imread
Обучение требовательно к объему видеопамяти, и это указано на GitHub проекта в разделе «возможных ошибок». Если видеопамяти мало, то придется уменьшать batch size — количество примеров, обрабатываемых за один шаг. По умолчанию параметр равен 50, и при нехватке ресурсов для обучения в логах появится сообщение о недостаточном количестве видеопамяти. В нашем случае такое произошло с Nvidia RTX 3060 Ti (8 ГБ VRAM), так что пришлось поэкспериментировать с параметром batch_size.
Уменьшение батча — это распространенная мера при ограниченной видеопамяти, и это не проходит бесследно. Основные последствия:
Снижается стабильность градиентов и сходимость. Большие батчи дают более точную оценку градиентов, что делает обучение стабильнее. Малые батчи, наоборот, вносят больше «шума» — из-за этого возможна менее стабильная сходимость, особенно в начале обучения.
Колебания функции потерь (loss). При малом batch_size loss-функция может колебаться более резко от шага к шагу, что требует тонкой настройки learning rate и других гиперпараметров.
Качество финальной модели. Оно зависит от задачи, но в общем случае меньший batch_size может немного ухудшить обобщающую способность модели, особенно если не были пересмотрены другие параметры (learning rate, количество эпох и т.д.).
Влияние на метрики качества изображений SSIM [17] (индекс структурного сходства) и PSNR [18] (пиковое отношение сигнала к шуму). Например, SSIM может быть чуть ниже, если модель недостаточно стабильно обучалась. Разница обычно некритична, если модель дообучена правильно, с использованием чуть большего количества эпох или адаптации learning rate.
Для видеокарты Nvidia RTX 3060 Ti (8 ГБ VRAM) мы понизили batch_size с 50 до 35. В результате модель обучилась без ошибок, и метрики качества остались на уровне или выше оригинальных результатов 2017 года. Кроме того, для обучения взяли Nvidia RTX 2080 Ti (11 ГБ RAM), и ее удалось запустить на параметрах, которые использовали авторы проекта.
Для обучения мы взяли две конфигурации: с Nvidia RTX 2080 Ti 11 ГБ и Nvidia RTX 3060 Ti 8 ГБ. В первой конфигурации мы использовали гиперпараметры по умолчанию, на которых модель обучали и сами авторы. На скриншоте к ним даны пояснения:
Мы посчитали метрики качества изображений SSIM [17] (индекс структурного сходства) и PSNR [18] (пиковое отношение сигнала к шуму) и сравнили их с приведенными в статье [5]. Раздел Nvidia Titan X — это итоги теста предобученной авторами проекта модели из оригинального репозитория. Разделы RTX — итоги тестов модели, обученной на более современном железе в более современном окружении (Python, TensorFlow). По горизонтали указаны конкретные датасеты для разных моделей телефонов:
Как можно заметить, метрики почти по всем моделям были улучшены при запуске на наших конфигурациях.
На момент написания статьи мы внесли все необходимые изменения в локальную копию проекта DPED, включая:
совместимость с Python 3.11,
замену scipy.misc.imread на imageio.imread,
обновление сохранения изображений с float32 на uint8,
обновление зависимостей и адаптацию под новые версии библиотек (NumPy, Pillow, TensorFlow и т.д.),
правки, связанные с ограничениями видеопамяти (например, batch_size).
Мы планируем выложить отдельную ветку проекта на GitHub, в которой:
Все изменения будут оформлены как pull request.
Будет приведен список модифицированных файлов и объяснений к ним.
Будет добавлена инструкция по установке окружения через requirements.txt и/или Conda.
Пора дать DPED реальную задачу. Для тестирования мы взяли фотографии, сделанные планшетом YADRO KVADRA_T [2]. В момент тестирования он оказался под рукой, так что мы смогли быстро провести эксперимент «в боевых условиях», пока проверяли работоспособность проекта после обновлений. Слева — оригиналы, справа — результаты обработки:
В следующей статье мы приведем метрики качества этих изображений, а пока предлагаем оценить прогресс визуально.
На момент публикации в 2017 году проект DPED был значительным достижением для постобработки мобильных фотографий через глубокое обучение. DPED — это не просто модель, это понятная и открытая архитектура, на которой мы можем четко отследить, как изменилось качество мобильных фото за последние годы. Особенно интересно сравнение «старой, но обновленной» модели с тем, что предлагают сегодня ведущие производители смартфонов и актуальные открытые решения.
Мы можем четко контролировать ход всех наших экспериментов с DPED и собственными датасетами и проверять, как именно различные компоненты модели и данные влияют на конечный результат.
Наша команда продолжит работу над этим проектом. Далее в планах: собрать собственный датасет по примеру разработчиков, обновить кодовую базу до актуальных библиотек, обучить свою модель на основе их архитектуры и сравнить полученные результаты. В следующей статье поделимся достижениями и выводами.
А что вы думаете про использование DPED в наши дни? Есть ли смысл возвращать эту технологии или она должна кануть в лету?
Автор: miriteam
Источник [19]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/13824
URLs in this post:
[1] интеллект: http://www.braintools.ru/article/7605
[2] KVADRA_T: https://kvadra.tech/?utm_source=habr&utm_medium=referral&utm_campaign=dped_article_020425
[3] Источник: https://www.researchgate.net/figure/The-rig-with-the-four-DPED-cameras_fig1_336579592
[4] на GitHub: https://github.com/aiff22/DPED
[5] на : https://arxiv.org/pdf/1704.02470
[6] arXiv.org: http://arXiv.org
[7] обучения: http://www.braintools.ru/article/5125
[8] зрения: http://www.braintools.ru/article/6238
[9] ошибки: http://www.braintools.ru/article/4192
[10] предобученную модель VGG-19: https://polybox.ethz.ch/index.php/s/7z5bHNg5r5a0g7k
[11] датасет: https://people.ee.ethz.ch/~ihnatova/#dataset
[12] памяти: http://www.braintools.ru/article/4140
[13] с OpenDataLab: https://opendatalab.com/OpenDataLab/DPED/tree/main/raw
[14] зеркало: https://modelscope.cn/datasets/OmniData/DPED/files
[15] с официального сайта: https://git-lfs.com
[16] опыт: http://www.braintools.ru/article/6952
[17] SSIM: https://ru.wikipedia.org/wiki/SSIM
[18] PSNR: https://ru.wikipedia.org/wiki/%D0%9F%D0%B8%D0%BA%D0%BE%D0%B2%D0%BE%D0%B5_%D0%BE%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D0%B0_%D0%BA_%D1%88%D1%83%D0%BC%D1%83
[19] Источник: https://habr.com/ru/companies/yadro/articles/895084/?utm_source=habrahabr&utm_medium=rss&utm_campaign=895084
Нажмите здесь для печати.