[Python] Évaluez les expressions faciales qui apparaissent sur le visage

Vous voulez être gentil avec les autres au travail. Endurant la colère de savoir pourquoi je dois le faire, je m'occupe de projets ennuyeux sans me plaindre. Mangeons après le déjeuner, hein ~ Je suis malade pour le moment! Un junior qui visait le moment où il s'étira un peu puis se pencha un peu sur le bureau et s'apprêtait à déjeuner, apporta un nouveau projet ennuyeux. N'est-ce pas ce sentiment sur votre visage? Êtes-vous un monstre junior? Les incidents ne sont plus signalés en raison de la peur, et des incidents encore plus graves se produisent. .. .. Je ne pense pas que ce soit le cas, mais avez-vous un visage effrayant avant de vous en rendre compte au travail? Ou est-ce normal de sourire aujourd'hui? Évaluons objectivement en utilisant la technologie de reconnaissance d'image.

Le visage est photographié à l'aide de la caméra intégrée de l'ordinateur personnel ou de la caméra Web connectée par USB, et évalué par la colère, la nausée, la peur, le bonheur, la tristesse, la surprise et la neutralité. Vous pouvez définir vous-même l'intervalle de prise de vue et l'heure de prise de vue, et les résultats seront représentés graphiquement et enregistrés dans Excel. Le contenu utilise un modèle formé par tensorflow et expression faciale. Je ne peux pas utiliser python! !! Je voulais le donner à quelqu'un qui l'a dit, mais je ne pouvais pas en faire un exe même si j'utilisais pyinstaller. Est-ce parce qu'il existe des packages lourds tels que tensorflow et keras? Veuillez me dire qui peut le faire.

hyoujyou.jpg

(Initialement conçu pour être évalué par les vétérinaires lorsqu'ils expliquent aux patients. Modifiez le nom dans le code en conséquence.)

  1. Créez un environnement. win lance l'invite de commande d'Anaconda. Mac lance le terminal. Si vous tapez ce qui suit, l'environnement d'exécution sera prêt. Téléchargez le package requis. Pour utiliser tensorflow, vous devez supprimer la version python. Vous ne pouvez pas utiliser tensorflow en 3.8. Faisons-en 3.6! !!

Win: à l'invite anaconda, procédez comme suit dans l'ordre. conda create -n face python=3.6.10 proceed ([y]/n)? → y activate face pip install opencv-python pip install pandas pip install matplotlib pip install openpyxl pip install tensorflow pip install keras

Mac: dans Terminal, copiez et collez les éléments suivants dans l'ordre et appuyez sur Entrée un par un. conda create -n face python=3.6.10 anaconda proceed ([y]/n)? → y conda activate face pip install opencv-python pip install pandas pip install matplotlib pip install openpyxl pip install tensorflow pip install keras

  1. Utilisez le modèle de reconnaissance des expressions faciales créé par M. Octavio Arriaga, qui est déployé sur github. Je suis reconnaissant qu'une chose aussi merveilleuse soit déployée gratuitement sur github. Téléchargez le zip, supprimez le fichier appelé fer2013_mini_XCEPTION.110-0.65.hdf5 à partir de là, veuillez le mettre quelque part dans le dossier pour une utilisation à partir de maintenant. https://github.com/oarriaga/face_classification/tree/master/trained_models/emotion_models

  2. Créez le fichier python suivant dans le dossier où vous avez enregistré le fichier ci-dessus.

face.py



from tkinter import *
from tkinter import ttk
import tkinter
import cv2
import os
import time
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import numpy as np
from keras.models import load_model
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing import image
import glob
import openpyxl
import datetime
from tkinter import filedialog


os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # not to show an error message related to CPU

def _destroyWindow():  # function to close the tinker window
    root.quit()
    root.destroy()
    
def askfileplace():
    cd =  filedialog.askdirectory() # function to ask which directly to use for saving image and excel    
    path.set(cd)

def resource_path(relative_path):   # function to get the target path
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.dirname(__file__)
    return os.path.join(base_path, relative_path)
    
# create a main function which is to be used after pressing a button
def save_frame_camera_key(device_num,interval1,duration1,vetname1,name1,path1):

    os.makedirs("{}//{}_{}".format(path1,vetname1,name1)) # create a folder to save above
    cap = cv2.VideoCapture(device_num)                    # create a videocapture object    

    if not cap.isOpened():  # check if it has been opened
        return

    n = 0 # increment initiated with 0
    while n <= int(duration1)/int(interval1) :  # calculation of the terminating point of the increment 

        ret, frame = cap.read() # read the object which returens two variables
        cv2.imwrite("{}//{}_{}//{}.jpg ".format(path1,vetname1,name1,n), frame) # save the pictures
        time.sleep(int(interval1)) # wait for interval
        n += 1 # increment

    image_paths = glob.glob("{}//{}_{}//*.jpg ".format(path1,vetname1,name1)) # get the jpg files in the folder
    
    result=[] # create a list of the results

    for image_path in image_paths: # process each file in the jpg files
        img = image.load_img(image_path, color_mode="grayscale" , target_size=(64, 64)) # convert it to grayscale
        img_array = image.img_to_array(img) # convert it to array
        pImg = np.expand_dims(img_array, axis=0) / 255 # make it between 0 ~ 1
        
        # read the face recognision trained model hdf5
        model_path = resource_path(".//fer2013_mini_XCEPTION.110-0.65.hdf5")
        emotions_XCEPTION = load_model(model_path, compile=False)
        
        prediction = emotions_XCEPTION.predict(pImg)[0] # predict a image using the model
        result.append(prediction) # append the result to the list named result
    
    df = pd.DataFrame(result) # convert it to DataFrame
    df.columns=['angry','disgust','fear','happy','sad','surprise','neutral'] # name the columns
    df = pd.concat([df,pd.DataFrame(df.mean(axis=0),columns=['Mean']).T]) # create a mean row on the bottom
    df.to_excel("{}//{}_{}//result.xlsx".format(path1,vetname1,name1), sheet_name='result') # save a excel file
    
    # create a graph using mtplotlib
    fig = plt.figure() # create object
    ax=fig.add_subplot(1,1,1) # create subplot indicating the place of the subplot
    mycolor = ["#ff0033", "#cc99ff", "#ffff66", "#ff9999", "#6699ff", "#ff9966", "#99ffcc"] # create a list for color
    ax.pie(df.tail(1).values[0],labels=df.columns,counterclock=True, startangle=90, autopct="%1.1f%%",colors=mycolor) # create piechart
    centre_circle = plt.Circle((0,0),0.7,color='white', fc='white',linewidth=1.25) # make it donuts shape
    fig = plt.gcf() #get current figure
    fig.gca().add_artist(centre_circle) # get the current axes and cover the white donuts on the pie chart

    # Create new window by Tkinter Class
    root = tkinter.Tk()
    root.title("Résultat de l'analyse faciale")
    root.withdraw()
    root.protocol('WM_DELETE_WINDOW', _destroyWindow)  # When you close the tkinter window.

    # Canvas and put the figure to the canvas
    canvas = FigureCanvasTkAgg(fig, master=root)  # Generate canvas instance, Embedding fig in root
    canvas.draw()
    canvas.get_tk_widget().pack() #canvas._tkcanvas.pack()
    root.update()
    root.deiconify()  

# create interface
root = Tk()
root.title('Outil d'évaluation faciale')
root.resizable(True, True)

#create text
frame1 = ttk.Frame(root, padding=(32))
frame1.grid()

label1 = ttk.Label(frame1, text='Intervalle de prise de vue(Secondes)', padding=(5, 2))
label1.grid(row=0, column=0, sticky=E)

label2 = ttk.Label(frame1, text='Temps de prise de vue(Secondes)', padding=(5, 2))
label2.grid(row=1, column=0, sticky=E)

label3 = ttk.Label(frame1, text='Nom du vétérinaire (alphabétique uniquement)', padding=(5, 2))
label3.grid(row=2, column=0, sticky=E)

label4 = ttk.Label(frame1, text='Nom du patient (alphabétique uniquement)', padding=(5, 2))
label4.grid(row=3, column=0, sticky=E)

label5 = ttk.Label(frame1, text='Où enregistrer les photos et les résultats', padding=(5, 2))
label5.grid(row=4, column=0, sticky=E)

# create textboxes
interval = StringVar()
interval_entry = ttk.Entry(
    frame1,
    textvariable=interval,
    width=20)
interval_entry.insert(0,"2")
interval_entry.grid(row=0, column=1)

duration = StringVar()
duration_entry = ttk.Entry(
    frame1,
    textvariable=duration,
    width=20)
duration_entry.insert(0,"10")
duration_entry.grid(row=1, column=1)

vetname = StringVar()
vetname_entry = ttk.Entry(
    frame1,
    textvariable=vetname,
    width=20)
vetname_entry.insert(0,"vet")
vetname_entry.grid(row=2, column=1)

name = StringVar()
name_entry = ttk.Entry(
    frame1,
    textvariable=name,
    width=20)
name_entry.insert(0,datetime.datetime.now().strftime("%Y%m%d_%H%M")) # time
name_entry.grid(row=3, column=1)

path =StringVar()
path_entry = ttk.Entry(
    frame1,
    textvariable=path,
    width=20)
path_entry.grid(row=4, column=1)

path_button = ttk.Button(frame1,text="Sélection de dossier",command= lambda : [askfileplace()] )
path_button.grid(row=4, column=2)

# create bottens
frame2 = ttk.Frame(frame1, padding=(0, 5))
frame2.grid(row=5, column=1, sticky=W)

button1 = ttk.Button(
    frame2, text='Lancer l'analyse',
    command= lambda : [save_frame_camera_key(0,interval.get(),duration.get(),vetname.get(),name.get(),path.get())]) # read the function I made
button1.pack(side=LEFT)

button2 = ttk.Button(frame2, text='Fin', command=quit)
button2.pack(side=LEFT)


root.mainloop()
  1. À l'invite de commande Anaconda, procédez comme suit: Obtenez le chemin du fichier python. Si c'est Win, Maj + clic droit, clic droit mac, puis option. python Le chemin obtenu ci-dessus (Exemple d'entrée Win: python "C: \ Users \ Yamada \ Desktop \ FaceEmotionAnalysis \ face.py") (Exemple d'entrée Mac: python / Users / Sato / Desktop / FaceEmotionAnalysis / face.py)

Si vous le souhaitez, consultez votre propre site Web. D'autres exemples (indicateur d'activité du chat AI) sont également affichés. https://meknowledge.jpn.org/

Recommended Posts

[Python] Évaluez les expressions faciales qui apparaissent sur le visage
Module standard Python utilisable en ligne de commande
Sakura utilisant Python sur Internet
Estimer la probabilité qu'une pièce apparaisse en utilisant MCMC
[python] Déplacer les fichiers qui remplissent les conditions
Python3 + pyperclip qui réécrit le texte copié
Télécharger des fichiers sur le Web avec Python
[Python] Une barre de progression sur le terminal
[Python] Un programme qui arrondit le score
[Python] Un programme qui calcule la différence entre les valeurs totales diagonales
Retour sur l'histoire des expressions qui renvoient somme de carré à Pythonic
Dessiner des lignes de contour qui apparaissent dans les manuels (Python)
Python: essayez d'utiliser l'interface utilisateur sur Pythonista 3 sur iPad
Essayez CI le code python poussé sur GitHub.
Construire plusieurs environnements Python sur le même système
Introduction à Python avec Atom (en route)
Sonnez le buzzer en utilisant python sur Raspberry Pi 3!
Au moment de la mise à jour de python avec ubuntu
Celui qui affiche la barre de progression en Python
Formules qui apparaissent dans Faire des mathématiques avec Python
Une histoire bloquée lors de la tentative de mise à niveau de la version Python avec GCE
Une note sur l'implémentation de la bibliothèque qui explore les hyperparamètres à l'aide de l'optimisation bayésienne en Python
Récapitulatif des versions de la bibliothèque Python standard qui sont désormais validées par le serveur sur https
[Python] Un bloc-notes qui traduit et télécharge le fichier ipynb de GitHub en japonais.