Outils pour utilisateurs

Outils du site


diy:projets:facedetection

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
diy:projets:facedetection [2018/05/24 09:19] spujoldiy:projets:facedetection [2018/06/01 11:02] (Version actuelle) – [Explication du programme] spujol
Ligne 1: Ligne 1:
 ====== Présentation du projet ====== ====== Présentation du projet ======
  
-Le but de se projet est de pouvoir détecter les visages sur des photos ou vidéos.+Le but de ce projet est de pouvoir détecter les visages sur des photos ou vidéos.
  
 ====== Outils requis et Librairies Python====== ====== Outils requis et Librairies Python======
Ligne 7: Ligne 7:
 Ce programme se base sur [[https://fr.wikipedia.org/wiki/M%C3%A9thode_de_Viola_et_Jones|la méthode de Viola et Jones]] donc de ce fait, on a besoin de télécharger le fichier "haarcascade_frontalface_alt.xml" Ce programme se base sur [[https://fr.wikipedia.org/wiki/M%C3%A9thode_de_Viola_et_Jones|la méthode de Viola et Jones]] donc de ce fait, on a besoin de télécharger le fichier "haarcascade_frontalface_alt.xml"
  
-Nous allons aussi utiliser différentes librairies de python tel que:+Nous allons aussi utiliser différentes librairies de python tels que:
  
 <code python> <code python>
Ligne 19: Ligne 19:
 ====== Explication du programme====== ====== Explication du programme======
  
-La première fonction à faire est la plus importante, il s'agit de la fonction qui va permettre de détecter les visages sur l'image. Elle prend en entrée une image et retourne l'image et un tableau de tableau contenant chacun les coordonnées des différents visages sur l'image.+La première fonction à faire est la plus importante, il s'agit de la fonction qui va permettre de détecter les visages sur l'image. Elle prend en entrée une image et retourne l'image et une liste de rectangles correspondant aux différents visages sur l'image.
  
 <code python> <code python>
Ligne 25: Ligne 25:
   cascade = cv2.CascadeClassifier("/home/pujol/Documents/L3/BE/haarcascade_frontalface_alt2.xml")   cascade = cv2.CascadeClassifier("/home/pujol/Documents/L3/BE/haarcascade_frontalface_alt2.xml")
   imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)   imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
 +  #La commande ci-dessous permet de détecter les visages
 +  #cascade.detectMultiScale(imageAtraiter, FacteurScalaire, NombreDeVoisinMinimumPourEtreReconnu,TailleMinimalePourEtreReperer)
   visage = cascade.detectMultiScale(imgGray, 1.2, 4,minSize=(20, 20))   visage = cascade.detectMultiScale(imgGray, 1.2, 4,minSize=(20, 20))
   if len(visage) == 0:   if len(visage) == 0:
Ligne 34: Ligne 36:
 La conversion en image de gris permet de faciliter la détection de visage. La conversion en image de gris permet de faciliter la détection de visage.
  
-Ensuite la fonction suivante, va permettre d'encadrer les différents visages en prenant entrée le tableau de visage et l'image. Elle retourne l'image modifié.+Ensuite la fonction suivante, va permettre d'encadrer les différents visages en prenant en entrée le tableau de visage et l'image. Elle retourne ainsi l'image modifiée.
  
 <code python> <code python>
 def rect(visage,img): def rect(visage,img):
   for x,y,h,w in visage:   for x,y,h,w in visage:
 +    #La commande ci-dessous rajoute le rectangle autour du visage concernés
 +    #cv2.rectangle(imageATraiter,pts1,pts2,couleur,épaisseur)
     cv2.rectangle(img, (x, h), (y, w), (255, 0, 0), 3)     cv2.rectangle(img, (x, h), (y, w), (255, 0, 0), 3)
   return img   return img
 </code> </code>
  
 +Nous avons donc en notre possession les deux fonctions importantes qui permettent la détection de visages. Il ne nous reste plus qu'a les appliquer à une images ou une vidéo.
  
 +Pour une image, il suffit juste d'utiliser les deux fonctions précédentes et écrire l'image résultat dans un nouveau fichier. 
 +
 +<code python>
 +img = cv2.imread("imgDetectVisage.jpeg", cv2.IMREAD_COLOR)
 +visage, img = detectionVisage(img)
 +cv2.imwrite("imageRes.jpeg",rect(visage,img))
 +</code> 
 +
 +Pour une vidéo, il faut appliquer les fonctions de détection à chaque frame de celle-ci et remonter la vidéo avec les images modifiées.
 +
 +<code python>
 +vid = cv2.VideoCapture('vidDetectVisage.avi')
 +vid.open('vidDetectVisage.avi')
 +fourcc = cv2.VideoWriter_fourcc('D', 'I', 'V', 'X')
 +i=1000000
 +os.system('rm ~/IMGDET/*.jpeg')
 +  while vid.isOpened():
 +    ret,img = vid.read()
 +    if ret == True:
 +      vis,img = detectionVisage(img)
 +      img = rect(vis,img)
 +      cv2.imwrite('IMGDET/img_'+ str(i) + '.jpeg',img)
 +      i += 1
 +    else:
 +      break
 +vid.release()
 +os.system('ls ~/Documents/L3/BE/IMGDET/*.jpeg > nomImgFich.txt')
 +os.system("mencoder -nosound -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=8000000 -vf scale=720:480 -o vidRes.avi -mf type=jpeg:fps=24 mf://@nomImgFich.txt")
 +os.popen("rm ./nomImgFich.txt","r").read
 +</code> 
 +
 +
 +====== Utilisation du Raspberry ======
 +
 +Ce programme fonctionne évidemment avec des images et vidéos importées directement d'un raspberry. Pour ce faire, nous avons besoin des scripts Bash ci-dessous permettant la connexion au raspberry.
 + 
 +Pour une image:
 +
 +<code bash>
 +#!/bin/sh
 +
 +ip=$1
 +cat detectVisImg.sh | ssh pi@$ip sh
 +rm imgDetectVisage.jpeg
 +scp pi@$ip:~/tempPS/imgDetectVisage.jpeg ./DetectVisage
 +</code>
 +
 +<code bash>
 +#!/bin/sh
 +
 +if [ -d "/home/pi/tempPS" ];
 +then
 +  cd tempPS
 +  sudo rm *.jpeg
 +else
 +  mkdir ./tempPS
 +  cd tempPS
 +fi
 +raspistill -vf -hf -o imgDetectVisage.jpeg
 +exit
 +</code>
 +
 +Pour une vidéo: 
 +
 +<code bash>
 +#!/bin/sh
 +
 +ip=$1
 +cat DetectVisVid.sh | ssh pi@$ip sh
 +rm vidDetectVisage.avi
 +scp pi@$ip:~/tempPS/vidDetectVisage.avi ./DetectVisage
 +</code>
 +
 +<code bash>
 +#!/bin/sh
 +
 +if [ -d "/home/pi/tempPS" ];
 +then
 +  cd tempPS
 +  sudo rm *.avi
 +else
 +  mkdir ./tempPS
 +  cd tempPS
 +fi
 +raspivid -vf -hf -o vidDetectVisage.avi -t 60000
 +exit
 +</code>
 +
 +Pour appeler un script Bash en python on utilise la commande suivante, qui permet de lire une commande systeme :
 +
 +<code python>
 +os.popen("./connexPiDetectVisageVid.sh " + ipRasp,"r").read
 +</code>
  
  
diy/projets/facedetection.1527153571.txt.gz · Dernière modification : 2018/05/24 09:19 de spujol