[PYTHON] zoom Ich habe versucht, den Grad der Aufregung der Geschichte auf der Konferenz zu quantifizieren

Einführung

In letzter Zeit hat die Anzahl der Besprechungen und Kurse bei Zoom zugenommen, aber ich habe das Gefühl, dass ich nicht weiß, wie viel Interesse ich am Sprechen habe, es sei denn, ich bin von Angesicht zu Angesicht. Warum also nicht versuchen, es zu quantifizieren? Ich habe darüber nachgedacht und es geschafft.

Es ist mein erster Beitrag, also etwas schlampig, aber ich hoffe, Sie werden ihn bis zum Ende lesen: Schweiß:

Zweck

zoom Erfasst ein Konferenzbild oder -video, erkennt das Gesicht im Bild und misst den Grad des Interesses an der Geschichte.

Implementierung

Als Test

Ich habe mich für Amazon Rekognition entschieden, um die Gesichter von Personen zu erkennen, die diesmal an der Zoom-Konferenz teilnehmen.

Ich habe auf diesen Artikel verwiesen, um zu erfahren, wie man ihn benutzt. https://qiita.com/G-awa/items/477f2324552cb908ecd0

detect_face.py


import cv2
import numpy as np
import boto3

#Einstellungen wie Skalierung und Farbe
scale_factor = .15
green = (0,255,0)
red = (0,0,255)
frame_thickness = 2
cap = cv2.VideoCapture(0)
rekognition = boto3.client('rekognition')

#Schriftgröße
fontscale = 1.0
#Schriftfarbe(B, G, R)
color = (0, 120, 238)
#Schriftart
fontface = cv2.FONT_HERSHEY_DUPLEX

#Schleife, bis Sie q drücken.
while(True):

    #Frame erfassen lassen
    ret, frame = cap.read()
    height, width, channels = frame.shape

    #In JPG konvertieren Da die Bilddatei über die API über das Internet gesendet wird, sollten Sie die Größe klein halten.
    small = cv2.resize(frame, (int(width * scale_factor), int(height * scale_factor)))
    ret, buf = cv2.imencode('.jpg', small)

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

    #Zeichne eine Schachtel um das Gesicht
    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

    #Zeigen Sie das Ergebnis auf dem Display an
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Als ich versuchte, den Code zu verschieben, konnte ich vorerst Gesichtserkennung und Emotionsanalyse durchführen! Bei der Videoaufnahme war es jedoch schwer und blieb auf halbem Weg stehen. Also habe ich beschlossen, das Bild zu laden. (Dies ist der Code des Artikels, auf den ich mich bezog.)

Bildschirmaufnahme

Ich habe auf diesen Artikel zur Bilderfassung verwiesen. https://qiita.com/koara-local/items/6a98298d793f22cf2e36

Ich habe PIL verwendet, um den Bildschirm aufzunehmen.

capture.py


from PIL import ImageGrab

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

Ich habe einen separaten Ordner namens Capture erstellt und in diesem Ordner gespeichert.

Implementierung

face_detect.py


import cv2
import numpy as np
import boto3

#Einstellungen wie Skalierung und Farbe
scale_factor = .15
green = (0,255,0)
red = (0,0,255)
frame_thickness = 2
#cap = cv2.VideoCapture(0)
rekognition = boto3.client('rekognition')

#Schriftgröße
fontscale = 1.0
#Schriftfarbe(B, G, R)
color = (0, 120, 238)
#Schriftart
fontface = cv2.FONT_HERSHEY_DUPLEX


from PIL import ImageGrab

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

#Frame erfassen lassen
#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)

    #In JPG konvertieren Da die Bilddatei über die API über das Internet gesendet wird, sollten Sie die Größe klein halten.
small = cv2.resize(frame, (int(width * scale_factor), int(height * scale_factor)))
ret, buf = cv2.imencode('.jpg', small)

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

    #Zeichne eine Schachtel um das Gesicht
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)


        

#Zeigen Sie das Ergebnis auf dem Display an
cv2.imshow('frame', frame)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV wurde verwendet, um das Bild selbst zu lesen. Amazon Rekognition kann 6 Emotionen von HAPPY, DISGUSETED, SURPRISED, ANGRY, CONFUSED, CALM, SAD lesen. HAPPY und SURPRISED werden also als positive Emotionen (hohes Interesse) und andere Emotionen als negative Emotionen (niedriges Interesse) berechnet. Schließlich wurde es auf dem Gesicht angezeigt, das den Grad des Interesses im Bereich von -100 bis 100 erkannte. スクリーンショット 2020-11-17 172257.png Ich leihe mir ein Bild einer Person aus, weil ich keine Leute mit Zoom sammeln konnte. https://tanachannell.com/4869

Amazon Rekognition bietet weitere Funktionen. Wenn Sie also interessiert sind, schauen Sie bitte! https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/faces-detect-images.html

Problem

・ Wenn die Anzahl der Teilnehmer im Zoom groß ist, überlappen sich die angezeigten Zeichen und es wird sehr schwer zu sehen.

Schließlich

Ich habe es so sehr gemacht, dass ich möchte, dass die Leute es sehen! Ich begann in diesem Sinne zu schreiben, aber als ich es schrieb, konnte ich die Erfahrung noch einmal erleben, während ich sie machte, was eine Lernerfahrung war. Es könnte eine Menge Spaß machen, wenn etwas, das ich so gemacht habe, die Welt durchdringt!

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

Recommended Posts

zoom Ich habe versucht, den Grad der Aufregung der Geschichte auf der Konferenz zu quantifizieren
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, die Phase der Geschichte mit COTOHA zu extrahieren und zu veranschaulichen
Ich habe die übliche Geschichte ausprobiert, Deep Learning zu verwenden, um den Nikkei-Durchschnitt vorherzusagen
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Die Geschichte von soracom_exporter (Ich habe versucht, SORACOM Air mit Prometheus zu überwachen)
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
[Erste COTOHA-API] Ich habe versucht, die alte Geschichte zusammenzufassen
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Quantifizieren Sie den Grad der Selbstbeherrschung, der erforderlich ist, um das neue Koronavirus einzudämmen
Ich habe versucht, zum Zeitpunkt der Bereitstellung mit Fabric und ChatWork Api automatisch in ChatWork zu posten
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, den Abschnitt zu schätzen.
[Linux] Ich habe versucht, die Ressourcenbestätigungsbefehle zusammenzufassen
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
Ich habe versucht, das SD-Boot-Image von LicheePi Nano zu erstellen
Ich habe mir die Metainformationen von BigQuery angesehen und versucht, sie zu verwenden
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Ich habe versucht, die häufig verwendete Implementierungsmethode von pytest-mock zusammenzufassen
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe versucht, den allgemeinen Zustand der VTuber-Kanalbetrachter zu visualisieren
Die Geschichte des Versuchs, den Client wieder zu verbinden
Ich habe den asynchronen Server von Django 3.0 ausprobiert
Ich habe versucht, den Befehl umask zusammenzufassen
Ich versuchte das Weckwort zu erkennen
Die Geschichte, MeCab in Ubuntu 16.04 zu setzen
Ich habe versucht, die grafische Modellierung zusammenzufassen.
Ich habe versucht, das Umfangsverhältnis π probabilistisch abzuschätzen
Ich habe versucht, die COTOHA-API zu berühren
Die Geschichte von pep8 wechselt zu pycodestyle
Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren
Ich habe versucht, die Trefferergebnisse von Hachinai mithilfe der Bildverarbeitung zu erhalten
Ich habe versucht, die Beispielnachrichten zur Geschäftsintegration in Amazon Transcribe zu übertragen
Ich habe versucht, die Ähnlichkeit der Frageabsicht mit Doc2Vec von gensim abzuschätzen
Ich habe versucht, die Genauigkeit meines eigenen neuronalen Netzwerks zu verbessern
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 3: Reguläre Ausdrücke 25-29]
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, die Bewegungen von Wiire-Playern automatisch mit Software zu extrahieren
(Python) Ich habe versucht, 1 Million Hände zu analysieren ~ Ich habe versucht, die Anzahl der AA ~ zu schätzen
Ich habe versucht, die logische Denkweise über Objektorientierung zusammenzufassen.
Ich habe versucht, die optimale Route des Traumlandes durch (Quanten-) Tempern zu finden
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Ich habe versucht, die Negativität von Nono Morikubo zu analysieren. [Vergleiche mit Posipa]
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
Ich habe versucht, den Text des Romans "Wetterkind" mit Word Cloud zu visualisieren
[Linux] Ich habe versucht, die sichere Bestätigungsmethode von FQDN (CentOS7) zu überprüfen.
Ich habe versucht, das RSS des Top-Songs des iTunes Store automatisch abzurufen
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen