Dans cette première étape nous allons développer un service simple de détection de visages comme base pour la suite.
Comment faire de la détection de visage en python grâce à openCV ?
Nous allons utiliser la librairie python cv2 et plus particulièrement le CascadeClassifier.
Initialisation du projet.
Organisation des fichiers.
Nous allons suivre l'arborescence suivante pour notre projet. C'est une organisation très classique pour un package python.
/ run.py app/ __init__.py detect.py models/ a.xml data/ img.jpg
Technologie de reconnaissance.
Dans le but de rester assez concis nous allons utiliser pour ce projet un modèle pré-entrainé de haar cascade détection fourni avec openCV. Pour aller plus loin des informations complémentaires sont disponibles au lien suivant : https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_face_detection.html
Développement.
Comme on peut l'intuiter en observant l'arborescence nous allons dans ce projet séparer la partie intelligence et la partie interface dans deux fichiers différents. Dans le fichier detect.py nous allons réunir tout ce qui est nécessaire au détecteur, tandis que le fichier run.py permettra d'instancier un détecteur et de l'utiliser sur une image soumise par l'utilisateur.
Préalablement au développement il est nécessaire de télécharger la modèle pré-entrainé disponible au lien suivant : https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml dans le dossier models
.
detect.py
Dans detect.py nous allons faire une classe python DetectVisage que nous pourrons ensuite importer et instancier dans le run.py.
Cette classe n'a que deux actions à effectuer : charger le modèle en mémoire et utiliser ce modèle pour faire de la détéction. On va donc traduire cela par deux méthodes : une méthode charge_model et une méthode detect.charge_model :
def charge_model(self): root_path = os.path.dirname(sys.modules['__main__'].__file__) model_path = os.path.join(root_path, 'models') self.filtre = cv2.CascadeClassifier( os.path.join(model_path, 'haarcascade_frontalface_default.xml'))
On notera que l'on récupère le chemin vers le xml du modèle relativement à la racine du projet. Cela permet de pouvoir déplacer facilement le projet dans un système ou d'un système à un autre sans avoir à se soucier de problème de fichiers perdus.
detect :
def detect(self, path_image): image = cv2.imread(path_image) image_niveaux_gris = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) face = self.filtre.detectMultiScale(image_niveaux_gris) return False if len(face) == 0 else True
Pour faire la détection nous allons utiliser la méthode detectMultiScale de notre CascadeClassifier. Cette méthode va chercher plusieurs fois un visage dans l'image en augmentant la taille de la zone de détection de 10% à chaque itération (on utilise la valeur par défaut. Cela permet d'être robuste au zoom.
Le détecteur fonctionne sur des images en niveaux de gris. Il est donc important de convertir l'espace des couleurs avant de l'utiliser.Code complet : https://github.com/ddonatien/detect_visage/blob/v0/app/detect.py
Nous avons maintenant un détecteur de visage ! Mais aucune façon de dialoguer avec...
run.py
Pour pallier ce problème nous allons pour l'instant faire une interface minimaliste avec la console. Pour ce faire nous nous servirons de la librairie getopts pour pouvoir passer des chemins vers des images au détecteur.
Une fois la librairie importée il ne nous restera plus qu'à définir les arguments attendus et agir en conséquences.
try: opts, args = getopt.getopt(sys.argv[1:], 'h:i:', ['help', 'image']) except getopt.GetoptError: sys.exit(2) chemin_image = '' for opt, arg in opts: if opt in ('-i', '--image'): chemin_image = arg detecteur = DetectVisage() if detecteur.detect(chemin_image): print("Visage detecte !") else: print("Pas de visage")
Code complet ici : https://github.com/ddonatien/detect_visage/blob/v0/run.py
Vous pouvez maintenant tester votre détecteur avec vos images ou avec les deux images de test fournies avec le projet (dans data) en appelant le run du package et en lui donnant le chemin vers une image : python2 -m detect_visage.run -i detect_visage/data/pas_visage.png
par exemple !
Etape 2 : https://steemit.com/programming/@defy/etape-2-mise-a-disposition-sur-le-web