Choix du modèle de machine-learning pour Pléiade
Pourquoi avoir choisis mask-RCNN ?
Created on August 18|Last edited on August 19
Comment
Tour d'horizon du problème
L'objectif de l'outil de segmentation dans Pléiade est de détecter et segmenter des objets d'intérêts dans des images rayon-x.
La tache de segmentation d'instance est un classique dans le domaine de la vision par ordinateur et on retrouve des modèles très performants comme YOLOv7 (https://github.com/jinfagang/yolov7_d2), U-Net (https://arxiv.org/abs/1505.04597) ou mask-RCNN (https://arxiv.org/abs/1703.06870) pour ne citer qu'eux.
Cependant, notre problème à la particularité de traiter des images rayon-x et cela a plusieurs conséquences :
- Les images sont en noir et blanc donc on perd l'information de la couleur.
- On perd également de l'information sur la texture et la brillance.
- Les objets peuvent et vont se chevaucher en transparence.
Si les deux premiers points diminuent l'efficacité des solutions déjà existantes, le troisième point est le plus problématique. En effet, il s'avère que la vaste majorité des modèles de segmentation d'instances ne sont tout simplement pas fait pour segmenter des objets qui se superposent.
Par là, on veut dire que le masquage est souvent représenté par une carte de pixels avec chaque pixel représentant une instance. Ce genre de représentation n'est pas du tout adapté à notre problème, car il va arriver qu'un pixel appartienne à deux objets voir plus.
Une solution robuste au images rayon-x
On cherche donc un modèle capable de produire le résultat attendu lorsque plusieurs objets se chevauchent.
Malheureusement pour nous, beaucoup d'articles traitant d'images rayon-x ne se préoccupent pas du problème de chevauchement. Il semble que pour beaucoup d'application médicales travaillant sur des images rayon-x n'ont pas ce problème.
Nous avons tout de même trouvé plusieurs publications s'adressant spécifiquement à ce problème. Notamment CIE-Net (https://arxiv.org/pdf/2201.02560v2.pdf) qui consiste à apprendre par incrémentation à reconnaître 1, 2,... puis N objets pas incréments et une modification du mask-RCNN (https://www.hindawi.com/journals/mpe/2021/6544325/) pour lui permettre de mieux détecter les objets qui se chevauchent.
C'est la dernière que nous avons retenue, car les deux méthodes semblent avoir des performances comparables, mais la deuxième consiste simplement à modifier une solution déjà implémentée en Python donc plus facile à implémenter, tester et entretenir.
Présentation de mask-RCNN
Mask-RCNN (Mask Region-based Convolutional Neural Network) est un réseau de neurones avec l'architecture suivante.

On retrouve 3 composantes principales:
Feature Pyramid Network (FPN)
Le FPN va permettre de créer des Feature Maps à partir d'une image en entrée. Une feature map est une version condensée de l'information présent sur une image et utilisable par le reste du réseau.
Dans notre cas, le modèle génère 4 feature maps à 4 échelles différentes, ces feature maps vont être utilisée par le RPN et ROI-Align.
Region Proposal Network (RPN)
Le RPN est la partie qui va sélectionner les zones d'intérêts ( ROI pour Region Of Interest). Il va créer des boîtes (bounding boxes) autour de ces zones.
ROI-Align
Cette partie va simplement produire la sortie du réseau, c'est elle qui va faire la segmentation et la classification des zones d'intérêts. Aussi pour des raisons techniques, les bounding boxes se décalent parfois et elle va donc les réaligner.
Modifications du mask-RCNN
Comme nous l'avons dit précédemment le mask-RCNN n'est pas plus fait que les autres modèles pour la segmentation d'images rayon-x, mais il y a tout de même des améliorations que l'on peut lui apporter.
DIoU
Dans plusieurs endroits dans le modèle, une grandeur est utilisée pour comparer deux bounding boxes, le IoU (intersection over union) et se calcule tout simplement comme pour deux boîtes B1 et B2. Cette grandeur sert, entre autres, à tester si deux boîtes représentent le même objet.
En effet, si deux boîtes ont un IoU proche de 1, cela signifie qu'elles sont quasiment identiques et donc qu'elles sont sûrement sur le même objet, on peut donc supprimer l'une des deux.
Or, dans notre cas, justement, des objets (et donc leur boîte) peuvent se chevaucher donc on ne veut pas trop supprimer de boîtes. Pour répondre à cela on va utiliser DIoU (Distance IoU) à la place de IoU et qui vaut avec la distance entre les centres des deux boîtes et la diagonale du plus petit rectangle contenant les deux boîtes.
En pratique, cela va pénaliser le IoU pour des boîtes qui se chevauchent mais qui ont des formes différentes, on aura donc une meilleure détection des objets qui se chevauchent partiellement.
soft-NMS
En interne, le RPN détecte plusieurs milliers de boîtes, mais seulement quelques-unes sont gardées au final. Le processus d'élimination s'appelle NMS (Non-Maximum Suppression) et va comparer les IoU boite à boite et va supprimer les boîtes qui ont des IoU trop proches de 1 (donc qui représentent le même objet) en gardant celle avec le plus grand score.
D'une part nous avons remplacé IoU par DIoU comme vu précédemment, mais aussi nous avons remplacé l'algorithme par soft-NMS qui fonctionne ainsi.

avec ici et un hyper-paramètre que nous avons fixé à 1 par défaut.
Pour que soft-NMS fonctionne avec DIoU, il faut aussi remarquer qu'il faut prendre la partie entière de DIoU. En effet, si IoU est toujours positif, ce n'est pas le cas de DIoU qui est négatif lorsque deux boîtes ne se chevauchent pas. Dans soft-NMS cela pose problème à cause du terme en qui va ignorer le signe de DIoU. Simplement prendre la partie positive règle ce problème.
Add a comment