Spaces:
Runtime error
Runtime error
File size: 3,876 Bytes
b417e0d f5996cf 7c117c8 f5996cf b417e0d f5996cf fa82bab 7c117c8 f5996cf 7c117c8 f5996cf b417e0d f5996cf b417e0d 7c117c8 b417e0d f5996cf b417e0d 5cbd746 b417e0d f5996cf b417e0d 5cbd746 b417e0d 5cbd746 7c117c8 b417e0d 5ceaa50 b417e0d 5ceaa50 b417e0d 5ceaa50 b417e0d |
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 |
import streamlit as st
from PIL import Image
import numpy as np
import cv2
from huggingface_hub import from_pretrained_keras
st.header("Segmentación de dientes con rayos X")
st.markdown(
"""
Hola estudiantes de Platzi 🚀. Este modelo usa UNet para segmentar imágenes
de dientes en rayos X. Se utila un modelo de Keras importado con la función
`huggingface_hub.from_pretrained_keras`. Recuerda que el Hub de Hugging Face está integrado
con muchas librerías como Keras, scikit-learn, fastai y otras.
El modelo fue creado por [SerdarHelli](https://huggingface.co/SerdarHelli/Segmentation-of-Teeth-in-Panoramic-X-ray-Image-Using-U-Net).
"""
)
## Seleccionamos y cargamos el modelo
model_id = "SerdarHelli/Segmentation-of-Teeth-in-Panoramic-X-ray-Image-Using-U-Net"
model = from_pretrained_keras(model_id)
## Permitimos a la usuaria cargar una imagen
archivo_imagen = st.file_uploader("Sube aquí tu imagen.", type=["png", "jpg", "jpeg"])
## Si una imagen tiene más de un canal entonces se convierte a escala de grises (1 canal)
def convertir_one_channel(img):
if len(img.shape) > 2:
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
return img
else:
return img
def convertir_rgb(img):
if len(img.shape) == 2:
img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
return img
else:
return img
## Manipularemos la interfaz para que podamos usar imágenes ejemplo
## Si el usuario da click en un ejemplo entonces el modelo correrá con él
ejemplos = ["dientes_1.png", "dientes_2.png", "dientes_3.png"]
## Creamos tres columnas; en cada una estará una imagen ejemplo
col1, col2, col3 = st.columns(3)
with col1:
## Se carga la imagen y se muestra en la interfaz
ex = Image.open(ejemplos[0])
st.image(ex, width=200)
## Si oprime el botón entonces usaremos ese ejemplo en el modelo
if st.button("Corre este ejemplo 1"):
archivo_imagen = ejemplos[0]
with col2:
ex1 = Image.open(ejemplos[1])
st.image(ex1, width=200)
if st.button("Corre este ejemplo 2"):
archivo_imagen = ejemplos[1]
with col3:
ex2 = Image.open(ejemplos[2])
st.image(ex2, width=200)
if st.button("Corre este ejemplo 3"):
archivo_imagen = ejemplos[2]
## Si tenemos una imagen para ingresar en el modelo entonces
## la procesamos e ingresamos al modelo
if archivo_imagen is not None:
## Cargamos la imagen con PIL, la mostramos y la convertimos a un array de NumPy
img = Image.open(archivo_imagen)
st.image(img, width=850)
img = np.asarray(img)
## Procesamos la imagen para ingresarla al modelo
img_cv = convertir_one_channel(img)
img_cv = cv2.resize(img_cv, (512, 512), interpolation=cv2.INTER_LANCZOS4)
img_cv = np.float32(img_cv / 255)
img_cv = np.reshape(img_cv, (1, 512, 512, 1))
## Ingresamos el array de NumPy al modelo
predicted = model.predict(img_cv)
predicted = predicted[0]
## Regresamos la imagen a su forma original y agregamos las máscaras de la segmentación
predicted = cv2.resize(
predicted, (img.shape[1], img.shape[0]), interpolation=cv2.INTER_LANCZOS4
)
mask = np.uint8(predicted * 255) #
_, mask = cv2.threshold(
mask, thresh=0, maxval=255, type=cv2.THRESH_BINARY + cv2.THRESH_OTSU
)
kernel = np.ones((5, 5), dtype=np.float32)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel, iterations=1)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel, iterations=1)
cnts, hieararch = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
output = cv2.drawContours(convertir_one_channel(img), cnts, -1, (255, 0, 0), 3)
## Si obtuvimos exitosamente un resultadod entonces lo mostramos en la interfaz
if output is not None:
st.subheader("Segmentación:")
st.write(output.shape)
st.image(output, width=850)
|