Как удалить фон за человеком на изображении с помощью проектов с открытым исходным кодом
Перевод моей статьи "How to cut a person out of a picture using python" на Medium.
В этом примере мы рассмотрим как сделать конвейер для высококачественного автоматического удаления фона вокруг человека с помощью ИИ.
Для проекта потребуется python с установленными пакетами pytorch 1.6, torchvision и opencv, git.
Видеоинструкцию по установке этих пакетов можно посмотреть здесь.
Конвейер включает следующие этапы:
- Выделение фоновых областей.
- Фильтрация.
- Финальная очистка.
Выделение фоновых областей
Для выделения фоновых областей мы будем использовать нейронную сеть DeeplabV3(импорт библиотек и код загрузки модели приведен ниже) из библиотеки PyTorch, которая присваивает каждому пикселю изображения определенный класс.
Загрузим изображение с помощью opencv. Модели в процессе работы требуют достаточно много ресурсов, поэтому в процессе вычислений мы будем пользоваться уменьшенной копией изображения, а возврат к исходному размеру произведем на последнем этапе (ниже приведен код загрузки и исходное изображение).
Далее приведена процедура выделения фона на изображении. Deeplab работает с нормализованными данными, поэтому перед использованием модели к изображению применяется преобразование deeplab_preprocess. Передний план определяется как набор областей с классом №15 (изображение человека).
В итоге получается маска как на рисунке.
В целом большая часть изображения промаркирована правильно, однако если эту маску использовать для удаления фона в неизменном виде, то изображение будет выглядеть неестественным из-за артефактов на границе передний план/фон (см. рисунок).
Мягкое выделение переднего плана или матирование изображения
Image Matting — это процесс точного выделения переднего плана и фона на изображениях и видео. Если при сегментации для каждого пикселя изображения определяется единственная метка — класс объекта, которому он принадлежит (в нашем случае, передний план/фон), то при матировании изображения некоторые пиксели могут иметь сразу несколько меток с разными долями, так называемые частичные или смешанные пиксели. Чтобы полностью отделить передний план от фона на изображении, производится точная оценка Альфа-значений для смешанных пикселей.
В нашем проекте мы будем использовать код F, B, Alpha Matting из репозитория Matting Marco Forte, François Pitié.
Скачаем в папку проекта код из репозитория:
и файл с весами модели из официального Google Drive:
Импортируем исходные коды FBA_Matting в скрипт обработки изображения
Сформируем конфигурацию и загрузим модель FBA
Фильтрация результатов сегментации и генерация trimap(троичных карт)
В качестве входных параметров FBA принимает троичные карты — разметку безусловно пикселей переднего плана, безусловно фоновых пикселей и пикселей, для которых модель должна вычислить значение альфа-канала.
Ниже приведен код генерации троичной карты с помощью эрозии. Она «съедает» пиксели, находящиеся вблизи границы передний план/фон, таким образом для FBA указываются области уточнения сегментации.
Применяем модель F, B, Alpha Matting.
Возвращаемся к исходному размеру и сохраняем изображение
В итоге мы получили изображение, которое можно использовать в графическом редакторе без дополнительных модификаций.
Все исходные тексты можно скачать из репозитория на GitHub.
Список источников
- Vitaliy Hramchenko How to cut a person out of a picture using python.
- https://pytorch.org/.
- Liang-Chieh Chen, George Papandreou, Florian Schroff, Hartwig Adam Rethinking Atrous Convolution for Semantic Image Segmentation.
- DeepLabV3 model with a ResNet-101 backbone Pytorch Team https://pytorch.org/hub/pytorch_vision_deeplabv3_resnet101/.
- Marco Forte, François Pitié F, B, Alpha Matting.
- https://github.com/MarcoForte/FBA_Matting.
че за модуль демо.. выложит его тоже на гитхаб..