• Aucun résultat trouvé

FREIA, un framework pour l’analyse d’images

3.3 Des bibliothèques pour le traitement d’images

3.3.1 FREIA, un framework pour l’analyse d’images

Le projet FREIA [15, 29], qui signifie « FRamework for Embedded Image Applications », consiste à fournir une interface de programmation commune à des accélérateurs matériels spécifiques au traitement d’images. Projet financé par l’Agence nationale de la recherche de 2008 à 2011, il réunit deux centres de recherche de l’École des mines de Paris, le Centre de recherche en informatique (CRI) et le Centre de morphologie mathématique (CMM), la grande école Télécom Bretagne et l’entreprise Thalès Research & Technology (TRT). FREIA visait à l’origine les accélérateurs SPoC [27], développé au CMM, et Terapix [20], de Thalès. Il a également gagné le support des processeurs graphiques grâce à l’utilisation du modèle de programmation OpenCL [60].

3.3. Des bibliothèques pour le traitement d’images

FREIA fournit une interface dans le langage C pour écrire des applications pouvant, par la suite, être exécutées sur ses cibles. Cette interface fournit des routines de création et de manipulation d’images, ainsi que des opérateurs de traitement d’images. Ces derniers se ré- partissent en deux sous-interfaces ; l’interface CIPO (« Complex Image Processing Operators ») est construite au-dessus de AIPO (« Atomic Image Processing Operators »), qui ne fournit que des opérateurs de base. FREIA permet d’écrire des applications de traitement d’images en utilisant uniquement des fonctions de son interface. Ainsi, FREIA s’apparente à un langage spécifique au domaine du traitement d’images, embarqué dans C. Un exemple d’utilisation de FREIA est disponible en extrait 3.1 : il s’agit ici de l’application d’extraction de plaques d’immatriculations décrite plus haut en figure 1.4.

Plusieurs autres applications FREIA ont servi de référence pour les implémentations de l’interface vers les différents accélérateurs cibles. Parmi celles-ci, on retrouve la détection de dégénérescence maculaire présentée en figure 1.5 et l’extraction de plaques d’imma- triculations de la figure 1.4, respectivement sous le nom retina et licensePlate. Une liste des applications utilisées durant cette thèse, avec quelques unes de leurs caractéristiques (lignes de code, nombre et type d’opérateurs, taille d’image typique), est présentée dans le tableau 3.1. Les effets des applications antibio, burner, deblocking et toggle sont également représentés, respectivement, dans les figure 3.3, figure 3.4, figure 3.5 et figure 3.6.

Apps. #LoC arith morpho#operateursred Total taille d’image anr999 88 1 30 2 33 288 × 224 antibio 200 276 288 267 831 256 × 256 burner 510 49 435 34 518 256 × 256 deblocking 162 26 9 2 37 512 × 512 licensePlate 202 4 65 0 69 640 × 383 retina 471 86 147 68 301 256 × 256 toggle 144 8 6 1 15 512 × 512

Table 3.1 – Liste des applications FREIA de référence

(a) Image initiale (b) Image finale

3. Traitement d’images et bibliothèques logicielles 1 #include "freia.h" 2 3 #define N_OPEN 15 4 #define N_CLOSE 8 5 #define THR_LOW 50 6 #define THR_HIGH 150 7 #define N_CROSS 4 8

9 int main(int argc, char *argv[]) {

10 freia_dataio fdin, fdout;

11 freia_data2d *imin, *imopen, *imclose, *imout;

12 const int32_t kernel1x3[9] = { 0, 0, 0, 1, 1, 1, 0, 0, 0 }; 13 const int32_t kernel3x1[9] = { 0, 1, 0, 0, 1, 0, 0, 1, 0 };

14 freia_initialize(argc, argv); 15 /* open images flow */

16 freia_common_open_input(&fdin, 0);

17 uint32_t w = fdin.framewidth, h = fdin.frameheight;

18 freia_common_open_output(&fdout, 0, w, h, 8); 19 /* images creation */

20 imin = freia_common_create_data(16, w, h);

21 imopen = freia_common_create_data(16, w, h);

22 imclose = freia_common_create_data(16, w, h); 23 imout = freia_common_create_data(16, w, h);

24 freia_common_rx_image(imin, &fdin); /* read input image */

25

26 /* computation */

27 freia_cipo_open_generic_8c(imopen, imin, kernel1x3, N_OPEN); 28 freia_cipo_close_generic_8c(imclose, imin, kernel1x3, N_CLOSE);

29 freia_aipo_threshold(imopen, imopen, 1, THR_LOW, true); 30 freia_aipo_threshold(imclose, imclose, THR_HIGH, 255, true); 31 freia_aipo_and(imout, imopen, imclose);

32 freia_cipo_open_generic_8c(imout, imout, kernel3x1, N_CROSS);

33 freia_cipo_open_generic_8c(imout, imout, kernel1x3, N_CROSS); 34 freia_cipo_dilate(imout, imout, 8, 3);

35 freia_aipo_and(imout, imout, imin);

36

37 freia_common_tx_image(imout, &fdout); /* save output image */ 38 /* images destruction */

39 freia_common_destruct_data(imin);

40 freia_common_destruct_data(imopen); 41 freia_common_destruct_data(imclose); 42 freia_common_destruct_data(imout);

43 /* close images flow */

44 freia_common_close_input(&fdin); 45 freia_common_close_output(&fdout);

46 freia_shutdown();

47 return 0; 48 }

Extrait 3.1 – Application licensePlate en FREIA

Les opérateurs fournis par FREIA disposent de plusieurs implémentations ; leur liste est présentée dans le tableau 3.2. SPoC, Terapix, OpenCL et l’implémentation logicielle Fulguro ont été intégrés à FREIA avant le début de cette thèse ; SMIL, Sigma-C et MPPA en sont des produits directs. À noter que l’implémentation Sigma-C n’est pas utilisable d’emblée par les applications FREIA : Sigma-C ne s’interface pas facilement avec C.

Des optimisations génériques ou spécifiques à la cible visée peuvent être appliquées par le 26

3.3. Des bibliothèques pour le traitement d’images

(a) Image initiale (b) Image finale

Figure 3.4 – Application burner : segmentation d’image de four industriel

(a) Image initiale (b) Image finale

Figure 3.5 – Application deblocking : atténuation des macro-blocs JPEG

compilateur source-à-source PIPS [41, 75]. Dans une première phase, celui-ci va décomposer les appels vers l’interface CIPO de FREIA en suite d’appels AIPO, propager les constantes et dérouler les boucles. Une représentation intermédiaire sous forme de graphe orienté acyclique va également être générée. Ensuite, des optimisations vont avoir lieu sur cette représentation : élimination des variables inutiles et des sous-expressions communes, afin de réduire le nombre d’opérations exécutées. Dans une dernière étape, du code spécifique pour les différentes cibles (et notamment Sigma-C) peut être généré. Des optimisations spécifiques à chaque cible sont également réalisées durant cette phase : fission du graphe applicatif en sous-graphes, fusion d’opérateurs, etc. Toutes ces optimisations sont détaillées dans [29].

Une fois les applications compilées vers une cible, elles peuvent être exécutées sur les matériels compatibles. Les cibles SPoC et Terapix sont exécutées sur un FPGA Xilinx, tandis que la cible OpenCL a pu l’être sur plusieurs processeurs centraux et graphiques, ainsi que sur le processeur manycore MPPA de Kalray. Les cibles utilisées dans le projet FREIA et également durant cette thèse sont ainsi listées dans le tableau 3.3.

3. Traitement d’images et bibliothèques logicielles

(a) Image initiale (b) Image finale

Figure 3.6 – Application toggle : amélioration de contraste

Cibles logicielles Type de matériel

SPoC FPGA

Terapix FPGA OpenCL GPU, CPU Fulguro CPU

SMIL CPU

Sigma-C CPU, Manycore MPPA Manycore

Table 3.2 – Liste des cibles logicielles de FREIA et le type de matériel visé

Matériels Type Cibles logicielles W Xilinx Virtex-5 FPGA SPoC, Terapix 26 Nvidia GeForce 8800 GTX GPU OpenCL 120 Nvidia Quadro 600 GPU OpenCL 40 Nvidia Tesla C 2050 GPU OpenCL 240 Intel dual-core CPU OpenCL 65 AMD quad-core CPU OpenCL 60 Intel Core i7-3820 CPU SMIL, Fulguro, Sigma-C 130 Kalray MPPA-256 Manycore Sigma-C, OpenCL, MPPA 10

Table 3.3 – Liste des accélérateurs matériels utilisés dans le projet FREIA et dans cette thèse

Parmi les cibles logicielles de FREIA, la bibliothèque SMIL fait figure de cas à part et mérite, de fait, sa propre sous-section.