---
title: INFO911 (TP3) Segmentation d'image et classification d'objets par réseau de neurones convolutionnels
---
INFO911 (TP3) Segmentation d'image et classification d'objets par réseau de neurones convolutionnels
===
[TOC]
> Création. [name=Jacques-Olivier Lachaud][time=Novembre 2020][color=#907bf7]
> Difficile de faire marcher Mask R-CNN. Testez YOLO plutôt. [name=Jacques-Olivier Lachaud][time=September 2025][color=#907bf7]
###### tags: `info911` `tp`
Retour à [INFO911 (Main) Traitement et analyse d'image](https://codimd.math.cnrs.fr/s/UE_B59gMy)
Ce TP vous fait découvrir une méthode "moderne" (2017-2018) de segmentation d'image, qui utilise l'apprentissage profond et les réseaux de neurones convolutionnels.
Il s'agit de vous faire mettre en place un réseau de neurones existant, et de le tester. Vous n'aurez pas vraiment de code à écrire proprement dit.
## 1. Le réseau Mask R-CNN
Comme beaucoup de méthodes d'apprentissage profond, construites par essai/erreur, il s'agit d'une évolution d'une succession de modèles de plus en plus efficaces pour segmentater une image en des objets d'intérêt.
Essentiellement, les méthodes employées sont:
* R-CNN: R. Girshick, J. Donahue, T. Darrell, and J. Malik. Rich feature hierarchies for accurate object detection and semantic segmentation. In CVPR, 2014
Réseau de convolution avec apprentissage profond, qui identifie et classifie des objets, en 2 apprentissages (features, reconnaissance)
* [Fast R-CNN. Ross Girshick, 2015](https://openaccess.thecvf.com/content_iccv_2015/papers/Girshick_Fast_R-CNN_ICCV_2015_paper.pdf)
Mélange dans le même réseau les features et les régions d'intérêt, ainsi que le classifieur (objets, background)
* [Faster R-CNN: Towards Real-Time Object Detection with Region Proposal. Networks Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun, 2016](https://arxiv.org/pdf/1506.01497.pdf)
Accélère le réseau précédent en utilisant un autre réseau, lui aussi déjà entrainé par ailleurs, qui propose des régions d'intérêt.
* [Mask R-CNN. Kaiming He, Georgia Gkioxari, Piotr Dollar, Ross Girshick, 2017](https://openaccess.thecvf.com/content_ICCV_2017/papers/He_Mask_R-CNN_ICCV_2017_paper.pdf)
Ajoute l'extraction de l'objet d'intérêt à l'intérieur des objets détectés sous forme de boites par Faster R-CNN.
Entre temps, le principal auteur est passé de Microsoft à Facebook.

## 2. Mettre en place un réseau Mask R-CNN
Comme il est très long de tout recoder un tel réseau, vous allez mettre en place une implémentation déjà écrite: [Matterport implementation on github](https://github.com/matterport/Mask_RCNN)
Elle est écrite en Python, et utilise les bibliothèques [tensorflow](https://www.tensorflow.org) et [keras](https://keras.io). Elle utilise aussi plein d'autres bibliothèques (dont OpenCV).
Normalement, si vous clonez le dépôt chez vous, tout le processus d'installation est fait par, cf [setup.py](https://github.com/matterport/Mask_RCNN/blob/master/setup.py)
```python=
pip install -r requirements.txt
python setup.py install
```
Puis de suivre les démos proposées sur le site.
:::danger
Il est extrêmement improbable que cela fonctionne directement chez vous. En effet, ce code dépend de bibliothèques avec des versions précises. A moins d'être un expert, je vous conseille de suivre les étapes suivantes.
:::
:::warning
Assurez-vous de faire les étapes dans l'ordre, et qu'il n'y ait pas de messages d'erreur suspect à chaque étape. Je n'ai pu valider cette approche que sous MacOS 10.15 (Catalina) avec `brew` pour installer les paquets. Ca devrait fonctionner pareil sous Linux. Je suis moins sûr sous Windows, même si Anaconda fonctionne pareil.
:::
1. Mettez vous quelque part et cloner Mask_RCNN
```shell=
git clone https://github.com/matterport/Mask_RCNN.git
```
2. Installez une version récente d'anaconda (python + plein de paquets scientifiques)
```shell=
## macos
brew install anaconda
```
Vous pouvez vous reporter à [Anaconda install doc](https://docs.anaconda.com/anaconda/install/) pour les autres systèmes.
Il peut être utile d'ajouter `anaconda` à votre shell via
```shell=
${PATH_TO_ANACONDA}/conda init zsh
```
3. Pour gérer les problèmes de versions de package, Anaconda a développé le système d'**environnement**. Sous le capot, ça crée dans un répertoire les exécutables et les bibliothèques spécifiques. Nous allons faire l'environnement `maskrcnn` qui a besoin d'un python pas trop récent.
```shell
## create environment with a not-too-recent python
conda create -n maskrcnn python=3.6.8
```
:::warning
Sur mon mac avec puce M2, j'ai du activer `rosetta 2` qui peut simuler des architectures x86 sur arm. Cela se fait via `softwareupdate --install-rosetta`. Ensuite les commandes sont :
```shell
## Mac récent avec puce M1 ou M2
conda create -n maskrcnn
conda activate maskrcnn
conda config --env --set subdir osx-64
conda install python=3.6.8
```
:::
4. On se met dans cet environnement, en l'activant.
```shell=
## activate environment
conda activate maskrcnn
## le prompt de votre shell a du changer
```
5. Il faut maintenant mettre une version récente de l'installeur, pour être sûr de trouver les bons paquets.
```shell=
## Update pip
pip install --upgrade pip
```
6. On peut maintenant installer des versions spécifiques de tensorflow et keras.
```shell=
## Install specific tensorflow and keras
pip install --upgrade tensorflow==1.15.3
pip install --upgrade keras==2.2.4
```
7. Ensuite seulement on installe les paquets requis par Mask R-CNN.
```shell=
## Install missing requirements
pip install -r requirements.txt
```
8. Il manque encore un paquet utilisé `pycocotools`
```shell=
## Install pycocotools
pip install git+https://github.com/waleedka/coco.git#subdirectory=PythonAPI
```
9. Malheureusement, le code utilise des fonctions dépréciées ensuite dans d'autres paquets. Il faut installer une version ancienne de `h5py`.
```shell=
## Make sure you have the right version of h5py
pip install "h5py<3.0.0"
```
10. On peut enfin déployer les sources de Mask R-CNN pour qu'ils soient accessibles comme bibliothèques pour python3 (et donc pour les notebook jupyter)
```shell=
## Deploy sources files
python setup.py install
```
11. On peut enfin tester les démos proposées, notamment celle qui permet de tester la qualité des détections sur des images à vous.
```shell=
## run jupyter notebook, go to samples, click on demo.ipynb
jupyter notebook
```
:::info
Dans le notebook, allez dans `samples` puis lancez `demo.ipynb`. Exécutez pas à pas pour vérifier que tout fonctionne. Normalement, il tire au hasard une image dans sa base, et vous affiche les objets détectés.
:::

:::warning
Vérifiez bien que vous n'avez pas de conflit de version de jupyter. Pour ma part, quand je fais `which jupyter`, j'ai le chemin:
```shell=
/usr/local/anaconda3/envs/maskrcnn/bin/jupyter
```
Pour vous aussi, le chemin doit contenir `maskrcnn`.
:::
## 3. Tester le réseau Mask R-CNN
Vous pouvez tester sur vos images le réseau, avec les lignes:
```python=
image = skimage.io.imread('../../zebra.jpg')
results = model.detect([image], verbose=1)
# Visualize results
r = results[0]
visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'],
class_names, r['scores'])
```
| Input | Output |
| -------------------------------------------------------------------------------------------------- | ------ |
|  |  |
|  |  |
Vous pouvez voir aussi que le réseau se plante aussi parfois.
| Input | Output |
| -------- | -------- |
|  |  |
Trouvez une dizaine d'image où le réseau fonctionne bien, et une dizaine d'image où le réseau donne des informations erronnées. Regardez aussi les probabilités de détection. Sont-elles fortes lorsqu'il se trompe ?
## 4. Comprendre le réseau Mask R-CNN
Suivez les tutoriaux présentés sur le site [Mask R-CNN](https://github.com/matterport/Mask_RCNN) en suivant le README.md
## 5. Autres ressources
Vous avez pas mal de tutoriaux sur internet. Je vous mets un tutorial sur cette méthode précise:
* [tutoriel Mask R-CNN for object detection](https://machinelearningmastery.com/how-to-perform-object-detection-in-photographs-with-mask-r-cnn-in-keras/)