Kota Takahashi
emotion_analyser.pyの`detect_best_image`をなくしてapp.pyの方に処理を移行
e3476c2
import sys
import os
import glob
import numpy as np
import streamlit as st
from PIL import Image
import zipfile
from emotion_analyzer import EmotionAnalyzer
st.title('ベストショット判定アプリ')
## スライダーの定義
st.sidebar.markdown('### 条件設定')
sld_anger_deg = st.sidebar.slider('怒り', 1, 5, 1)
sld_disgust_deg = st.sidebar.slider('嫌悪', 1, 5, 1)
sld_fear_deg = st.sidebar.slider('恐怖', 1, 5, 1)
sld_happiness_deg = st.sidebar.slider('喜しさ', 1, 5, 5)
sld_sadness_deg = st.sidebar.slider('悲しみ', 1, 5, 1)
sld_surprise_deg = st.sidebar.slider('驚き', 1, 5, 1)
sld_neutral_deg = st.sidebar.slider('真顔', 1, 5, 1)
# 各変数の比率を計算
sld_total_deg = (sld_anger_deg + sld_disgust_deg + sld_fear_deg +
sld_happiness_deg + sld_sadness_deg +
sld_surprise_deg + sld_neutral_deg)
emotion_ratios = {
'anger': sld_anger_deg / sld_total_deg,
'disgust': sld_disgust_deg / sld_total_deg,
'fear': sld_fear_deg / sld_total_deg,
'happiness': sld_happiness_deg / sld_total_deg,
'sadness': sld_sadness_deg / sld_total_deg,
'surprise': sld_surprise_deg / sld_total_deg,
'neutral': sld_neutral_deg / sld_total_deg
}
image_extensions = ['*.jpg', '*.jpeg', '*.png', '*.gif', '*.bmp']
extract_dir = 'imgs'
# アップローダー
uploaded_file = st.file_uploader('ZIPファイルをアップロードしてください', type='zip')
# イメージファイルのパスを格納するリスト
img_file_path_list = []
if uploaded_file:
# 一時ディレクトリを作成してZIPファイルを解凍
with zipfile.ZipFile(uploaded_file, 'r') as zip_ref:
zip_ref.extractall(extract_dir)
# 解凍したファイル・ディレクトリの一覧を取得
extracted_items = os.listdir(extract_dir)
# zipファイルのベースファイルを取得
uploaded_file_base_name = uploaded_file.name.split('.zip')[0]
# 解凍したディレクトリのパスを取得
extract_dir_path = os.path.join(extract_dir, uploaded_file_base_name)
# 各拡張子に対してglobを使用してファイルを取得
for ext in image_extensions:
img_file_path_list.extend(glob.glob(os.path.join(extract_dir_path, ext)))
if img_file_path_list:
st.write(f'{len(img_file_path_list)}枚のイメージファイルが見つかりました')
else:
st.write('イメージファイルが見つかりませんでした')
st.write('再度アップロードしなおしてください')
sys.exit()
if st.button('表情分析開始'):
# 画像を指定して表情認識を実行
with (st.spinner('表情分析中...')):
ema = EmotionAnalyzer(img_file_path_list)
df_emotions = ema.create_emotion_dataflame()
# 各表情の値と設定値との二乗和を取り、最も値が小さい(設定値に近い)写真をベストショットをする
df_emotions['distance'] = \
np.sqrt(sum((df_emotions[emotion] - ratio) ** 2 for emotion, ratio in emotion_ratios.items()))
best_image_record = df_emotions.loc[df_emotions['distance'].idxmin()]
# ベストショットのファイル名
best_image_record_filename = best_image_record.name
# 保存した画像を表示
result_detection = df_emotions.loc[best_image_record_filename]['detections']
fig_list = result_detection.plot_detections(faces='landmarks', faceboxes=True, muscles=False, poses=False,
gazes=False,
add_titles=True,
au_barplot=False, emotion_barplot=True,
plot_original_image=True)
st.markdown('ベストショットはこちら!')
# 保存した画像を表示
img = Image.open(best_image_record_filename)
st.image(img, width=500)
# 分析結果を表示
st.markdown('分析結果')
st.pyplot(fig_list[0])