pythonでFERを使用して感情を数値化する_part3～MySQLを使用～

# 概要
今回はpythonでFERを使用して感情を数値化する方法について記載していきます。
各感情を数値化して、MySQLにデータを格納することができました。
勉強用に簡易的に記載していますので、ご了承ください。

## 実行環境
・windows：Windows11Pro 23H2
・Python 3.12.3

## 参考サイト
https://www.javadrive.jp/mysql/

https://qiita.com/FumiyaShibusawa/items/2e3b30ceedeafff0bce2

https://qiita.com/Utricularor/items/aec6c9a4a3d0b3cf0e1d

## 実行ファイル
```emoton.py
from fer import FER
import matplotlib.pyplot as plt
import sys
import json
import os
import numpy as np
import pandas as pd
import pymysql


# 感情のリスト
EMOTIONS_LIST = ["angry","disgust","fear","happy","sad","surprise","neutral"]

def emotion_cap(pic):
    # 画像の取得
    test_image_one = plt.imread(pic)
    emo_detector = FER(mtcnn=True)
    captured_emotion = emo_detector.detect_emotions(test_image_one)

    INITDATA = 0
    EMOTIONS = {"angry":INITDATA,"disgust":INITDATA,"fear":INITDATA, "happy":INITDATA, "sad":INITDATA, "surprise":INITDATA,"neutral":INITDATA}

    # 全ての感情の取得
    for key in EMOTIONS.keys():
        if captured_emotion[0]['emotions'][key]:
            EMOTIONS[key] = captured_emotion[0]['emotions'][key]

    return EMOTIONS

## 感情を円グラフにする
def emotion_show(emotion_dict):
    # 全ての画像の感情値の出力
    print("########################################")
    print(emotion_dict)
    print("########################################")

    # DataFrameの作成
    df = pd.DataFrame(emotion_dict)
    print(df)

    # 円グラフの作成(１枚ずつ表示)
    for i in df.columns:
        x = df[i]
        fig, ax = plt.subplots()
        ax.pie(x, labels=EMOTIONS_LIST, autopct="%1.1f %%")

        plt.show()

def mysql_insert(dic):
    # データベースに接続
    connection = pymysql.connect(host='localhost',
                                user='root',
                                password='Suika628',
                                database='emotion',
                                cursorclass=pymysql.cursors.DictCursor)
    # mysqlに格納されているデータを全て抽出
    mysql_exist = []
    # 主キーのみ抽出
    mysql_name = []
    try:
        with connection.cursor() as cursor:
            TABLE = 'info'
            #データの取得・表示
            cursor.execute("SELECT * FROM " + TABLE + ";")
            mysql_exist = cursor.fetchall()
            print(mysql_exist)

            # mysqlの重複をなくす
            for i in mysql_exist:
                mysql_name.append(i['name'])
                mysql_name = list(set(mysql_name))
            print("\n")
            print(mysql_name)

            for already in mysql_name:
                for key in dic:
                    # 既に存在する主キーのデータはinsertしない
                    if already == key:
                        continue
                    # 存在しない主キーのデータはinsertする
                    else:
                        sql = f"INSERT INTO info(name,angry,disgust,fear,happy,sad,surprise,neutral) values ('{key}',{dic[key]['angry']},{dic[key]['disgust']},{dic[key]['fear']},{dic[key]['happy']},{dic[key]['sad']},{dic[key]['surprise']},{dic[key]['neutral']});"
                        cursor.execute(sql)
                        connection.commit()

    finally:
        connection.close()

if __name__ == '__main__':

    # 第一引数は設定ファイル
    json_file = sys.argv[1]
    json_file = open(json_file,'r')
    json_data = json.load(json_file)
    
    # 感情の値を格納する辞書型
    emotion_dict = {}

    # 画像を一枚ずつ読み込み感情の値を取得
    for i in json_data["picture"].values():
        pic = i
        emotion_result = emotion_cap(pic)
        filename = os.path.basename(pic)
        emotion_dict[filename] = emotion_result
    print(emotion_dict)

    ## 感情を円グラフにする
    emotion_show(emotion_dict)

    ## mysqlへの接続
    mysql_insert(emotion_dict)
```
## 設定ファイル
設定ファイルは前回と同じです。

https://qiita.com/futurecreatenow/items/e523177c35d21be012f8

## 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559550/5ac373c8-6951-1287-9feb-3ee39fe8f1e9.png)