Compartilhamento de tecnologia

Estrutura doméstica PaddleClas combinada com Swanlab para classificação de ervas daninhas

2024-07-12

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

1. Introdução do projeto

As ervas daninhas são um dos principais problemas na agricultura, representando uma séria ameaça ao crescimento e rendimento das culturas. Os métodos tradicionais de identificação e gestão manuais são ineficientes e imprecisos, pelo que é necessária tecnologia avançada de visão computacional para melhorar a eficiência e a qualidade da produção agrícola. Como um modelo de aprendizagem profunda, o ResNet tem um bom desempenho no tratamento de tarefas complexas de classificação de imagens. Ele pode não apenas resolver efetivamente o problema de ervas daninhas diversas e complexas em terras agrícolas, mas também promover o desenvolvimento da agricultura inteligente e reduzir a dependência de pesticidas químicos para atingir o objetivo. do desenvolvimento agrícola sustentável. Ao utilizar o ResNet para classificação de ervas daninhas, podemos fornecer aos agricultores soluções de gestão agrícola mais inteligentes e precisas, promover a melhoria da eficiência da produção agrícola e a modernização da indústria agrícola. Portanto, este projeto utiliza a estrutura localizada PaddleClas+Swanlab+Gradio+Swanhub para conduzir experimentos de classificação de ervas daninhas.

PaddlePaddle é uma plataforma de aprendizado profundo de nível empresarial desenvolvida pela Baidu, projetada para oferecer suporte a aplicativos de aprendizado profundo de processo completo, desde o desenvolvimento do modelo até a implantação. Ele fornece uma variedade de ferramentas e bibliotecas para oferecer suporte a uma variedade de tarefas de aprendizagem profunda, incluindo processamento de imagens, processamento de linguagem natural, reconhecimento de fala, etc.RemoRemo

PaddleClas é uma biblioteca de ferramentas usada especificamente para tarefas de classificação de imagens na estrutura Paddle. Ele fornece um conjunto completo de soluções ponta a ponta, incluindo processamento de dados, definição de modelo, treinamento, avaliação e implantação, projetadas para ajudar os desenvolvedores a construir e implantar rapidamente modelos eficientes de classificação de imagens.Classes de remo

SwanLab é uma ferramenta leve e de código aberto de rastreamento de experimentos de IA que melhora o rastreamento de experimentos de ML e a experiência de colaboração, fornecendo uma API amigável e combinando rastreamento de hiperparâmetros, registro de indicadores, colaboração online e outras funções.Bem-vindo à documentação oficial do SwanLab |

Swanhub é uma comunidade de colaboração e compartilhamento de modelos de código aberto desenvolvida pelo Geek Studio. Ele fornece aos desenvolvedores de IA funções como hospedagem de modelo de IA, registros de treinamento, exibição de resultados de modelo e implantação rápida de API.Bem vindo ao Swanhub

Gradio é uma biblioteca Python de código aberto projetada para ajudar cientistas de dados, pesquisadores e desenvolvedores que trabalham na área de aprendizado de máquina a criar e compartilhar rapidamente interfaces de usuário para modelos de aprendizado de máquina.Gradio

2. Parte de preparação

2.1 Instalação do ambiente

Instale as três bibliotecas a seguir:

  1. paddle
  2. swanlab
  3. gradio

Comando de instalação:

pip install paddle swanlab gradio

2.2 Baixar conjunto de dados

Conjunto de dados de classificação de ervas daninhas: DeepWeeds

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

Suas respectivas funções e significados:

1. Pasta DeepWeeds: esta pasta é usada para armazenar imagens de pastas de imagens, arquivos de conjunto de verificação de conjunto de teste de conjunto de treinamento e arquivos de rótulo

2. pasta de imagens: esta pasta é usada para salvar pastas de imagens de treinamento, teste e verificação.

3. Arquivos train.txt, val.txt, test.txt: Este arquivo é usado para salvar os caminhos de imagem e categorias de conjuntos de treinamento, teste e validação.

4. arquivo de nomes de classe: usado para salvar rótulos de categoria

2.3 Baixe a estrutura PaddleClas

Link do modelo:Modelo PaddleClas

Após descompactar, você obterá a pasta PaddleClas.

2.4 Criar diretório de arquivo

Crie app.py na pasta PaddleClas.

O que faz é: executar o script que executa o Gradio Demo

3. Treinamento do modelo ResNet

3.1 Modificar configuração

Primeiro encontre ppcls-->configs-->ImageNet-->Res2Net-->Res2Net50_14w_8s.yaml na pasta PaddleClas.

Modifique épocas para 100, categoria class_num para 9, caminho da imagem de treinamento, caminho da imagem de verificação e arquivo de rótulo, respectivamente. Um total de 7 alterações foram feitas.

  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

Encontre ferramentas -> train.py na pasta PaddleClas. Inicializar o 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()

Encontre ppcls-->engine-->train-->utils.py em PaddleClas e adicione o seguinte 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]})

Encontre ppcls-->engine-->engine.py na pasta PaddleClas e adicione o seguinte código:

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

3.3 Treinamento de modelo

Digite o seguinte comando no console:

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

Veja detalhes do experimento no swanlab

Os resultados experimentais são os seguintes:

Veja resultados experimentais no swanlab

3.4 Raciocínio do modelo

Digite o seguinte código no 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. Treinamento do modelo DarkNet53

4.1 Modificar configuração

Primeiro encontre ppcls-->configs-->ImageNet-->DarkNet-->DarkNet53.yaml na pasta PaddleClas.

Modifique épocas para 100, categoria class_num para 9, caminho da imagem de treinamento, caminho da imagem de verificação e arquivo de rótulo, respectivamente. Um total de 7 alterações foram feitas.

  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

Encontre ferramentas -> train.py na pasta PaddleClas. Modificar inicialização do 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 Treinamento de modelo

Digite o seguinte comando no console:

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

Veja detalhes do experimento no swanlab

Os resultados experimentais são os seguintes:

4.4 Raciocínio do modelo

Digite o seguinte código no 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 Exibição de resultados do Swanlab

Como pode ser visto na figura, o modelo ResNet50 tem desempenho melhor que o modelo DarkNet53, e o swanlab fornece uma função de gráfico de comparação conveniente.

5. Demonstração de Gradio

Continua. . .

6. Swanhub carrega e demonstra a demonstração

Continua. . .