Resumo
Remover o fundo de uma foto costumava significar enviá-la para um servidor com GPU. Isso deixou de ser necessário. Um modelo de segmentação pequeno o bastante para ser baixado uma única vez (44 MB) consegue rodar dentro do navegador: numa máquina com WebGPU, leva bem menos de um segundo por foto; sem ela, o mesmo modelo roda na CPU em 15–25 segundos. Nos dois casos, a foto não sai do aparelho. O modelo se sai bem com pessoas, produtos e animais diante de um fundo bem distinto, e mal com cabelo sobre cabelo, vidro e qualquer coisa cujo contorno nem o próprio fotógrafo conseguiria enxergar.
O que é o modelo
A ferramenta usa o ISNet, a rede do artigo Highly Accurate Dichotomous Image Segmentation (Qin et al., ECCV 2022). “Dicotômica” quer dizer que a tarefa é binária: para cada pixel, primeiro plano ou não. O ISNet foi treinado com o conjunto de dados DIS5K, que reúne cinco mil imagens em alta resolução com máscaras minuciosas, pixel a pixel, de coisas como bicicletas, cadeiras e árvores, escolhidas justamente porque suas estruturas finas derrotavam os modelos anteriores. Para uma entrada de 1024 × 1024, ele produz um mapa de probabilidades de 1024 × 1024; a ferramenta aplica um limiar a esse mapa, suaviza a borda e usa o resultado como canal alfa de um PNG.
Os pesos são distribuídos sob a licença Apache-2.0. O próprio site os hospeda, divididos em três partes para que o download possa ser retomado, e eles ficam em cache no navegador depois do primeiro uso: a segunda foto não baixa nada.
Por que agora dá para fazer isso “no navegador”
Duas peças precisavam existir. O ONNX Runtime Web executa um modelo treinado em JavaScript, com os cálculos feitos pelo WebAssembly na CPU ou, desde 2023, pela WebGPU, a API do navegador que expõe a placa de vídeo para computação geral. Uma passagem direta de segmentação envolve algumas centenas de bilhões de multiplicações e somas; é para isso que as GPUs foram construídas, e é exatamente o que uma única thread de CPU não faz bem.
Os números da ferramenta deste site, com a mesma entrada de 1024 pixels:
| Caminho | Onde roda | Tempo por foto |
|---|---|---|
| WebGPU | Chrome / Edge 113+, Safari 26+ em notebook ou desktop com qualquer GPU moderna | menos de 1 segundo |
| WebAssembly | qualquer navegador, uma thread | 15–25 segundos |
O caminho WebAssembly usa uma única thread de propósito. O WASM multithread exige que a página esteja em isolamento de origem cruzada (cross-origin isolated), uma configuração de cabeçalho que bloqueia todo script de terceiros, inclusive o código de anúncios que paga o site. Com uma thread só, fica mais lento, mas a página continua gratuita; o trabalho vai para um Web Worker, e a interface segue respondendo enquanto o cálculo avança.
A memória é a outra restrição: o runtime, o modelo e as ativações precisam de cerca de 200 MB livres. Celulares com 4 GB de RAM dão conta pelo caminho da CPU; alguns celulares mais antigos não conseguem nem alocar o buffer, e a ferramenta avisa isso em vez de travar a aba.
Onde ele falha, sem rodeios
- Cabelo contra um fundo parecido. Cabelo escuro diante de uma parede escura, cabelo loiro contra uma cortina bege. O modelo não vê borda porque não existe borda nos pixels. A máscara ou come o cabelo ou deixa um halo de parede.
- Objetos transparentes e reflexivos. Vidro, água, uma taça de vinho na frente da pessoa. A segmentação é binária; um vidro não é primeiro plano nem fundo, e o resultado é um corte seco atravessando o objeto.
- Desfoque de movimento. Uma borda borrada não tem um único limite correto.
- Vários objetos. O modelo mantém tudo o que considera “o objeto”; com duas pessoas, geralmente mantém as duas; com uma pessoa e um cachorro grande, pode manter só um.
- Objetos muito pequenos. A entrada tem 1024 px no lado maior; uma pessoa com 60 px de altura numa foto aberta vira algumas dezenas de pixels de máscara e sai disforme.
Em fotos limpas de produto, retratos com parede lisa, animais no chão e logotipos em papel, o resultado é confiável: é disso que o conjunto de treinamento está cheio.
O que fazer com o resultado
A saída é um PNG com transparência de verdade. É o formato certo para colocar num slide, num anúncio ou sobre outra foto, e o errado para mandar por e-mail: um recorte em PNG de 12 megapixels tem 20–30 MB. Se o destino precisa de um arquivo pequeno e não precisa de transparência, converta para JPEG com fundo branco; se precisa de transparência e de um tamanho menor, o WebP com alfa fica com um terço do tamanho do PNG. O Compressor de Imagens cuida dos dois casos.