Le Deep Learning pour accélérer le diagnostic par imagerie médicale

Les avancés de l’Intelligence Artificielle sont vouées à bouleverser le monde de la santé. Nous présentons ici un exemple d’application du Deep Learning en imagerie médicale dans le cadre du Challenge Kaggle Data Science Bowl 2018.
Depuis 2014, le populaire challenge kaggle Data Science Bowl (DSB) a lieu tous les ans autour d’un défi de la santé. Pour l’année 2018 le Data Science Bowl a réuni de nombreux Data Scientist du monde entier pour s’attaquer à un des plus grands défis pour les biologistes et médecins : concevoir un algorithme de segmentation d’image pour automatiser la détection des noyaux dans les cellules biologiques.
Ce n’est pas par hasard que la segmentation est devenue un sujet d’actualité dans le traitement des images médicales.
La plupart des 30 milliards de cellules du corps humain contient un noyau rempli d’ADN, le code génétique qui programme chaque cellule. L’identification des noyaux des cellules est donc un point de départ important pour de nombreuses analyses médicales. L’identification des noyaux permet aux chercheurs d’isoler chaque cellule individuelle d’un échantillon, et suivre leur réaction à différents traitements. Ainsi, les chercheurs et les médecins peuvent comprendre les processus biologiques sous-jacents et accélérer le diagnostic médical.
Imaginez accélérer la recherche et le développement pour un grand nombre de maladies, du cancer du poumon aux maladies rares en passant par les maladies cardiaques. Chaque année des milliers de personnes en France et des millions dans le monde pourraient être sauvées s’ils avaient accès à un diagnostic plus rapide et précis de leur maladie.

Figure 1 : Challenge Kaggle DSB 2018, Objectifs et motivations. Source : https://www.kaggle.com/c/data-science-bowl-2018
A Quantmetry, impossible pour nous de manquer un tel challenge. Nous avons donc constitué une équipe de Data scientist pour y participer.
Présentation du DSB 2018
1.Objectif
Il s’agit d’un problème de segmentation d’image difficile car il est question de détecter des objets parfois très peu semblables sur des fonds différents, avec le risque de confondre plusieurs objets (noyaux) distincts avec un unique objet. Nous verrons par la suite comment ce problème a pu être résolu par les approches mises en place.

Figure 2 : Exemple d’image d’entrée pour le model (à gauche) et de masque d’apprentissage (à droite)
2. Caractéristiques du jeu de données
Une difficulté liée aux données réside dans l’hétérogénéité des images. En effet, les images sont très variées, présentent différents grossissements, différentes colorisations des noyaux et contiennent différents types cellulaires, comme on peut le voir sur la figure 3. De plus, nous disposons pour ce challenge de relativement peu de données : 673 images d’entraînement avec une majorité dominante (60%) pour les images à fond noir (cf figure 3 droite).
Plusieurs stratégies vont donc s’imposer pour pallier ces déséquilibres et cette taille de jeu de donnée.

Figure 3 : Exemple d’images du Dataset kaggle du DSB 2018.
3. Métrique d’évaluation
La métrique proposée par Kaggle est intéressante, car elle répond à une préoccupation double : nous souhaitons à la fois détecter et compter les cellules, mais aussi en déterminer le contour précis. Pour cela, la détection d’un noyau est principalement fondée sur un calcul d’IoU (Intersection over Union), une métrique classique en traitement d’image. On
dispose ainsi d’un indicateur permettant de déterminer si la prédiction recouvre pertinemment la ground truth. En choisissant un seuil sur cet IoU, on peut ainsi déterminer si un masque détecté correspond effectivement à un noyau ou non. On peut alors calculer les taux de vrais positifs, de faux positifs, de faux négatifs, et toute autre métrique classique en apprentissage.
La métrique retenue par Kaggle est un mélange entre précision et rappel, qui est ensuite moyenné pour différents seuils d’IoU (de 0.5 à 0.95). On obtient finalement le score par l’opération :
Quelle infrastructure pour ce challenge ?
Pour réaliser nos calculs nous utilisons un serveur de calcul Qbox de Quantmetry, une belle machine avec :
GPU NVIDIA 970 Ti
Mémoire vidéo : 8 GB GDDR5
- Intel socket 16 coeurs hyperthreadés @ 2.4GHz
- 64 Go RAM
- 2 x 1To SSD OS + Programmes
- 4To RAID10 ; 4 HDD 7200tr/min
- OS : Ubuntu 16
- Environnement : Python 3.6; Keras; Tensorflow
1. Petit échauffement : l’histogramme des couleurs
Nous commençons doucement afin de défricher le terrain en partant sur une stratégie simple mais efficace : l’histogramme des couleurs.
L’idée s’appuie sur l’observation que les images ont souvent un fond de couleur assez uniforme et que les noyaux se distinguent par une couleur différente. Ainsi l’idée est de dériver une répartition des niveaux de gris dans l’image et de définir la séparation entre les pixels des deux catégories de niveaux de gris. La catégorie des pixels de fort niveau de gris et la catégorie des faibles niveaux de gris peuvent correspondre aux noyaux et au background (fond) ou inversement selon le type d’image (cf figure 4).
Dans un premier temps les images sont converties en nuances de gris. Ainsi une image RGB de format : 256x256x3 est convertie en 256x256x1. Puis la médiane des pixels est calculée pour déterminer le seuil entre les deux catégories (background et noyaux)
Pour déterminer l’appartenance des pixels “background”, on regarde la catégorie des pixels majoritaires en supposant que les pixels du background sont majoritaires sur l’image. Dans les images à background sombre les pixels “clairs” seront donc classifiés “noyaux” et dans les images à background clair ce sont les pixels “sombres” qui seront classifiés “noyaux”.

Figure 4 : Stratégie de l’histogramme des couleurs.
Cette stratégie nous a permis d’obtenir un score à 0.10 et d’être classé Top 78%. Elle fonctionne relativement bien sur les images à fond noir et noyaux clairs (cf Figure 5 – Haut gauche). En revanche elle pose plusieurs problèmes, le premier étant qu’elle est très sensible au bruit de fond dans l’image (cf Figure 5 – Bas gauche et Haut droite).
Le deuxième problème est la mauvaise segmentation des différents noyaux qui se touchent ou sont proches dans l’espace créant ainsi des agglomérats de noyaux (cf Figure 5 – Bas gauche et Haut droite).
Si cette approche naïve et rapide permet facilement d’obtenir des premiers résultats, elle se heurte bien vite à la complexité des données, que ce soit les nuances au sein d’une image ou leur diversité à travers l’ensemble du dataset.

Figure 5 : Quelques résultats de la stratégie ‘histogramme des couleurs’ ainsi que les deux types de problèmes rencontrés avec cette stratégie.
Après ce petit échauffement nous avons décidé de passer aux choses sérieuses, et d’utiliser des algorithmes à base de CNN, devenus une référence en traitement d’image depuis plusieurs années.
2. Un CNN, qu’est ce que c’est ?
Un CNN, c’est avant tout un réseau de neurone. Une donnée d’entrée, en l’occurrence une image, parcourt les différentes couches du réseau qui apprend à en extraire des caractéristiques, les features, qui représentent la donnée d’entrée à un niveau sémantique de plus en plus haut, jusqu’à permettre de pouvoir par exemple la classifier avec une probabilité associée : « cette image représente un camion », ou « un arbre » ou encore « un data scientist en milieu extérieur » (rare).
La particularité d’un réseau de neurone à convolution vient en fait de l’hypothèse d’invariance spatiale des caractéristiques utilisées dans l’image : on s’intéresse aux mêmes motifs à reconnaître dans les différentes parties de l’image. Techniquement, cela revient à faire partager à l’ensemble des neurones d’une même couche des poids similaires, ce qui permet de réduire considérablement le nombre de paramètres du réseau. A noter que cette hypothèse peut néanmoins limiter l’exploitation de structures bien spécifiques dans une image, comme la géométrie d’un visage Pour une bonne illustration plus détaillée du fonctionnement des étapes de convolutions, c’est ici.

Figure 6 : Exemple de fonctionnement d’un CNN sur la reconnaissance de panneaux de signalisation. source : developer.nvidia.com
3. La piste U-Net
Maintenant que nous avons rappelé le principe du CNN, nous allons présenter le U-Net, premier bon candidat pour notre cas d’application. Le U-Net est une architecture à réseau convolutionnel pour une segmentation rapide et précise des images (cf figure 6). Il a la particularité d’avoir une architecture symétrique composée d’une partie de “contraction”, qui va permettre de détecter le contexte et les objets, et une partie “expansion” composée de succession d’up-convolution qui fait le chemin inverse qui va permettre de reconstituer l’image composée de macro-features extraites de la partie “contraction” et finalement de localiser précisément le contour des objets détectés.

Figure 6 : Architecture du réseau U-Net.
Il est particulièrement adapté à la segmentation dans les images médicales (microscopes et radiographies). Jusqu’à présent, il a surpassé la meilleure méthode antérieure (un réseau convolutionnel à fenêtre glissante) sur le défi de l’ISBI pour la segmentation des structures neuronales dans les empilements microscopiques électroniques. Il a remporté le Grand Défi de la détection automatisée des caries en radiographie