\documentclass[a4paper, 12pt]{article}

\input{setup}
\input{pagedegarde}

\author{Marjorie ROSCIAN}
\title{Bancarisation des données de cytométrie : des profils optiques aux images}
\master{Master \\ Compétence Complémentaire en Informatique}
\encadrant{Gérald Gregori et David Nerini}
\date{\today}

\begin{document}
\pagedegarde

\newpage
\thispagestyle{empty}
\setcounter{page}{0}
\section*{Remerciements}

Avant tout autre chose, je tiens à remercier mes encadrants Gérald Gregori et David Nerini pour m'avoir une nouvelle fois fait confiance et permis de travailler avec eux sur des thématiques qui me plaisaient.\\

En cette année un peu particulière, avec un objectif un peu éloigné de la formation CCI et des rêves plein la tête, c'est ma coéquipière sans faille que je souhaite remercier, mon binôme et amie, Claire Ceresa. Je la remercie également d'avoir été mon secours Python durant tout le stage, sans elle, je crois que je n'aurais pas d'interface graphique correcte. \\

Pour l'aide et les conseils apportés, je remercie également Melilotus Thyssen et toute l'équipe de la plateforme PRECYM.\\
Je souhaite également remercier Jean-Luc Mari, Bertrand Estellon et Jean Sequeira qui m'ont apporté conseils et expertise durant la formation mais également durant le stage.\\

Finalement, un grand merci à l'équipe du MIO et surtout aux copains du bureau, Clément, Rémi, Ben et surtout à mon partenaire au travail et à la vie, Morgan.

\newpage
\thispagestyle{empty}
\setcounter{page}{0}
\tableofcontents

\newpage
\section{Introduction}

Les progrès technologiques de ces dernières années ont totalement révolutionné les études scientifiques, que ce soit à travers l'énorme quantité de données échantillonnées, leur qualité et/ou leur diversité. Cependant, ces nouvelles données soulèvent des problèmes de traitement. Les analyses sont extrêmement chronophages et requièrent un expert du domaine. Elles nécessitent également des méthodes adaptées en raison de leur nature multidimensionnelle (i.e vidéo échantillonnée selon l'espace et le temps). En conséquence, ces données sont généralement stockées en attendant un traitement ultérieur ou sont parfois analysées superficiellement. \\
Afin de résoudre ces problèmes, des logiciels avec des méthodes mathématiques et statistiques particulières sont développés pour automatiser ces analyses. L'objectif est, à terme, de ne plus monopoliser un expert et d'utiliser des outils numériques devenant de plus en plus autonomes (i.e machine learning). \\

Cependant, l'avancée de ces développements n'est pas homogène dans tous les domaines en raison notamment de la complexité de certaines données. Il est donc nécessaire de d'explorer et de développer des méthodes adaptées aux différentes données.

\subsection{Contexte du projet}

La cytométrie en flux est un domaine de la biologie qui s'intègre parfaitement la problématique des grands jeux de données et de l'automatisation de leur traitement.\\

En effet,cette méthode permet, en autres, d'étudier la dynamique des micro-organismes à hautes fréquences. Cette méthode est basée sur la séparation des cellules dans un flux d'eau et l'analyse de chacune d'elles via un faisceau laser. Pour chaque particule traversée par le laser, la diffusion de la lumière et les émissions de fluorescences (rouge, orange, jaune) sont mesurées. Ces mesures optiques sont des profils continus qui permettent de compter et d'identifier les différentes communautés présentes dans un échantillon. Récemment, une caméra est venue s'ajouter aux mesures du cytomètre. Elle détecte des cellules assez grandes et prend actuellement 150 photos par échantillon. Elle pourra, dans quelques temps, photographier plus de 1000 cellules par échantillon.\\

Actuellement, le traitement des échantillons de cytométrie est manuel et requiert un expert du domaine. De plus, le logiciel associé au cytomètre ne permet qu'une visualisation partielles des différentes variables (Figure~\ref{GGfig}). L'analyse est donc très chronophage et nécessite surtout une bonne connaissance des différentes caractéristiques des multiples communautés du milieu.\\

\begin{figure}[H]
\centering
\includegraphics[width=7.5cm]{GGsans}
\includegraphics[width=7.5cm]{GGavec}
\caption{Exemple de l'une des figures présentée par le logiciel du cytomètre avant (gauche) et après (droite) traitement manuel}
\label{GGfig}
\end{figure}

Dans ce contexte, la thèse d'Anthony Malkassian, soutenue en 2012, visait à étudier les assemblages planctoniques de l'Etang de Berre en développant une méthode mathématique semi-automatisée pour traiter ces données. Depuis ces premiers résultats, de nombreux scientifiques ont essayé de trouver une technique efficace pour automatiser la classification des groupes. Certains ont créé des packages sous R, avec plus ou moins d'efficacité, et d'autres ont testé et comparé les résultats sur différents types de données.\\

Dans ce cadre, le projet visait à travailler de nouveau sur le développement d'un programme automatisé en incluant les nouvelles connaissances et des techniques d'analyses fonctionnelles encore peu utilisées aujourd'hui, et ce, en se basant sur les travaux de la thèse d'Anthony Malkassian.

\subsection{Présentation de l'entreprise}

Le Mediteranean Institute of Oceanography (M.I.O) est un laboratoire d'océanographie situé à Marseille et à Toulon. C'est une unité mixte de recherche des Universités d’Aix-Marseille, de Toulon, du CNRS et de l’IRD. Il fait partie de l'institut OSU Pytheas qui lui même regroupe plusieurs laboratoires liés aux sciences de l'environnement (i.e CEREGE, IMBE).\\

Cinq équipes sont définies au sein du M.I.O et travaillent dans les domaines de l'écologie, la biologie, la biodiversité, l'halieutique la modélisation, la physique, la chimie, la biogéochimie, la sédimentologie ou encore la microbiologie. \\
Les objectifs du M.I.O sont principalement de mieux comprendre le système océanique et son évolution en réponse au changement climatique global au travers de l'étude de la circulation océanique et atmosphérique mais également de l'étude des écosystèmes marins et de la biodiversité ou encore de la pollution. \\

Dans ce laboratoire, l'équipe CYBELE (CYcles BiogEochimiques et rôLE fonctionnel des assemblages de micro-organismes planctoniques) travaille sur le rôle fonctionnel des groupes planctoniques majeurs dans les cycles biogéochimiques marins. Leur objectif est d'améliorer la compréhension du cycle de certains éléments comme le carbone ou l'azote dans la colonne d'eau et d'étudier les interactions entre les structures planctoniques et les cycles biogéochimiques. \\

Une plateforme de cytométrie pour la microbiologie, nommée PRECYM, a été mise en place au sein du laboratoire. La plateforme PRECYM a pour but de travailler dans le domaine de la microbiologie en général. Cette plateforme comprend tous les outils nécessaires pour l’analyse à l’échelle individuelle des micro-organismes : identification, tri, dénombrements, physiologie, viabilité, activités.

\subsection{Problématique}

A la suite de la thèse d'Anthony Malkassian, des premiers résultats positifs sont apparus quant à l'efficacité de l'utilisation de l'analyse fonctionnelle, c'est à dire de l'ensemble des profils en tant que courbe, pour dénombrer et identifier les communautés planctoniques passées dans le cytomètre. 
Depuis, la problématique de l'automatisation n'a cessé d'augmenter avec le perfectionnement des outils et l'acquisition de plus en plus de données. Avec un traitement manuel, des fichiers sont traités bien longtemps après alors que certaines communautés sont toxiques et peuvent poser des problèmes de santé publique. L’automatisation du traitement des échantillons est donc essentiel pour la compréhension des communautés planctoniques, à la base des réseaux trophiques, mais également pour la prévention de la contamination de l'eau. 

C'est pourquoi, la problématique du stage était dans un premier temps de développer un logiciel qui automatise l'analyse des fichiers en utilisant une méthode de classification des groupes adaptée.\\
Dans un second temps, l'objectif était d'inclure et de traiter les images produites par le cytomètre, non utilisées actuellement, pour inclure leur information dans la détection des différentes communautés.

\section{Cahier des charges}

On souhaite utiliser un logiciel (sous format .exe) qui analyse d'un fichier CSV avec un programme en Python. Dans ce logiciel, on aura un bouton pour importer un fichier .CSV obtenu par le logiciel associé au cytomètre. On pourra préciser en cochant une case de quel type de cytomètre il s'agit pour lancer le programme correspondant aux caractéristiques particulières du cytomètre. On aura un autre bouton qui lancera l'analyse en python en arrière plan. Enfin, un dernier bouton permettra, si elles existent, de sélectionner le dossier dans lequel se trouvent les photos associées au fichier (Figure~\ref{princ}). \\

\begin{figure}[H]
\begin{center}
\begin{tikzpicture}
\draw [color=black](5,10) rectangle (20,2) ;
\draw (13,9) node {PhytoClus Software};
\draw (8, 7) node {Fichier CSV};
\draw (8, 5) node {Cytomètre};
\draw (11.5, 5.7) node {Type 1};
\draw (11.5, 4.7) node {Type 2};
\draw (8, 3) node {Dossier d'images};
\draw [color=blue](10,7.5) rectangle (14,6.5) ;
\draw [color=blue](10,6) rectangle (10.5,5.5) ;
\draw [color=blue](10,5) rectangle (10.5,4.5) ;
\draw [color=blue](10,3.5) rectangle (14,2.5) ;
\draw [color=blue](15,6) rectangle (19,4.5);
\draw (17, 5.2) node {START};
\end{tikzpicture}
\end{center}
\caption{Modèle de la fenêtre d'affichage principale du logiciel}
\label{princ}
\end{figure}

Une fois l'analyse lancée, une fenêtre de dialogue s'ouvrira ainsi qu'un graphique permettant à l'utilisateur de choisir le nombre de groupes de cellules qui lui parait pertinent grâce aux informations du graphique. Dans cette boite de dialogue, seul des nombres pourront être entrés et un bouton Valider permettra d'enregistrer la valeur et de lancer la suite du programme (Figure~\ref{group}). \\

\begin{figure}[H]
\begin{center}
\begin{tikzpicture}
\draw [color=black](5,10) rectangle (15,7) ;
\draw (8,9.5) node {Nombre de groupes souhaité :};
\draw [color=green](5.2,9) rectangle (14.5,8.3) ;
\draw [color=blue](9,8) rectangle (11.5,7.3) ;
\draw (10.25,7.6) node {Valider};
\end{tikzpicture}
\end{center}
\caption{Modèle de la fenêtre de dialogue du choix du nombre de groupes}
\label{group}
\end{figure}

Pour finir, les graphiques de résultats s'afficheront ainsi qu'une fenêtre contenant un tableau récapitulatif des résultats (Figure~\ref{tab}). Dans la fenêtre du tableau, il y aura un bouton qui permettra de valider l'analyse et ainsi de l'envoyer dans la base de données. Un deuxième bouton permettra d'invalider et d'annuler l'analyse effectuée pur une modification manuelle.\\

\begin{figure}[H]
\begin{center}
\begin{tikzpicture}
\draw [color=black](5,10) rectangle (20,4) ;
\draw (13,9.5) node {Tableau récapitulatif};
\draw [color=black](5,9.25) -- (20,9.25) ;
\draw [color=black](5,8.25) -- (20,8.25) ;
\draw [color=black](5,7.25) -- (20,7.25) ;
\draw [color=black](5,6.25) -- (20,6.25) ;
\draw [color=black](5,5.25) -- (20,5.25) ;
\draw [color=black](7.5,5.25) -- (7.5,9.25) ;
\draw [color=black](8.5,5.25) -- (8.5,9.25) ;
\draw [color=black](9.5,5.25) -- (9.5,9.25) ;
\draw [color=black](10.5,5.25) -- (10.5,9.25) ;
\draw [color=black](11.5,5.25) -- (11.5,9.25) ;
\draw [color=black](12.5,5.25) -- (12.5,9.25) ;
\draw [color=black](13.5,5.25) -- (13.5,9.25) ;
\draw [color=black](14.5,5.25) -- (14.5,9.25) ;
\draw [color=black](15.5,5.25) -- (15.5,9.25) ;
\draw [color=black](16.5,5.25) -- (16.5,9.25) ;
\draw [color=black](17.5,5.25) -- (17.5,9.25) ;
\draw [color=black](18.5,5.25) -- (18.5,9.25) ;
\draw [color=black](19.5,5.25) -- (19.5,9.25) ;
\draw [color=blue](7,5) rectangle (12.5,4.2) ;
\draw [color=blue](13,5) rectangle (18.5,4.2) ;
\draw (9.7,4.6) node {Valider et envoyer};
\draw (16,4.6) node {Annuler l'analyse};

\end{tikzpicture}
\end{center}
\caption{Modèle de tableau résumé de l'analyse des données}
\label{tab}
\end{figure}

Pour aller plus loin, le bouton permettant l'ajout des images sera systématiquement testé et les images traitées à la suite du programme principal. Les images ainsi identifiées apparaîtront séparément avec le nom de l'espèce identifiée en en-tête. \\

Si une espèce toxique est détectée, dans le programme ou dans l'analyse des images, une fenêtre d'alarme s'ouvrira pour la signaler (Figure~\ref{toxique}).\\

\begin{figure}[H]
\begin{center}
\begin{tikzpicture}
\draw [color=black](5,10) rectangle (15,7) ;
\draw (10.5,8.7) node {Attention : une espèce toxique a été détectée};
\draw [color=red](5.2,8.5) -- (6.2,8.5) ;
\draw [color=red](5.2,8.5) -- (5.7,9.5) ;
\draw [color=red](6.2,8.5) -- (5.7,9.5) ;
\draw [color=black, line width = 2pt](5.7,8.7) -- (5.7,9.3) ;
\fill [black] (5.7,8.58) circle (0.08cm) ;
\draw [color=blue](9,8) rectangle (11.5,7.3) ;
\draw (10.25,7.6) node {J'ai compris !};
\end{tikzpicture}
\end{center}
\caption{Modèle de fenêtre d'alarme indiquant la détection d'une espèce toxique}
\label{toxique}
\end{figure}

Pour le développement du programme, il sera en partie basé sur les codes R d'Anthony Malkassian. Ces codes seront revus, traduits en Python, automatisés et modifiés pour mieux répondre à la problématique de classification des données. Ainsi, il s'agit là d'une recherche de nouvelles méthodes de classification qui pourraient correspondre aux données de cytométrie. \\
Pour cela, l'algorithme général consiste à traiter l'ensemble des cellules du fichier, en triant leurs profils. Ces profils sont plongés dans une base de Fourier. Les coefficients seuls vont ensuite être utilisés pour caractériser de façon continue les profils et c'est sur ces coefficients que les réductions de dimension (Analyse en Composante Principale, Multi-Dimensional Scaling ou autre) et les classifications (Classification Ascendante Hiérarchique, Model-Based Clustering) vont être réalisées. Les graphiques résultats obtenus seront projetés lors de l'exécution du programme et les statistiques résumées seront affichées dans la fenêtre tableau à la fin.\\

Dans la mesure du possible, la structure de la base de données et de son interface (PHP) sur le serveur local sera revue et améliorée pour être plus lisible et rendre le code plus pérenne dans le temps. Concernant l'interface, le passage d'un code linéaire à un modèle de type Modèle Vue Contrôleur (MVC) est envisagé.\\

\section{Travail effectué}

Tout d'abord, la première étape consistait à se familiariser avec les travaux de thèse d'Antony Malkassian, ses objectifs ainsi que ses codes R. Il a également fallu comprendre les besoins de l'équipe de cytométrie et leurs attentes.\\

Parallèlement à cela, l'apprentissage de Python via les ressources du web a été nécessaire. Pour réaliser ce travail, j'ai choisi d'installer Pycharm comme IDE et j'ai du apprendre à le paramétrer. Ainsi, les codes R d'Anthony ont dans un premier temps été simplement traduis en Python. Les fonctions utilisées sous R ont dans un premier temps été recherchées ou codées en Python. Dans un second temps, l'utilisation du package rpy2 a permis d'utiliser les fonctions R sur Python, dont les codes sont plus optimisés en terme de temps de calculs. \\
A partir de cela, le code a été modifié pour supprimer les répétitions d'instructions et automatiser le traitement d'origine. \\

Après recherche, j'ai commencé à revoir les méthodes statistiques utilisées pour classer les cellules planctoniques passées au cytomètre. Ainsi, au lieu de traiter les profils comme des courbes séparées, j'ai commencé par les grouper pour les traiter comme un seul bloc identifiant une cellule. \\
Ensuite, j'ai testé une première méthode de classification proche de celle qu'avait utilisée Anthony. Alors que les résultats étaient prometteurs pour des fichiers de tests factices et de petites tailles, il s'est avéré impossible de traiter un fichier réel avec cette méthode en raison d'un nombre de cellules trop important engendrant des erreur de mémoire lors des calculs. \\
Une seconde méthode a alors été testée pour contrer ce problème. Cette méthode évitait les calculs trop volumineux et pour un temps de calcul beaucoup plus faible, on pouvait alors passer toutes les cellules. \\

J'ai ensuite travaillé avec mon encadrant, Gérald Gregori, pour déterminer de quelle manière je devais afficher les résultats afin qu'il puisse les comprendre et les interpréter. Une fois la visualisation terminée, nous avons pu ensemble travailler sur la validation de la méthode.\\

D'un autre côté, j'ai utilisé le logiciel Qt Designer pour générer les fenêtres demandées pour le logiciel. Tout d'abord, je me suis intéressée à la création de la fenêtre principale et à la liaison des fonctions principales de chargement des fichiers avec le programme. J'ai également implémenté le bouton de lancement du programme. Ensuite, j'ai travaillé sur la communication et les affichages entre le logiciel et l'utilisateur. Finalement, je me suis intéressée à l'affichage des résultats et notamment à la fenêtre contenant le tableau résumé qui allait ensuite être implémenté dans la base de données.\\

Pour traiter les images, j'ai commencé par créer une macro sous ImageJ qui applique le même traitement à toutes les images d'un dossier. Ce traitement permettait d'obtenir une image binaire du contour de chaque objet. \\
Afin de transférer et d'automatiser le traitement via le logiciel, j'ai souhaité traduire cette macro en OpenCV. Pour cela, il a fallu que je me familiarise avec OpenCV sous python via le package cv2. \\

A partir des contours obtenus, j'ai codé l'algorithme de Freeman qui permet d'enregistrer la position d'un pixel du contour relativement à celle du précédent. Les positions sont enregistrées sous forme de chaîne. Ensuite, j'ai reconstitué ces contours à partir des chaînes et je les ai traiter comme des courbes fermées en les plongeant dans une base de Fourier, de la même manière que pour les profils optiques. Pour la suite des analyses, je n'ai utilisé que les coefficients de Fourier. \\
D'un autre côté, j'ai détouré des images déjà identifiées de plusieurs espèces dans différentes positions et j'ai créé un dictionnaire de référence associant à chaque espèce le ou les contours qui la représentent. \\
J'ai ensuite programmé une analyse procruste ordinaire (OPA) qui compare chacune des formes du dossier au dictionnaire de référence. En choisissant la distance minimale entre la forme a identifier et les références, je pouvais ainsi identifier l'espèce.


\section{Résultats}

\subsection{Interface graphique}

A l'aide de Qt Designer, j'ai pu réaliser une interface graphique selon les critères à respecter dans le cahier des charges. J'ai donc créé un programme avec une fenêtre principale, qui s'ouvre en exécutable et codé à l'aide de PyQt (Figure~\ref{principale}). J'ai intégré une entête qui explique d'où vient le programme. J'ai également ajouté une partie avec des instructions. En effet, je me suis aperçue des défauts de certains fichiers au moment de lancer le programme. En attendant de programmer toutes les exceptions, j'ai choisi de préciser les formats des fichiers .CSV à entrer ainsi que le formatage des noms des images. Si ces points ne sont pas respecter le programme s'arrête.\\
J'ai également ajouté le choix du type de cytomètre utilisé pour lancer des programmes prenant en compte les spécificités de chacune des machines. La sélection lance l'un ou l'autre et l'absence de sélection lance le premier par défaut. \\

\begin{figure}[H]
\centering
\includegraphics[width=17cm]{CaptureLogiciel}
\caption{Fenêtre principale du logiciel}
\label{principale}
\end{figure}

\vspace{0.3cm}
J'ai inclus un bouton permettant de rechercher un fichier .CSV dans son ordinateur (Figure~\ref{csv}). Ce bouton enregistre le chemin qui mène au fichier et le programme en extrait le nom pour la lecture. \\
Dans un second temps, j'ai inclus le bouton qui recherche le dossier menant aux images, s'il existe (Figure~\ref{img}). L’absence de sélection d'un dossier n'empêche pas le programme de se lancer correctement. \\

\begin{figure}[H]
\centering
\includegraphics[width=13cm]{CaptureCSV}
\caption{Utilisation du bouton de recherche d'un fichier CSV}
\label{csv}
\end{figure}

\begin{figure}[H]
\centering
\includegraphics[width=13cm]{CapturePhoto}
\caption{Utilisation du bouton de recherche d'un dossier d'images}
\label{img}
\end{figure}

Finalement, le bouton Start lance le programme sélectionné.\\


\subsection{Programme de classification}

Tout d'abord, les 4 profils sont convertis en courbes continues en les plongeant dans une base de Fourier. A partir des coefficients obtenus, on calcule les puissances de Fourier pour chacune des courbes. Ces puissances sont ensuite agencées à la suite pour les 4 courbes et une ACP est effectuée sur la matrice obtenue. En prenant les 3 premières composantes principales de l'ACP, représentant plus de 80\% de la variance, on effectue une recherche du nombre de groupe optimal. Pour cela, on effectue une classification avec un Model Based Clustering. Une fenêtre graphique s'ouvre alors ainsi qu'une boite de dialogue demandant le nombre de groupe souhaité à partir du critère du BIC (Figure~\ref{BIC}).\\
Pour choisir le nombre de groupes optimal, on cherche alors le plateau de la courbe la plus haute et on essaie de déterminer à partir de quel nombre de groupes la différence de valeur n'est plus significative. Ainsi, dans la figure \ref{BIC}, le nombre de groupe optimal est situé juste après le début du plateau soit, entre 4 et 5 groupes. En effet, 4 groupes étaient présents dans l'échantillon et le cinquième groupe représente le groupe des valeurs aberrantes compris dans l'utilisation de cette classification.

\begin{figure}[H]
\centering
\includegraphics[width=11cm]{CaptureBIC}
\caption{Exemple d'affichage du critère du BIC après la classification par Model Based Clustering et de la fenêtre de dialogue associée.}
\label{BIC}
\end{figure}

Une fois le nombre de groupe sélectionné, le programme continue son exécution jusqu'à la fin (Figures~\ref{4groupes} et \ref{8groupes}).\\

Une deuxième affectation des points, après calcul de la plus petite distance selon l'orientation, a été testée (Figure~\ref{8groupes}). Le but était d'éliminer l'effet de la position de la cellule au passage à travers le faisceau, générant ainsi des groupes factices. Ces groupes auraient identifié les mêmes espèces ayant traversé le faisceau dans une autre position et auraient faussé les résultats. \\

Les résultats sont présentés sous forme d'une série de 4 graphiques appelés cytogrammes. Ces cytogrammes ont été choisis avec Gérald Grégori selon des critères particuliers d'identification des espèces. \\
 
Dans un premier temps, j'ai travaillé avec un fichier test utilisant 4 groupes déjà connus (Figures~\ref{4groupes}) comprenant 3893 cellules. Les cytogrammes obtenus dans ce cas là montrent que la classification est cohérente et semble correspondre aux communautés planctoniques choisies pour l'échantillon.\\

\begin{figure}[H]
\centering
\includegraphics[width=17cm]{Figure_1}
\caption{Cytogrammes obtenus pour un fichier test généré avec 4 groupes}
\label{4groupes}
\end{figure}

Lorsque la double affectation des points est calculée, le résultat n'est plus cohérent. Seulement 3 groupes ressortent contre 4 normalement. En effet, on peut voir sur la figure \ref{3groupes} que les deux groupes les plus à gauche ont alors fusionné. La double affectation ne donne donc pas de meilleurs résultats et n'est donc pour le moment pas conservée.

\begin{figure}[H]
\centering
\includegraphics[width=17cm]{Figure_1_ter}
\caption{Cytogrammes obtenus après la double affectation pour un fichier test généré avec 4 groupes}
\label{3groupes}
\end{figure}

Dans un second temps, j'ai utilisé un fichier réel séparé en 11 groupes, soit 123 184 cellules. Ce fichier est d'abord traité comme s'il n'y en avait que 8 en supprimant notamment le groupe le plus abondant (24 175 cellules traitées). Le nombre de groupe et la répartition de ces derniers sur les cytogrammes semblent également cohérents par rapport aux résultats obtenus manuellement. Le programme trouve 9 groupes, c'est à dire 8 groupes plus un groupe de valeurs aberrantes. Ces résultats sont corrects et les groupes identifiés sont cohérents avec ce qui est analysé par l'expert. Néanmoins, la visualisation de tous les groupes restent difficiles. Cela est notamment dû à la superposition des groupes pour les variables sélectionnées.\\

\begin{figure}[H]
\centering
\includegraphics[width=17cm]{Figure_8}
\caption{Cytogrammes obtenus pour 8 groupes après classification et sans double affectation}
\label{8groupes}
\end{figure}

Finalement, lorsque la totalité du fichier est analysé, les résultats deviennent instables. Tout d'abord, le nombre de groupe identifié va difficilement au delà de 8 ou 9, et ce résultat est approximatif et plutôt aléatoire. Ainsi, sur la figure \ref{BIC11} on peut voir que choisir 6 ou 10 groupes ne change pas de manière significative pour le critère du BIC. Un utilisateur n'ayant aucune idée de ce qui se trouve dans le fichier ne pourra donc pas choisir 10 groupes, le plateau étant à partir de 6. Pour exemple, on a donc choisi de sélectionner uniquement 6 groupes et de regarder en détails les superpositions (Figure~\ref{ex10gps}). 

\begin{figure}[H]
\centering
\includegraphics[width=12cm]{BIC11}
\caption{Graphique du critère du BIC obtenu lorsque le fichier contient 10 groupes}
\label{BIC11}
\end{figure}

En conclusion, on suppose que la méthode de classification utilisée n'est pas stable au delà de 9 groupes. Ainsi, même en forçant la recherche jusqu'à 16 groupes, ce qui correspond à la réalité des données biologiques, le modèle identifie difficilement plus de groupes sans avoir de superpositions aberrantes. Cette méthode de classification n'est donc pas viable pour ce type de données, à moins d'être sûr qu'il n'y a pas plus de 8 espèces dans l'échantillon.\\

\begin{figure}[H].
\centering
\includegraphics[width=12cm]{Figure_10-1}\\
\includegraphics[width=12cm]{Figure_10-3}
\caption{Cytogrammes du fichier complet où seulement 6 groupes sur 10 sont identifiés}
\label{ex10gps}
\end{figure}

Le tableau final s'affiche et comporte un résumé des analyses effectuées, comme attendu au départ. Le bouton d'implémentation dans la base de données n'est pour le moment pas fonctionnel, le programme de classification devant être encore amélioré avant de pouvoir intégrer les résultats à la base de données.

\begin{figure}[H]
\centering
\includegraphics[width=16cm]{CaptureTableau}
\caption{Fenêtre d'affichage finale contenant le tableau résumé des valeurs statistiques à envoyer dans la base de données}
\label{tableauresume}
\end{figure}


\subsection{Traitement d'images}

La macro créé sous ImageJ a permis dans un premier temps de détourer les images de cytométrie quand cela était possible (Figure \ref{macroIJ}). En effet, certaines images n'ont pas pu être correctement détourées à cause de leur qualité et du niveau de netteté.\\

D'une part, on constate que le contour de l'image A et celui de l'image B sont très proches alors qu'il s'agit d'une cellule vivante et d'une bille de calibration. Cette ressemblance ne permet pas de distinguer l'un ou l'autre des contours et toutes les cellules de type "rondes" vont être associées. C'est également le cas pour les cellules dont les formes sont très proches et dont seul un détail permet de les distinguer. Malheureusement, la qualité actuelle des images ne permettra pas d'améliorer le résultat pour le moment. \\ 

D'autre part, les cellules pouvant passer dans différentes positions sous le faisceau laser ou parfois même en agglomérats, une même espèce peut être représentée par plusieurs contours assez différents. C'est le cas des images E, H et I de la figure \ref{macroIJ}. Alors que l'espèce présente sur l'image est normalement un "bâton" unique, elle se présente souvent agglomérée par deux sous forme de "V". L'image I est en fait une agglomération de 4 individus de cette même espèce. Il faut donc considérer pour chaque espèce toutes les positions les plus fréquemment retrouvées dans les données. Ce travail est long et requiert la participation d'un expert qui aidera à la fois à l'identification mais également à la sélection des formes de référence. Ce travail a néanmoins déjà été commencé pour tester les reconnaissances des formes principales. \\

\begin{figure}[H]
\centering
\includegraphics[width=17cm]{macroIJ}
\caption{Exemples d'images brutes et d'images détourées par la macro créée sous ImageJ \\
A : cellule; B : bille de calibration; C : ??, D : \textit{Pseudo-nitzschia}; E, H, I : ??; F : larve; G : \textit{Dinophysis}; J : cellule}
\label{macroIJ}
\end{figure}

Une fois détourées, les images sont importées sous Python et le contour est redessiné grâce à l'algorithme de Freeman qui permet d'obtenir une chaîne de code contenant uniquement l'information du contour. Ce contour est ensuite comparé aux contours de référence créés à partir des images déjà identifiées (Figure~ref). \\

Pour cela, chaque chaîne de code est transformée en courbe par passage dans la base de Fourier et l'analyse se fait sur les coefficients de Fourier obtenus. Une analyse procustéenne ordinaire est alors réalisée, c'est à dire qu'on s'affranchit des paramètres de translation, de rotation et de dilatation pour ne garder que la forme de l'objet et minimiser la distance qui sépare les deux formes. On choisit ensuite la plus petite distance et on associe le nom de l'espèce de référence au contour trouvé. Lorsque toutes les images sont passées, on affiche les images avec les noms des espèces identifiées et un expert peut valider ou non les résultats. \\

FIGURE D IDENTIFICATION DES ESPECES \\




\section{Problèmes rencontrés}

Avant toutes choses, la première difficulté a été de s'intégrer dans un projet datant de 2012, avec les données laissées en l'état après la thèse par Anthony. Même si avec le manuscrit la compréhension de ce qu'il faisait a été facilitée, la lecture du code ne l'a pas été. En effet, le code R avait été écrit pour lui-même et les noms des variables ne rendaient pas le code lisible. Il a donc fallu du temps pour prendre en main son travail et se l'approprier.\\

De plus, le langage Python était pour moi totalement inconnu. Dans le laboratoire où j'ai travaillé, personne n'était en mesure de m'aider en cas de blocage sur le code ou sur les problèmes de compatibilité entre les versions de Python, de Ubuntu, de Pycharm etc. J'ai donc passé de longues heures sur le web pour trouver ou non des réponses à mes questions. Certains ajustements du code et de la représentation graphique, que ce soit pour le logiciel ou les sorties graphiques auraient certainement pu être effectués si j'avais eu un programmeur avisé en Python. \\
L'apprentissage et la traduction du code d'Anthony ont donc été plus chronophages que prévu. Finalement, c'est le package rpy2, permettant d'interfacer R sous Python qui a sauvé mon stage. J'ai ainsi compris l'intérêt de chacun et l'association intelligente des deux parties. \\

Une fois le langage Python relativement maîtrisé et le code d'Anthony traduit, il a fallu rechercher les méthodes de classifications qui allaient améliorer le traitement des données et automatiser le tout. L'automatisation n'a posé de problème que lorsque je me suis rendue compte que pour que le programme fonctionne de manière optimale, l'utilisateur devait forcément intervenir. Il était irréaliste de penser que, actuellement, la totalité de l'analyse pouvait se faire sans l'aide d'un utilisateur. De plus, l'amélioration de l'analyse statistique s'est révélée assez difficile. J'ai testé une première méthode choisie avec mon second encadrant David Nerini mais cette méthode limitait le nombre de cellules traitées à environ 20 000. Or, les fichiers "réels" peuvent dépasser les 200 000 cellules assez facilement. Il a donc fallu choisir entre trouver une méthode qui permettent de tirer de manière efficace 20 000 cellules à traiter représentant correctement l'échantillon, ce qui est mathématiquement assez complexe, ou trouver une autre méthode qui ne nécessite pas des calculs saturant l’ordinateur. \\ 
Le temps de calcul et la saturation de l'ordinateur pour un échantillonnage trop faible étant difficilement envisageable, il a fallu reprendre l'analyse statistique. Là encore, j'ai re-travaillé avec mon encadrant statisticien pour trouver une méthode qui paraissait correcte. \\ 
Néanmoins, l'utilisation du Model Based Clustering semble limiter le nombre de groupes observés à 9. Au delà, la différence au niveau du critère BIC n'est pas significative, et à moins de savoir combien il y a d'espèces dans le fichier, il est impossible d'en identifier le bon nombre. La méthode est donc encore à revoir pour les gros fichiers. Cependant, cette méthode a permis de passer outre la saturation de la mémoire de l’ordinateur et de diminuer le temps de calcul. Il semble que cela reste une piste à conserver pour la suite du projet.\\

Concernant l'analyse d'images, j'avais au préalable discuté de la méthode à adopter pour détourer correctement les images sous ImageJ avec Jean Sequeira. Grâce à ses conseils, j'ai pu créer rapidement une macro plutôt satisfaisante pour une grande majorité des images. Cependant, les images sont de très faibles qualités, souvent floues et de petites tailles. De plus, une barre d'échelle est systématiquement incrustée sur l'image et coupe parfois la cellule. Il a donc fallu trouver un juste milieu et accepter le fait que toutes les images ne pourraient être utilisées. Dans ce cas là, j'ai pris la décision de considérer que si parmi toutes les images d'un fichier on trouvait au moins une fois une espèce, et que l'image était validée par un expert, on pouvait considérer que l'espèce était présente dans l'échantillon. De plus, la macro ImageJ ne pouvait être utilisée dans le logiciel directement. J'ai donc commencer à apprendre à utiliser OpenCV pour traduire la macro dans ce langage. Malheureusement, les fonctions de transformations codées sous ImageJ ne sont pas toutes présentes sous OpenCV. J'ai donc  choisi de séparer le traitement en 2 étapes : le détourage via la macro ImageJ puis le traitement sous OpenCV. Finalement, le problème rencontré avec ces images vient surtout du fait qu'il parait actuellement impossible de distinguer certaines espèces d’intérêt majeur puisque certaines sont toxiques et d'autres ne le sont pas.\\

\section{Conclusion}

Ce stage avait pour objectif de développer un logiciel de traitement automatisé des données de cytométrie. Jusqu'à aujourd'hui, les groupes de d'espèces sont dénombrés et identifiés à la main par un expert, ce qui est chronophage et qui pose des problèmes d'objectivité de l'observateur. L'objectif était donc d'automatiser cette analyse en s'appuyant sur des critères de classification mathématiques. Il fallait également développer une interface graphique simple pour les utilisateurs et intégrer, dans la mesure du possible, l'analyse des images. Ces dernières sont simplement stockées dans une base de données pour une utilisation ponctuelle. \\

Au travers de ce projet, j'ai appris à m'intégrer dans un projet déjà en cours, notamment dans une plateforme technique dont les besoins sont bien précis. J'ai également appris à reprendre un travail déjà entamé, avec les contraintes de lecture de code et de transposition dans un autre langage. 
L'apprentissage de Python, de OpenCV et de PyQt ont été longs et difficiles, n'ayant personne pour m'encadrer à ce niveau là. Néanmoins, j'ai été autonome et j'ai fait en sorte de m'adapter à ce qu'il était possible de faire. \\

Dans ce projet, l'automatisation était la clé. Cependant, pour un fonctionnement optimal, l'intervention de l'utilisateur s'est révélée indispensable. \\

Pour aller plus loin, la question qui se pose actuellement est de savoir si, plutôt que d'essayer de forcer la machine pour qu'elle s'adapte à la biologie, il ne serait pas plus efficace de modifier les protocoles d'acquisition des données de biologie. En effet, si le programme fonctionne bien pour de petits nombres de groupes mais pas au delà de 9, on peut se demander s'il ne serait pas plus efficace de revoir la manière dont les échantillons sont analysés par le cytomètre. L'idée ici serait de faire 2 séries de mesures au lieu d'une, avec d'une part les petites cellules, qui sont souvent beaucoup plus abondantes, et d'autre part les grosses cellules, qui peuvent en partie être photographiées.\\
D'autres méthodes peuvent également encore être testées et l'idéal serait d'intégrer un réseau de neurone dans l'identification des groupes. Les nombreuses données déjà traitées permettraient de faire apprendre au programme comment identifier correctement les groupes et son efficacité et sa précision pourrait rapidement augmenter. \\
L'intégration du traitement des images n'est encore qu'un début, et nous sommes aujourd'hui limités par la qualité des images qui ne permettent pas une assez grande précision des contours pour identifier des différences entre certaines cellules. Néanmoins, le progrès technologique dans cette partie là est en cours et on peut espérer qu'en plus de prendre beaucoup plus de photos par fichier, la qualité pourra rapidement s'améliorer pour pouvoir aider à la détection des espèces et notamment celle des espèces toxiques.\\

\end{document}