Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| from deepface import DeepFace | |
| import cv2 | |
| import numpy as np | |
| import os | |
| import shutil | |
| # --- 設定 --- | |
| DB_PATH = "my_db" | |
| # 起動時にDBフォルダをリセット(Hugging Faceの環境をクリーンに保つため) | |
| if os.path.exists(DB_PATH): | |
| shutil.rmtree(DB_PATH) | |
| os.makedirs(DB_PATH, exist_ok=True) | |
| # --- 関数定義 --- | |
| def register_face(image, name): | |
| """画像をDBフォルダに保存する""" | |
| if image is None or name.strip() == "": | |
| return "画像と名前を入力してください。" | |
| try: | |
| # OpenCV形式に変換して保存 | |
| image_bgr = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) | |
| # ここを修正:os.path.join です(スラッシュは不要) | |
| file_path = os.path.join(DB_PATH, f"{name}.jpg") | |
| cv2.imwrite(file_path, image_bgr) | |
| return f"「{name}」さんを登録しました!" | |
| except Exception as e: | |
| return f"エラーが発生しました: {str(e)}" | |
| def recognize_face(target_image): | |
| """画像から登録済みの顔を探す""" | |
| if target_image is None: | |
| return None, "画像をアップロードしてください。" | |
| if not os.listdir(DB_PATH): | |
| return target_image, "まだ誰も登録されていません。「推し登録」タブで登録してください。" | |
| try: | |
| # 認識の実行 | |
| results = DeepFace.find(img_path=target_image, db_path=DB_PATH, enforce_detection=False, silent=True) | |
| output_image = target_image.copy() | |
| found_names = [] | |
| for df in results: | |
| if df.empty: continue | |
| for index, row in df.iterrows(): | |
| # 登録名を取得 | |
| full_path = row['identity'] | |
| name = os.path.basename(full_path).split('.')[0] | |
| found_names.append(name) | |
| # 座標の取得と描画 | |
| x, y, w, h = int(row['source_x']), int(row['source_y']), int(row['source_w']), int(row['source_h']) | |
| cv2.rectangle(output_image, (x, y), (x+w, y+h), (0, 255, 0), 3) | |
| cv2.putText(output_image, name, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2) | |
| if not found_names: | |
| message = "登録された推しは見つかりませんでした。" | |
| else: | |
| message = f"発見しました!: {', '.join(set(found_names))}" | |
| return output_image, message | |
| except Exception as e: | |
| return target_image, f"認識エラー: {str(e)}" | |
| # --- UI (Gradio) の構築 --- | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# 🌟 推し認識AIプロトタイプ") | |
| gr.Markdown("まずは『推し登録』で写真をアップし、その後『推しを探す』で判定してください。") | |
| with gr.Tabs(): | |
| with gr.TabItem("① 推し登録"): | |
| with gr.Row(): | |
| reg_input_img = gr.Image(label="推しの写真") | |
| reg_input_name = gr.Textbox(label="推しの名前") | |
| reg_btn = gr.Button("データベースに登録") | |
| reg_status = gr.Textbox(label="登録状況") | |
| reg_btn.click(register_face, inputs=[reg_input_img, reg_input_name], outputs=reg_status) | |
| with gr.TabItem("② 推しを探す"): | |
| with gr.Row(): | |
| rec_input_img = gr.Image(label="判定したい画像") | |
| rec_output_img = gr.Image(label="判定結果") | |
| rec_btn = gr.Button("推しを検索!") | |
| rec_status = gr.Textbox(label="結果メッセージ") | |
| rec_btn.click(recognize_face, inputs=[rec_input_img], outputs=[rec_output_img, rec_status]) | |
| # アプリ起動 | |
| if __name__ == "__main__": | |
| demo.launch() |