Коротко
Раньше удалить фон значило загрузить фото на сервер с видеокартой. Теперь это необязательно. Модель сегментации, которую достаточно скачать один раз (44 МБ), работает внутри браузера: на машине с WebGPU одно фото обрабатывается заметно быстрее секунды, без WebGPU та же модель справляется на процессоре за 15–25 секунд. В обоих случаях фото не покидает устройство. Модель хорошо отделяет людей, товары и животных от контрастного фона и плохо справляется с волосами на фоне волос, со стеклом и со всем, у чего границу не видно и на самой фотографии.
Что это за модель
Инструмент использует ISNet, сеть из статьи Highly Accurate Dichotomous Image Segmentation (Qin et al., ECCV 2022). «Дихотомическая» означает, что задача бинарная: каждый пиксель либо относится к объекту, либо нет. ISNet обучали на наборе DIS5K. В нём пять тысяч снимков высокого разрешения с тщательно размеченными попиксельными масками велосипедов, стульев, деревьев и других предметов, отобранных именно потому, что их тонкие детали сбивали с толку прежние модели. На вход 1024 × 1024 сеть выдаёт карту вероятностей 1024 × 1024. Инструмент применяет к ней порог, растушёвывает край и записывает результат в альфа-канал PNG.
Веса распространяются по лицензии Apache-2.0. Сайт хранит их у себя, разбитыми на три части, чтобы загрузку можно было продолжить после обрыва, и после первого запуска кэширует в браузере: для второго фото ничего не скачивается.
Почему «в браузере» стало возможно только сейчас
Нужны были две вещи. ONNX Runtime Web выполняет обученную модель в JavaScript, а вычисления идут либо через WebAssembly на процессоре, либо (с 2023 года) через WebGPU, браузерный API, который открывает видеокарту для вычислений общего назначения. Один прямой проход сегментации состоит из нескольких сотен миллиардов умножений со сложением. Именно для этого создавались видеокарты, и именно это плохо даётся одному потоку процессора.
Замеры на инструменте этого сайта, вход тот же, 1024 пикселя:
| Способ | Где работает | Время на одно фото |
|---|---|---|
| WebGPU | Chrome / Edge 113+, Safari 26+ на ноутбуке или настольном компьютере с любой современной видеокартой | меньше 1 секунды |
| WebAssembly | любой браузер, один поток | 15–25 секунд |
Путь через WebAssembly однопоточный намеренно. Многопоточный WASM требует, чтобы страница была cross-origin isolated. Это настройка заголовков, которая блокирует все сторонние скрипты, включая рекламный код, на который существует сайт. Один поток медленнее, зато страница остаётся бесплатной. Работа вынесена в Web Worker, поэтому интерфейс не зависает, пока идёт расчёт.
Второе ограничение связано с памятью: среде выполнения, модели и промежуточным данным нужно около 200 МБ свободной памяти. Телефоны с 4 ГБ оперативной памяти справляются на процессоре. Некоторые старые телефоны вообще не могут выделить буфер, и тогда инструмент сообщает об этом, а вкладка не падает.
Где модель ошибается
- Волосы на похожем фоне. Тёмные волосы на тёмной стене, светлые на бежевой шторе. Модель не видит границы, потому что в пикселях её нет. Маска либо съедает волосы, либо оставляет ореол из стены.
- Прозрачные и отражающие предметы. Стекло, вода, бокал вина перед человеком. Сегментация бинарна, а стекло не относится ни к объекту, ни к фону, поэтому через него проходит жёсткая граница.
- Смазанное движение. У размытого края нет одной правильной границы.
- Несколько объектов. Модель оставляет всё, что считает «объектом». Двух людей она обычно оставляет обоих, человека с крупной собакой может оставить только одного.
- Очень мелкие объекты. Вход составляет 1024 пикселя по длинной стороне. Человек ростом 60 пикселей на общем плане превращается в несколько десятков пикселей маски и выходит бесформенным пятном.
Для чистых предметных снимков, портретов на фоне ровной стены, питомцев на полу и логотипов на бумаге результат надёжный: именно такими снимками заполнен обучающий набор.
Что делать с результатом
На выходе получается PNG с настоящей прозрачностью. Этот формат подходит, чтобы вставить вырезанный объект в слайд, карточку товара или другое фото, но не подходит для отправки по почте: вырезка из 12-мегапиксельного снимка в PNG весит 20–30 МБ. Если получателю нужен лёгкий файл без прозрачности, конвертируйте его в JPEG на белом фоне. Если нужна прозрачность и меньший размер, WebP с альфа-каналом весит втрое меньше PNG. Сжать изображение умеет и то, и другое.