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:
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.
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.)
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.
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. 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
・ 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.
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