đ Mask R-CNN â Le Guide Ultime
Deep Dive : Segmentation d'Instance, Faster R-CNN (Base), đ RoIAlign (Innovation), FPN & ImplĂ©mentation.
1. C'est quoi Mask R-CNN ?
Segmentation d'Instance (2017). Identifie objet (Classe + BBox + Masque).
Instance Segmentation Kaiming He2. Philosophie : Two-Stage
1: Proposer (RPN), 2: Classifier/Masquer. Précis (SOTA) mais "lent" (vs YOLO).
Two-Stage One-Stage3. đ GĂ©nĂ©alogie (R-CNN)
L'évolution : R-CNN (Lent) -> Fast R-CNN -> Faster R-CNN (Base) -> Mask R-CNN.
R-CNN Faster R-CNN4. đ Architecture (Diagramme)
Faster R-CNN + "Plugin" (TĂȘte de Masque). (Backbone -> RPN -> RoIAlign -> 3 TĂȘtes).
Architecture Diagramme5. Ătape 1 : Backbone & RPN
Backbone (ResNet+FPN) + RPN (Region Proposal Network) qui "propose" des RoIs.
Backbone RPN6. đ L'Innovation : RoIAlign
La "clé" du papier. Remplace RoIPool (quantization) par Interpolation Bilinéaire.
7. Ătape 2 : Les "TĂȘtes" (Head)
3 "plugins" parallĂšles : Classe (FC), BBox (FC), Masque (FCN/ConvTranspose).
Mask Head FCN8. Loss (Multi-TĂąches)
L_total = L_rpn + L_cls + L_box + L_mask (BCE Loss pour le masque).
9. "Plugin": Implémentation Keras
Le repo "historique" Matterport (Keras/TF1). model.detect(), model.train().
10. "Plugin": Implémentation PyTorch
torchvision.models.detection..
maskrcnn_resnet50_fpn()
11. đ vs. U-Net (Addon)
Sémantique (U-Net) vs Instance (Mask R-CNN). "Chat-1, Chat-2" vs "tous les pixels Chat".
U-Net Instance12. Projets & Liens
Benchmark COCO, Imagerie Médicale, Robotique (Grasping). Liens (Papier, ...).
Projects COCOMask R-CNN (Mask Region-based Convolutional Neural Network) est une architecture d'IA (publiée en 2017 par Kaiming He et al. chez Facebook AI Research - FAIR) qui a défini l'état de l'art (SOTA) en Segmentation d'Instance.
La Hiérarchie des Tùches (Qu'est-ce que "Instance" ?)
Il faut comprendre la différence entre les 3 tùches de segmentation :
| TĂąche | Question (Ce que fait l'IA) | Exemple (Sortie) | Architecture (Ex) |
|---|---|---|---|
| Sémantique | "Quels pixels sont 'Chat' ?" | Un seul masque "Chat" (tous les chats sont fusionnés). | U-Net, FCN |
| DĂ©tection | "OĂč sont les chats ?" | BBox-1 (Chat), BBox-2 (Chat). | YOLO, Faster R-CNN |
| Instance | "OĂč est Chat-1 ? OĂč est Chat-2 ?" | BBox-1 + Masque-1 (Chat-1), BBox-2 + Masque-2 (Chat-2). | Mask R-CNN |
En résumé : Mask R-CNN ne se contente pas de trouver les objets (Détection), il *dessine* le contour de *chaque* instance d'objet (Segmentation).
En détection/segmentation, il y a deux "philosophies" (frameworks) :
| Approche | Description | Exemples | Avantage | Inconvénient |
|---|---|---|---|---|
| One-Stage (En une Ă©tape) | "Regarde" l'image une fois et prĂ©dit les BBox/Classes en mĂȘme temps (sur une grille). | YOLO, SSD | ExtrĂȘmement Rapide (Temps-rĂ©el, > 30 FPS). | Moins prĂ©cis (surtout sur petits objets). |
| Two-Stage (En deux Ă©tapes) | Ătape 1 (Proposal) : Un rĂ©seau (RPN) "propose" des RĂ©gions d'IntĂ©rĂȘt (RoI). Ătape 2 (Classify) : Un 2e rĂ©seau analyse *chaque* RoI (rĂ©gion). | R-CNN, Fast R-CNN, Faster R-CNN, Mask R-CNN. | ExtrĂȘmement PrĂ©cis (SOTA mAP). | Lent (ex: ~5-10 FPS). |
Mask R-CNN est le "roi" de l'approche "Two-Stage". Sa philosophie est : La précision (qualité) prime sur la vitesse (latence). On l'utilise quand on a besoin des *meilleurs* masques possibles, pas forcément en temps-réel.
Pour comprendre Mask R-CNN (2017), il faut comprendre son "pÚre" : Faster R-CNN (2015). C'est une évolution de "plugins" successifs.
| ModĂšle | Date | Innovation (Le "Plugin") | ProblĂšme (Lenteur) |
|---|---|---|---|
| R-CNN | 2014 | Combine "Selective Search" + CNN (AlexNet). | ExtrĂȘmement lent. Lance le CNN sur 2000 rĂ©gions (sur CPU !). |
| Fast R-CNN | 2015 | Lance le CNN *une seule fois* (sur l'image). Ajout du "plugin" RoIPool pour extraire les features. | Rapide, mais le "Selective Search" (qui propose les régions) est *toujours* sur CPU (le goulot d'étranglement). |
| Faster R-CNN | 2015 | LA RĂVOLUTION. Remplace "Selective Search" (CPU) par un "plugin" RPN (Region Proposal Network). Le RPN est un *mini-rĂ©seau* (GPU) qui *apprend* Ă trouver les rĂ©gions. | (Rapide). Le RoIPool (voir 1.6) "arrondit" (quantize) les pixels, ce qui est mauvais pour les masques. |
| Mask R-CNN | 2017 | 1. Ajoute un 3Ăšme "plugin" (TĂȘte de Masque). 2. Remplace RoIPool par RoIAlign. | (Le SOTA de 2017). |
Conclusion : Mask R-CNN = Faster R-CNN + Mask Head + RoIAlign
L'architecture de Mask R-CNN est "Two-Stage" (deux étapes) et "Multi-Task" (multi-tùches).
Diagramme (Conceptuel)
(Input: Image)
|
âŒ
+--------------------------------+
| 1. Backbone (Feature Extractor)|
| (ex: ResNet-50 + FPN) |
+--------------------------------+
|
| (Feature Maps Multi-échelles)
|
+-----------> (Ătape 1) -------------------+
| |
⌠|
+-----------------+ (Features)
| 2. RPN | |
| (Propose Régions) |
+-----------------+ |
| |
| (Propositions de RoI [BBox]) |
| |
+-----------> (Ătape 2) <------------------+
|
âŒ
+--------------------------------+
| 3. RoIAlign (Plugin) | (Alignement précis des features)
| (Combine RoIs + Features) |
+--------------------------------+
| (Features "croppées" et alignées)
|
+-------------+-------------+
| | |
⌠⌠âŒ
+----------+ +----------+ +-------------+
| 4a. TĂȘte | | 4b. TĂȘte | | 4c. TĂȘte |
| (Classif.) | (BBox Reg.) | (MASK (FCN))|
+----------+ +----------+ +-------------+
| | |
⌠⌠âŒ
(Classe) (BBox) (Masque)
1. Le Backbone (Plugin) : ResNet + FPN
L'Encoder. Mask R-CNN utilise un "plugin" (backbone) standard pour extraire les features. Le papier originel utilisait ResNet-50 ou ResNet-101 (voir 1.4, ResNet).
Il utilise aussi un "plugin" FPN (Feature Pyramid Network) (le mĂȘme que YOLOv3, voir 1.4, YOLOv3) pour obtenir des features *multi-Ă©chelles* (bonnes pour les petits *et* les grands objets).
2. Le RPN (Region Proposal Network)
C'est le "plugin" hĂ©ritĂ© de Faster R-CNN. Le RPN est un *mini-rĂ©seau* qui "glisse" sur les *feature maps* (du FPN) et "propose" ~1000 "RĂ©gions d'IntĂ©rĂȘt" (RoI) qui ont une forte probabilitĂ© de contenir *un* objet (peu importe lequel).
Sortie du RPN : Une liste de "boĂźtes" (RoIs) candidates.
C'est la *vraie* innovation de Mask R-CNN. C'est le "plugin" qui a rendu la segmentation d'instance (précise) possible.
Le ProblĂšme : RoIPool (de Faster R-CNN)
RoIPool (l'ancien) prenait les RoIs (régions, ex: [10.5px, 20.2px, 30.8px, 40.1px]) et les "quantifiait" (arrondissait) à l'entier le plus proche (ex: [10, 20, 31, 40]) pour les "cropper" (découper) dans la feature map.
Conséquence : Un désalignement (misalignment). Pour une BBox, ce n'est pas grave. Pour un *masque* (pixel-level), c'est *désastreux*.
La Solution : RoIAlign
RoIAlign (le "nouveau" plugin) ne "quantifie" (n'arrondit) *jamais*.
Il garde les coordonnées *flottantes* (ex: 10.5, 20.2) et utilise l'Interpolation Bilinéaire (Bilinear Interpolation) pour "sampler" (échantillonner) les pixels de la feature map à ces positions exactes (sub-pixel).
Résultat : Les "features" extraites sont *parfaitement* alignées avec l'image d'entrée, permettant une prédiction de masque au pixel prÚs.
AprÚs RoIAlign, on obtient un "pool" de features (ex: 14x14x256) pour *chaque* RoI proposée.
Mask R-CNN envoie ces features Ă 3 "tĂȘtes" (heads) "plugins" en parallĂšle :
| TĂȘte (Plugin) | Architecture | Sortie |
|---|---|---|
| 1. TĂȘte de Classification | Couches Fully Connected (FC) | Classe (ex: "chat", "chien") + Score |
| 2. TĂȘte de BBox (RĂ©gression) | Couches Fully Connected (FC) | BBox raffinĂ©e (dx, dy, dw, dh) |
| 3. TĂȘte de Masque (L'INNOVATION) | FCN (Fully Convolutional Network) | Un Masque (ex: 28x28) binaire (par classe). |
La TĂȘte de Masque (Mask Head)
C'est le "plugin" M de Mask R-CNN.
C'est un "mini U-Net" (un FCN) qui prend les features (ex: 14x14x256) et utilise des ConvTranspose2d (Up-sampling) pour les "remonter" en un masque (ex: 28x28x80) (un masque de 28x28 pour chacune des 80 classes).
Mask R-CNN est un modĂšle "Multi-Task" (Multi-TĂąches). Il n'apprend pas *une* chose, il apprend *plusieurs* choses en mĂȘme temps. La "Loss" (fonction de coĂ»t) est une *somme* de toutes les "losses" (erreurs) de chaque "plugin" (tĂȘte).
Loss de l'Ătape 1 (RPN)
L_rpn_cls(Loss Classe RPN) : Cross-Entropy. Le RPN a-t-il bien classé "Objet" vs "Fond" ?L_rpn_box(Loss BBox RPN) : L1 Loss. Le RPN a-t-il bien prédit la BBox de l'objet ?
Loss de l'Ătape 2 (TĂȘtes)
L_cls(Loss Classe TĂȘte) : Cross-Entropy. La tĂȘte de classification a-t-elle bien classĂ© "Chat" vs "Chien" ?L_box(Loss BBox TĂȘte) : L1 Loss. La tĂȘte BBox a-t-elle bien *raffinĂ©* la BBox ?L_mask(Loss Masque TĂȘte) : Binary Cross-Entropy (BCE). La tĂȘte de masque a-t-elle bien prĂ©dit le masque (pixel par pixel) ?
Loss Totale
L_total = L_rpn_cls + L_rpn_box + L_cls + L_box + L_mask
Le réseau est entraßné "de bout en bout" (End-to-End) en optimisant cette "loss" totale (via backpropagation).
L'implémentation "historique" et la plus célÚbre de Mask R-CNN (en dehors de celle de Facebook, Caffe2) est le "plugin" (repository) de Matterport.
Il est écrit en Python 3, Keras (TensorFlow 1.x). (Attention : Il est *trÚs* difficile à faire tourner avec TF 2.x+).
Inférence (Matterport)
import mrcnn.model as modellib
from mrcnn import visualize
# 1. Charger la config (mode inférence)
class InferenceConfig(coco.CocoConfig):
GPU_COUNT = 1
IMAGES_PER_GPU = 1
config = InferenceConfig()
# 2. Créer le modÚle (en mode inférence)
model = modellib.MaskRCNN(mode="inference",
config=config,
model_dir="./logs")
# 3. Charger les poids (pré-entraßnés sur COCO)
model.load_weights("mask_rcnn_coco.h5", by_name=True)
# 4. Inférence (Lancer la détection)
results = model.detect([image], verbose=1)
# 5. Parser les résultats (trÚs simple)
r = results[0]
# r['rois'] -> (N, 4) BBoxes
# r['masks'] -> (H, W, N) Masques
# r['class_ids'] -> (N,) IDs
# r['scores'] -> (N,) Confiance
# 6. Visualiser (plugin 'visualize')
visualize.display_instances(image, r['rois'], r['masks'],
r['class_ids'], class_names)
Aujourd'hui, l'implémentation "plugin" la plus simple et la plus maintenue est celle de Torchvision (l'addon "vision" de PyTorch).
Exemple (Inférence PyTorch)
import torch
import torchvision
from torchvision.models.detection import maskrcnn_resnet50_fpn
from PIL import Image
from torchvision import transforms as T
# 1. Charger le modÚle pré-entraßné
model = maskrcnn_resnet50_fpn(pretrained=True)
model.eval() # Mode Inférence
# 2. Transforms (simples)
transform = T.Compose([T.ToTensor()])
# 3. Charger l'image
img = Image.open("mon_image.jpg")
img_tensor = transform(img)
# 4. Inférence
with torch.no_grad():
# Note: [img_tensor] (batch de 1)
prediction = model([img_tensor])
# 5. Parser les résultats (prediction[0])
# (Sont déjà des Tensors Torch)
boxes = prediction[0]['boxes']
labels = prediction[0]['labels']
scores = prediction[0]['scores']
masks = prediction[0]['masks']
U-Net et Mask R-CNN sont deux "plugins" (architectures) de segmentation, mais ils ne font pas la mĂȘme chose.
| CritÚre | U-Net (Sémantique) | Mask R-CNN (Instance) |
|---|---|---|
| Tùche | Segmentation Sémantique. | Segmentation d'Instance. |
| Sortie (ex: 2 chats) | 1 masque. (Tous les pixels "Chat" sont 1, le reste 0). | 2 masques. (Masque-1 (Chat-1), Masque-2 (Chat-2)). |
| Architecture | Encoder-Decoder (FCN) symĂ©trique. | Two-Stage (RPN + TĂȘtes) asymĂ©trique. |
| Backbone | Entraßné de zéro (généralement). | Utilise un "plugin" (Backbone) pré-entraßné (ResNet). |
| Cas d'usage | Quand les instances ne comptent pas (ex: "Route", "Ciel", "Tumeur"). | Quand les instances comptent (ex: "Voiture-1", "Voiture-2", "Cellule-1"). |
Exemples de Projets
- Analyse MĂ©dicale : Isoler et compter *chaque* cellule ou noyau dans une image de microscopie (oĂč U-Net fusionnerait tout).
- Robotique (Grasping) : Permet à un bras robotisé de voir *chaque* objet (ex: "Vis-1", "Vis-2") sur une table, de connaßtre sa forme (masque) et de le saisir.
- Analyse Satellite : Dénombrer et mesurer la surface de *chaque* bùtiment (Instance) dans une ville (vs U-Net qui donnerait juste un masque "bùtiment").
