from groq import Groq import base64 import os from dotenv import load_dotenv import gradio as gr import mysql.connector import cv2 #pip3 install cv-3 import datetime from sumy.parsers.plaintext import PlaintextParser from sumy.nlp.tokenizers import Tokenizer from sumy.summarizers.lsa import LsaSummarizer load_dotenv(verbose=True) conn = mysql.connector.connect( host=os.environ.get("HOST"), user=os.environ.get("USER_NAME"), password=os.environ.get("PASSWORD"), port=os.environ.get("PORT"), database=os.environ.get("DB"), ssl_disabled=True, connection_timeout=60, use_pure=True ) cursor = conn.cursor(dictionary=True) '''def capture_image(image): return image # 撮影した画像をそのまま返す # Function to encode the image def encode_image(image_path): with open(image_path, "rb") as image_file: return base64.b64encode(image_file.read()).decode('utf-8')''' def encode_image(image_array, file_name): # 色空間をBGRからRGBに変換 image_array = cv2.cvtColor(image_array, cv2.COLOR_BGR2RGB) cv2.imwrite(file_name, image_array, [int(cv2.IMWRITE_JPEG_QUALITY), 90]) #cv2.imwrite(file_name, image_array) with open(file_name, "rb") as image_file: return base64.b64encode(image_file.read()).decode('utf-8') #return file_name # Function to process and identify expressions def identify_expression(image_path,userid): base64_image = encode_image(image_path,userid+".jpg") client = Groq(api_key=os.environ.get("GROQ_API_KEY")) chat_completion = client.chat.completions.create( messages=[ { "role": "user", "content": [ {"type": "text", "text": "どんな表情ですか? その顔表情から推測できる心境を詳しく説明してください。尚、メンタルカウンセリングが必要かを教えてください。その場合、どのようにカウンセリングを受ければ良いかも教えてください。"}, { "type": "image_url", "image_url": { "url": f"data:image/jpeg;base64,{base64_image}", }, }, ], } ], model="meta-llama/llama-4-scout-17b-16e-instruct", ) # USER Emotion Register client2 = Groq(api_key=os.environ.get("GROQ_API_KEY2")) # Set the system prompt system_prompt = { "role": "system", "content": "You are a helpful assistant, answer questions concisely." } # Set the user prompt user_input = f'{chat_completion.choices[0].message.content}をカウンセリングの情報を除いて要約してください。' user_prompt = { "role": "user", "content": user_input } # Initialize the chat history chat_history = [system_prompt, user_prompt] response = client2.chat.completions.create( model="llama-3.3-70b-versatile", messages=chat_history, max_tokens=1024, temperature=0) summary = response.choices[0].message.content # Update user emotion dt_now = datetime.datetime.now() today = dt_now.strftime('%Y/%m/%d') update_emotion_query = f"UPDATE emotion_data SET emotion_logs = CONCAT(emotion_logs,CHAR(13),CHAR(13),'"+today+"',CHAR(13),'"+summary+"') WHERE userid = '"+userid+"'" cursor.execute(update_emotion_query) conn.commit() return chat_completion.choices[0].message.content def close_mysql(): cursor.close() # カーソルを閉じる conn.close() # 接続を閉じる return "DB接続が閉じられました!" def on_userid_change(user_id): if (user_id == ''): gr.Info('ユーザーIDが入力されていません。') else: with open("uid.dat", "wb") as f: f.write(user_id.encode()) def uid_changed(new_userid): return gr.update(visible=True) def trend_analyze(userid): if (userid == ''): gr.Info('ユーザーIDが入力されていません。') else: select_emotion_query = f"select emotion_logs from emotion_data WHERE userid = '"+userid+"'" cursor.execute(select_emotion_query) rows = cursor.fetchall() data = "" for row in rows: data = row parser = PlaintextParser.from_string(data, Tokenizer("japanese")) summarizer = LsaSummarizer() summary = summarizer(parser.document, 4090) smry = "\n".join(str(sentence) for sentence in summary) client2 = Groq(api_key=os.environ.get("GROQ_API_KEY2")) # Set the system prompt system_prompt = { "role": "system", "content": "You are a helpful assistant, answer questions concisely." } # Set the user prompt user_input = f'{smry}からこの人の表情や感情の傾向を全体的に分析してください。必ず、呼称は老人、青年などは除いて、人を使ってください。' user_prompt = { "role": "user", "content": user_input } # Initialize the chat history chat_history = [system_prompt, user_prompt] response = client2.chat.completions.create( model="llama-3.3-70b-versatile", messages=chat_history, max_tokens=1024, temperature=0) analysis = response.choices[0].message.content return analysis if os.path.exists("uid.dat"): with open("uid.dat", "rb") as f: taken_userid = f.read().decode() # Gradio Interface with gr.Blocks(css="footer {visibility: hidden;} #custom_button {width: 400px; margin: 0 auto; background-color: #E0E7FF;}", theme=gr.themes.Soft(), title="EMOTION DETECTION") as emotion: gr.Markdown("# Facial Expression Detector") with gr.Row(): with gr.Row(): image = gr.Image(sources=["webcam"], streaming=False, label="撮影する画像") userid = gr.Textbox(label="ユーザーID", value=taken_userid) reg_button = gr.Button("登録",visible=False,elem_id="custom_button") userid.change(fn=uid_changed, inputs=[userid], outputs=[reg_button]) submit_button = gr.Button("実行",elem_id="custom_button") output_text = gr.Textbox(label="結果") submit_button.click(fn=identify_expression, inputs=[image, userid], outputs=output_text) reg_button.click(fn=on_userid_change, inputs=[userid], outputs=None) with gr.Row(): trend_input = gr.Textbox(label="傾向分析ID", value=taken_userid) trend_output = gr.Textbox(label="傾向分析結果") trend_button = gr.Button("分析",visible=True,elem_id="custom_button") trend_button.click(fn=trend_analyze, inputs=[trend_input], outputs=[trend_output]) emotion.launch(favicon_path='favicon.ico') emotion.close(close_mysql)