1234 / app.py
hayakoko's picture
Update app.py
79db84f verified
from keras.models import load_model
from PIL import Image, ImageOps
import numpy as np
import gradio as gr
import random
# モデルとラベルの読み込み
model = load_model("keras_model.h5", compile=False)
class_names = open("labels.txt", "r").readlines()
# グローバル変数としてtempを宣言
temp = ""
# 式の評価関数
def evaluate_expression(expression):
try:
result = eval(expression)
return str(result)
except Exception as e:
return f"エラー: {str(e)}"
# 新しく生成された問題
def generate_random_expression():
operators = ['+', '-', '*', '/']
num1 = random.randint(1, 9)
num2 = random.randint(1, 9)
operator = random.choice(operators)
expression = f"{num1} {operator} {num2}"
return expression
# 1桁の自然数になるように修正
def generate_valid_expression():
while True:
true_answer = generate_random_expression()
if len(evaluate_expression(true_answer)) == 1:
return true_answer
# 問題を表示
def display_question():
global temp # グローバル変数として宣言
question = generate_valid_expression()
temp = question
return question
# Gradio インターフェースをセットアップ
def greet(answer_img, question=display_question()):
global temp # グローバル変数として宣言
# ユーザーが入力した答えの前処理
user_answer_data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32)
user_answer_image = Image.fromarray(answer_img).convert('RGB')
size = (224, 224)
user_answer_image = ImageOps.fit(user_answer_image, size, Image.LANCZOS)
user_answer_array = np.asarray(user_answer_image)
user_normalized_image_array = (user_answer_array.astype(np.float32) / 127.0) - 1
user_answer_data[0] = user_normalized_image_array
# ユーザーの答えの予測
answer_prediction = model.predict(user_answer_data)
predicted_number = class_names[np.argmax(answer_prediction)][2:]
# 画像認識で確認した数字が事前に生成した問題の答えとあっているか判断
if int(predicted_number) == int(evaluate_expression(question)):
result = f"正解! 画像認識で確認した数字: {predicted_number}, 正しい答え: {evaluate_expression(question)}"
else:
result = f"不正解! 画像認識で確認した数字: {predicted_number}, 正しい答え: {evaluate_expression(question)}"
# 問題と結果を表示
print(result)
return result
# Gradio インターフェースのセットアップと起動
iface = gr.Interface(
fn=greet,
inputs=["image"],
outputs=["text"],
live=False, # "text" コンポーネントは非表示にします
title="問題",
description=temp
)
iface.launch(debug=True, share=True)