Перейти к содержимому

Подробный разбор модуля Fast Sketch Cleanup для Krita

Предыдущая запись | Пятница, 20 декабря 2024 | Время чтения: 10 мин | Следующая запись

Модуль Fast Sketch Cleanup

Введение

Этот проект был начат с целью предоставить пользователям инструмент, помогающий обводить эскизы. Он основан на научной статье Simo и Sierra, опубликованной в 2016 году, и для работы использует нейронные сети (сейчас их обычно называют просто ИИ). Инструмент разработан в сотрудничестве с Intel и по-прежнему считается экспериментальным, но его уже можно использовать и увидеть результаты.

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

Что касается модели, используемой в инструменте, мы обучили её сами. Все данные в наборе данных переданы людьми, которые сами прислали свои изображения и дали согласие именно на такое использование. Другие данные не использовались. Кроме того, при использовании модуля обработка выполняется локально на компьютере: не требуется подключение к Интернету, не выполняется соединение ни с каким сервером, и учётная запись также не нужна. Сейчас он работает только в Windows и Linux, но ведётся работа над тем, чтобы сделать его доступным и в MacOS.

Варианты применения

Он усредняет линии в одну и создаёт чёткие чёрные линии, но конечный результат может получиться размытым или неравномерным. Однако во многих случаях он всё же работает лучше, чем один только фильтр «Уровни» (например, при извлечении карандашного эскиза). Возможно, после использования модуля имеет смысл применить фильтр «Уровни», чтобы уменьшить размытость. Поскольку модуль лучше всего работает с белым холстом и серо-чёрными линиями, при работе со сфотографированными карандашными эскизами или очень светлыми линиями эскиза, возможно, стоит применить «Уровни» и до использования модуля.

Извлечение карандашного наброска с фотографии

Это результат стандартной процедуры применения фильтра «Уровни» к наброску для извлечения линий (в результате чего часть изображения получает тень):

sketch_girl_original_procedure_comparison_small

sketch_girl_original_procedure_comparison_small1843×1209 165 KB

Набросок нарисовал Tiar (ссылка на профиль KA)

Порядок действий при использовании модуля с SketchyModel («Уровни» → модуль → «Уровни»):

sketch_girl_new_procedure_comparison_small

sketch_girl_new_procedure_comparison_small1843×2419 267 KB

Сравнение (для чёрных линий):

sketch_girl_procedures_comparison_small

sketch_girl_procedures_comparison_small1920×1260 215 KB

Другой возможный результат — просто остановиться на модуле, не превращая линии в чёрные с помощью фильтра «Уровни»; это даёт более приятный, более карандашный вид, при этом нижняя часть страницы остаётся пустой:

sketch_girl_after_plugin_small

sketch_girl_after_plugin_small1536×2016 161 KB

Обводка в стиле комиксов


Рисунок мужчины, созданный BeARToys

На приведённых выше изображениях показана обводка в стиле комикса. Результат, который немного размыт по сравнению с оригиналом, можно дополнительно улучшить с помощью фильтра «Увеличение резкости». Дракон нарисован David Revoy (CC-BY 4.0).

Очистка линий

Примеры моих набросков и результат работы модуля, демонстрирующие сильные и слабые стороны модуля. Все изображения ниже созданы с помощью SketchyModel.

flower_001

flower_0011209×739 46.5 KB

flower_001_detail

flower_001_detail681×456 22.1 KB

portrait_man_portrait_2_comparison_2_small

portrait_man_portrait_2_comparison_2_small1305×505 139 KB

portrait_man_portrait_2_detail

portrait_man_portrait_2_detail646×1023 26.6 KB

Все приведённые выше изображения нарисовал Tiar (ссылка на профиль KA)

На изображениях ниже, на чешуе рыбы, видно, как модель различает более светлые линии и усиливает более сильные, делая чешую более выраженной. Теоретически этого можно добиться с помощью фильтра «Уровни», но на практике результаты будут хуже, поскольку модель учитывает локальную силу линии.


fish_square_sketchy_comparison_small1920×968 156 KB

Рисунок рыбы, созданный Christine Garner (ссылка на портфолио)

Использование в Krita

Чтобы использовать модуль Fast Sketch Cleanup в Krita, выполните следующие действия:

  1. Подготовка Krita:
    1. В Windows:
      1. Либо в одном пакете: загрузите Krita 5.3.0-prealpha с уже включённым модулем Fast Sketch Cleanup: https://download.kde.org/unstable/krita/5.3.0-prealpha-fast-sketch/krita-x64-5.3.0-prealpha-cdac9c31.zip
      2. Или отдельно:
        1. Загрузите портативную версию Krita 5.2.6 (или аналогичную - она тоже должна работать)
        2. Загрузите отдельно модуль Fast Sketch Cleanup: https://download.kde.org/stable/krita/FastSketchPlugin-1.0.2/FastSketchPlugin1.0.2.zip
        3. Распакуйте файл в папку krita-5.2.6/ (сохранив структуру папок).
        4. Затем перейдите в «Настройка» → «Настройка Krita» → «Управление модулями Python», включите модуль Fast Sketch Cleanup и перезапустите Krita.
    2. В Linux:
      1. Загрузите AppImage: https://download.kde.org/unstable/krita/5.3.0-prealpha-fast-sketch/krita-5.3.0-prealpha-cdac9c31c9-x86_64.AppImage
  2. (Необязательно) Установите драйверы NPU, если на устройстве есть NPU (практически необходимо только в Linux и только при очень новом процессоре Intel): Конфигурации для Intel® NPU с OpenVINO™ — документация OpenVINO™ (примечание: модуль по-прежнему можно запускать на CPU или GPU, NPU для этого не требуется)
  3. Запустите модуль:
    1. Откройте или создайте белый холст с серо-белыми штрихами (учтите, что модуль берёт текущую проекцию холста, а не текущий слой).
    2. Перейдите в меню «Инструменты» → Fast Sketch Cleanup
    3. Выберите модель. Дополнительные параметры будут выбраны автоматически.
    4. Дождитесь завершения обработки (после этого диалоговое окно закроется автоматически).
    5. Убедитесь, что создан новый слой с результатом.

Советы по обработке

Сейчас лучше просто использовать SketchyModel.xml — в большинстве случаев он работает значительно лучше, чем SmoothModel.xml.

Убедитесь, что фон достаточно светлый, а линии, которые нужно сохранить в результате, относительно тёмные (либо довольно тёмно-серые, либо чёрные; светло-серые могут привести к пропуску многих линий). Возможно, имеет смысл заранее применить фильтр «Уровни».

После обработки результат можно улучшить с помощью фильтра «Уровни» либо фильтра «Увеличение резкости» — в зависимости от полученного результата.

Технологии и наука, лежащие в основе

Особые требования

Первым нестандартным требованием была работа на холстах любого размера. Это означало, что в сети не могло быть плотных или полносвязных линейных слоёв, которые очень распространены в большинстве нейронных сетей для обработки изображений (они требуют входных данных определённого размера и дают разные результаты для одного и того же пикселя в зависимости от его расположения), — только свёртки, объединение или подобные слои, дающие одинаковый результат для каждого пикселя холста независимо от расположения. К счастью, в научной статье Simo и Sierra, опубликованной в 2016 году, описана именно такая сеть.

Ещё одна трудность заключалась в том, что созданную ими модель использовать было практически невозможно, поскольку она несовместима с лицензией Krita, и даже точно описанный ими тип модели применить не удавалось: один из таких файлов модели был бы почти таким же большим, как сама Krita, а обучение заняло бы очень много времени. Требовалось нечто, что работало бы не хуже, а возможно и лучше, но при этом было бы достаточно компактным, чтобы его можно было добавить в Krita, не увеличив её размер вдвое. (Теоретически можно было бы поступить, как некоторые другие компании, и выполнять обработку на каком-нибудь сервере, но это не то, чего хотелось. И даже если бы это решило часть проблем, оно породило бы немало собственных серьёзных трудностей. Кроме того, хотелось, чтобы пользователи могли использовать её локально, без зависимости от серверов и Интернета.) Более того, модель должна была быть достаточно быстрой и умеренной по потреблению ОЗУ и видеопамяти.

Кроме того, не было набора данных, который можно было бы использовать. Simo и Sierra использовали набор данных, в котором все ожидаемые изображения были нарисованы с постоянной толщиной линий и прозрачностью, а значит, и результаты обучения обладали теми же свойствами. Хотелось получить нечто более похожее на рисунок от руки — с переменной толщиной линий или полупрозрачными концами линий, — поэтому набор данных должен был содержать такие изображения. Поскольку наборы данных, соответствующих требованиям к лицензии и процессу сбора данных, не были известны, за помощью обратились к своему сообществу; об этом можно прочитать в теме на Krita Artists: https://krita-artists.org/t/call-for-donation-of-artworks-for-the-fast-line-art-project/96401 .

Ссылка на полный набор данных приведена ниже, в разделе «Набор данных».

Архитектура модели

Все основные слои являются свёрточными или развёрточными (в конце модели). После каждого (раз)свёрточного слоя, кроме последнего, находится слой активации ReLu, а после последней свёртки — слой сигмоидной активации.

Используемые пакеты Python: Pillow, Numpy, PyTorch и Openvino

Numpy — стандартная библиотека для всевозможных массивов и расширенных операций с массивами; для чтения изображений и преобразования их в массивы numpy и обратно использовалась Pillow. Для обучения применялся PyTorch, а в модуле Krita для вывода (обработки через сеть) использовался Openvino.

Использование NPU для вывода


В этой таблице показаны результаты работы benchmark_app — инструмента, входящего в состав пакета openvino для Python от Intel. Он проверяет модель изолированно на случайных данных. Как видно, на одной и той же машине NPU оказался в несколько раз быстрее CPU.

С другой стороны, внедрение NPU добавило сложность: на NPU могут работать только статические модели, то есть размер входных данных известен в момент сохранения модели в файл. Чтобы решить эту проблему, модуль сначала разрезает холст на части заданного размера (который зависит от файла модели), затем обрабатывает их все и в конце сшивает результаты вместе. Чтобы избежать артефактов на участках рядом со швами, все части вырезаются с небольшим запасом, а затем этот запас отрезается.

Обучение собственной модели

Чтобы обучить собственную модель, потребуются технические навыки, пары изображений (входное и ожидаемый результат) и мощный компьютер. Также может понадобиться довольно много места на жёстком диске, хотя при нехватке места можно просто удалить ненужные старые модели.

Драйверы и подготовка

Потребуется установить Python3 и следующие пакеты: Pillow, openvino, numpy, torch. Для квантования модели также потребуются nncf и sklearn. Если что-то упущено, появится сообщение об ошибке, поэтому установите и упомянутые в нём пакеты.

В Windows драйверы для NPU и дискретного GPU, вероятно, уже установлены. В Linux может потребоваться установить драйверы NPU, прежде чем появится возможность его использовать: https://docs.openvino.ai/2024/get-started/configurations/configurations-intel-npu.html.

Кроме того, если для обучения нужно использовать iGPU (что всё же может быть значительно быстрее, чем на CPU), скорее всего, потребуется применить что-то вроде IPEX, который позволяет PyTorch задействовать устройство «XPU» — а это и есть iGPU. Это не проверено и не рекомендуется, поскольку лично у меня не получилось это использовать: версия Python оказалась выше, чем предполагает инструкция. Сама инструкция здесь: https://pytorch-extension.intel.com/installation?platform=gpu&version=v2.5.10%2Bxpu .
Проверка правильности установки выполняется так:
python3 -c "import torch; import intel_extension_for_pytorch as ipex; print(f'Packages versions:'); print(f'Torch version: {torch.__version__}'); print(f'IPEX version: {ipex.__version__}'); print(f'Devices:'); print(f'Torch XPU device count: {torch.xpu.device_count()}'); [print(f'[Device {i}]: {torch.xpu.get_device_properties(i)}') for i in range(torch.xpu.device_count())];"
Должно показываться более 0 устройств с некоторыми базовыми свойствами.

Если устройство XPU удастся заставить работать на компьютере, всё равно потребуется отредактировать сценарии обучения, чтобы они могли его использовать: https://intel.github.io/intel-extension-for-pytorch/xpu/latest/tutorials/getting_started.html (скорее всего, достаточно будет добавить эту строку:
import intel_extension_for_pytorch as ipex
в самое начало сценария, сразу под «import torch», а при запуске сценария указать «xpu» в качестве имени устройства — и всё должно заработать. Но, как уже говорилось, сценарии для этого не тестировались.

Набор данных

Чтобы обучить модель, потребуются изображения. Изображения должны составлять пары, и каждая пара должна содержать набросок (вход) и контурный рисунок (ожидаемый результат). Чем выше качество набора данных, тем лучше результаты.

Перед обучением данные лучше дополнить: то есть изображения поворачиваются, увеличиваются или уменьшаются и зеркально отражаются. Сейчас сценарий дополнения данных также выполняет инверсию, исходя из предположения, что обучение на инвертированных изображениях даст результаты быстрее (учитывая, что чёрный означает ноль, то есть отсутствие сигнала, а фоном хотелось бы видеть именно его, чтобы модели усваивали линии, а не фон вокруг них).

Использование сценария дополнения данных описано ниже в подробной инструкции по обучению.

Вот набор данных, который использовался (внимательно прочитайте лицензию, если хотите его использовать): https://files.kde.org/krita/extras/FastSketchCleanupPluginKritaDataset.zip

Выбор модели и других параметров

Для быстрого результата используйте tooSmallConv; если времени и ресурсов больше, возможно, лучше подойдёт typicalDeep. Если есть доступ к мощному компьютеру с GPU, можно попробовать original или originalSmaller — они представляют собой исходное описание модели из статьи Simo-Sierra для SIGGRAPH 2016 и его уменьшенную версию.

Используйте adadelta в качестве оптимизатора.

В качестве функции потерь можно использовать как blackWhite, так и mse; mse — классический вариант, но blackWhite позволяет получить более быстрый результат, поскольку снижает относительную ошибку на полностью белых или полностью чёрных областях (исходя из ожидаемого изображения на выходе).

Обучение

  1. Клонируйте репозиторий по адресу https://invent.kde.org/tymond/fast-line-art (на коммите 33869b6)
    git clone https://invent.kde.org/tymond/fast-line-art.git

  2. Затем подготовьте папку:

    • Создайте новую папку для обучения.
    • В папке выполните:
      python3 [папка репозитория]/spawnExperiment.py --path [путь к новой папке, относительный или абсолютный] --note "[личное примечание об эксперименте]"
  3. Подготовка данных:

    • Если дополненный набор данных уже имеется, его нужно поместить целиком в data/training/ и data/verify/, учитывая, что парные изображения во вложенных папках ink/ и sketch/ должны иметь в точности одинаковые имена (например, если данные — это sketch.png и ink.png, нужно поместить одно в sketch/ под именем picture.png, а другое в ink/ под именем picture.png, чтобы они стали парными).
    • Если нет готового дополненного набора данных:
      1. Поместите все исходные данные в data/raw/, учитывая, что парные изображения должны иметь одинаковые имена с добавленным префиксом ink_ или sketch_ (например, если picture_1.png — это набросок, а picture_2.png — обводка, их нужно назвать соответственно sketch_picture.png и ink_picture.png).
      2. Запустите сценарий подготовки данных:
        python3 [папка репозитория]/dataPreparer.py -t taskfile.yml
        Это дополнит данные в папке raw, чтобы обучение прошло успешнее.
  4. Отредактируйте файл taskfile.yml по своему усмотрению. Наиболее важные части, которые следует изменить:

    • тип модели - кодовое имя типа модели, используйте tinyTinier, tooSmallConv, typicalDeep или tinyNarrowerShallow
    • оптимизатор - тип оптимизатора, используйте adadelta или sgd
    • скорость обучения - скорость обучения для sgd, если используется
    • функция потерь - кодовое имя функции потерь: используйте mse для среднеквадратичной ошибки или blackWhite для пользовательской функции потерь на основе mse, но немного меньшей для пикселей, где значение пикселя целевого изображения близко к 0,5
  5. Запустите код обучения:
    python3 [папка репозитория]/train.py -t taskfile.yml -d "cpu"

    В Linux, если требуется запустить его в фоновом режиме, добавьте в конце «&». Если он работает на переднем плане, обучение можно приостановить, просто нажав Ctrl+C; если в фоновом режиме — найдите идентификатор процесса (с помощью команды «jobs -l» или «ps aux | grep train.py», первое число — это идентификатор процесса) и завершите его командой «kill [process id]». Результаты останутся в папке, и обучение можно будет продолжить той же командой.

  6. Преобразование модели в модель OpenVINO:
    python3 [папка репозитория]/modelConverter.py -s [размер входных данных, рекомендуется 256] -t [имя входной модели, из PyTorch] -o [имя модели OpenVINO, должно заканчиваться на .xml]

  7. Поместите оба файла модели (.xml и .bin) в папку ресурсов Krita (во вложенную папку pykrita/fast_sketch_cleanup) рядом с другими моделями, чтобы использовать их в модуле.