# file name : reidai12_2.py
# reidai12_2 犬か猫か？ 画像分類アプリ
# ファイル'catdog_model.keras'が同じフォルダに存在するかどうか確認しておくこと

import streamlit as st
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing import image

st.set_page_config(page_title='犬か猫か？ 画像分類アプリ',
                            layout="centered")
st.title('犬か猫か？ 画像分類アプリ')
st.write('画像をアップロードすると、AIが犬か猫かを判定！ ')

# 事前学習済みモデルの読み込み
@st.cache_resource # 1回読み込んだモデルを再利用
def load_trained_model():
    return tf.keras.applications.MobileNetV2(weights='imagenet',
            include_top=False,input_shape=(224,224,3))

model=load_trained_model()

# ユーザが画像をアップロード
uploaded_file=st.file_uploader('犬か猫の画像をアップロード！ ',
type=['jpg','png','jpeg'])

# 画像がアップロードされた画像がある場合
if uploaded_file is not None:
    # 画像の表示
    st.image(uploaded_file,caption='アップロードされた画像', width=300)
    # 画像の前処理　224×224でリサイズ
    img=image.load_img(uploaded_file,target_size=(224,224)) # リサイズ
    img_array=image.img_to_array(img)   # 画像データをNumpy配列に変換
    img_array=np.expand_dims(img_array,axis=0) # バッチ次元を追加
    img_array=tf.keras.applications.mobilenet_v2.preprocess_input(img_array)
                                        # 画像のピクセル値の調整
    # 予測
    feature=model.predict(img_array)
    feature=feature.flatten()           # CNNの出力（特徴）を1次元化
    pred=np.dot(feature,np.random.randn(feature.shape[0]))
                                        # 仮の分類器（本来は訓練済みモデルを使用）
    # 判定結果
    result='犬！' if pred > 0 else '猫！'
    st.success(f'予測結果：{result}')