File size: 2,303 Bytes
542c815
3f8e328
542c815
 
 
d6e753e
 
 
8a357d1
542c815
bfcc517
018621a
3267028
b98efed
542c815
bfcc517
155e7bd
 
 
 
 
542c815
bfcc517
155e7bd
 
 
bfcc517
155e7bd
 
bfcc517
 
 
 
 
542c815
bfcc517
70974c3
bfcc517
155e7bd
bfcc517
 
 
155e7bd
 
bfcc517
 
 
 
542c815
bfcc517
 
 
155e7bd
542c815
155e7bd
542c815
bfcc517
1c01319
bfcc517
 
d04247d
d909bca
bfcc517
1c01319
bfcc517
 
 
 
1c01319
735502c
d04247d
bfcc517
 
735502c
1c01319
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import numpy as np
import torch
import torch.nn.functional as F
from torchvision.transforms.functional import normalize
import gradio as gr
from briarmbg import BriaRMBG
import PIL
from PIL import Image
from typing import Tuple

# Carregar o modelo pré-treinado
net = BriaRMBG.from_pretrained("briaai/RMBG-1.4")
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
net.to(device)

# Função para redimensionar a imagem para o tamanho que o modelo espera
def redimensionar_imagem(imagem):
    imagem = imagem.convert('RGB')
    tamanho_entrada_modelo = (1024, 1024)
    imagem = imagem.resize(tamanho_entrada_modelo, Image.BILINEAR)
    return imagem

# Função principal para processar a imagem
def processar(imagem):
    # preparar entrada
    imagem_original = Image.fromarray(imagem)
    w, h = imagem_original.size
    imagem = redimensionar_imagem(imagem_original)
    im_np = np.array(imagem)
    im_tensor = torch.tensor(im_np, dtype=torch.float32).permute(2, 0, 1)
    im_tensor = torch.unsqueeze(im_tensor, 0)
    im_tensor = torch.divide(im_tensor, 255.0)
    im_tensor = normalize(im_tensor, [0.5, 0.5, 0.5], [1.0, 1.0, 1.0])
    
    if torch.cuda.is_available():
        im_tensor = im_tensor.cuda()

    # Inferência com o modelo
    resultado = net(im_tensor)
    
    # Pós-processamento
    resultado = torch.squeeze(F.interpolate(resultado[0][0], size=(h, w), mode='bilinear'), 0)
    ma = torch.max(resultado)
    mi = torch.min(resultado)
    resultado = (resultado - mi) / (ma - mi)
    
    # Convertendo o resultado para imagem PIL
    im_array = (resultado * 255).cpu().data.numpy().astype(np.uint8)
    pil_im = Image.fromarray(np.squeeze(im_array))
    
    # Colando a máscara na imagem original
    nova_im = Image.new("RGBA", pil_im.size, (0, 0, 0, 0))
    nova_im.paste(imagem_original, mask=pil_im)

    return nova_im

# Interface com Gradio
gr.Markdown("")

# Exemplos
exemplos = [['./input.jpg']]

# Configurando a interface
output = gr.Image(type="pil", label="Imagem Processada")

# Definindo a interface com inputs e outputs
demo = gr.Interface(
    fn=processar,
    inputs=gr.Image(type="numpy", label="Carregar Imagem"),  # Mantido em português
    outputs=output,
    examples=exemplos
)

# Executando a interface
demo.launch(share=False)