[PYTHON] zoom J'ai essayé de quantifier le degré d'excitation de l'histoire lors de la conférence

introduction

Récemment, le nombre de réunions et de cours chez Zoom a augmenté, mais je sens que je ne sais pas à quel point je suis intéressé à parler à moins que je ne sois en face à face, alors pourquoi ne pas essayer de le quantifier? J'y ai pensé et je l'ai fait.

C'est mon premier message, donc c'est un peu bâclé, mais j'espère que vous le lirez jusqu'à la fin: suer:

Objectif

zoom Acquiert une image ou une vidéo de la conférence, reconnaît le visage de l'image et mesure le degré d'intérêt pour l'histoire.

la mise en oeuvre

Comme test

J'ai décidé d'utiliser Amazon Rekognition pour reconnaître les visages des personnes participant à la conférence Zoom cette fois.

Je me suis référé à cet article pour savoir comment l'utiliser. https://qiita.com/G-awa/items/477f2324552cb908ecd0

detect_face.py


import cv2
import numpy as np
import boto3

#Paramètres tels que l'échelle et la couleur
scale_factor = .15
green = (0,255,0)
red = (0,0,255)
frame_thickness = 2
cap = cv2.VideoCapture(0)
rekognition = boto3.client('rekognition')

#taille de police
fontscale = 1.0
#Couleur de la police(B, G, R)
color = (0, 120, 238)
#Police de caractère
fontface = cv2.FONT_HERSHEY_DUPLEX

#Faites une boucle jusqu'à ce que vous appuyiez sur q.
while(True):

    #Obtenez une image capturée
    ret, frame = cap.read()
    height, width, channels = frame.shape

    #Convertir en jpg Puisque le fichier image est envoyé via Internet via l'API, gardez la petite taille.
    small = cv2.resize(frame, (int(width * scale_factor), int(height * scale_factor)))
    ret, buf = cv2.imencode('.jpg', small)

    #Lancer l'API sur Amazon Rekognition
    faces = rekognition.detect_faces(Image={'Bytes':buf.tobytes()}, Attributes=['ALL'])

    #Dessinez une boîte autour du visage
    for face in faces['FaceDetails']:
        smile = face['Smile']['Value']
        cv2.rectangle(frame,
                      (int(face['BoundingBox']['Left']*width),
                       int(face['BoundingBox']['Top']*height)),
                      (int((face['BoundingBox']['Left']+face['BoundingBox']['Width'])*width),
                       int((face['BoundingBox']['Top']+face['BoundingBox']['Height'])*height)),
                      green if smile else red, frame_thickness)
        emothions = face['Emotions']
        i = 0
        for emothion in emothions:
            cv2.putText(frame,
                        str(emothion['Type']) + ": " + str(emothion['Confidence']),
                        (25, 40 + (i * 25)),
                        fontface,
                        fontscale,
                        color)
            i += 1

    #Afficher le résultat sur l'écran
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Pour le moment, lorsque j'ai essayé de déplacer le code, j'ai pu effectuer une reconnaissance faciale et une analyse des émotions! Cependant, en ce qui concerne l'acquisition vidéo, elle était lourde et s'est arrêtée à mi-chemin. J'ai donc décidé de charger l'image. (Ceci est le code de l'article auquel j'ai fait référence.)

Capture d'écran

J'ai fait référence à cet article pour la capture d'image. https://qiita.com/koara-local/items/6a98298d793f22cf2e36

J'ai utilisé PIL pour capturer l'écran.

capture.py


from PIL import ImageGrab

ImageGrab.grab().save("./capture/PIL_capture.png ")

J'ai créé un dossier séparé appelé capture et l'ai enregistré dans ce dossier.

la mise en oeuvre

face_detect.py


import cv2
import numpy as np
import boto3

#Paramètres tels que l'échelle et la couleur
scale_factor = .15
green = (0,255,0)
red = (0,0,255)
frame_thickness = 2
#cap = cv2.VideoCapture(0)
rekognition = boto3.client('rekognition')

#taille de police
fontscale = 1.0
#Couleur de la police(B, G, R)
color = (0, 120, 238)
#Police de caractère
fontface = cv2.FONT_HERSHEY_DUPLEX


from PIL import ImageGrab

ImageGrab.grab().save("./capture/PIL_capture.png ")

#Obtenez une image capturée
#ret, frame = cap.read()
frame = cv2.imread("./capture/PIL_capture.png ")
height, width, channels = frame.shape
frame = cv2.resize(frame,(int(width/2),int(height/2)),interpolation = cv2.INTER_AREA)

    #Convertir en jpg Puisque le fichier image est envoyé via Internet via l'API, gardez la petite taille.
small = cv2.resize(frame, (int(width * scale_factor), int(height * scale_factor)))
ret, buf = cv2.imencode('.jpg', small)

    #Lancer l'API sur Amazon Rekognition
faces = rekognition.detect_faces(Image={'Bytes':buf.tobytes()}, Attributes=['ALL'])

    #Dessinez une boîte autour du visage
for face in faces['FaceDetails']:
    smile = face['Smile']['Value']
    cv2.rectangle(frame,
                    (int(face['BoundingBox']['Left']*width/2),
                    int(face['BoundingBox']['Top']*height/2)),
                    (int((face['BoundingBox']['Left']/2+face['BoundingBox']['Width']/2)*width),
                    int((face['BoundingBox']['Top']/2+face['BoundingBox']['Height']/2)*height)),
                    green if smile else red, frame_thickness)
    emothions = face['Emotions']
    i = 0
    score = 0
    for emothion in emothions:
        
        if emothion["Type"] == "HAPPY":
            score = score + emothion["Confidence"]
        elif emothion["Type"] == "DISGUSTED":
            score = score - emothion["Confidence"]
        elif emothion["Type"] == "SURPRISED":
            score = score + emothion["Confidence"]
        elif emothion["Type"] == "ANGRY":
            score = score - emothion["Confidence"]
        elif emothion["Type"] == "CONFUSED":
            score = score - emothion["Confidence"]
        elif emothion["Type"] == "CALM":
            score = score - emothion["Confidence"]
        elif emothion["Type"] == "SAD":
            score = score - emothion["Confidence"]
        i += 1
        if i == 7:
            cv2.putText(frame,
            "interested" +":"+ str(round(score,2)),
            (int(face['BoundingBox']['Left']*width/2),
            int(face['BoundingBox']['Top']*height/2)),
            fontface,
            fontscale,
            color)


        

#Afficher le résultat sur l'écran
cv2.imshow('frame', frame)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV a été utilisé pour lire l'image elle-même. Amazon Rekognition peut lire 6 émotions de HEUREUSE, DÉGUÉRÉE, SURPRISE, EN COLÈRE, CONFUSÉE, CALME, TRISTE, donc HEUREUSE et SURPRISE sont calculées comme des émotions positives (niveau d'intérêt élevé) et d'autres émotions comme des émotions négatives (faible niveau d'intérêt). Enfin, il a été affiché sur le visage qui a reconnu le degré d'intérêt dans la plage de -100 à 100. スクリーンショット 2020-11-17 172257.png J'emprunte l'image d'une personne car je n'ai pas pu rassembler de personnes avec un zoom. https://tanachannell.com/4869

Amazon Rekognition a d'autres fonctionnalités, donc si vous êtes intéressé, jetez un œil! https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/faces-detect-images.html

problème

・ Lorsque le nombre de participants en zoom est grand, les caractères affichés se chevauchent et il devient très difficile de voir. -Comme il ne s'agit pas d'une capture d'écran Zoom, l'invite de commande apparaîtra dans l'image à moins que l'invite de commande ne soit réduite immédiatement après l'exécution.

finalement

Je l'ai tellement fait que je veux que les gens le voient! J'ai commencé à écrire avec cela à l'esprit, mais quand je l'ai écrit, j'ai pu revivre l'expérience pendant que je la réalisais, ce qui a été une expérience d'apprentissage. Cela pourrait être très amusant si quelque chose que j'ai fait comme ça imprègne le monde!

GitHub https://github.com/r-301/zoom-response-check

Recommended Posts

zoom J'ai essayé de quantifier le degré d'excitation de l'histoire lors de la conférence
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
J'ai essayé l'histoire courante de l'utilisation du Deep Learning pour prédire la moyenne Nikkei
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
L'histoire de la fabrication de soracom_exporter (j'ai essayé de surveiller SORACOM Air avec Prometheus)
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de trouver l'entropie de l'image avec python
[Première API COTOHA] J'ai essayé de résumer l'ancienne histoire
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
Quantifier le degré d'autolimitation nécessaire pour contenir le nouveau virus corona
J'ai essayé de publier automatiquement sur ChatWork au moment du déploiement avec Fabric et ChatWork Api
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
[Linux] J'ai essayé de résumer les commandes de confirmation des ressources
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
J'ai essayé de créer l'image de démarrage SD de LicheePi Nano
J'ai regardé les méta-informations de BigQuery et essayé de les utiliser
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai essayé de résumer la méthode de mise en œuvre fréquemment utilisée de pytest-mock
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de visualiser la condition commune des téléspectateurs de la chaîne VTuber
L'histoire d'essayer de reconnecter le client
J'ai essayé le serveur asynchrone de Django 3.0
J'ai essayé de résumer la commande umask
J'ai essayé de reconnaître le mot de réveil
L'histoire de la mise en place de MeCab dans Ubuntu 16.04
J'ai essayé de résumer la modélisation graphique.
J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste
J'ai essayé de toucher l'API COTOHA
L'histoire du changement de pep8 en pycodestyle
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
J'ai essayé de transcrire les actualités de l'exemple d'intégration commerciale sur Amazon Transcribe
J'ai essayé d'estimer la similitude de l'intention de la question en utilisant Doc2Vec de gensim
J'ai essayé d'améliorer la précision de mon propre réseau neuronal
J'ai essayé de résoudre 100 traitements linguistiques Knock version 2020 [Chapitre 3: Expressions régulières 25-29]
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé d'extraire automatiquement les mouvements des joueurs Wiire avec un logiciel
(Python) J'ai essayé d'analyser 1 million de mains ~ J'ai essayé d'estimer le nombre d'AA ~
J'ai essayé de résumer la manière logique de penser l'orientation objet.
J'ai essayé de trouver l'itinéraire optimal du pays des rêves par recuit (quantique)
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé d'analyser la négativité de Nono Morikubo. [Comparer avec Posipa]
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai essayé de visualiser le texte du roman "Weather Child" avec Word Cloud
[Linux] J'ai essayé de vérifier la méthode de confirmation sécurisée du FQDN (CentOS7)
J'ai essayé d'obtenir automatiquement le RSS de la chanson la plus populaire de l'iTunes Store
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python