Condivisione della tecnologia

Quadro domestico PaddleClas combinato con Swanlab per la classificazione delle infestanti

2024-07-12

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

1. Introduzione al progetto

Le erbe infestanti rappresentano uno dei maggiori problemi in agricoltura e rappresentano una seria minaccia per la crescita e la resa dei raccolti. I tradizionali metodi manuali di identificazione e gestione sono inefficienti e imprecisi, pertanto è necessaria una tecnologia avanzata di visione artificiale per migliorare l’efficienza e la qualità della produzione agricola. Come modello di deep learning, ResNet si comporta bene nella gestione di compiti complessi di classificazione delle immagini. Non solo può risolvere efficacemente il problema delle erbe infestanti diverse e complesse nei terreni agricoli, ma anche promuovere lo sviluppo di un'agricoltura intelligente e ridurre la dipendenza dai pesticidi chimici dello sviluppo agricolo sostenibile. Utilizzando ResNet per la classificazione delle infestanti, possiamo fornire agli agricoltori soluzioni di gestione agricola più intelligenti e accurate, promuovere il miglioramento dell'efficienza della produzione agricola e la modernizzazione del settore agricolo. Pertanto, questo progetto utilizza il framework localizzato PaddleClas+Swanlab+Gradio+Swanhub per condurre esperimenti di classificazione delle erbe infestanti.

PaddlePaddle è una piattaforma di deep learning di livello aziendale sviluppata da Baidu, progettata per supportare applicazioni di deep learning a processo completo, dallo sviluppo del modello alla distribuzione. Fornisce una vasta gamma di strumenti e librerie per supportare una varietà di attività di deep learning, tra cui l'elaborazione delle immagini, l'elaborazione del linguaggio naturale, il riconoscimento vocale, ecc.PagaiaPagaia

PaddleClas è una libreria di strumenti utilizzata specificamente per attività di classificazione delle immagini nel framework Paddle. Fornisce un set completo di soluzioni end-to-end, tra cui elaborazione dei dati, definizione di modelli, formazione, valutazione e implementazione, progettate per aiutare gli sviluppatori a creare e implementare rapidamente modelli di classificazione delle immagini efficienti.PagaiaClas

SwanLab è uno strumento di monitoraggio degli esperimenti AI leggero e open source che migliora il monitoraggio degli esperimenti ML e l'esperienza di collaborazione fornendo un'API intuitiva e combinando il monitoraggio degli iperparametri, la registrazione degli indicatori, la collaborazione online e altre funzioni.Benvenuti nella documentazione ufficiale SwanLab |

Swanhub è una comunità di collaborazione e condivisione di modelli open source sviluppata da Geek Studio. Fornisce agli sviluppatori di intelligenza artificiale funzioni come hosting di modelli di intelligenza artificiale, record di formazione, visualizzazione dei risultati dei modelli e distribuzione rapida delle API.Benvenuti su Swanhub

Gradio è una libreria Python open source progettata per aiutare data scientist, ricercatori e sviluppatori che lavorano nel campo del machine learning a creare e condividere rapidamente interfacce utente per modelli di machine learning.Grado

2. Parte preparatoria

2.1 Installazione dell'ambiente

Installa le seguenti 3 librerie:

  1. paddle
  2. swanlab
  3. gradio

Comando di installazione:

pip install paddle swanlab gradio

2.2 Scarica il set di dati

Set di dati sulla classificazione delle infestanti: DeepWeeds

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

Le loro rispettive funzioni e significato:

1. Cartella DeepWeeds: questa cartella viene utilizzata per archiviare le immagini delle cartelle di immagini, i file dei set di convalida dei set di test dei set di training e i file delle etichette

2. cartella immagini: questa cartella viene utilizzata per salvare le cartelle di immagini di formazione, test e verifica.

3. File train.txt, val.txt, test.txt: questo file viene utilizzato per salvare i percorsi delle immagini e le categorie dei set di training, test e convalida.

4. file dei nomi delle classi: utilizzato per salvare le etichette delle categorie

2.3 Scarica il framework PaddleClas

Collegamento al modello:Modello PaddleClas

Dopo aver decompresso, otterrai la cartella PaddleClas.

2.4 Creare la directory dei file

Crea app.py nella cartella PaddleClas.

Ciò che fa è: eseguire lo script che esegue Gradio Demo

3. Formazione sul modello ResNet

3.1 Modificare la configurazione

Per prima cosa trova ppcls-->configs-->ImageNet-->Res2Net-->Res2Net50_14w_8s.yaml nella cartella PaddleClas.

Modifica le epoche su 100, la categoria class_num su 9, il percorso dell'immagine di training, il percorso dell'immagine di verifica e il file di etichetta rispettivamente. Sono state apportate 7 modifiche in totale.

  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 Utilizzo di Swanlab

Trova tools-->train.py nella cartella PaddleClas. Inizializza 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()

Trova ppcls-->engine-->train-->utils.py in PaddleClas e aggiungi il seguente codice:

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

Trova ppcls-->engine-->engine.py nella cartella PaddleClas e aggiungi il seguente codice:

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

3.3 Formazione modello

Immettere il seguente comando sulla console:

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

Visualizza i dettagli dell'esperimento in swanlab

I risultati sperimentali sono i seguenti:

Visualizza i risultati sperimentali in swanlab

3.4 Ragionamento modello

Inserisci il seguente codice nella 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. Formazione sul modello DarkNet53

4.1 Modificare la configurazione

Per prima cosa trova ppcls-->configs-->ImageNet-->DarkNet-->DarkNet53.yaml nella cartella PaddleClas.

Modifica le epoche su 100, la categoria class_num su 9, il percorso dell'immagine di training, il percorso dell'immagine di verifica e il file di etichetta rispettivamente. Sono state apportate 7 modifiche in totale.

  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 Utilizzo di Swanlab

Trova tools-->train.py nella cartella PaddleClas. Modifica l'inizializzazione 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 Formazione modello

Immettere il seguente comando sulla console:

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

Visualizza i dettagli dell'esperimento in swanlab

I risultati sperimentali sono i seguenti:

4.4 Ragionamento modello

Inserisci il seguente codice nella 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 Visualizzazione dei risultati Swanlab

Come si può vedere dalla figura, il modello ResNet50 funziona meglio del modello DarkNet53 e swanlab fornisce una comoda funzione di grafico di confronto.

5. Demo di Grado

Continua. . .

6. Swanhub carica e mostra la demo

Continua. . .