Traitement de flux vidéo sur GPU (Processeur graphique) Stage au laboratoire L2S Supelec « On ne connaît que les choses que l’on apprivoise. » Antoine de Saint-Exupéry lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte 1.1 Objectif : Traiter un flux vidéo 1.2 Convolution 1.3 GPU : Graphic Processing Unit 1.4 Situation initiale Optimiser les transferts entre PC et GPU 2.1 Programmer avec Cuda 2.2 Différences entre synchrone ou asynchrone 2.3 Optimiser grâce aux streams 2.4 Gain obtenu 3 Application sur une caméra HD 3.1 Acquisition des images 3.2 Traitement du flux vidéo sur CPU 3.3 Convolution sur GPU lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD Objectif : Traiter un flux vidéo Traitement d’un flux vidéo haute-définition (HD) en temps réel sur GPU Traitement d’un flux vidéo haute-définition Sur CPU : Impossible de traiter un flux vidéo haute-résolution en temps réel Sur GPU : Grâce à l’amélioration précédente, on peut envisager de traiter un flux vidéo HD en temps réel lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD Convolution Noyau de convolution Pixel source + Pixels voisins Pixel résultat Convolution : Somme de produit lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD Convolution Convolution séparée : Détection de contours (Taille images en pixels)² x (Taille noyau)² Convolution avec noyau classique (Taille images en pixels)² x 2(Taille noyau) Convolution avec noyau séparée lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD GPU : Graphic Processing Unit GPU CPU Représentation simplifiée des composants Pour 100 images 4096*4096 avec un kernel 7*7 : Version CPU : 5196 ms Version GPU : 41 ms lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD GPU : Graphic Processing Unit Puissance comparée des CPU/GPU en GFLOPS par seconde lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD GPU : Graphic Processing Unit Programmer avec CUDA : Utilisation du langage Cuda : Cuda : Compute Unified Device Architecture Permet de lancer des kernels (fonctions) en parallèle très simplement Extension du C (compilée grâce à nvcc) Disponible depuis 2007 Utilisation possible d’un IDE lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD GPU : Graphic Processing Unit Avantage au GPU Le GPU est efficace sur des calculs indépendants Chaque pixel du résultat est une somme de produits indépendantes des autres résultats La convolution est adaptée et parfaitement parallélisable sur GPU lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD Situation Initiale Accélérer une convolution … Optimisations précédentes : Convolution séparée Accéléré sur GPU Avec utilisation de la mémoire shared sur la puce du GPU Soit moins que 25 ips pour avoir une image fluide Une version CPU pour comparaison : 154 863 ms, soit 0,646 images par seconde Une version GPU optimisée au niveau calcul : 726 ms, soit 137,7 ips Pour traiter 100 images 2048*2048 pixels avec un kernel 7*7 => Les transferts mémoires entre pc et GPU, goulot d’étranglement. lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD Situation Initiale Représentation simplifiée des connexions entre PC et Device Goulot d’étranglement Cause : Temps de transfert des images & mode de fonctionnement du programme lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD Situation Initiale Pour 100 images convoluant avec un kernel 7*7 Les temps de transferts sont la clé 60% du temps passé à effectuer des copies Il existe un moyen de faire des copies tout en calculant : En utilisant les streams Dans quelles conditions ce gain est intéressant ? lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD Différences entre synchrone ou asynchrone Différence entre synchrone et asynchrone Nombre de cycle nécessaires pour n images : Synchrone : n * 3 cycles Asynchrone : n + 2 cycles (Cas ou Tup = Tkernel = Tdown) Synchrone : CPU et GPU s’attendent Asynchrone : Le CPU n’attend pas le GPU Pour utiliser le mode asynchrone : Les streams lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD Optimiser grâce aux streams Une nécessité pour le mode asynchrone Fonctionne avec de la mémoire non pagineable Création d’un stream : Utilisation de cudaMemcpyAsync au lieu de cudaMemcpy Rajout de deux nouvelles variables lors de l’appel d’un kernel Destruction d’un stream lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD Gain obtenu Accélération par rapport à la version synchrone (Sans streams) 100 images, kernel 7*7 lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD Gain obtenu Facteur d’accélération obtenu par rapport à la version CPU Pour 100 images Avec un Kernel 7*7 Sur une Tesla C2050 Trois streams : Idéal dans de nombreux cas Gain performances : x2 voir x3 Nombre de streams lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD Acquisition des images OpenCV OpenCV : Open Source Computer Vision (Version 2.3) Traitement d’images en temps réel Ouverture d’un flux vidéo simplifié Mais soumis aux problèmes de la librairie Code ouvrant un flux vidéo et changeant sa résolution Source : wikiopencv lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD Acquisition des images OpenCV Affichage d’une vidéo (sans traitement) Code des anciennes versions compatibles Source : wikiopencv lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD Acquisition des images Matlab Utilisation de la toolbox ‘Image Acquisition’ Code Matlab permettant l’acquisition et l’affichage d’image provenant de la webcam lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD Traitement du flux vidéo sur CPU OpenCV Fonctions CPU dans un premier temps Détection de contours sur CPU Utilisation des fonctions intégrées d’OpenCV : Code C++ pour effectuer une détection de contours grâce à Sobel Contours d’une image (OpenCV) lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD Traitement du flux vidéo sur CPU Matlab Version Matlab : Code Matlab pour détection contours Source : Projet S4 2011 lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Contexte Optimiser les transferts entre PC et GPU Application sur une caméra HD Convolution sur GPU Retard tant sur la version Matlab que sur la version OpenCV Solutions possibles : Utilisation des ‘mexs functions’ pour Matlab Correction des problèmes de librairie OpenCV Travaux en cours. lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Bilan Accélération facteur 2 voir 3 Traitement sur une webcam (OpenCV/Matlab) Bilan personnel : Programmation GPU (Cuda et C++) Utilisation (et installation) d’une librairie externe : OpenCV Utilisation d’un environnement Linux (Red Hat, puis Ubuntu) Programmation sous Linux, sans IDE Perspective Finaliser implémentation Matlab/OpenCV Algorithme itératif Multi-GPU lundi 27 mars 2017 Alexandre Frizac
Traitement de flux vidéo sur GPU (Processeur graphique) Sitographie http://developer.download.nvidia.com/compute/cuda/2_3/toolkit/docs/online/modules.html Nvidia Cuda Library http://opencv.willowgarage.com/documentation/cpp/index.html Wiki OpenCV : Rapport de Benoît Pencrec'h http://web1.lss.supelec.fr/perso/gac_nicolas/encadrements/stage_pencrech_L2S_2010.pdf Stage IUT au L2S - 2010 lundi 27 mars 2017 Alexandre Frizac