Удаление фона с фотографии (AI-технологии)

В принципе, вы можете и сами удалить фон с фотографии в фоторедакторе наподобие Gimp или Photoshop, но это долго и лучше и проще доверить это искусственному интеллекту, чем мы сегодня и займемся.

Честно говоря, про AI я немного слукавил и для этих операций используется обученная модель которая в большинстве случаев уберет фон на вашем фото и вы получите PNG файл с альфа-каналом.

Есть несколько сайтов для удаления фона с фотографии например https://www.photoroom.com, но они платные и, честно говоря, они используют тот же подход который мы сейчас и рассмотрим.

Использовать мы будем проект Rembg и его репозиторий на GitHub находится по адресу https://github.com/danielgatis/rembg.

Первым делом мы скачиваем репозиторий проекта и собираем Docker образ содержащий утилиту rembr и пред обученную модель для удаления фона с фотографии.

$ git clone https://github.com/danielgatis/rembg.git
$ cd ./rembg
$ docker build -t rembg:1 ./

Создаем два каталога input и output, соответственно в input скидываем исходные фотографии, а в output будем помещать обработанные фотографии в которых будет удален фон.

Конвертация выполняется командой.

$ docker run -v ./input:/rembg -v ./output:/output rembg:1 i 00124.jpg /output/00124.png

Таким образом мы запускаем утилиту в докере с параметром на конвертацию и двумя подключенными томами. Давайте посмотрим, что у нас получилось.

За основу взял довольно сложное изображение, вот его исходник.

Исходное изображение для теста удаления фона

Платная утилита от photoroom справилась вот так (она платная только в том случае если вам FullHD надо).

Коммерческая онлайн утилита

Утилита с моделью по умолчанию справилась так.

OpenSource проект по удалению фона изображения

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

#!/bin/sh

#docker run -v ./input:/rembg -v ./output:/output rembg:1 i 00124.jpg /output/00124.png

find ./input/*.jpg | while read file_2_convert
    do
    source_file=`basename "$file_2_convert"`
    file_name=`basename "$file_2_convert" | cut -d "." -f 1`
    echo "$source_file" - "$file_name".png
    docker run -v ./input:/rembg -v ./output:/output rembg:1 i "$source_file" /output/"$file_name".png
    done

exit 0

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

Результат скажем так не сильно обрадовал и попробуем другую обученную модель.

На выбор у нас несколько моделей.

  • u2net (downloadsource): A pre-trained model for general use cases.
  • u2netp (downloadsource): A lightweight version of u2net model.
  • u2net_human_seg (downloadsource): A pre-trained model for human segmentation.
  • u2net_cloth_seg (downloadsource): A pre-trained model for Cloths Parsing from human portrait. Here clothes are parsed into 3 category: Upper body, Lower body and Full body.
  • silueta (downloadsource): Same as u2net but the size is reduced to 43Mb.
  • isnet-general-use (downloadsource): A new pre-trained model for general use cases.
  • isnet-anime (downloadsource): A high-accuracy segmentation for anime character.
  • sam (download encoderdownload decodersource): A pre-trained model for any use cases.
  • birefnet-general (downloadsource): A pre-trained model for general use cases.
  • birefnet-general-lite (downloadsource): A light pre-trained model for general use cases.
  • birefnet-portrait (downloadsource): A pre-trained model for human portraits.
  • birefnet-dis (downloadsource): A pre-trained model for dichotomous image segmentation (DIS).
  • birefnet-hrsod (downloadsource): A pre-trained model for high-resolution salient object detection (HRSOD).
  • birefnet-cod (downloadsource): A pre-trained model for concealed object detection (COD).
  • birefnet-massive (downloadsource): A pre-trained model with massive dataset.

При указании модели для обработки в случае запуска в Docker, естественно он будет пытаться заново скачать кучу данных и разумно, что нам понадобится отдельный внешний том для хранения моделей.

$ docker run -v ./input:/rembg -v ./output:/output rembg:1 i -m birefnet-massive  00124.jpg /output/00124.png
Downloading data from 'https://github.com/danielgatis/rembg/releases/download/v0.0.0/BiRefNet-massive-TR_DIS5K_TR_TEs-epoch_420.onnx' to file '/root/.u2net/birefnet-massive.onnx'.

Все модели хранятся внутри контейнера в каталоге /root/.u2net и логично его вытащить в еще один внешний том, чтобы не загружать их на каждый чих и для этого добавим еще один том опцией -v ./models:/root/.u2net.

$ mkdir ./models
$ docker run -v ./input:/rembg -v ./output:/output -v ./models:/root/.u2net rembg:1 i -m silueta  00124.jpg /output/00124.png

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

Давайте сейчас попробуем все модели и посмотрим какая справится лучше с фотографией с зонтиками с корпоратива 4Финанс (стандартный u2net пробовали в начале статьи).

u2netp

Моделька в 4МБ, в принципе результат предсказуем.

AI-Модель u2netp

u2net_human_seg

Модель 176МБ и прям только люди и остались, зонтики исчезли.

u2net_human_seg

Попробуем еще одно фото, где я на относительно ровном фоне.

u2net_human_seg

Фото само по себе неудачное, а моделька справилась просто замечательно.

u2net_cloth_seg

Аналогично моделька на 176МБ. Но получилось нечто странное.

Нечто странное

Судя по результату по фото в костюме эта модель пытается отдельно одежду выбрать.

silueta

У меня зонтик забрали. Но все равно ореол остается. Моделька так-же 170 с копейками МБ.

Зонтик украли

isnet-general-use

Модель 179МБ. По описанию новая модель для общих целей.

isnet-general-use

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

isnet-general-use

Пока из всех испробованных моделей самый лучший результат.

isnet-anime

Модель 176МБ для обработки аниме-картинок.

Не очень я анимешный

sam

А вот тут уже солидные 360МБ. Странная моделька, остались одни брюки.

birefnet-general

Серьезный датасет в 973МБ.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *