La soustraction d’arrière-plan est une étape courante dans de nombreux algorithmes de vision par ordinateur. En effet, pour certaines applications comme le comptage de personne ou de véhicule, la détection de personne ou encore la reconnaissance d’action intègre une étape préalable de soustraction de fond.

De nombreuses personnes me demandent comment appliquer des algorithmes présent sur ce site, comme la reconnaissance de formes ou la détection de plaque d’immatriculation, dans des situations réelles. Il est donc nécessaire que j’aborde dans cet article, un moyen de faciliter la détection d’objets dans des vidéos. C’est pourquoi nous nous intéressons dans cet article à la soustraction d’arrière-plan afin de permettre de différencier les objets de l’avant plan du fond de l’image. Dans cet article, nous allons mettre en application quelques méthodes disponibles dans la bibliothèque OpenCV.

Les images que nous analyserons dans cet article sont issues de la base de données Viradata. Nous nous basons sur une vidéo de surveillance de parking, la vidéo : « VIRAT_S_000205_02_000409_000566.mp4 » et notamment l’image 1150, présentant plusieurs objets en bas à droite.

Soustraction d’image

Une des méthodes les plus simple pour mettre en avant des objets se déplaçant dans une scène est de trouver les différences entre une image de la vidéo et une image de référence. Cette image de référence peut être extraite au tout début des traitements, voire avant, dans le cas où la scène est contrôlée (arrière-plan fixe; lumière toujours identique). Dans le cas où quelques changements dans l’illumination ou le fond en lui même peuvent intervenir, l’image de référence devra être mise à jour.

import cv2

cap=cv2.VideoCapture('VIRAT_S_000205_02_000409_000566.mp4')
ret, imageRef = cap.read()

while True:
	ret, image = cap.read()
	image_soustraite = cv2.absdiff(image,imageRef)
	imageRef = image

	cv2.imshow('fenetre', image_soustraite)
	k=cv2.waitKey(1)
	if k == 27:
		break

cap.release()
cv2.destroyAllWindows()

Résultats :

Dans les deux cas, les objets se déplaçant sont bien extrait. Cependant, comme nous l’avions précisé précédemment, dans le cas où l’image de référence n’est pas mise à jour, tous les mouvement de l’arrière-plan ressortent (cliquez sur les images pour agrandir). C’est pourquoi nous pouvons voir le déplacement des feuilles de l’arbre en bas à gauche de l’image, ou encore la détection des lignes du parking au centre de l’image, dû à des changements dans l’illumination de la scène. Dans le cas de la mise à jour de l’image de référence à chaque image, seul le contour des objets déplacés est visible. Il sera alors nécessaire d’effectuer des post-traitements afin d’extraire l’objet en totalité.

Soustraction d’arrière-plan

Comme le code sera quasi identique pour les différentes méthodes de soustraction d’arrière-plan, nous allons tout d’abord voir la structure du code avant de s’intéresser aux différentes méthodes.

import cv2

cap = cv2.VideoCapture('video.mp4')
fgbg = cv2.bgsegm.createBackgroundSubtractorGMG()

while(1):
	ret,image = cap.read()
	fgmask = fgbg.apply(image)

	cv2.imshow('fenetre', fgmask)
	k=cv2.waitKey(1)
	if k == 27:
		break
		
cap.release()
cv2.destroyAllWindows()

Nous commençons donc par importer la bibliothèque OpenCV (l. 1), puis nous ouvrons notre fichier vidéo à la ligne 3. La seule ligne qui variera entre les différentes méthodes sera la ligne 4. À cette ligne, nous créons notre soustracteur d’arrière-plan qui dépend donc de la méthode utilisée.

Pour chaque image de la vidéo (l. 6), nous récupérons l’image (l. 7) et nous appliquons la soustraction (l. 8).

Il nous reste plus qu’à afficher l’image (l. 10) et dans le cas où la touche « échap » est pressée, nous arrêtons la lecture (l. 11-13). Enfin nous fermons le fichier vidéo et nous détruisons toutes les fenêtres (l. 15-16)

Méthode MOG

Il s’agit d’un algorithme de segmentation d’arrière/premier plan basé sur un mélange de Gaussian. Chaque pixel de l’arrière-plan est modélisé par un ensemble de K distribution Gaussienne (K = 3 à 5). Les poids des mélanges représente la proportion de temps qu’une couleur reste dans la scène. La couleur correspondant à l’arrière plan la plus probable est celle qui reste le plus longtemps.

fgbg = cv2.bgsegm.createBackgroundSubtractorMOG()

Méthode MOG2

La méthode MOG2 est également un algorithme de segmentation de l’arrière-plan basé sur un mélange gaussien. Une caractéristique importante de cet algorithme est qu’il sélectionne le nombre approprié de distribution gaussienne pour chaque pixel. Il offre ainsi une meilleure adaptabilité aux variations dans les scènes.

fgbg = cv2.createBackgroundSubtractorMOG2()

Méthode GMG

Cet algorithme combine l’estimation statistique de l’image de fond et la segmentation bayésienne par pixel. Les estimations sont adaptatives ; les observations les plus récentes sont plus fortement pondérées que les anciennes pour tenir compte de l’éclairage variable. Plusieurs opérations de filtrage morphologique, comme la fermeture et l’ouverture, sont effectuées afin d’éliminer les bruits indésirables.

fgbg = cv2.bgsegm.createBackgroundSubtractorGMG()

Méthode KNN

Le principe des méthode des K plus proches voisins, consiste à associer un pixel à un cluster, arrière-plan ou premier-plan, en fonction de sa distance à la moyenne des clusters.

fgbg = cv2.createBackgroundSubtractorKNN()

Résultats des méthodes de soustraction d’arrière-plan

Comme nous pouvons le voir, les résultats produits par les différentes méthodes sont relativement proches. La méthode MOG2 est celle extrayant le plus d’objets La méthode GMG est celle présentant le moins de détections au niveaux des arbres. Ce qui s’explique par l’utilisation dans cette méthode d’ opérations de filtrages morphologiques.

En terme de temps, voici les résultats obtenus sur mon ordinateur :

Méthodes :SoutstractionMOGMOG2GMGKNN
Temps (s/img) :0.0030.0530.0190.0860.014

Quelle méthode de soustraction d’arrière-plan choisir ?

Il n’existe malheureusement pas de réponse universelle à cette question. Et il sera nécessaire de choisir un algorithme en fonction de votre application (type de scène, éclairages, temps-réel, …)

Par exemple, dans la vidéo suivante, l’algorithme MOG2 semble être le plus performant.

Il ne vous reste donc plus qu’à appliquer ces algorithmes sur vos vidéos.

Sources :


0 commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.