Spaces:
Running
Running
from transformers import pipeline | |
from pathlib import Path | |
from PIL import Image | |
import matplotlib.pyplot as plt | |
import numpy as np | |
from matplotlib import colormaps | |
from matplotlib.patches import Patch | |
import cv2 | |
from matplotlib import patches | |
detc_modelo = 'valentinafeve/yolos-fashionpedia' | |
detc = pipeline('object-detection', detc_modelo) | |
sgm_modelo = 'mattmdjaga/segformer_b0_clothes' | |
sgm = pipeline('image-segmentation', sgm_modelo) | |
def processar_imagem(image_path): | |
# Carrega a imagem | |
imagem = Image.open(Path(image_path)) | |
# Segmentação | |
segmentacao = sgm(imagem) | |
# Detecção de objetos | |
deteccao = detc(imagem) | |
return imagem, segmentacao, deteccao | |
# segmentacao = sgm(imagem) feito na função processar_imagem | |
def adicionar_mascara(dados_imagem, dados_mascara, cor): | |
imagem_mascara = dados_imagem.copy() | |
imagem_mascara = np.where( | |
dados_mascara[:, :, np.newaxis] == 255, | |
cor, | |
imagem_mascara, | |
).astype(dados_imagem.dtype) | |
return cv2.addWeighted(dados_imagem, 0.5, imagem_mascara, 0.5, 0) | |
def plotar_segmentos(imagem, segmentacao, nome_colormap): | |
cmap = colormaps.get_cmap(nome_colormap) | |
cores = [ | |
(np.array(cmap(x)[:3]) * 255).astype(int) | |
for x in np.linspace(0, 1, len(segmentacao)) | |
] | |
imagem_final = np.array(imagem).copy() | |
legendas = [] | |
for segmento, cor in zip(segmentacao, cores): | |
dados_mascara = np.array(segmento['mask']) | |
label_mascara = segmento['label'] | |
imagem_final = adicionar_mascara(imagem_final, dados_mascara, cor) | |
legendas.append(Patch(facecolor=cor/255, edgecolor='black', label=label_mascara)) | |
fig, ax = plt.subplots(figsize=(16, 16)) | |
plt.legend(handles=legendas) | |
ax.imshow(imagem_final) | |
#plotar_segmentos(imagem=imagem, segmentacao=segmentacao, nome_colormap='hsv') | |
# deteccao = detc(imagem) feito na função processar_imagem | |
# Função para desenhar os retângulos | |
def plotar_deteccao(imagem, deteccao): | |
fig, ax = plt.subplots(figsize=(16, 16)) | |
ax.imshow(imagem) | |
for det in deteccao: | |
if det['score'] >= 0.80: | |
box = det['box'] | |
origem = (box['xmin'], box['ymin']) | |
largura = box['xmax'] - box['xmin'] | |
altura = box['ymax'] - box['ymin'] | |
rect = patches.Rectangle(origem, largura, altura, linewidth=3, edgecolor='red', facecolor='none') | |
ax.add_patch(rect) | |
texto = f"{det['label']} {100 * det['score']:.2f}%" | |
ax.text(box['xmin'] - 50, box['ymin'] + altura / 2, texto, | |
bbox={'facecolor': 'red', 'alpha': 0.8}, ha='right', va='center') | |
plt.axis('off') | |
plt.show() | |
# plotar_deteccao(imagem=imagem, deteccao=deteccao) |