Creando una app de reconocimiento de patrones con Tkinter y TensorFlow

La inteligencia artificial (IA) es una disciplina que permite a las computadoras aprender y tomar decisiones basadas en datos. Utilizando modelos de aprendizaje automático, es posible entrenar algoritmos para reconocer patrones y hacer predicciones. En esta breve entrada, se muestra cómo desarrollar una aplicación en Python que permita el reconocimiento de patrones, para este caso, reconocer los números del 0 – 9 utilizando una red neuronal entrenada con TensorFlow. y para la interfaz gráfica, Tkinter, en python.

Librerias

  • Tkinter: Para la interfaz gráfica.
  • NumPy: Para manejar la matriz de datos.
  • TensorFlow/Keras: Para cargar y utilizar un modelo de reconocimiento de patrones.

Carga del Modelo de Reconocimiento

import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.utils import to_categorical

# Ejemplos simples para 0 al 9
digits = {
    0: [
        [0,1,1,0],
        [1,0,0,1],
        [1,0,0,1],
        [1,0,0,1],
        [1,0,0,1],
        [0,1,1,0]
    ],
    1: [
        [0,0,1,0],
        [0,1,1,0],
        [0,0,1,0],
        [0,0,1,0],
        [0,0,1,0],
        [0,1,1,1]
    ],
    2: [
        [0,1,1,0],
        [1,0,0,1],
        [0,0,1,0],
        [0,1,0,0],
        [1,0,0,0],
        [1,1,1,1]
    ],
    3: [
        [1,1,1,0],
        [0,0,0,1],
        [0,1,1,0],
        [0,0,0,1],
        [0,0,0,1],
        [1,1,1,0]
    ],
    4: [
        [0,0,1,0],
        [0,1,1,0],
        [1,0,1,0],
        [1,1,1,1],
        [0,0,1,0],
        [0,0,1,0]
    ],
    5: [
        [1,1,1,1],
        [1,0,0,0],
        [1,1,1,0],
        [0,0,0,1],
        [1,0,0,1],
        [0,1,1,0]
    ],
    6: [
        [0,1,1,0],
        [1,0,0,0],
        [1,1,1,0],
        [1,0,0,1],
        [1,0,0,1],
        [0,1,1,0]
    ],
    7: [
        [1,1,1,1],
        [0,0,0,1],
        [0,0,1,0],
        [0,1,0,0],
        [1,0,0,0],
        [1,0,0,0]
    ],
    8: [
        [0,1,1,0],
        [1,0,0,1],
        [0,1,1,0],
        [1,0,0,1],
        [1,0,0,1],
        [0,1,1,0]
    ],
    9: [
        [0,1,1,0],
        [1,0,0,1],
        [1,0,0,1],
        [0,1,1,1],
        [0,0,0,1],
        [0,1,1,0]
    ]
}

# Preparación de los datos
X = np.array([np.array(digits[d]).flatten() for d in digits])  # Convertir a vectores de 24 elementos
y = np.array(list(digits.keys()))

# Codificación one-hot para las etiquetas
y_categorical = to_categorical(y, num_classes=10)

# Definir el modelo de red neuronal
model = Sequential([
    Dense(32, activation='relu', input_shape=(24,)),
    Dense(16, activation='relu'),
    Dense(10, activation='softmax')  # 10 clases (0 al 9)
])

# Compilar el modelo
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# Entrenar el modelo
model.fit(X, y_categorical, epochs=1000, verbose=1)

# Guardar el modelo entrenado
model.save("modeloReconocimiento0-9.keras")

print("Modelo guardado exitosamente como 'modelo_numeros.keras")

El primer paso es cargar el modelo previamente entrenado. En este caso, el modelo debe haber sido guardado en un archivo modelo0-9.keras.

import tensorflow as tf
import numpy as np
import tkinter as tk

# Cargar el modelo
try:
    model = tf.keras.models.load_model('modelo0-9.keras')  
except:
    print(" No se encontró el archivo 'modelo0-9.keras'. Asegúrate de entrenar y guardar el modelo.")
    exit()

Creación de la Interfaz Gráfica con Tkinter

La interfaz se basa en un lienzo donde el usuario puede dibujar un patrón de 6×4 celdas. Cada celda puede activarse o desactivarse haciendo clic en ella.

# Dimensiones de la matriz
ROWS = 6
COLS = 4
CELL_SIZE = 50  

matrix = np.zeros((ROWS, COLS), dtype=int)

root = tk.Tk()
root.title("Reconocimiento de Patrones (Canvas)")
root.configure(bg="white")

canvas = tk.Canvas(root, width=COLS * CELL_SIZE, height=ROWS * CELL_SIZE, bg="white")
canvas.grid(row=0, column=0, columnspan=4, padx=10, pady=10)

Funcionalidad de Dibujo

Cada clic del usuario alterna el estado de la celda, cambiando su color de blanco a negro y viceversa.

rectangles = {}

def toggle_cell(event):
    col = event.x // CELL_SIZE
    row = event.y // CELL_SIZE  
    if 0 <= row < ROWS and 0 <= col < COLS:
        matrix[row, col] = 1 if matrix[row, col] == 0 else 0
        color = "black" if matrix[row, col] == 1 else "white"
        canvas.itemconfig(rectangles[(row, col)], fill=color)

Creación de la Cuadrícula

for r in range(ROWS):
    for c in range(COLS):
        x1, y1 = c * CELL_SIZE, r * CELL_SIZE
        x2, y2 = x1 + CELL_SIZE, y1 + CELL_SIZE
        rect = canvas.create_rectangle(x1, y1, x2, y2, fill="white", outline="gray")
        rectangles[(r, c)] = rect

canvas.bind("<Button-1>", toggle_cell)

Reconocimiento del Patrón

Al presionar el botón «Reconocer», la matriz se procesa y se pasa al modelo para obtener una predicción.

def recognize_number():
    flattened_matrix = matrix.flatten().reshape(1, -1)
    prediction = model.predict(flattened_matrix)
    result_label.config(text=f"Número reconocido: {np.argmax(prediction)}")

Reinicio del Dibujo

def reset_matrix():
    global matrix
    matrix = np.zeros((ROWS, COLS), dtype=int)
    for (r, c), rect in rectangles.items():
        canvas.itemconfig(rect, fill="white")  

Botones de Interacción

recognize_btn = tk.Button(root, text="Reconocer", command=recognize_number, font=("Arial", 12), bg="lightblue")
recognize_btn.grid(row=1, column=0, columnspan=2, pady=10)

reset_btn = tk.Button(root, text="Reiniciar", command=reset_matrix, font=("Arial", 12), bg="lightblue", fg="black")
reset_btn.grid(row=1, column=2, columnspan=2, pady=10)

result_label = tk.Label(root, text="Dibuja un número y presiona 'Reconocer'", font=("Arial", 12), bg="white")
result_label.grid(row=2, column=0, columnspan=4)

Finalmente, iniciamos el bucle de Tkinter:

root.mainloop()

Esta aplicación es un ejemplo práctico de cómo integrar modelos de inteligencia artificial en interfaces gráficas de usuario. Puedes mejorarla entrenando modelos más precisos o ampliando la resolución de la cuadrícula para mejorar la precisión en el reconocimiento.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *