File size: 3,714 Bytes
9e0ec45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fb8989b
 
9e0ec45
fb8989b
 
9e0ec45
 
 
 
 
 
6daeacc
9e0ec45
 
5f410f3
9e0ec45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
from ultralytics import YOLO
import cv2
import numpy as np
from PIL import Image

# Cargar el modelo YOLO directamente desde el archivo local
model = YOLO('./best.pt')

# Funci贸n para procesar la imagen con YOLO
def detectar_objetos(image):
    # Convertir la imagen de entrada (Gradio) a formato OpenCV (BGR)
    image_bgr = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)

    # Realiza la detecci贸n con YOLO directamente en la imagen
    results = model.predict(source=image_bgr, conf=0.25, save=False)

    # Dibuja las detecciones en la imagen
    annotated_image = image_bgr.copy()
    for box in results[0].boxes:
        # Extraer coordenadas y clase
        x1, y1, x2, y2 = map(int, box.xyxy[0])
        cls = int(box.cls)

        # Colores personalizados para las clases
        if cls == 0:  # Well
            color = (0, 255, 0)  # Verde
            label = "Well"
        elif cls == 1:  
            color = (255, 0, 0)  # Rojo
            label = "Partially"
        elif cls == 2:  
            color = (0, 0, 255)  # Azul
            label = "Bad"
        else:
            color = (255, 255, 255)
            label = f"Class {cls}"

        # Dibujar el cuadro y la etiqueta
        cv2.rectangle(annotated_image, (x1, y1), (x2, y2), color, thickness=2)
        cv2.putText(
            annotated_image, label, (x1, y1 - 10),
            cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, thickness=0
        )

    # Convertir la imagen anotada de BGR a RGB para mostrar en Gradio
    annotated_image_rgb = cv2.cvtColor(annotated_image, cv2.COLOR_BGR2RGB)

    return annotated_image_rgb

# CSS personalizado para la interfaz
css = """
.app-container { background-color: white; }
.title-container {
    background-color: white;
    display: flex;
    align-items: center;
    justify-content: center;
    height: 300px;
    font-size: 24px;
    font-weight: bold;
    text-align: center;
}
.centered-image { 
    display: block; 
    margin: auto; 
}
"""

# Crear la interfaz con el dise帽o original
examples = [["cacao_1.png"], ["cacao_2.jpg"]]  # Aseg煤rate de que estos archivos est茅n en la misma carpeta que el script

with gr.Blocks(css=css) as demo:
    # Logo y t铆tulo en la parte superior
    with gr.Row():
        gr.Image(value="Cacaotin.png", width=300, height=300, elem_id="centered-image")
        gr.Markdown("<div class='title-container'>Fermentation Level Classification for Cocoa Beans</div>")

    # Bot贸n de GitHub centrado
    gr.Markdown("<center><a href='https://github.com/kebincontreras/cocoa_beans_interfaces' target='_blank'><button style='background-color: #007bff; color: white; padding: 10px 20px; border: none; border-radius: 5px; font-size: 16px;'>View on GitHub</button></a></center>")

    # Fila para cargar la imagen y mostrar la salida procesada
    with gr.Row():
        img_input = gr.Image(label="Upload Image")
        img_output = gr.Image(label="Image with Detected Objects")
    
    # Bot贸n para procesar la imagen
    btn_detectar = gr.Button("Detect Objects")
    btn_detectar.click(detectar_objetos, inputs=img_input, outputs=img_output)

    # Descripci贸n de las clases de cacao
    gr.Markdown("""
    **Cacao Classes According to NTC1252:2021:**
    - **a) Well-fermented:** 
    - **b) Partially fermented:**
    - **c) Non-fermented:**
    """)
    gr.Image(value="cacao.png", label="a) Well-fermented, b) Partially fermented, c) Non-fermented")

    # Explicaci贸n final seg煤n la norma
    gr.Markdown("**Explanation According to NTC1252:2021:** Here you can explain how the NTC1252:2021 norm applies to the classification of fermentation levels.")

# Ejecutar la aplicaci贸n
if __name__ == "__main__":
    demo.launch()