Technologieaustausch

Inländischer Rahmen PaddleClas kombiniert mit Swanlab zur Unkrautklassifizierung

2024-07-12

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

1. Projekteinführung

Unkräuter sind eines der größten Probleme in der Landwirtschaft und stellen eine ernsthafte Bedrohung für das Pflanzenwachstum und den Ertrag dar. Herkömmliche manuelle Identifizierungs- und Managementmethoden sind ineffizient und ungenau. Daher ist fortschrittliche Computer-Vision-Technologie erforderlich, um die Effizienz und Qualität der landwirtschaftlichen Produktion zu verbessern. Als Deep-Learning-Modell eignet sich ResNet gut für die Bewältigung komplexer Bildklassifizierungsaufgaben. Es kann nicht nur das Problem vielfältiger und komplexer Unkräuter in landwirtschaftlichen Flächen effektiv lösen, sondern auch die Entwicklung einer intelligenten Landwirtschaft fördern und die Abhängigkeit von chemischen Pestiziden verringern einer nachhaltigen landwirtschaftlichen Entwicklung. Durch die Verwendung von ResNet zur Unkrautklassifizierung können wir Landwirten intelligentere und genauere landwirtschaftliche Managementlösungen bieten, die Verbesserung der landwirtschaftlichen Produktionseffizienz und die Modernisierung der Agrarindustrie fördern. Daher verwendet dieses Projekt das lokalisierte Framework PaddleClas+Swanlab+Gradio+Swanhub, um Experimente zur Unkrautklassifizierung durchzuführen.

PaddlePaddle ist eine von Baidu entwickelte Deep-Learning-Plattform auf Unternehmensebene, die Deep-Learning-Anwendungen im gesamten Prozess von der Modellentwicklung bis zur Bereitstellung unterstützen soll. Es bietet eine Fülle von Tools und Bibliotheken zur Unterstützung einer Vielzahl von Deep-Learning-Aufgaben, einschließlich Bildverarbeitung, Verarbeitung natürlicher Sprache, Spracherkennung usw.PaddelPaddel

PaddleClas ist eine Werkzeugbibliothek, die speziell für Bildklassifizierungsaufgaben im Paddle-Framework verwendet wird. Es bietet einen vollständigen Satz End-to-End-Lösungen, einschließlich Datenverarbeitung, Modelldefinition, Schulung, Bewertung und Bereitstellung, die Entwicklern dabei helfen sollen, schnell effiziente Bildklassifizierungsmodelle zu erstellen und bereitzustellen.PaddelKlasse

SwanLab ist ein Open-Source-Tool zur Verfolgung von KI-Experimenten, das die Verfolgung und Zusammenarbeit von ML-Experimenten verbessert, indem es eine benutzerfreundliche API bereitstellt und Hyperparameter-Tracking, Indikatoraufzeichnung, Online-Zusammenarbeit und andere Funktionen kombiniert.Willkommen bei der offiziellen SwanLab-Dokumentation

Swanhub ist eine von Geek Studio entwickelte Open-Source-Community für die Zusammenarbeit und den Austausch von Modellen. Es bietet KI-Entwicklern Funktionen wie das Hosten von KI-Modellen, Trainingsaufzeichnungen, die Anzeige von Modellergebnissen und eine schnelle API-Bereitstellung.Willkommen bei Swanhub

Gradio ist eine Open-Source-Python-Bibliothek, die Datenwissenschaftlern, Forschern und Entwicklern, die im Bereich maschinelles Lernen arbeiten, dabei helfen soll, schnell Benutzeroberflächen für Modelle für maschinelles Lernen zu erstellen und zu teilen.Gradio

2. Vorbereitungsteil

2.1 Umgebungsinstallation

Installieren Sie die folgenden 3 Bibliotheken:

  1. paddle
  2. swanlab
  3. gradio

Installationsbefehl:

pip install paddle swanlab gradio

2.2 Datensatz herunterladen

Datensatz zur Unkrautklassifizierung: DeepWeeds

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

Ihre jeweiligen Funktionen und Bedeutung:

1. DeepWeeds-Ordner: In diesem Ordner werden Bildordnerbilder, Trainingssatz-Testsatz-Verifizierungssatzdateien und Etikettendateien gespeichert

2. Bilderordner: Dieser Ordner wird zum Speichern von Schulungs-, Test- und Verifizierungsbildordnern verwendet.

3. Dateien train.txt, val.txt, test.txt: Diese Datei wird zum Speichern der Bildpfade und Kategorien von Trainings-, Test- und Validierungssätzen verwendet.

4. Klassennamendatei: Wird zum Speichern von Kategoriebezeichnungen verwendet

2.3 Laden Sie das PaddleClas-Framework herunter

Modelllink:PaddleClas-Modell

Nach dem Entpacken erhalten Sie den PaddleClas-Ordner.

2.4 Dateiverzeichnis erstellen

Erstellen Sie app.py im PaddleClas-Ordner.

Was es tut, ist: Führen Sie das Skript aus, das Gradio Demo ausführt

3. ResNet-Modelltraining

3.1 Konfiguration ändern

Suchen Sie zuerst ppcls-->configs-->ImageNet-->Res2Net-->Res2Net50_14w_8s.yaml im PaddleClas-Ordner.

Ändern Sie die Epochen auf 100, die Kategorie class_num auf 9, den Trainingsbildpfad, den Verifizierungsbildpfad bzw. die Etikettendatei. Insgesamt wurden 7 Änderungen vorgenommen.

  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 Verwendung von Swanlab

Suchen Sie tools-->train.py im PaddleClas-Ordner. Swanlab initialisieren

  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()

Suchen Sie in PaddleClas nach ppcls-->engine-->train-->utils.py und fügen Sie den folgenden Code hinzu:

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

Suchen Sie im PaddleClas-Ordner nach ppcls-->engine-->engine.py und fügen Sie den folgenden Code hinzu:

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

3.3 Modellschulung

Geben Sie den folgenden Befehl auf der Konsole ein:

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

Details zum Experiment in Swanlab anzeigen

Die experimentellen Ergebnisse sind wie folgt:

Sehen Sie sich experimentelle Ergebnisse in Swanlab an

3.4 Modellargumentation

Geben Sie den folgenden Code in die Konsole ein:

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. DarkNet53-Modelltraining

4.1 Konfiguration ändern

Suchen Sie zuerst ppcls-->configs-->ImageNet-->DarkNet-->DarkNet53.yaml im PaddleClas-Ordner.

Ändern Sie die Epochen auf 100, die Kategorie class_num auf 9, den Trainingsbildpfad, den Verifizierungsbildpfad bzw. die Etikettendatei. Insgesamt wurden 7 Änderungen vorgenommen.

  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 Verwendung von Swanlab

Suchen Sie tools-->train.py im PaddleClas-Ordner. Ändern Sie die Initialisierung von 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 Modellschulung

Geben Sie den folgenden Befehl auf der Konsole ein:

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

Details zum Experiment in Swanlab anzeigen

Die experimentellen Ergebnisse sind wie folgt:

4.4 Modellargumentation

Geben Sie den folgenden Code in die Konsole ein:

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

Wie aus der Abbildung ersichtlich ist, ist die Leistung des ResNet50-Modells besser als das DarkNet53-Modell, und Swanlab bietet eine praktische Vergleichsdiagrammfunktion.

5. Gradio-Demo

Fortgesetzt werden. . .

6. Swanhub lädt die Demo hoch und führt sie vor

Fortgesetzt werden. . .