Le projet Fauchelevent est un projet écologique mis en place par l'entreprise Metigate. L'objectif de ce projet est de déterminer l'impact du climat sur la production agricole via une collecte de données agronomiques. Pour y parvenir, Metigate nous a demandé de concevoir un algorithme permettant de déterminer 4 stades de croissance de l'orge à partir de photos prises par un robot potager Farmbot.
Ce dépôt GitHub recense à la fois le livrable final (ImageAI) mais aussi les pistes explorées puis abandonnées (TFOD37 et PyTorch38). Nous avons dédié une partie explicative dans ce README pour chaque dossier présent à la racine du projet. Nous y avons explicité les intallations nécessaires, le fonctionnement de l'algorithme et les erreurs rencontrées. Nous avons aussi tenu à expliquer pourquoi nous avons abandonné les pistes TFOD et PyTorch pour une meilleure compréhension de notre démarche au cours des 7 semaines qui ont rythmé ce projet.
Voir README.md dans le dossier ImageAI
L'algorithme utilisant TFOD37 s'inspire très largement des travaux de Nicholas Renotte, que l'on peut retrouver à l'adresse : https://github.com/nicknochnack/TFODCourse. Il existe également une vidéo explicative (environ 5h) : https://youtu.be/yqkISICHH-U?list=RDCMUCHXa4OpASJEwrHrLeIzw7Yg.
Cet algorithme se divise en deux jupyter notebooks :
- 1 : Labellisation
- 2 : Installation de TFOD, training et testing
Step 1. Cloner ce dépôt: https://github.com/nicknochnack/TFODCourse dans un dossier nommé TFODCourse
Step 2. Créer un nouvel environnement virtuel nommé tfod (pour tensorflow object detection) dans le dossier TFODCourse
python -m venv tfod
Step 3. Activer l'environnement virtuel tfod
source tfod/bin/activate # Linux .\tfod\Scripts\activate # Windows
Step 4. Installer les dépendances et ajouter l'environnement virtuel au Kernel Python
python -m pip install --upgrade pip pip install ipykernel python -m ipykernel install --user --name=tfodj
Step 5. Labelliser les images en utilisant le Notebook 1. Image Collection.ipynb - s'assurer que l'on a bien changé mis l'environnement virtuel en kernel comme montré sur la photo ci-dessous
Step 6. Diviser manuellement les images labellisées en deux dossiers train et test. Manually divide collected images into two folders train and test. Alors, tous les dossiers et annotations doivent maintenant être répartis entre les deux dossiers suivants.
\TFODCourse\Tensorflow\workspace\images\train
\TFODCourse\Tensorflow\workspace\images\test
Step 7. Commencer le processus de training en ouvrant 2. Training and Detection.ipynb, ce notebook vous guidera dans l'installation de Tensorflow Object Detection, la réalisation de détections, la sauvegarde et l'exportation du modèle.
Step 8. Au cours de ce processus, le Notebook installera Tensorflow Object Detection. Vous devriez idéalement recevoir une notification indiquant que l'API a été installée avec succès à l'étape 8 avec la dernière ligne indiquant OK. Si ce n'est pas le cas, résoudre les erreurs d'installation en se référant au Guide des erreurs.md de ce dossier.
Step 9. Une fois que vous êtes arrivé à l'étape 6. Entraîner le modèle à l'intérieur du carnet de notes, vous pouvez choisir d'entraîner le modèle à l'intérieur du carnet de notes. Nous avons cependant remarqué que l'entraînement à l'intérieur d'un terminal séparé sur une machine Windows permet d'afficher des mesures de perte en direct.
Step 10. On peut éventuellement évaluer le modèle à l'intérieur de Tensorboard. Une fois que le modèle a été formé et que vous avez exécuté la commande d'évaluation à l'étape 7. Naviguer vers le dossier d'évaluation de votre modèle formé. e.g.
cd Tensorlfow/workspace/models/my_ssd_mobnet/evalet ouvrir Tensorboard avec la commande suivante
tensorboard --logdir=.Tensorboard sera accessible via votre navigateur et on pourra voir des mesures telles que la mAP (précision moyenne) et le Recall.
Nous avons décidé d'abandonner l'utilisation de TFOD car nous avons décidé d'abandonner la piste de détection d'images.En grande partie, cela est dû à notre jeu de données et le travail colossal que représente la labellisation. Deux choix s'offraient à nous, chacun avec ses problèmes :
- Utiliser le dataset de la compétition Global Wheat Detection pré-labellisées : La labellisation de ce dataset consiste à placer des bounding boxes autour des épis sans les classifier. Cela est problématique, car il faut catégoriser chaque bounding boxes qui peut représenter les étapes 3 ou 4 des stades de croissance. Or cela représente plus de 30 bounding boxes pour 2000 images (donc plus de 60000 classifications à faire). De plus, il faut trouver des images des stades 1 et 2 de croissance et les labelliser avec labelImg, or cela est très compliqué il y a souvent une grande quantité de pousses/tallages sur une seule image, ce qui rend la labellisation très longue et délicate.
- Labelliser à la main des photos prises sur Internet : Comme expliqué plus haut (et comme on peut le voir sur l'image ci-dessous), il y a souvent une grande quantité de pousses/tallages/épis sur une seule image, ce qui rend la labellisation très longue et délicate.
L'algorithme utilisant PyTorch38 s'inspire très largement des travaux du Kaggle "Getting started with object detection with pytroch : https://www.kaggle.com/aryaprince/getting-started-with-object-detection-with-pytorch. Il tourne sous Python 3.8.10.
Deux scripts sont présents dans ce dossier :
- "former main.py" : algorithme qui permet de détecter une classe sur une image à l'aide de bounding boxes
- "main pytorch.py" : algorithme qui permet de détecter une ou plusieurs classes sur une image à l'aide de bounding boxes labellisées
Step 1. Installer les dependencies suivantes dans un environnement virtuel
pip install numpy pip install pandas pip install opencv-python # cv2 pip install pillow # PIL pip install torch==1.9.1+cu111 torchvision==0.10.1+cu111 -f https://download.pytorch.org/whl/torch_stable.html
Step 1. bis Pour utiliser le GPU lors de l'entraînement, installer CUDA 11.1 (version compatible avec cette version de Python et de Pytorch)
Step 2. Labellisation
La labellisation pour le script "former main.py" est enregistrée au format .csv, de la même façon que dans le Notebook Kaggle https://www.kaggle.com/aryaprince/getting-started-with-object-detection-with-pytorch
La labellisation pour le script "main pytorch.py" se fait de la même façon que pour la partie TFOD37
Step 3. Scructurer les dossiers du projet Pour "former main.py"
> former main.py > fasterrcnn_resnet50_fpn_best.pth > sample_submission.csv > train.csv > output.png > test/test1.png test2.png ... > train/train1.png train2.png ...
Pour "main pytorch.py"
> main pytorch.py > fasterrcnn_resnet50_fpn_best.pth > sample_submission.xml > output.png > test/test1.png test2.png ... > train/train1.png train1.xml train2.png train2.xml ...
Step 4. Run le script Python en prenant en compte les commentaires