DHEIVER's picture
Update app.py
5fc7808 verified
import gradio as gr
import cv2
import numpy as np
import torch
import torch.nn as nn
from PIL import Image
import torchvision.transforms as transforms
from skimage import restoration
import warnings
warnings.filterwarnings('ignore')
class WatermarkRemovalNet(nn.Module):
def __init__(self):
super(WatermarkRemovalNet, self).__init__()
# Encoder
self.encoder = nn.Sequential(
nn.Conv2d(3, 64, 3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(64, 64, 3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(2, 2),
nn.Conv2d(64, 128, 3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(128, 128, 3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(2, 2),
nn.Conv2d(128, 256, 3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, 3, padding=1),
nn.ReLU(inplace=True),
)
# Decoder
self.decoder = nn.Sequential(
nn.ConvTranspose2d(256, 128, 2, stride=2),
nn.ReLU(inplace=True),
nn.Conv2d(128, 128, 3, padding=1),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(128, 64, 2, stride=2),
nn.ReLU(inplace=True),
nn.Conv2d(64, 64, 3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(64, 3, 3, padding=1),
nn.Sigmoid()
)
def forward(self, x):
x = self.encoder(x)
x = self.decoder(x)
return x
class WatermarkRemover:
def __init__(self):
self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
self.model = WatermarkRemovalNet().to(self.device)
self.transform = transforms.Compose([
transforms.ToTensor(),
])
def preprocess_image(self, image):
if isinstance(image, np.ndarray):
image = Image.fromarray(image)
return self.transform(image).unsqueeze(0)
def detect_watermark(self, img):
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
denoised = cv2.fastNlMeansDenoising(gray)
# Multi-scale watermark detection
scales = [1.0, 0.5, 2.0]
masks = []
for scale in scales:
scaled = cv2.resize(denoised, None, fx=scale, fy=scale)
thresh = cv2.adaptiveThreshold(
scaled, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY_INV, 11, 2
)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
mask = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
if scale != 1.0:
mask = cv2.resize(mask, (denoised.shape[1], denoised.shape[0]))
masks.append(mask)
# Combine masks
final_mask = np.zeros_like(denoised)
for mask in masks:
final_mask = cv2.bitwise_or(final_mask, mask)
return final_mask
def remove_watermark(self, img, mask, strength=0.8):
# Apply inpainting
inpainted = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)
# Apply deep learning model
tensor_img = self.preprocess_image(inpainted).to(self.device)
with torch.no_grad():
output = self.model(tensor_img)
dl_result = output.squeeze(0).cpu().numpy().transpose(1, 2, 0)
# Apply image restoration
denoise_img = restoration.denoise_tv_chambolle(dl_result, weight=0.1)
enhanced = cv2.detailEnhance(denoise_img.astype(np.float32), sigma_s=10, sigma_r=0.15)
# Blend results
result = cv2.addWeighted(enhanced, strength, img.astype(np.float32)/255, 1-strength, 0)
return (result * 255).astype(np.uint8)
def process_image(input_image, strength, enhance_details):
remover = WatermarkRemover()
# Detect watermark
mask = remover.detect_watermark(input_image)
# Remove watermark
result = remover.remove_watermark(input_image, mask, strength)
# Optional detail enhancement
if enhance_details:
result = cv2.detailEnhance(result, sigma_s=10, sigma_r=0.15)
return result, mask
# Gradio Interface
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown("""
# Removedor Avançado de Marca D'água
Este aplicativo utiliza uma combinação de deep learning e processamento de imagem para remover marcas d'água.
""")
with gr.Row():
with gr.Column():
input_image = gr.Image(label="Imagem Original", type="numpy")
strength_slider = gr.Slider(
minimum=0.1,
maximum=1.0,
value=0.8,
step=0.1,
label="Intensidade da Remoção"
)
enhance_checkbox = gr.Checkbox(
label="Melhorar Detalhes",
value=True
)
process_btn = gr.Button("Processar Imagem", variant="primary")
with gr.Column():
output_image = gr.Image(label="Imagem Processada")
mask_image = gr.Image(label="Máscara de Marca D'água")
# Eventos
process_btn.click(
fn=process_image,
inputs=[input_image, strength_slider, enhance_checkbox],
outputs=[output_image, mask_image]
)
gr.Markdown("""
## Recursos Avançados:
- Detecção multi-escala de marca d'água
- Modelo de deep learning para reconstrução de imagem
- Restauração avançada de imagem
- Preservação de detalhes
- Controle de intensidade ajustável
## Dicas de Uso:
1. Ajuste a 'Intensidade da Remoção' para controlar o balanço entre remoção da marca e preservação da imagem
2. Ative 'Melhorar Detalhes' para realçar a qualidade da imagem final
3. Visualize a máscara para entender quais áreas estão sendo processadas
""")
if __name__ == "__main__":
demo.launch(share=True)