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.
pip3 install cv2
pip3 install matplotlib
pip3 install mtcnn
pip3 install tensorflow
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
# 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)
Tout est détecté correctement. Il semble qu'il n'y ait pas de faux positifs pour cette image.
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
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
MTCNN ... Défaite totale ... Cela a pris environ 40 heures _| ̄|○ il||li
J'ai essayé d'en sauver un seul qui puisse être coupé le plus grand.
# 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)
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