lab2_2 / app.py
semerikov's picture
Upload 5 files
bfc7a76 verified
import gradio as gr
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import load_model
import os
# Завантаження моделі
model = load_model('model.keras')
# Отримання класів з файлу (якщо вони були збережені)
try:
with open('class_names.txt', 'r') as f:
class_names = f.read().splitlines()
except:
# За замовчуванням використовуємо числові імена класів
num_classes = model.output_shape[-1]
class_names = [f"Class {i}" for i in range(num_classes)]
# Визначення функції передбачення
def predict(image):
"""
Виконує передбачення класу за допомогою навченої моделі
Args:
image: Вхідне зображення
Returns:
dict: Словник з ймовірностями для кожного класу
"""
# Отримання форми вхідних даних з моделі
input_shape = model.input_shape[1:]
# Перевірка кількості каналів
if len(input_shape) == 3: # Для зображень (CNN)
# Масштабуємо зображення до потрібного розміру
resized_image = tf.image.resize(image, [input_shape[0], input_shape[1]])
# Перетворення на одноканальне зображення, якщо потрібно
if input_shape[2] == 1 and resized_image.shape[-1] == 3:
resized_image = tf.image.rgb_to_grayscale(resized_image)
# Нормалізація та додавання розмірності пакету
img_array = tf.expand_dims(resized_image, 0) / 255.0
else: # Для плоских даних
# Розгортаємо зображення в одновимірний вектор
img_array = tf.reshape(image, (1, -1)) / 255.0
# Передбачення
predictions = model.predict(img_array)
# Формування результату
result = {class_names[i]: float(predictions[0][i]) for i in range(len(class_names))}
return result
# Створення інтерфейсу Gradio
interface = gr.Interface(
fn=predict,
inputs=gr.Image(),
outputs=gr.Label(num_top_classes=len(class_names)),
title="Модель багатокласової класифікації",
description="Завантажте зображення для класифікації."
)
# Запуск інтерфейсу
interface.launch()