Projet GE2-GE3 2013: P13AB06: Estimation de l'activité de Saumons par vision
Entreprise / Client : Salmoniculture de Chanteuges / M. Martin, M. Rancon
Auteurs : Bilal YASSINE / Rachid TIDLIOUINE
Responsable Projet : M. Jacques LAFFONT
Tuteur industriel : Mme. Isabelle GOI

1. Résumé
2. Abstract
3. Introduction
4. Présentation du Sujet
5. Cahier des Charges
6. Developpement

1. Problématiques
2. Faisabilité
3. Solutions

1. Flot optique
2. ScanLine et corrélation

7. Gestion de Projet

1. W.B.S.
2. Gantt

8. Notes d'application

1. sujet 1

9. Bilan

1. Etat d'avancement
2. Analyse Critique
3. Perspectives

10. Bibliographie


Résumé

Ce projet industriel est proposé par le CNSS (Conservatoire National du Saumon Sauvage). L'objectif du CNSS est de repeupler le bassin de Loire-Allier. Pour cela, le CNSS mène différents programmes de recherche au travers desquels il étudie le comportement des saumons. Ainsi, dans le cadre d'une recherche, et à l'initiative de Patrick Martin et de Jocelyn Rancon, quatre bassins du CNSS sont filmés de haut 24h24, 7j/7. Les vidéos sont enregistrées sur un disque dur, et une vidéo dure cinq minutes. Ainsi, le CNSS nous demande de développer une application qui calcule la vitesse des saumons dans le bassin, et qui détermine leur sens de rotation.


Abstract

This industrial project is proposed by the CNSS (Conservatoire National du Saumon Sauvage). Their goal is to repopulate the Allier-Loire(river) in salmons. For this, they need to study the behavior of the salmons. 4 circular basins are filmed from above. So the CNSS ask us an application which can handle those videos and calculate the angular velocity of salmons and also determination of their rotation direction.
In order to do so, we have to go through:

- a research phase, during which we look for a compatible algorithm.
- an implementation phase of the algorithm.
- a validation phase.

Key Words: Salmon, Image processing, OpenCV, optical flow algorithm, correlation algorithm


Introduction

Dans le cadre de notre formation d'ingénieur au département Génie Électrique de Polytech'Clermont-Ferrand, nous avions à choisir un sujet de projet de fin d'études par binômes. Nous avons donc choisis le sujet suivant: Estimation de l'activité de saumons par vision. Ce projet est proposé par le Conservatoire National du Saumon Sauvage ( CNSS ) dans le cadre du programme de repeuplement de l'Allier en saumons. La salmoniculture de Chanteuges en Haute-Loire (43), qui est notre client, est dirigée par M Patrick Martin et procède à l'éclosion et à l'élevage de saumons dans le but de les relâcher dans l'Allier.

Enfin de 2ème année, il sera question de l'étude de faisabilité ainsi que la prise en main de l'outil (OpenCV) à utiliser pour réaliser le projet, tandis qu'en 3ème année, nous nous consacrerons pleinement à l'aspect technique.
Afin de mener à bien cette étude, nous avons le privilège d'être conseillés sur l'aspect industriel par Isabelle GOI qui est notre tutrice industrielle. De plus, l'aspect technique sera supervisé par Jacques LAFFONT, notre tuteur technique.
Nous tâcherons d'être le plus clair et le plus concis possible dans cette documentation, afin qu'elle soit comprise et agréée par nos tuteurs et surtout par notre client.


Présentation du Sujet

Grâce au "Plan Loire Grandeur Nature" initié par le Ministère de l'Environnement en 1994, la salmoniculture de Chanteuges voit le jour le 10 juillet 2001. Il s'agit de la plus grande salmonie d'Europe.

Ce projet s’inscrit dans un cadre écologique, puisqu’il traite de la sauvegarde d’une espèce en voie d'extinction: le saumon Atlantique. Ce fait est dû, entre autres, aux nombreux barrages et à la pollution active dans les rivières.
Dans le cadre de son activité, la salmoniculture de Chanteuges entretient des élevages de smolts (dans plusieurs bassins de trois mètres de diamètre), qui sont filmés de haut, 24h/24, de jour comme de nuit.
La salmoniculture met à disposition des séquences de ces vidéos, qui chacune d'entre elles dure cinq minutes. Le projet va servir à déterminer la date précise dans la croissance des saumons à laquelle ces derniers commencent à se déplacer très activement dans le bassin, date qui correspond au meilleur moment pour les relâcher, car leur métabolisme aura dès lors subit un changement : celui de l’état smolt à l’état adulte. Cette transition se caractérise par un déplacement très actif dans le bassin. De plus, elle leur permet de survivre dans l’eau salée. C’est à ce moment précis qu’il est propice de les relâcher en rivière afin qu’ils migrent sans problèmes vers l'océan.

Le travail demandé est de traiter ces vidéos, afin d'en tirer des données. Le choix a été d'utiliser OpenCV pour cette étude, car cette librairie de fonctions est libre d'utilisation et qu'elle s'avère être très efficace malgré la complexité de sa mise en œuvre (en comparant avec Labview qui a été utilisé les années précédentes). En effet, à partir de l'application développée, nous tenterons de calculer la vitesse des poissons et leur sens de rotation dans le bassin. Toutes ces données seront sauvegardées dans un fichier au format CSV, afin de pouvoir tracer la courbe de l'évolution de la vitesse des saumons au cours du temps, qui est de plusieurs mois.


Cahier des Charges

Dans cette partie, nous allons présenter le cahier des charges dont nous nous sommes engagés à respecter.
Ainsi, nous devrons:

- Calculer une vitesse moyenne des poissons dans le bassin (pas de suivi individuel de poisson mais la valeur calculée est pour l'ensemble du bassin) ;
- Déterminer le sens de rotation des poissons dans le bassin (horaire ou anti-horaire).

Au niveau des données techniques:

- Le format de la vidéo est imposé par le client (extension « .mkv », 15 images par secondes);
- L'algorithme sera compatible avec les vidéos de jour et de nuit;
- Une vidéo de 5 min prendra au maximum 2 min 30 pour être traitée;
- Tout poisson se trouvant dans une zone invisible sera négligé.

Ainsi, étant donné que certains poissons sont regroupés au centre du bassin, et que d’autres sont invisibles sur les parois du bassin, certains poissons ne seront pas pris en compte. Pire encore, si un poisson quitte la zone de visibilité pour la zone d’invisibilité, toutes les données sur ce poisson seront perdues. C’est pourquoi suivre un poisson à intervalles de cinq minutes permet de minimiser les risques de disparition d'un poisson suivi. A l’inverse, un poisson peut quitter la zone d’invisibilité pour la zone de visibilité, dans ce cas, ce nouveau poisson commencera à être suivi comme les autres. Cette notion de zone de visibilité (ou d'invisibilité) est modélisée à la Fig. 1.


Développement


Problématiques

La principale problématique est de trouver un algorithme pour le calcul de la vitesse et le sens de nage des poissons. Cet algorithme doit:

- Traiter les vidéos de jour et de nuit.
- Être fiable dans toutes les phases de l'évolution du poisson.
- calculer la vitesse pour les quatre bassins même si la position de la caméra change.

Voici des images des quatre bassins


Faisabilité


Solutions

Durant la première phase de notre projet, nous avons travaillé en parallèle sur deux algorithmes de traitement d’images: le Flot optique et la corrélation.

1. Flot optique

La détermination d'un mouvement dans une vidéo se fait entre deux images, une image im1 et une image im+N, ce paramètre N est déterminé selon l’accélération du mouvement. Il s'agit ici de déterminer le vecteur de déplacement des poissons, c'est à dire leur point de départ, leur point d'arrivée, et d'en déduire la vitesse moyenne. Pour ce faire, nous utilisons un algorithme de flot optique. Le flot optique permet de déterminer des mouvements entre deux images en se basant sur les variations de l'intensité lumineuse.

Le flot optique se base sur deux fonctions, la première cherche les points de l'image où il y a une forte variation de l'intensité lumineuse, et la deuxième cherche ces points trouvés dans l'image suivante.

ScanLine? et corrélation

La scanline

Afin de calculer la vitesse des poissons, la technique de la scanline a été utilisée. Celle-ci consiste à placer une ligne de scan sur un des rayons du bassin et de relever au cours du temps tout objet traversant cette ligne. Ceci est illustré dans la figure ci-dessous.

Afin de calculer la vitesse des poissons, la technique de la scanline a été utilisée. Celle-ci consiste à placer une ligne de scan sur un des rayons du bassin et de relever au cours du temps tout objet traversant cette ligne. Ceci est illustré dans la figure ci-dessous.

En relevant tout ce qui passe par cette ligne, on est censé obtenir l’image présentée en Figure 2, sur laquelle une « tâche » blanche correspond à un poisson. Précisons que sur cette image, l’abscisse représente le temps et l’ordonnée représente la position du poisson sur la scanline. Ainsi, plus une tâche est longue sur le graphe, plus le poisson correspondant à cette tâche est resté longtemps sur cette ligne, et inversement. On peut ainsi avoir une première idée de la vitesse des poissons.

Grâce à ces résultats, on peut d’ores et déjà avoir une première estimation de la vitesse, en faisant l’hypothèse que tous les poissons font la même taille, et que donc la tâche d’un poisson sur le graphe donne l’information sur sa vitesse.
Le calcul de la vitesse linéaire s’effectue selon la formule suivante : v= d/t , Avec d la distance parcourue et t le temps mis à faire cette distance. Le résultat obtenu est en mètres par seconde (m/s). C’est ici que le premier problème se pose : On a le temps qu’un poisson a mis à traverser la scanline, mais quelle distance a-t-il parcouru ? Cette distance est en fait la largeur de la scanline, qui est d’un seul pixel… Ce pixel représente en réalité 4.5 mm !
Avec cette méthode, on calcule donc le temps qu’a mis un poisson à faire une très petite distance, ce qui pose problème car la vitesse ne peut avoir une valeur significative que si elle est prise entre deux points distants d’un minimum qu’on appelle ξ.
Pour cette distance notée ξ, on prendra 30 pixels, ce qui semble être déjà plus raisonnable en terme de distance parcourue (dans notre cas, cela représente 13.5 cm). On doit donc poser une seconde scanline distante de 30 pixels de la première. On est donc censé avoir les images présentées ci-dessous :

On peut observer que sur ces images théoriques, les tâches sont décalées d’une image à l’autre. Ce décalage correspond au laps de temps nécessaire aux poissons pour passer de la scanline 1 à la scanline 2. Maintenant, pour avoir la vitesse (v = d/t), on a une distance d fixe et connue, et un temps t, qu’il reste à calculer. Comme nous l’avons présenté, ce temps est l’écart de pixel entre les tâches d’une image à l’autre, une corrélation d’image peut donc fournir cet écart de pixel qui nous intéresse.

a. La corrélation

Cette technique consiste à superposer par décalage les deux images et afin de déterminer l’écart entre elles. Cette définition est peu parlante, afin de mieux visualiser ceci, voyons l’exemple ci-dessous :

À l’itération 0, l’image 2 est à droite de l’image 1. On va la décaler vers la droite, et à chaque décalage, on va relever le score de vraisemblance (= score de corrélation) entre les 2 images pour chaque ligne.

À l’itération 50, les deux images sont au même niveau. Si on était en train de faire cette corrélation avec deux mêmes images, ce serait pour cette itération que le score serait maximum. On va continuer le décalage vers la droite de l’image 2.

À l’itération 100, l’image 2 est à droite de l’image 1. La corrélation est terminée. Il ne reste plus qu’à déterminer pour quelle itération on a eu le score maximum. Ce score détermine l’écart entre les tâches d’une image à l’autre.
On a donc maintenant la distance, et le temps, donc la vitesse linéaire en m/s. On facilement en radian par seconde en divisant cette vitesse par le rayon du bassin.

Nous avons donc développé en parallèle deux algorithmes. Le choix s'est penché en faveur de celui mettant en oeuvre la scanline et la corrélation, faute de résultats pour l'autre algorithme.


Gestion de Projet


W.B.S.


Gantt

Afin de gérer au mieux l'organisation du travail pour la finalisation de ce projet, nous avons appréhendé un diagramme de GANTT, dont voici l'allure avec le nom des tâches associées:


Notes d'application

sujet 1

Mise en œuvre d'OpenCV sous CodeBlocks: Rachid TIDLIOUINE


Bilan

Dans ce bilan, nous allons exposer les résultats que nous avons obtenus. Le client nous a fourni 2, quelques vidéos afin que nous puissions développer l’application. Ces vidéos furent l’outil de travail de nos sous-traitants, qui sont les Génie Électrique en 4ème année du cursus. Nous leur avons développés une application dans laquelle l’opérateur doit cliquer sur chaque poisson, et ce, à plusieurs images d’intervalle de la vidéo. Ainsi, les coordonnées de chaque poisson sont enregistrées dans un fichier, et il devient aisé de calculer la vitesse de ces poissons. Ces données sont nos références afin de qualifier l’algorithme, c’est-à-dire qu’elles vont nous permettre de déterminer si ce dernier est performant ou non.

Ainsi, nous avons procédé comme cela pour quatre vidéos que nous appellerons « Vidéo 1 », « Vidéo 2 », « Vidéo 5 » et « Vidéo 9 ». Les courbes de qualification sont données ci-dessous.

Explication des légendes :
- donnée_algo : Vitesse générée par notre algorithme pour la vidéo en question ;
- vitesse : Vitesse moyenne mesurée par les données de sous-traitance ;
- vitesse_max : Vitesse du poisson le plus rapide dans le bassin ;
- vitesse_min : Vitesse du poisson le plus lent dans le bassin.

On voit sur ces graphiques que nos résultats de vitesse sont dans l'intervalle [vitesse_min ; vitesse_max], ce qui montre d'emblée que notre algorithme ne génère pas de résultat aberrant.
Cependant, il apparaît que les erreurs commises sur les vitesses ne respectent pas toutes le cahier des charges. En effet, il était convenu dans ce dernier que l'erreur maximale sur les vitesses pouvait être de 20%, Or il apparaît dans le tableau ci-dessous que ce n'est pas toujours le cas :

Remarque : Le calcul de l'erreur sur les résultats générés se sont fait avec la formule suivante :

Cependant, ce qui intéresse le client, c'est avant tout l'évolution de la vitesse des saumons. Ainsi, si la courbe d'évolution de la vitesse générée par notre algorithme présente changement brutal de la vitesse au cours du temps, cela prouvera que notre algorithme arrive tout de même à percevoir cette transition. C'est effectivement la cas : Comme nous pouvons le voir sur le graphique ci-dessous, on trace la vitesse générée par notre algorithme pour une vidéo où les poissons ne bougent pas (vidéo 9) et pour une vidéo où les poissons ont une forte activité (vidéo 2). On remarque une différence très nette entre ces deux vitesses.

En ce qui concerne le sens de rotation des poissons, il n'y a pas d'erreur : l'algorithme nous génère toujours le bon sens de rotation, comme le présente le tableau ci-dessous :

Finalement, même si le cahier des charges n'a pas pu être respecté en ce qui concerne les erreurs sur les vitesses, la finalité du projet est présente : le client pourra détecter l'évolution de la vitesse des poissons au cours du temps. Cela explique donc que ce projet que nous avons réalisé est un succès pour nous. Le client est satisfait de cela et il a décidé d'utiliser notre application afin de traiter ses très nombreuses vidéos.


Etat d'avancement

Arrivés au terme de ce projet, nous pouvons dire que nous avons atteint l'objectif de ce dernier, dans la mesure où nous avons réussi à avoir une vitesse et le sens de rotation des poissons dans le bassin. Néanmoins, et puisqu'il s'agit d'un projet de recherche, l'algorithme développé peut encore être optimisé, afin d'avoir des erreurs moindres.


Analyse Critique


Perspectives


Bibliographie

- http://www.saumon-sauvage.org/
- http://opencv.org/
- http://dasl.mem.drexel.edu/~noahKuntz/openCVTut9.html

cnss_20140122192952_20140122200207.png (84.1 KB) axel BARRIEUX, 04/09/2021 08:37 AM

CNSS_20140123174804_20140123174820.png (287 KB) axel BARRIEUX, 04/09/2021 08:44 AM

syno_20140122215815_20140122223301.png (350 KB) axel BARRIEUX, 04/09/2021 08:46 AM

a_20130409165320_20130409165530.jpg (36 KB) axel BARRIEUX, 04/09/2021 08:47 AM

bassins_20131202092234_20131203141438.png (92.6 KB) axel BARRIEUX, 04/09/2021 08:49 AM

flow_20140123170941_20140123171114.jpg (48.7 KB) axel BARRIEUX, 04/09/2021 08:51 AM

scan_1_20140123173810_20140123173821.png (22.7 KB) axel BARRIEUX, 04/09/2021 08:56 AM

scan_2_20140123173810_20140123173840.png (16.5 KB) axel BARRIEUX, 04/09/2021 08:57 AM

scan_3_20140123173810_20140123173853.png (8.05 KB) axel BARRIEUX, 04/09/2021 08:57 AM

correl_1_20140123174114_20140123174231.png (8.16 KB) axel BARRIEUX, 04/09/2021 08:58 AM

correl_2_20140123174114_20140123174143.png (7.44 KB) axel BARRIEUX, 04/09/2021 09:00 AM

correl_3_20140123174114_20140123174154.png (7.64 KB) axel BARRIEUX, 04/09/2021 09:01 AM

gantt_20140123174114_20140123174318.jpg (120 KB) axel BARRIEUX, 04/09/2021 09:05 AM

note_appli_mise_en_oeuvre_opencv_sous_codeblocks.pdf (1.72 MB) axel BARRIEUX, 04/09/2021 09:08 AM

video1_20140123175536_20140123175821.png (48.8 KB) axel BARRIEUX, 04/09/2021 09:09 AM

video2_20140123172240_20140123172328.png (59.5 KB) axel BARRIEUX, 04/09/2021 09:10 AM

video5_20140123175536_20140123175900.png (66.5 KB) axel BARRIEUX, 04/09/2021 09:10 AM

comparatif_vitesses_20140123175536_20140123175954.png (49.3 KB) axel BARRIEUX, 04/09/2021 09:11 AM

erreur_20140123172550_20140123172711.png (20 KB) axel BARRIEUX, 04/09/2021 09:11 AM

formule_20140123172550_20140123172636.png (4.6 KB) axel BARRIEUX, 04/09/2021 09:12 AM

gap_20140123172751_20140123172807.png (15.4 KB) axel BARRIEUX, 04/09/2021 09:13 AM

sens_20140123172751_20140123172911.png (33.2 KB) axel BARRIEUX, 04/09/2021 09:14 AM