Partage de technologie

Cadre domestique PaddleClas combiné avec Swanlab pour la classification des mauvaises herbes

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Présentation du projet

Les mauvaises herbes constituent l’un des problèmes majeurs de l’agriculture et constituent une menace sérieuse pour la croissance et le rendement des cultures. Les méthodes traditionnelles d’identification et de gestion manuelles sont inefficaces et imprécises. Une technologie avancée de vision par ordinateur est donc nécessaire pour améliorer l’efficacité et la qualité de la production agricole. En tant que modèle d'apprentissage profond, ResNet fonctionne bien dans la gestion de tâches complexes de classification d'images. Il peut non seulement résoudre efficacement le problème des mauvaises herbes diverses et complexes dans les terres agricoles, mais également promouvoir le développement d'une agriculture intelligente et réduire la dépendance aux pesticides chimiques. du développement agricole durable. En utilisant ResNet pour la classification des mauvaises herbes, nous pouvons fournir aux agriculteurs des solutions de gestion agricole plus intelligentes et précises, promouvoir l'amélioration de l'efficacité de la production agricole et la modernisation de l'industrie agricole. Par conséquent, ce projet utilise le framework localisé PaddleClas+Swanlab+Gradio+Swanhub pour mener des expériences de classification des mauvaises herbes.

PaddlePaddle est une plateforme d'apprentissage profond au niveau de l'entreprise développée par Baidu, conçue pour prendre en charge les applications d'apprentissage profond complets, du développement du modèle au déploiement. Il fournit une multitude d'outils et de bibliothèques pour prendre en charge une variété de tâches d'apprentissage en profondeur, notamment le traitement d'images, le traitement du langage naturel, la reconnaissance vocale, etc.PagaiePagaie

PaddleClas est une bibliothèque d'outils spécifiquement utilisée pour les tâches de classification d'images dans le framework Paddle. Il fournit un ensemble complet de solutions de bout en bout, comprenant le traitement des données, la définition de modèles, la formation, l'évaluation et le déploiement, conçues pour aider les développeurs à créer et déployer rapidement des modèles de classification d'images efficaces.PaddleClas

SwanLab est un outil open source et léger de suivi des expériences d'IA qui améliore le suivi des expériences de ML et l'expérience de collaboration en fournissant une API conviviale et en combinant le suivi des hyperparamètres, l'enregistrement des indicateurs, la collaboration en ligne et d'autres fonctions.Bienvenue dans la documentation officielle de SwanLab |

Swanhub est une communauté de collaboration et de partage de modèles open source développée par Geek Studio. Il fournit aux développeurs d'IA des fonctions telles que l'hébergement de modèles d'IA, les enregistrements de formation, l'affichage des résultats du modèle et le déploiement rapide d'API.Bienvenue sur Swanhub

Gradio est une bibliothèque Python open source conçue pour aider les scientifiques des données, les chercheurs et les développeurs travaillant dans le domaine de l'apprentissage automatique à créer et partager rapidement des interfaces utilisateur pour les modèles d'apprentissage automatique.Gradio

2. Partie préparation

2.1 Installation de l'environnement

Installez les 3 bibliothèques suivantes :

  1. paddle
  2. swanlab
  3. gradio

Commande d'installation :

pip install paddle swanlab gradio

2.2 Télécharger l'ensemble de données

Ensemble de données de classification des mauvaises herbes : DeepWeeds

  1. DeepWeeds
  2. --images
  3. ----1.jpg
  4. ----2.jpg
  5. --train.txt
  6. --val.txt
  7. --test.txt
  8. --classnames.txt

Leurs fonctions et significations respectives :

1. Dossier DeepWeeds : ce dossier est utilisé pour stocker les images du dossier d'images, les fichiers d'ensemble de test d'ensemble de formation et les fichiers d'étiquettes.

2. dossier images : ce dossier est utilisé pour enregistrer les dossiers d’images de formation, de test et de vérification.

3. Fichiers train.txt, val.txt, test.txt : ce fichier est utilisé pour enregistrer les chemins d'image et les catégories d'ensembles de formation, de test et de validation.

4. fichier classnames : utilisé pour enregistrer les étiquettes de catégorie

2.3 Téléchargez le framework PaddleClas

Lien du modèle :Modèle PaddleClas

Après la décompression, vous obtiendrez le dossier PaddleClas.

2.4 Créer un répertoire de fichiers

Créez app.py dans le dossier PaddleClas.

Ce qu'il fait, c'est : exécuter le script qui exécute Gradio Demo

3. Formation sur le modèle ResNet

3.1 Modifier la configuration

Recherchez d'abord ppcls-->configs-->ImageNet-->Res2Net-->Res2Net50_14w_8s.yaml dans le dossier PaddleClas.

Modifiez respectivement les époques à 100, la catégorie class_num à 9, le chemin de l'image d'entraînement, le chemin de l'image de vérification et le fichier d'étiquette. Au total, 7 modifications ont été apportées.

  1. # global configs
  2. Global:
  3. checkpoints: null
  4. pretrained_model: null
  5. output_dir: ./output/
  6. device: gpu
  7. save_interval: 1
  8. eval_during_train: True
  9. eval_interval: 1
  10. epochs: 100###########################1##############################
  11. print_batch_step: 10
  12. use_visualdl: False
  13. # used for static mode and model export
  14. image_shape: [3, 224, 224]
  15. save_inference_dir: ./inference
  16. # model architecture
  17. Arch:
  18. name: Res2Net50_14w_8s
  19. class_num: 9############################2##############################
  20. # loss function config for traing/eval process
  21. Loss:
  22. Train:
  23. - CELoss:
  24. weight: 1.0
  25. epsilon: 0.1
  26. Eval:
  27. - CELoss:
  28. weight: 1.0
  29. Optimizer:
  30. name: Momentum
  31. momentum: 0.9
  32. lr:
  33. name: Cosine
  34. learning_rate: 0.1
  35. regularizer:
  36. name: 'L2'
  37. coeff: 0.0001
  38. # data loader for train and eval
  39. DataLoader:
  40. Train:
  41. dataset:
  42. name: ImageNetDataset
  43. image_root: ./weeds/images/#################3#######################
  44. cls_label_path: ./weeds/train.txt###########4########################
  45. transform_ops:
  46. - DecodeImage:
  47. to_rgb: True
  48. channel_first: False
  49. - RandCropImage:
  50. size: 224
  51. - RandFlipImage:
  52. flip_code: 1
  53. - NormalizeImage:
  54. scale: 1.0/255.0
  55. mean: [0.485, 0.456, 0.406]
  56. std: [0.229, 0.224, 0.225]
  57. order: ''
  58. batch_transform_ops:
  59. - MixupOperator:
  60. alpha: 0.2
  61. sampler:
  62. name: DistributedBatchSampler
  63. batch_size: 64
  64. drop_last: False
  65. shuffle: True
  66. loader:
  67. num_workers: 4
  68. use_shared_memory: True
  69. Eval:
  70. dataset:
  71. name: ImageNetDataset
  72. image_root: ./DeepWeeds/images/###############5#######################
  73. cls_label_path: ./DeepWeeds/val.txt###########6########################
  74. transform_ops:
  75. - DecodeImage:
  76. to_rgb: True
  77. channel_first: False
  78. - ResizeImage:
  79. resize_short: 256
  80. - CropImage:
  81. size: 224
  82. - NormalizeImage:
  83. scale: 1.0/255.0
  84. mean: [0.485, 0.456, 0.406]
  85. std: [0.229, 0.224, 0.225]
  86. order: ''
  87. sampler:
  88. name: DistributedBatchSampler
  89. batch_size: 64
  90. drop_last: False
  91. shuffle: False
  92. loader:
  93. num_workers: 4
  94. use_shared_memory: True
  95. Infer:
  96. infer_imgs: docs/images/inference_deployment/whl_demo.jpg
  97. batch_size: 10
  98. transforms:
  99. - DecodeImage:
  100. to_rgb: True
  101. channel_first: False
  102. - ResizeImage:
  103. resize_short: 256
  104. - CropImage:
  105. size: 224
  106. - NormalizeImage:
  107. scale: 1.0/255.0
  108. mean: [0.485, 0.456, 0.406]
  109. std: [0.229, 0.224, 0.225]
  110. order: ''
  111. - ToCHWImage:
  112. PostProcess:
  113. name: Topk
  114. topk: 5
  115. class_id_map_file: ./DeepWeeds/classnaems.txt###########7##################
  116. Metric:
  117. Train:
  118. Eval:
  119. - TopkAcc:
  120. topk: [1, 5]

3.2 Utilisation de Swanlab

Recherchez tools-->train.py dans le dossier PaddleClas. Initialiser Swanlab

  1. # Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. from __future__ import absolute_import
  15. from __future__ import division
  16. from __future__ import print_function
  17. import os
  18. import sys
  19. __dir__ = os.path.dirname(os.path.abspath(__file__))
  20. sys.path.append(os.path.abspath(os.path.join(__dir__, '../')))
  21. from ppcls.utils import config
  22. from ppcls.engine.engine import Engine
  23. import swanlab
  24. # -*- coding: utf-8 -*-
  25. if __name__ == "__main__":
  26. args = config.parse_args()
  27. config = config.get_config(
  28. args.config, overrides=args.override, show=False)
  29. config.profiler_options = args.profiler_options
  30. engine = Engine(config, mode="train")
  31. ## 初始化swanlab
  32. swanlab.init(
  33. experiment_name="Swanlab_ResNet50_PaddleClas",
  34. description="Train ResNet50 for weeds classification.",
  35. project="Swanhub_Weeds_Classification",
  36. config={
  37. "model": "ResNet50",
  38. "optim": "Adam",
  39. "lr": 0.001,
  40. "batch_size": 64,
  41. "num_epochs": 100,
  42. "num_class": 9,
  43. }
  44. )
  45. engine.train()

Recherchez ppcls-->engine-->train-->utils.py dans PaddleClas et ajoutez le code suivant :

  1. swanlab.log({"train_lr_msg": lr_msg.split(": ")[1]}) #
  2. swanlab.log({"train_CELoss": metric_msg.split(",")[0].split(': ')[1]}) ##
  3. swanlab.log({'train_loss': metric_msg.split(",")[1].split(': ')[1]})

Recherchez ppcls-->engine-->engine.py dans le dossier PaddleClas et ajoutez le code suivant :

swanlab.log({'best_metric': best_metric.get('metric')})

3.3 Formation sur modèle

Entrez la commande suivante sur la console :

python -m paddle.distributed.launch tools/train.py -c ./ppcls/configs/ImageNet/Res2Net/Res2Net50_14w_8s.yaml

Afficher les détails de l'expérience dans Swanlab

Les résultats expérimentaux sont les suivants :

Afficher les résultats expérimentaux dans Swanlab

3.4 Raisonnement du modèle

Entrez le code suivant dans la console :

python tools/infer.py -c ./ppcls/configs/ImageNet/Res2Net/Res2Net50_14w_8s.yaml -o Infer.infer_imgs=./DeepWeeds/infer/01.jpg -o Global.pretrained_model=./output/Res2Net50_14w_8s/best_model

4. Formation sur le modèle DarkNet53

4.1 Modifier la configuration

Recherchez d'abord ppcls-->configs-->ImageNet-->DarkNet-->DarkNet53.yaml dans le dossier PaddleClas.

Modifiez respectivement les époques à 100, la catégorie class_num à 9, le chemin de l'image d'entraînement, le chemin de l'image de vérification et le fichier d'étiquette. Au total, 7 modifications ont été apportées.

  1. # global configs
  2. Global:
  3. checkpoints: null
  4. pretrained_model: null
  5. output_dir: ./output/
  6. device: gpu
  7. save_interval: 1
  8. eval_during_train: True
  9. eval_interval: 1
  10. epochs: 100
  11. print_batch_step: 10
  12. use_visualdl: False
  13. # used for static mode and model export
  14. image_shape: [3, 256, 256]
  15. save_inference_dir: ./inference
  16. # model architecture
  17. Arch:
  18. name: DarkNet53
  19. class_num: 9
  20. # loss function config for traing/eval process
  21. Loss:
  22. Train:
  23. - CELoss:
  24. weight: 1.0
  25. epsilon: 0.1
  26. Eval:
  27. - CELoss:
  28. weight: 1.0
  29. Optimizer:
  30. name: Momentum
  31. momentum: 0.9
  32. lr:
  33. name: Cosine
  34. learning_rate: 0.1
  35. regularizer:
  36. name: 'L2'
  37. coeff: 0.0001
  38. # data loader for train and eval
  39. DataLoader:
  40. Train:
  41. dataset:
  42. name: ImageNetDataset
  43. image_root: F:/datasets/DeepWeeds/images
  44. cls_label_path: F:/datasets/DeepWeeds/train.txt
  45. transform_ops:
  46. - DecodeImage:
  47. to_rgb: True
  48. channel_first: False
  49. - RandCropImage:
  50. size: 256
  51. - RandFlipImage:
  52. flip_code: 1
  53. - NormalizeImage:
  54. scale: 1.0/255.0
  55. mean: [0.485, 0.456, 0.406]
  56. std: [0.229, 0.224, 0.225]
  57. order: ''
  58. batch_transform_ops:
  59. - MixupOperator:
  60. alpha: 0.2
  61. sampler:
  62. name: DistributedBatchSampler
  63. batch_size: 64
  64. drop_last: False
  65. shuffle: True
  66. loader:
  67. num_workers: 4
  68. use_shared_memory: True
  69. Eval:
  70. dataset:
  71. name: ImageNetDataset
  72. image_root: F:/datasets/DeepWeeds/images
  73. cls_label_path: F:/datasets/DeepWeeds/val.txt
  74. transform_ops:
  75. - DecodeImage:
  76. to_rgb: True
  77. channel_first: False
  78. - ResizeImage:
  79. resize_short: 292
  80. - CropImage:
  81. size: 256
  82. - NormalizeImage:
  83. scale: 1.0/255.0
  84. mean: [0.485, 0.456, 0.406]
  85. std: [0.229, 0.224, 0.225]
  86. order: ''
  87. sampler:
  88. name: DistributedBatchSampler
  89. batch_size: 64
  90. drop_last: False
  91. shuffle: False
  92. loader:
  93. num_workers: 4
  94. use_shared_memory: True
  95. Infer:
  96. infer_imgs: docs/images/inference_deployment/whl_demo.jpg
  97. batch_size: 10
  98. transforms:
  99. - DecodeImage:
  100. to_rgb: True
  101. channel_first: False
  102. - ResizeImage:
  103. resize_short: 292
  104. - CropImage:
  105. size: 256
  106. - NormalizeImage:
  107. scale: 1.0/255.0
  108. mean: [0.485, 0.456, 0.406]
  109. std: [0.229, 0.224, 0.225]
  110. order: ''
  111. - ToCHWImage:
  112. PostProcess:
  113. name: Topk
  114. topk: 5
  115. class_id_map_file: F:/datasets/DeepWeeds/classnames
  116. Metric:
  117. Train:
  118. Eval:
  119. - TopkAcc:
  120. topk: [1, 5]

4.2 Utilisation de Swanlab

Recherchez tools-->train.py dans le dossier PaddleClas. Modifier l'initialisation Swanlab

  1. # Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. from __future__ import absolute_import
  15. from __future__ import division
  16. from __future__ import print_function
  17. import os
  18. import sys
  19. __dir__ = os.path.dirname(os.path.abspath(__file__))
  20. sys.path.append(os.path.abspath(os.path.join(__dir__, '../')))
  21. from ppcls.utils import config
  22. from ppcls.engine.engine import Engine
  23. import swanlab
  24. # -*- coding: utf-8 -*-
  25. if __name__ == "__main__":
  26. args = config.parse_args()
  27. config = config.get_config(
  28. args.config, overrides=args.override, show=False)
  29. config.profiler_options = args.profiler_options
  30. engine = Engine(config, mode="train")
  31. ## 初始化swanlab
  32. swanlab.init(
  33. experiment_name="Swanlab_DrakNet53_PaddleClas",
  34. description="Train DarkNet53 for weeds classification.",
  35. project="Swanhub_Weeds_Classification",
  36. config={
  37. "model": "DarkNet53",
  38. "optim": "Adam",
  39. "lr": 0.001,
  40. "batch_size": 64,
  41. "num_epochs": 100,
  42. "num_class": 9,
  43. }
  44. )
  45. engine.train()

4.3 Formation sur modèle

Entrez la commande suivante sur la console :

python -m paddle.distributed.launch tools/train.py -c ./ppcls/configs/ImageNet/DarkNet/DarknetNet53.yaml

Afficher les détails de l'expérience dans Swanlab

Les résultats expérimentaux sont les suivants :

4.4 Raisonnement du modèle

Entrez le code suivant dans la console :

python tools/infer.py -c ./ppcls/configs/ImageNet/DarkNet/DarkNet53.yaml -o Infer.infer_imgs=./DeepWeeds/infer/01.jpg -o Global.pretrained_model=./output/DarkNet53/best_model

4.5 Affichage des résultats Swanlab

Comme le montre la figure, le modèle ResNet50 fonctionne mieux que le modèle DarkNet53 et swanlab fournit une fonction de tableau de comparaison pratique.

5. Démo Gradio

À suivre. . .

6. Swanhub télécharge et présente la démo

À suivre. . .