File size: 4,418 Bytes
02b1531
 
 
 
 
 
 
 
 
 
 
 
 
2c7ede3
 
02b1531
 
 
2c7ede3
02b1531
 
 
 
 
6541d18
 
 
79cd6c4
02b1531
6541d18
 
2e32e4e
02b1531
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f8911d2
02b1531
f2c74a2
1c4f0a4
f2c74a2
 
f7e5508
 
f2c74a2
 
883b87e
1c4f0a4
f2c74a2
 
 
 
 
 
 
1c4f0a4
f7e5508
1c4f0a4
f7e5508
f2c74a2
 
 
 
edca1ee
f2c74a2
 
 
 
 
 
 
 
 
 
b662596
f2c74a2
 
 
 
 
 
 
 
 
 
02b1531
f2c74a2
 
 
 
 
6541d18
f2c74a2
 
 
 
883b87e
f2c74a2
f7e5508
f2c74a2
6541d18
f6d651a
dbad460
f2c74a2
b662596
f2c74a2
 
 
 
 
 
 
 
f7e5508
1c4f0a4
f2c74a2
883b87e
f8911d2
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# App code based on: https://github.com/petergro-hub/ComicInpainting
# Model based on: https://github.com/saic-mdal/lama

import numpy as np
import pandas as pd
import streamlit as st
import os
from datetime import datetime
from PIL import Image
from streamlit_drawable_canvas import st_canvas
from io import BytesIO
from copy import deepcopy

import sys
sys.path.insert(0, '/tree/main/src')
from src.core import process_inpaint



def image_download_button(pil_image, filename: str, fmt: str, label="Download"):
    if fmt not in ["jpg", "png"]:
        raise Exception(f"Unknown image format (Available: {fmt} - case sensitive)")
    
    pil_format = "JPEG" if fmt == "jpg" else "PNG"
    file_format = "jpg" if fmt == "jpg" else "png"
    mime = "image/jpeg" if fmt == "jpg" else "image/png"
    

    buf = BytesIO()
    pil_image.save(buf, format=pil_format)


    
    return st.download_button(
        label=label,
        data=buf.getvalue(),
        file_name=f'{filename}.{file_format}',
        mime=mime,
    )



if "button_id" not in st.session_state:
    st.session_state["button_id"] = ""
if "color_to_label" not in st.session_state:
    st.session_state["color_to_label"] = {}

if 'reuse_image' not in st.session_state:
    st.session_state.reuse_image = None
def set_image(img):
    st.session_state.reuse_image = img

st.title("Removedor de Objetos com IA")

st.image(open("assets/demo.png", "rb").read())

st.markdown(
    """
    Então você quer remover um objeto em sua foto? Você não precisa aprender habilidades de edição de fotos.
      **Apenas desenhe as partes da imagem que deseja remover, então nossa IA irá removê-las.**
    """
)
uploaded_file = st.file_uploader("Escolher imagem:", accept_multiple_files=False, type=["png", "jpg", "jpeg"])

if uploaded_file is not None:
    
    if st.session_state.reuse_image is not None:
        img_input = Image.fromarray(st.session_state.reuse_image)
    else:
        bytes_data = uploaded_file.getvalue()
        img_input = Image.open(BytesIO(bytes_data)).convert("RGBA")

    stroke_width = st.slider("Tamanho da ponta", 1, 100, 50)

    st.write("**Agora desenhe (pinte) a parte da imagem que você deseja remover.**")
    
    # Canvas size logic
    canvas_bg = deepcopy(img_input)
    aspect_ratio = canvas_bg.width / canvas_bg.height
    streamlit_width = 720
    
    # Max width is 720. Resize the height to maintain its aspectratio.
    if canvas_bg.width > streamlit_width:
        canvas_bg = canvas_bg.resize((streamlit_width, int(streamlit_width / aspect_ratio)))
    
    canvas_result = st_canvas(
        stroke_color="rgba(255, 0, 255, 1)",
        stroke_width=stroke_width,
        background_image=canvas_bg,
        width=canvas_bg.width,
        height=canvas_bg.height,
        drawing_mode="freedraw",
        key="compute_arc_length", 
    )
    
    if canvas_result.image_data is not None:
        im = np.array(Image.fromarray(canvas_result.image_data.astype(np.uint8)).resize(img_input.size))
        background = np.where(
            (im[:, :, 0] == 0) & 
            (im[:, :, 1] == 0) & 
            (im[:, :, 2] == 0)
        )
        drawing = np.where(
            (im[:, :, 0] == 255) & 
            (im[:, :, 1] == 0) & 
            (im[:, :, 2] == 255)
        )
        im[background] = [0, 0, 0, 255]
        im[drawing]=[0,0,0,0] # RGBA
        
        reuse = False
        
        if st.button('Remover Elementos'):
            
            with st.spinner("A IA está fazendo a mágica!"):
                output = process_inpaint(np.array(img_input), np.array(im)) #TODO Put button here
                img_output = Image.fromarray(output).convert("RGB")
                

            
            st.write("A IAterminou o trabalho!")
            st.image(img_output)
            # reuse = st.button('Edit again (Re-use this image)', on_click=set_image, args=(inpainted_img, ))
            
            uploaded_name = os.path.splitext(uploaded_file.name)[0]
            image_download_button(
                pil_image=img_output,
                filename=uploaded_name,
                fmt="jpg",
                label="Download Imagem"
            )
                
            st.info("DICA: Se o resultado não for perfeito, você pode voltar a editar a imagem"
                     "ou baixar a imagem resultante e subir novamente para editar e clicar em Remover Elementos.")