[PYTHON] J'ai essayé la détection de visage avec MTCNN

Dans l'apprentissage automatique pour la détection des visages, j'ai utilisé uniquement OpenCV, y compris la création de modèles, j'ai donc décidé d'en utiliser d'autres également. J'ai donc essayé d'utiliser MTCNN.

MTCNN semble utiliser le tensorflow dans les coulisses. Ça fait du bien de courir en profondeur avec un pied.

Préparation

pip3 install cv2
pip3 install matplotlib
pip3 install mtcnn
pip3 install tensorflow

Image utilisée dans le test

C'est juste pour la vérification, n'est-ce pas? Divers visages exposés. Il y a beaucoup de choses autres que le visage

test.png

Détection de visage avec MTCNN

code de vérification

# face detection with mtcnn on a photograph
from matplotlib import pyplot
from matplotlib.patches import Rectangle
from matplotlib.patches import Circle
from mtcnn.mtcnn import MTCNN
import cv2

# draw an image with detected objects
def draw_image_with_boxes(filename, result_list):
	# load the image
	data = pyplot.imread(filename)
	# plot the image
	pyplot.imshow(data)
	# get the context for drawing boxes
	ax = pyplot.gca()
	# plot each box
	for result in result_list:
		# get coordinates
		x, y, width, height = result['box']
		# create the shape
		rect = Rectangle((x, y), width, height, fill=False, color='red')
		# draw the box
		ax.add_patch(rect)
		# draw the dots
		for key, value in result['keypoints'].items():
			# create and draw dot
			dot = Circle(value, radius=2, color='red')
			ax.add_patch(dot)
	# show the plot
	pyplot.show()
 
filename = 'test.png'
# load image from file
pixels = cv2.cvtColor(cv2.imread(filename), cv2.COLOR_BGR2RGB)
# create the detector, using default weights
detector = MTCNN()
# detect faces in the image
faces = detector.detect_faces(pixels)
# display faces on the original image
draw_image_with_boxes(filename, faces)

résultat

Tout est détecté correctement. Il semble qu'il n'y ait pas de faux positifs pour cette image.

result_1.png

Au fait, voici celui qui utilise OpenCV (haarcascade_frontalface_default). Je peux détecter tous les visages, mais ils sont détectés par erreur. La glace est vraiment un visage w

result_cv.png

Voici ce que j'ai fait avant car je n'étais pas satisfait du modèle par défaut. Les fausses détections ne sont plus détectées, mais une personne ne peut pas être détectée.

Référence) Une histoire sur un gopher touchant OpenCV https://speakerdeck.com/usk81/introduction-about-opencv-for-gophers

mine.png

MTCNN ... Défaite totale ... Cela a pris environ 40 heures _| ̄|○ il||li

J'ai aussi essayé de couper

J'ai essayé d'en sauver un seul qui puisse être coupé le plus grand.

code

# face detection with mtcnn on a photograph
from matplotlib import pyplot
from mtcnn.mtcnn import MTCNN
import cv2

# draw each face separately
def save_biggest_face_image(filename, result_list):
	# load the image
	# data = pyplot.imread(filename)
	data = cv2.imread(filename)
	# plot each face as a subplot
	maxlen = -1
	for i in range(len(result_list)):
		# get coordinates
		x1, y1, width, height = result_list[i]['box']
		if width > height:
			length = width 
		else:
			length = height
		x2, y2 = x1 + length, y1 + length
		# # define subplot
		# pyplot.subplot(1, len(result_list), i+1)
		# pyplot.axis('off')
		# # plot face
		# pyplot.imshow(data[y1:y2, x1:x2])
		d = data[y1:y2, x1:x2]
		if length > 100 and length > maxlen:
			maxlen = length
			md = d
		# cv2.imwrite('/Users/komatsu/Desktop/'+str(i)+'.png', d)

	# show the plot
	# pyplot.show()
	if maxlen > 0:
		cv2.imwrite('result.png', md)
 
filename = 'test.png'
# load image from file
pixels = cv2.cvtColor(cv2.imread(filename), cv2.COLOR_BGR2RGB)
# create the detector, using default weights
detector = MTCNN()
# detect faces in the image
faces = detector.detect_faces(pixels)
# save face image
save_biggest_face_image(filename, faces)

résultat

result_2.png

Remarques

Le mystère est que le fichier image n'a pas pu être lu par pyplot.imread. Je peux l'utiliser dans une fonction ...

Recommended Posts

J'ai essayé la détection de visage avec MTCNN
J'ai essayé la reconnaissance faciale avec OpenCV
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
J'ai essayé Learning-to-Rank avec Elasticsearch!
J'ai essayé la reconnaissance faciale avec Face ++
J'ai essayé le clustering avec PyCaret
Détection de visage avec Python + OpenCV
J'ai essayé gRPC avec Python
Détection de visage avec Haar Cascades
J'ai essayé de gratter avec du python
Détection de visage d'anime avec OpenCV
Détection de visage avec YOLO Face (Windows10, Python3.6)
J'ai essayé de résumer des phrases avec summpy
Détection de visage avec Lambda (Python) + Rekognition
J'ai essayé l'apprentissage automatique avec liblinear
J'ai essayé webScraping avec python.
J'ai essayé de déplacer de la nourriture avec SinGAN
J'ai essayé d'implémenter DeepPose avec PyTorch
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé la communication SMTP avec Python
J'ai essayé la génération de phrases avec GPT-2
J'ai essayé d'apprendre LightGBM avec Yellowbrick
Hello World et détection de visage avec opencv-python 4.2
J'ai essayé d'envoyer un SMS avec Twilio
J'ai essayé linebot avec flacon (anaconda) + heroku
J'ai essayé de visualiser AutoEncoder avec TensorFlow
J'ai essayé de commencer avec Hy
J'ai essayé l'analyse factorielle avec des données Titanic!
J'ai essayé d'apprendre avec le Titanic de Kaggle (kaggle②)
J'ai essayé le rendu non réaliste avec Python + opencv
J'ai essayé un langage fonctionnel avec Python
J'ai essayé d'implémenter DeepPose avec PyTorch PartⅡ
J'ai essayé d'implémenter CVAE avec PyTorch
J'ai essayé de jouer avec l'image avec Pillow
J'ai essayé de résoudre TSP avec QAOA
J'ai essayé la reconnaissance d'image simple avec Jupyter
J'ai essayé le réglage fin de CNN avec Resnet
J'ai essayé le traitement du langage naturel avec des transformateurs.
J'ai essayé la détection 3D d'une voiture
# J'ai essayé quelque chose comme Vlookup avec Python # 2
J'ai essayé la détection d'objets avec YOLO v3 (TensorFlow 2.0) sur un processeur Windows!
J'ai essayé de gratter
J'ai essayé PyQ
J'ai essayé AutoKeras
J'ai essayé le moulin à papier
J'ai essayé django-slack
J'ai essayé Django
J'ai essayé spleeter
J'ai essayé cgo
J'ai essayé la reconnaissance manuscrite des caractères des runes avec scikit-learn
J'ai essayé de prédire l'année prochaine avec l'IA
Hello World et détection de visage avec OpenCV 4.3 + Python
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé des centaines de millions de SQLite avec python
J'ai essayé d'utiliser lightGBM, xg boost avec Boruta
J'ai essayé la reconnaissance d'image de CIFAR-10 avec Keras-Learning-
J'ai essayé d'apprendre le fonctionnement logique avec TF Learn