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.") |