Compartir tecnología

Marco doméstico PaddleClas combinado con Swanlab para clasificación de malezas

2024-07-12

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

1. Introducción del proyecto

Las malezas son uno de los principales problemas en la agricultura y representan una seria amenaza para el crecimiento y el rendimiento de los cultivos. Los métodos tradicionales de identificación y gestión manuales son ineficientes e inexactos, por lo que se necesita tecnología avanzada de visión por computadora para mejorar la eficiencia y la calidad de la producción agrícola. Como modelo de aprendizaje profundo, ResNet tiene un buen desempeño en el manejo de tareas complejas de clasificación de imágenes. No solo puede resolver eficazmente el problema de las malezas diversas y complejas en las tierras agrícolas, sino que también promueve el desarrollo de la agricultura inteligente y reduce la dependencia de los pesticidas químicos. del desarrollo agrícola sostenible. Al utilizar ResNet para la clasificación de malezas, podemos brindar a los agricultores soluciones de manejo agrícola más inteligentes y precisas, promover la mejora de la eficiencia de la producción agrícola y la modernización de la industria agrícola. Por lo tanto, este proyecto utiliza el marco localizado PaddleClas+Swanlab+Gradio+Swanhub para realizar experimentos de clasificación de malezas.

PaddlePaddle es una plataforma de aprendizaje profundo de nivel empresarial desarrollada por Baidu, diseñada para respaldar todo el proceso de aplicaciones de aprendizaje profundo, desde el desarrollo del modelo hasta la implementación. Proporciona una gran cantidad de herramientas y bibliotecas para respaldar una variedad de tareas de aprendizaje profundo, incluido el procesamiento de imágenes, el procesamiento del lenguaje natural, el reconocimiento de voz, etc.RemoRemo

PaddleClas es una biblioteca de herramientas que se utiliza específicamente para tareas de clasificación de imágenes en el marco Paddle. Proporciona un conjunto completo de soluciones de extremo a extremo, que incluyen procesamiento de datos, definición de modelos, capacitación, evaluación e implementación, diseñadas para ayudar a los desarrolladores a construir e implementar rápidamente modelos de clasificación de imágenes eficientes.Clase de pádel

SwanLab es una herramienta de seguimiento de experimentos de IA liviana y de código abierto que mejora el seguimiento de experimentos de aprendizaje automático y la experiencia de colaboración al proporcionar una API amigable y combinar seguimiento de hiperparámetros, registro de indicadores, colaboración en línea y otras funciones.Bienvenido a SwanLab | Documentación oficial de SwanLab

Swanhub es una comunidad de colaboración e intercambio de modelos de código abierto desarrollada por Geek Studio. Proporciona a los desarrolladores de IA funciones como alojamiento de modelos de IA, registros de capacitación, visualización de resultados de modelos e implementación rápida de API.Bienvenido a Swanhub

Gradio es una biblioteca Python de código abierto diseñada para ayudar a los científicos, investigadores y desarrolladores de datos que trabajan en el campo del aprendizaje automático a crear y compartir rápidamente interfaces de usuario para modelos de aprendizaje automático.Grado

2. Parte de preparación

2.1 Instalación del entorno

Instale las siguientes 3 bibliotecas:

  1. paddle
  2. swanlab
  3. gradio

Comando de instalación:

pip install paddle swanlab gradio

2.2 Descargar conjunto de datos

Conjunto de datos de clasificación de malezas: DeepWeeds

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

Sus respectivas funciones y significado:

1. Carpeta DeepWeeds: esta carpeta se utiliza para almacenar imágenes de carpetas de imágenes, archivos de conjuntos de pruebas de conjuntos de entrenamiento y archivos de etiquetas.

2. Carpeta de imágenes: esta carpeta se utiliza para guardar carpetas de imágenes de capacitación, pruebas y verificación.

3. Archivos train.txt, val.txt, test.txt: este archivo se utiliza para guardar las rutas de imágenes y las categorías de los conjuntos de entrenamiento, prueba y validación.

4. archivo de nombres de clases: se utiliza para guardar etiquetas de categorías

2.3 Descargar el marco PaddleClas

Enlace del modelo:Modelo PaddleClas

Después de descomprimir, obtendrás la carpeta PaddleClas.

2.4 Crear directorio de archivos

Cree app.py en la carpeta PaddleClas.

Lo que hace es: ejecutar el script que ejecuta Gradio Demo

3. Entrenamiento del modelo ResNet

3.1 Modificar configuración

Primero busque ppcls-->configs-->ImageNet-->Res2Net-->Res2Net50_14w_8s.yaml en la carpeta PaddleClas.

Modifique las épocas a 100, la categoría class_num a 9, la ruta de la imagen de entrenamiento, la ruta de la imagen de verificación y el archivo de etiqueta respectivamente. Se realizaron un total de 7 cambios.

  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 Usando Swanlab

Busque herramientas-->train.py en la carpeta PaddleClas. Inicializar 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()

Busque ppcls-->engine-->train-->utils.py en PaddleClas y agregue el siguiente código:

  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]})

Busque ppcls-->engine-->engine.py en la carpeta PaddleClas y agregue el siguiente código:

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

3.3 Entrenamiento modelo

Ingrese el siguiente comando en la consola:

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

Ver detalles del experimento en swanlab

Los resultados experimentales son los siguientes:

Ver resultados experimentales en swanlab

3.4 Razonamiento modelo

Ingrese el siguiente código en la consola:

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. Entrenamiento del modelo DarkNet53

4.1 Modificar configuración

Primero busque ppcls-->configs-->ImageNet-->DarkNet-->DarkNet53.yaml en la carpeta PaddleClas.

Modifique las épocas a 100, la categoría class_num a 9, la ruta de la imagen de entrenamiento, la ruta de la imagen de verificación y el archivo de etiqueta respectivamente. Se realizaron un total de 7 cambios.

  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 Usando Swanlab

Busque herramientas-->train.py en la carpeta PaddleClas. Modificar inicialización 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 Entrenamiento modelo

Ingrese el siguiente comando en la consola:

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

Ver detalles del experimento en swanlab

Los resultados experimentales son los siguientes:

4.4 Razonamiento modelo

Ingrese el siguiente código en la consola:

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 Visualización de resultados de Swanlab

Como se puede ver en la figura, el modelo ResNet50 funciona mejor que el modelo DarkNet53 y swanlab proporciona una función de gráfico comparativo conveniente.

5. Demostración de Gradio

Continuará. . .

6. Swanhub carga y demuestra la demostración.

Continuará. . .