====== Présentation du projet ====== ====Ce que ce programme fait==== **facesToX** est un programme permettant de changer chaque instance de visage dans une image par une autre image. "L'image" en entrée peut être donnée, prise, ou du temps réel sur n'importe quelle caméra supportant la librairie OpenCV.\\ Ce programme n'a pas d'autre but que de divertir.\\ \\ Voici un exemple classique d'une exécution de ce programme:\\ {{:diy:projets:allezlesbleus.jpg?345|Avant}} {{:diy:projets:allezlesoofs.jpg?345|Après}}\\ //(Si vous vous demandez pourquoi certains visages ne sont pas pris, je vous propose de regarder la section [[https://wiki.ensfea.fr/doku.php?id=diy:projets:facestooof#problemes_et_ameliorations|Problèmes et améliorations]]).//\\ ---- ====== Outils requis et Librairies Python ====== ====Le programme==== Le programme se trouve en intégralité [[https://github.com/JsuisUnLama/BE-2018---PHILIBERT-Thomas/blob/master/code/facesToX.py|ici]].\\ \\ ====Outils requis==== * Un classifier entraîné dans la détection du visage, comme [[https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml|celui-ci]]. * Cette [[https://github.com/JsuisUnLama/BE-2018---PHILIBERT-Thomas/blob/master/code/oof.png|image de base]]. Le tout à placer dans le même dossier que celui du programme.\\ \\ __Remarques:__ * Le classifier donné est celui utilisé par le programme. Vous pouvez le remplacer par n'importe quel autre classifier remplissant la même fonction mais si vous le faites, n'oubliez pas de changer son nom ici:\\ # Load XML Classifier face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') //ligne 133//.\\ * N'importe quelle image peut-être l'image de base du moment qu'elle s'appelle ''oof.png''. ====Librairies==== Ce programme utilise les librairies suivantes: # Libraries import cv2 import sys //lignes 1 à 3// * ''cv2'' référence la librairie [[https://opencv.org/|OpenCV]] permettant de nombreuses opérations sur les images en Python et C++\\ * ''sys'' référence la librairie [[https://docs.python.org/3/library/sys.html|sys]] pour la gestion des paramètres en Python. ---- ====== Explication du programme ====== ====Le contrôle d'erreur==== Il s'agit d'un pan entier de code contrôlant l'arbre d'argument suivant:\\ {{:diy:projets:arbre_des_arguments.png |}}\\ Ce n'est pas nécessairement excitant mais ça permet au programme de détecter différentes erreurs, de s'arrêter dans de meilleures conditions et en indiquant l'erreur en question. Si cela vous intéresse, le contrôle s'étend //lignes 35 à 126.//\\ ---- ====Les fonctions==== Ce programme ne contient qu'une seule fonction: **facesToOof**.\\ \\ **facesToOof** def facesToOof(img,oof,x,y,w,h): # ~0.008s # Datas add_h = 13 add_w = 0 # Preprocess new_h = h+2*add_w new_w = w+2*add_h resized_oof = cv2.resize(oof,(new_h,new_w),interpolation = cv2.INTER_AREA) y1, y2 = y-add_h, y+h+add_h x1, x2 = x-add_w, x+w+add_w alpha = resized_oof[:, :, 3] / 255 ctr_alpha = 1.0 - alpha # Treatment try: for c in range(0, 3): img[y1:y2, x1:x2, c] = (alpha * resized_oof[:, :, c] + ctr_alpha * img[y1:y2, x1:x2, c]) except Exception as e: pass return img //lignes 9 à 31//.\\ \\ La partie ''#Data'' contient les données paramètres de "d'explosion" du **ROI** s'ajoutant aux calculs suivant pour étendre l'image substituante après le ''resize''.\\ La partie ''#Preprocess'' contient le calcul de la taille du nouvel **ROI**, le changement de taille de l'image substituante, le calcul des nouvelles valeurs de départ et de fin dans **l'image de départ** et le calcul de la valeur de transparence.\\ La partie ''#Treatment'' pose //dans un ''try ... catch'' (voir problèmes et améliorations)// l'image substituante sur l'image de départ pixel par pixel avant de la renvoyer.\\ Et voilà, tous les visages ont été substitués ! Il ne reste plus qu'à afficher le résultat.\\ ====Le main==== Il s'étend //lignes 130 jusqu'à la fin// et se résume à: * Chargement du //classifier//. * Si aucune image substituante n'a été donnée, charge celle de base. * Lancer le traitement selon la méthode choisie, i.e: * Si traitement sur image fixe, détecte chaque visage et leur applique **facesToOof** un à un avant d'écrire le résultat. * Si traitement en temps réel, capture une image, détecte chaque visage et leur applique **facesToOof** un à un avant d'afficher le résultat et ce, jusqu'à pression de la touche ''Q''. * Quitter. ---- =====Problèmes et améliorations===== ====Problèmes==== Même si la scène ou l'image comporte un visage, le programme peut: - Ne pas détecter pas de visage ou en détecter trop. - Ne pas substituer le visage même s'il l'a détecté. ====Solutions possibles et améliorations==== En ce qui concerne les problèmes de détection (1), il suffirait d'utiliser un //classifier// mieux entraîné, ou bien de faire le traitement (''detectMultiScale'') avec plusieurs //classifiers// et compiler les résultats dans une liste sans doublon.\\ Faire tourner plusieurs //classifiers// par image porterait un certain coup sur le temps réel, mais est envisageable pour l'image fixe.\\ \\ Concernant l'absence d'affichage malgré détection (2), il s'agit d'un compromis.\\ Vous vous souvenez du traitement coincé dans un //''try ... catch''//? C'est de ça qu'il s'agit. Cela provient de "l'explosion" du **ROI** qui se fait sans contrôle de valeur aucun.\\ Une solution serait d'avoir un traitement plus rigoureux concernant les valeurs maximales de **l'image de départ**, définir une limite à ne pas franchir et ne superposer qu'une portion du flash lumineux d'une limite vers la fin, du début jusqu'à une limite, ou même d'une limite jusqu'à une limite.\\ Cette fois-ci, on peut considérer que cela n’entacherait pas le temps réel car il s'agit d'opérations de tests, peu coûteuses. Seulement, par soucis de temps, cette solution n'a pas été réalisée.\\ \\ Enfin, vis à vis des améliorations possibles, j'ai surtout en tête des améliorations de performance pour le temps réel sur une machine moins puissante (RaspBerry par exemple). Une amélioration évidente serait de paralléliser le programme, puisque la fonction s'applique indépendamment à chaque visage. \\ \\ \\ ---- //Merci pour votre attention.//\\ //[[thomas.philibert@univ-tlse3.fr|Philibert Thomas]]//