P13AB07 Mesure par vision du taux de croissance d'un smolt

Projet GE2-GE3 2013 : P13AB07 MESURE PAR VISION DU TAUX DE CROISSANCE D'UN SMOLT
Entreprise / Client : Conservatoire National du Saumon Sauvage (CNSS)
Patrick MARTIN, Jocelyn RANCON
*Auteurs
: Hakim EL GHARRABI, François JULLIEN
Responsable Projet : Roland CHAPUIS, Jacques LAFFONT
Tuteur industriel : 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. Etude Théorique
4. Solutions
5. Validation
6. Points d'inflexions
7. Interface homme-machine

7. Gestion de Projet

1. Gantt

8. Notes d'application

1. sujet 1
2. sujet 2

9. Bilan

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

10. Bibliographie


Résumé

Le Conservatoire National du Saumon Sauvages (CNSS) étudie le comportement des saumons afin de palier au déficit de population dans les rivières de l’Allier et la Loire. Ils étudient actuellement le comportement ainsi que le taux de croissance des smolts, pour cela ils prélèvent des écailles puis sont numérisés. Les écailles ressemblant à une coupe d’arbre, sur le même principe, les saumons déposent des circulis plus ou moins rapproché en fonction de la saison. Afin de connaitre son taux de croissance ils analysent manuellement l’écartement des circulis par rapport au centre, pour en faire une courbe. Cette opération nécessite donc aujourd’hui de mobiliser une personne pour traiter un petit nombre d’écailles.

Mots clefs :
-Saumon
-Traitement d’image
-Courbe de croissance
-Points d’inflexion


Abstract

The Conservatoire National des Saumon Sauvages (CNSS) studies the salmon’s behavior, to overcome the deficit of population in the Allier’s and Loire’s river. They have studied the smolt’s behavior and the growth rate, for that they take scales and are digitized. The scales looks like a tree stump, in the same principle, the salmons file circulis more or less distant in function of the season. To know his growth rate, they have analyzed manually each circulis from the center, to do a curve. Curently, this operation need to mobolize one person to treat a small number of scale.

Key words :
-Salmon
-Image processing
-Growth curve
-Inflection points


Introduction

Les nombreux aménagements ainsi que la pollution des rivières ont considérablement réduit le nombre de saumon dans le bassin Loire-Allier. C’est pourquoi le Conservatoire National de Saumon Sauvage (CNSS) est né.
Pour pallier la baisse de population et accroître les connaissances sur les saumons, le conservatoire a choisi de faire appel aux élèves ingénieurs de Polytech Clermont-Ferrand lors des projets de 5ème années.
Le projet consistait à automatiser le relever de courbe de croissance de saumon en vue de constituer une banque de données. Le projet c’est articulé en deux phases, la première consistait à chercher un algorithme de traitement d’image, la seconde phase visait à qualifier et améliorer les résultats.


Présentation du Sujet

Le travail porte sur l’analyse d’écailles de smolt dans le but de récolter beaucoup de données concernant la croissance des saumons.

Les écailles sont composées de circulis, qui ressemblent à ceux d’une souche d’arbre. Les circulis sont déposés à intervalle de temps régulier, ainsi l’espacement entre eux représente le taux de croissance du poisson. Un saumon dépose en moyenne 40 circulis par an.

Le procédé actuellement en place au CNSS est manuel, en effet un opérateur mesure l’espacement entre chaque circuli. L’opération nécessite donc beaucoup de temps pour traiter un petit nombre d’écailles. C’est pourquoi l’automatisation permettra d’analyser rapidement un grand nombre d’écailles, et par conséquent de récolter suffisamment de données pour une publication.

Pour en savoir plus: Cycle de vie du saumon


Cahier des Charges

Le cahier des charges initialement défini avec le client était basé sur la même méthode de recherche qu’au CNSS. Lors de l’avancée du projet, les essais d’automatisation ont permis de déduire le taux de croissance du poisson en s’affranchissant du comptage des circulis. L’analyse de la colorimétrie de l’image permet de restituer directement la courbe de croissance. Lors de la rédaction du nouveau cahier des charges, la recherche des différentes phases de croissance a été ajoutée.


Développement

- Problématiques

Le CNSS à fait appel à Polytech pour répondre à leur problématique :
Optimisation de l’analyse du taux de croissance d’un smolt.

Le CNSS publie des études sur le saumon, ils ont récemment publié une étude sur l’influence du climat sur les saumoneaux. Ils désirent aujourd’hui publier une étude basée sur le taux de croissance des saumons, pour cela ils doivent appuyer leurs recherches de résultat concret. La méthode d’acquisition en place ne permettait pas de se basé sur un nombre de relevé suffisant car elle nécessitait un opérateur pour faire le relevé.

- Faisabilité

Au moment de l’acceptation du projet, la faisabilité n’était pas du tout assurée, car n’ayant aucune notion dans le traitement d’image, ils nous étaient difficiles de définir les risques.
Le projet reposait sur la recherche d’un ou plusieurs algorithmes afin de permettre le comptage des circulis. Nous nous sommes aperçus au cours du projet que la résolution des images ainsi que la présence de nombreux « artefact » ne nous permettaient pas d’arriver aux résultats escomptés.
Lors d’un entretien avec le client, nous avons conclu que le cahier des charges avait été mal défini. Nous avons donc rectifié le cahier des charges afin qu’il réponde réellement aux attentes du client et pour lequel nous avions trouvé un algorithme fournissant des résultats convenables.

- Etude Théorique

Courbe du taux de croissance d'un smolt

Dans cette partie nous allons détailler les différents algorithmes recherchés et lequel a été validé.

Pour avoir la courbe de croissance, on a recherché un algorithme de détection de contour pour pouvoir détecter les circulis et avoir ne nombre exacte de circuli et ainsi tracer la courbe de croissance.
L’algorithme est "canny". Voici ci-dessous les résultats obtenus. À gauche nous avons l'image sans traitement et à droite l'image après traitement.

Comme on peut le remarquer, après traitement l'image devient difficile à traiter. Nous avons eu de la perte d'information.

Pour avoir un meilleur résultat, on s’est posé d'améliorer le contraste de l'image pour pouvoir détecter plus facilement les circulis.
Pour cela, nous avons recherché un algorithme adéquat qui est "kernel". À gauche nous avons l'image sans traitement et à droite après traitement.

Après traitement, nous avons réutilisé l'algorithme précédent "canny" pour avoir un meilleur résultat. Or après traitement, les résultats obtenus n'ont pas changé comme précédemment. C'est à dire nous avions toujours de la perte d'information, et l'image n'était pas traitable.

Nous sommes partie sur une transformée de fourrier, pour non plus étudier l'image tel qu'elle mais pour l'étudier en fréquentiel. Voici ci-dessous l'image d'écaille à gauche et sa transformée de Fourier à droite.

Une fois que la transformée a été faite, le but est de supprimer certaines zones de fréquences pour supprimer du "bruit" pour avoir des données exploitables. Or, on s'est aperçue que travailler en fréquentiel était compliqué et qu'il fallait passer beaucoup de temps.

- Solutions

Nous sommes parties sur un autre algorithme. Le but de cet algorithme est de récupérer la valeur de chaque pixel sur une ligne de mesure. L'opérateur devra placer deux points. Le primer sur le centre de l'écaille et le second à l'extrémité de l'écaille.

Une fois que nous avons la valeur de chaque pixel, nous utilisons un algorithme de cumul. Voici la courbe obtenue.

- Validation

En rouge, nous avons la courbe du client, et en bleu la courbe de l'algorithme.
Actuellement, c'est l'algorithme qui donne de très bons résultats, et que nous avons choisi d’implanter dans l'application.

Détermination des points d'inflexion

En mathématique, un point d'inflexion est une rupture de pente sur une courbe (point rouge sur l'exemple ci-dessous).

- Points d'inflexions

Pour déterminer ces différents points, voici les algorithmes recherchés et celui que nous avons implanté dans l'application.

Pour cela, un algorithme de régression linéaire a été recherché. Cet algorithme permet d'estimer une droite qui passe au mieux par les points de la courbe.

Lors du calcul de la droite, une marge d'erreur est ajoutée. Si le point suivant de la courbe de l'algorithme est en dehors de cette marge d'erreur, on estime que le point d'inflexion se trouve aux coordonnées de ce point. Voir ci-dessous la simulation.

En bleu, nous avons la courbe estimée, et en rouge l'intervalle d'erreur. Nous n'avons pas retenu cet algorithme, car pour chaque estimation des points d'inflexion, il va falloir modifier l'intervalle d'erreur.

Par la suite, nous avons tracé une droite linéaire partant du début de la courbe de croissance, jusqu'à l'extrémité. Ensuite, l'erreur entre la courbe de croissance et celle de la droite linéaire est calculée avec cette formule ². Lorsque nous trouvons l'erreur maximale, on en déduit que le 1er point d'inflexion se trouve à ce point. Nous allons faire une récursivité. C'est-à-dire qu'à partir de ce nouveau point, nous allons retracé une droite partant de ce point jusqu'à l'extrémité, mais aussi une autre droite partant de ce point jusqu'au début de la courbe (au cas ou si un point d’inflexion a été oublié). Et nous recalculons l'erreur. Voir ci-dessous les différentes étapes.

Nous n'avons pas gardé cet algorithme, car, si l'on ne fixe pas un seuil, on va trouver une infinité de points d'inflexion du à la récursivité de la fonction. Idem qu'avec la régressons linéaire, pour chaque image il va falloir déterminer un seuil.

Dans la même optique que la fonction récursive, une droite linéaire est tracée entre le début de la courbe de croissance jusqu'à la fin. Ensuite l'erreur est calculée entre la droite linéaire et la courbe de croissance. Lorsque nous trouvons l'erreur maximale, on en déduit que le 1er point d'inflexion se trouve à ce point. On retrace une droite de ce point jusqu'à l'extrémité de la courbe de croissance et on recalcule l'erreur. Une fois l'erreur max déterminée, on en déduit que le deuxième point d'inflexion se trouve à ce point.

Le seul paramètre à prendre en compte c'est le nombre de points d'inflexion par image. Ceci sera indiqué par l'opérateur sur l'interface. Actuellement, c'est l'algorithme qui est implanté dans l'application.
Voici le résultat.

Interface homme-machine

Lors de la définition du projet, il a été décidé avec le client que l’interface homme-machine serait à réaliser suivant l’avancement du projet. Lors de la révision du cahier des charges, nous avons jugé qu'il serait possible de développer l'interface.
L’IHM a pour but initial de faciliter l’utilisation de l’algorithme de cumul en proposant une interface graphique pour s'affranchir de l'invite de commande. Nous avons par la suite amélioré l’interface afin de permettre la validation et l’optimisation des résultats.
L’application s’articule en 3 temps :

étape 1 : Le choix des images que l'on souhaite traiter

Pour ajouter les images, on peut soit le faire depuis l’interface en parcourant l’arborescence ou par simple « drag and drop » depuis un explorateur de fichier. L’application dispose d’un filtre permettant de n’ajouter que des images, les types acceptés sont : .tif; .png; .jpg; .bmp. Au lancement du programme on recharge le dernier emplacement dans l’arborescence.
Une fois toutes les images ajoutées on passe dans une autre vue.

étape 2 : la désignation des points remarquables

Pour définir la courbe de croissance du poisson, l'utilisateur doit indiquer une ligne de mesure correspondant à la zone la plus significative de l'image.
Pour cela il désigne le centre de l'écaille puis une extrémité. L'algorithme va alors se baser entre ces deux points pour calculer la courbe de croissance. L’utilisateur peut, si il le souhaite, modifier le placement des points pour trouver le profil de croissance le plus significatif, la courbe de croissance s’actualise instantanément avec le déplacement des points remarquable. Dès que l’utilisateur juge que les points sont bien placés, il peut modifier la zone de travail pour visualiser plus précisément la courbe de croissance.

Le placement des points d'inflexion se fait automatiquement comme demandé dans le cahier des charges. Néanmoins, l’opérateur peut déplacer les points d'inflexion s’il juge qu'ils sont mal placés. Si les informations sont exactes, on peut passer à l’image suivante sinon il suffit de faire les modifications manuellement.
Une fois toutes les images traitées on passe à la dernière étape.

étape 3 : La génération des résultats

L’opérateur choisit où il souhaite enregistrer le fichier de sortie contenant les informations sur toutes les images traitées.
On peut conclure que l’interface est entièrement fonctionnel et permet l’utilisation croisé de l’algorithme de cumul ainsi que de l’expertise de l’opérateur.


Gestion de Projet

- Gantt

Le projet c’est décomposé en deux phases :
1er phase :
Les deux membres du binôme se sont concentrés sur la recherche d’algorithme de détections de circuli. Le choix des algorithmes définitifs retenus devait se faire en date du 16 octobre, seulement les résultats n’étant pas encore convaincants, nous avons poursuivi la recherche jusqu’au 8 novembre.
Le 8 novembre, nous avons rencontré notre client et choisi l’algorithme retenu.
Nous avions alors 3 semaines de retard sur le plan d’action qui ont été récupérées en n’utilisant qu’un algorithme. La tâche d’unification des algorithmes a été supprimée.

2ème phase :
Une personne s’est alors occupée de valider les résultats obtenus avec l’algorithme ainsi que la recherche des points d’inflexion.
L’autre membre a développé l’interface homme-machine pour permettre au client d’utiliser dans les meilleures conditions l’algorithme.


Notes d'application
sujet 1

"Principe de détermination des phases de croissances à partir d'une image d'écaille de Smolt.pdf?":

sujet 2

Développement d’une application OpenCV avec interface Qt


Bilan

- Etat d'avancemement

Tableau récapitulatif des points clés du projet :

Le programme développé répond à l’intégralité des critères demandés par le client, à savoir : le numéro de poisson, sa courbe de croissance ainsi que le positionnement des points d’inflexion.
Le temps de traitement est très inférieur au temps de traitement accordé par le client. Le programme affiche en temps réel les résultats.
Pour qualifier les résultats nous avions convenu d’une erreur sur le nombre de circulis or l’analyse avec la colorimétrie de l’image a permis de s’affranchir du comptage de ceux-ci, néanmoins, nous avons effectué un début de validation sur le positionnement des points d’inflexion qui étaient inférieurs à 10% pour les images testées.

- Analyse Critique

Le projet répond aux exigences du client, cependant la phase de recherche d’algorithme nous a pris beaucoup de temps pour finalement retenir une des premières méthodes de traitement essayé.
Nous avons fait preuve d’autonomie lorsque la recherche d’algorithme a commencé à stagner. Nous avons convenu d’un rendez-vous avec le client afin de revoir les objectifs sans quoi le projet n’aurait pas pu aboutir.
Les phases de tests ont été traitées que partiellement pars manque de temps. Il est nécessaire de refaire des phases de tests pour pouvoir s’affranchir du contrôle des résultats par l’opérateur.
Aujourd’hui, le projet est abouti mais il est possible d’apporter des modifications aux algorithmes afin de fiabiliser les résultats et pousser l’automatisation encore plus loin.

- Perspectives

Détection automatique des points remarquables : En cas d’amélioration du projet la détection en automatique des points d’inflexion permettrait d’automatiser entièrement le processus, mais pose le problème de savoir si l’algorithme effectue bien les mesures sur une partie correcte de l’écaille.

Analyse de plusieurs lignes de mesures : Pour fiabiliser les résultats, nous avons commencé à effectuer les relevés sur plusieurs lignes, mais le manque de temps nous a imposé de laisser cette amélioration pour un projet futur.

Amélioration du placement des points d’inflexion : La validation du placement a été effectuée sur un nombre restreint d’images ne permettant pas de valider le bon placement de ceux-ci dans toutes les circonstances.


Bibliographie

Site de la bibliothèque OpenCV : http://opencv.org/
Le site permet de télécharger la bibliothèque ainsi que de nombreux exemples de base.
Site du framework QT : http://qt-project.org/
Le site permet de télécharger le framework QT.

titre_20140122222232_20140122222246.png (49.8 KB) axel BARRIEUX, 04/08/2021 11:36 AM

ecaille_20130412093439_20130412093740.jpg (26.5 KB) axel BARRIEUX, 04/08/2021 11:41 AM

cnss_20130412112835_20130412112859.jpg (36.3 KB) axel BARRIEUX, 04/08/2021 11:44 AM

cdc_20140121182650_20140121184016.png (21.7 KB) axel BARRIEUX, 04/08/2021 11:46 AM

CdC_v2_20140121182650_20140121184027.PNG (23.5 KB) axel BARRIEUX, 04/08/2021 11:46 AM

ecaille_canny_20140121184948_20140121185012.png (132 KB) axel BARRIEUX, 04/08/2021 11:48 AM

ecaille_kernel_20140121184948_20140121185358.png (302 KB) axel BARRIEUX, 04/08/2021 11:49 AM

fft_20140121185530_20140121185832.png (191 KB) axel BARRIEUX, 04/08/2021 11:49 AM

pixel_20140121190645_20140121190804.png (113 KB) axel BARRIEUX, 04/08/2021 11:50 AM

formule_20140118150441_20140118150452.png (2.84 KB) axel BARRIEUX, 04/08/2021 11:50 AM

courbe_20140118151853_20140118151906.png (45.5 KB) axel BARRIEUX, 04/08/2021 11:51 AM

pts1_20140119113631_20140119113653.png (39.3 KB) axel BARRIEUX, 04/08/2021 11:51 AM

formule_reg_20140122173911_20140122173931.png (11.8 KB) axel BARRIEUX, 04/08/2021 11:52 AM

reg_20140119115643_20140119115725.png (24.6 KB) axel BARRIEUX, 04/08/2021 11:52 AM

reg_matlab_20140119162825_20140119162910.png (36.6 KB) axel BARRIEUX, 04/08/2021 11:53 AM

recurs1_20140119123601_20140119123835.png (23.6 KB) axel BARRIEUX, 04/08/2021 11:54 AM

recurs2_20140119123601_20140119123851.png (23.7 KB) axel BARRIEUX, 04/08/2021 11:55 AM

recurs3_20140119123601_20140119123906.png (22.6 KB) axel BARRIEUX, 04/08/2021 11:55 AM

infl1_20140119162548_20140119162603.png (21.9 KB) axel BARRIEUX, 04/08/2021 11:55 AM

infl2_20140119162548_20140119162622.png (20.1 KB) axel BARRIEUX, 04/08/2021 01:34 PM

pts_matlab_20140119163553_20140119163621.png (13.2 KB) axel BARRIEUX, 04/08/2021 01:34 PM

selectionImage_20140122225804_20140122225835.png (88.4 KB) axel BARRIEUX, 04/08/2021 01:35 PM

ptsRemarquable_20140122225804_20140122225855.png (345 KB) axel BARRIEUX, 04/08/2021 01:36 PM

courbeCroissance_20140122225804_20140122225911.png (167 KB) axel BARRIEUX, 04/08/2021 01:37 PM

generation_20140122225804_20140122225924.png (8.64 KB) axel BARRIEUX, 04/08/2021 01:38 PM

gantt_20140121233121_20140121233135.png (166 KB) axel BARRIEUX, 04/08/2021 01:39 PM

AppNote_ApplicationOpencvAvecInterfaceQt_JullienFrancois.pdf (412 KB) axel BARRIEUX, 04/08/2021 01:41 PM

avancement_20140121235255_20140121235347.png (32.4 KB) axel BARRIEUX, 04/08/2021 01:42 PM