[Ubuntu] [Python] Comparaison de la détection de visage entre dlib et OpenCV

J'ai comparé la détection de visage de dlib et OpenCV. C'est une vidéo que je vois de temps en temps, mais je voulais l'essayer moi-même, alors essayez-la.

dlib est plus précis en termes d'orientation, OpenCV est plus rapide (grâce à Adaboost? S'il doit être utilisé dans les affaires, il sera étudié plus en détail.

Linux est plus facile à installer dlib, donc je le fais avec Ubutntu. Même sous Windows, si vous installez dlib, il devrait fonctionner avec la même source. .. .. ??

La vidéo est ci-dessous. Le rouge est la détection par OpenCV et le bleu est la détection par dlib. https://www.youtube.com/watch?v=SQTXLfwlPjQ [Ubuntu] [Python] Comparaison de la détection de visage entre dlib et OpenCV

Le code source est ci-dessous. Pour que cela fonctionne, placez les données entraînées par OpenCV dans le même répertoire que le fichier py. Doit être placé. →./data/haarcascades/haarcascade_frontalface_alt.xml


#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
face_landmark_detector.py.

Usage:
  face_landmark_detector.py [<video source>] [<resize rate>]
'''

import sys
import dlib
import cv2
import time
import copy

try:
    fn = sys.argv[1]
    if fn.isdigit() == True:
        fn = int(fn)
except:
    fn = 0

try:
    resize_rate = sys.argv[2]
    resize_rate = int(resize_rate)
except:
    resize_rate = 1

# Dlib
detector = dlib.get_frontal_face_detector()

# OpenCV
cascade_fn = "./data/haarcascades/haarcascade_frontalface_alt.xml"
cascade = cv2.CascadeClassifier(cascade_fn)

video_input = cv2.VideoCapture(fn)

total_frame_count = 0
face_detection_frame_count_dlib = 0
face_detection_frame_count_opencv = 0

while(video_input.isOpened() == True):
    total_frame_count += 1

    ret, frame = video_input.read()
    temp_frame = copy.deepcopy(frame)

    #Réduction de la trame cible pour réduire la charge de traitement (lorsque l'argument est spécifié)
    height, width = frame.shape[:2]
    temp_frame = cv2.resize(frame, (int(width/resize_rate), int(height/resize_rate)))

    #Détection facial(dlib)
    start = time.time()
    dets = detector(temp_frame, 1)
    elapsed_time_dlib = time.time() - start

    if len(dets) > 0:
        face_detection_frame_count_dlib += 1

    #Dessin des résultats de détection (dlib)
    for k, d in enumerate(dets):
        cv2.rectangle(frame, (int(d.left() * resize_rate), int(d.top() * resize_rate)), \
            (int(d.right() * resize_rate), int(d.bottom() * resize_rate)), (255, 0, 0), -1)

    #Détection facial(opencv)
    gray_image = cv2.cvtColor(temp_frame, cv2.COLOR_BGR2GRAY)
    gray_image = cv2.equalizeHist(gray_image)

    start = time.time()
    rects = cascade.detectMultiScale(gray_image, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE)
    if len(rects) == 0:
        rects = []
    else:
        rects[:,2:] += rects[:,:2]
    elapsed_time_opencv = time.time() - start


    if len(rects) > 0:
        face_detection_frame_count_opencv += 1

    #Dessin des résultats de détection (OpenCV)
    for x1, y1, x2, y2 in rects:
        cv2.putText(frame, "OpenCV", (int(x1 * resize_rate), int(y1 * resize_rate)), cv2.FONT_HERSHEY_PLAIN, 2.0, (0, 0, 255), thickness = 2)
        cv2.rectangle(frame, (int(x1 * resize_rate), int(y1 * resize_rate)), (int(x2 * resize_rate), int(y2 * resize_rate)), (0, 0, 255), -1)
    #Dessin des résultats de détection (dlib)
    for k, d in enumerate(dets):
        cv2.putText(frame, "Dlib", (int(d.left() * resize_rate), int(d.top() * resize_rate)), cv2.FONT_HERSHEY_PLAIN, 2.0, (255, 0, 0), thickness = 2)
        cv2.rectangle(frame, (int(d.left() * resize_rate), int(d.top() * resize_rate)), \
            (int(d.right() * resize_rate), int(d.bottom() * resize_rate)), (255, 0, 0), 2)

    print ("face detect(dlib) processing time:{0}".format(elapsed_time_dlib)) + "[sec]"
    print ("face detect(opencv) processing time:{0}".format(elapsed_time_opencv)) + "[sec]"
    print ("face detect(dlib) success count:" + '%06d' % face_detection_frame_count_dlib + "/" + '%06d' % total_frame_count)
    print ("face detect(opencv) success count:" + '%06d' % face_detection_frame_count_opencv + "/" + '%06d' % total_frame_count)
    print

    cv2.imshow('face detector vs', frame)

    c = cv2.waitKey(50) & 0xFF

    if c==27: # ESC
        break

video_input.release()
cv2.destroyAllWindows()

c'est tout.

Recommended Posts

[Ubuntu] [Python] Comparaison de la détection de visage entre dlib et OpenCV
Détection de visage Dlib et compteur de clignotements par Python
Hello World et détection de visage avec OpenCV 4.3 + Python
Détection de visage avec Python + dlib
Détection de visage avec Python + OpenCV
Détection de visage avec Python + OpenCV (rotation invariante)
[Python] Détection de visage par OpenCV (Haar Cascade)
Créer un environnement Python 3 et OpenCV sur Ubuntu 18.04
Estimation de l'orientation de la tête avec Python et OpenCV + dlib
Comparaison des performances du détecteur de visage avec Python + OpenCV
J'ai essayé la détection d'objets en utilisant Python et OpenCV
Expérience de comparaison de la vitesse d'écriture de fichier entre python 2.7.9 et pypy 2.5.0
[Ruby vs Python] Comparaison de référence entre Rails et Flask
Ubuntu 20.04 sur raspberry pi 4 avec OpenCV et utilisation avec python
Installez OpenCV sur Ubuntu + python
Résumé de la détection de visage en Python
Fonctions de tri et de comparaison Python 3
Détection de visage d'anime avec OpenCV
Construction d'environnement de python et opencv
Différence entre Ruby et Python Split
Briller la vie avec Python et OpenCV
Différence entre java et python (mémo)
Détection de visage avec YOLO Face (Windows10, Python3.6)
[Ubuntu] [Python] Suivi d'objets à l'aide de dlib
Différence entre list () et [] en Python
Comparaison de la grammaire de base entre Java et Python
Réseau neuronal avec OpenCV 3 et Python 3
Installez OpenCV et Chainer sur Ubuntu
Détection de visage avec Lambda (Python) + Rekognition
Mettez python, numpy, opencv3 dans ubuntu14
Différence entre Python, stftime et strptime
Différence entre la série python2 et la série python3 dict.keys ()
[Traitement d'image] Poo-san est nu par détection de bord en utilisant Python et OpenCV!
Dessinez une illusion d'aquarelle avec détection des contours en Python3 et openCV3
Essayez la reconnaissance faciale avec python + OpenCV
Comparaison de vitesse entre CPython et PyPy
Découpez le visage avec Python + OpenCV
Reconnaissance faciale avec caméra avec opencv3 + python2.7
[Python] Différence entre fonction et méthode
Résumé des différences entre Python et PHP (tableau de comparaison des principaux éléments)
Fonction pour ouvrir un fichier en Python3 (différence entre open et codecs.open et comparaison de vitesse)
Python - Différence entre exec et eval
[Python] Différence entre randrange () et randint ()
[Explication pour les débutants] Mécanisme de détection de visage OpenCV et pratique (détecter MultiScale)
[Python] Différence entre trié et trié (Colaboratoire)
Construction d'environnements OpenCV3 et Python3 sur Ubuntu
Comment mettre OpenCV dans Raspberry Pi et collecter facilement des images des résultats de détection de visage avec Python
Ne fonctionne pas Python avec OpenCV sur le processeur AMD Ryzen sur WSL2 Ubuntu 18.04 et 20.04
Détection de visage à partir de plusieurs fichiers image avec openCV, découpez et enregistrez
Obtenez et estimez la forme de la tête en utilisant Dlib et OpenCV avec python
Communiquez entre Elixir et Python avec gRPC
Hello World et détection de visage avec opencv-python 4.2
Différence d'authenticité entre Python et JavaScript
Différences entre Ruby et Python dans la portée
différence entre les instructions (instructions) et les expressions (expressions) en Python
Environnement virtuel Python et packages sur Ubuntu
Capturer des images avec Pupil, python et OpenCV
Différence entre @classmethod et @staticmethod en Python
Différence entre append et + = dans la liste Python
Différence entre non local et global en Python
[Python] Différence entre la méthode de classe et la méthode statique