Обмен технологиями

Отечественная система PaddleClas в сочетании с Swanlab для классификации сорняков

2024-07-12

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

1. Представление проекта

Сорняки являются одной из основных проблем в сельском хозяйстве, создавая серьезную угрозу для роста сельскохозяйственных культур и урожайности. Традиционные методы ручной идентификации и управления неэффективны и неточны, поэтому для повышения эффективности и качества сельскохозяйственного производства необходимы передовые технологии компьютерного зрения. Как модель глубокого обучения, ResNet хорошо справляется со сложными задачами классификации изображений. Она может не только эффективно решить проблему разнообразных и сложных сорняков на сельскохозяйственных угодьях, но также способствовать развитию интеллектуального сельского хозяйства и снижению зависимости от химических пестицидов. устойчивого развития сельского хозяйства. Используя ResNet для классификации сорняков, мы можем предоставить фермерам более интеллектуальные и точные решения для управления сельским хозяйством, способствовать повышению эффективности сельскохозяйственного производства и модернизации сельскохозяйственной отрасли. Поэтому в этом проекте используется локализованная платформа PaddleClas+Swanlab+Gradio+Swanhub для проведения экспериментов по классификации сорняков.

PaddlePaddle — это платформа глубокого обучения корпоративного уровня, разработанная Baidu и предназначенная для поддержки полнопроцессных приложений глубокого обучения, от разработки модели до развертывания. Он предоставляет множество инструментов и библиотек для поддержки различных задач глубокого обучения, включая обработку изображений, обработку естественного языка, распознавание речи и т. д.ВеслоВесло

PaddleClas — это библиотека инструментов, специально используемая для задач классификации изображений в платформе Paddle. Он предоставляет полный набор комплексных решений, включая обработку данных, определение моделей, обучение, оценку и развертывание, призванных помочь разработчикам быстро создавать и развертывать эффективные модели классификации изображений.PaddleClas

SwanLab — это легкий инструмент отслеживания экспериментов с искусственным интеллектом с открытым исходным кодом, который улучшает отслеживание экспериментов ML и возможности совместной работы, предоставляя дружественный API и сочетая отслеживание гиперпараметров, запись индикаторов, онлайн-сотрудничество и другие функции.Добро пожаловать в официальную документацию SwanLab |

Swanhub — это сообщество моделей сотрудничества и обмена с открытым исходным кодом, разработанное Geek Studio. Он предоставляет разработчикам ИИ такие функции, как размещение моделей ИИ, записи обучения, отображение результатов модели и быстрое развертывание API.Добро пожаловать в Сванхаб

Gradio — это библиотека Python с открытым исходным кодом, призванная помочь ученым, исследователям и разработчикам, работающим в области машинного обучения, быстро создавать и делиться пользовательскими интерфейсами для моделей машинного обучения.Градио

2. Подготовительная часть

2.1 Установка среды

Установите следующие 3 библиотеки:

  1. paddle
  2. swanlab
  3. gradio

Команда установки:

pip install paddle swanlab gradio

2.2 Загрузка набора данных

Набор данных классификации сорняков: DeepWeeds

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

Их соответствующие функции и значение:

1. Папка DeepWeeds: эта папка используется для хранения изображений папок с изображениями, файлов наборов проверок набора тестов и файлов меток.

2. Папка изображений: эта папка используется для сохранения папок изображений для обучения, тестирования и проверки.

3. Файлы train.txt, val.txt, test.txt: этот файл используется для сохранения путей к изображениям и категорий наборов обучения, тестирования и проверки.

4. Файл имен классов: используется для сохранения меток категорий.

2.3 Загрузите фреймворк PaddleClas

Ссылка на модель:Модель PaddleClas

После распаковки вы получите папку PaddleClas.

2.4 Создать каталог файлов

Создайте app.py в папке PaddleClas.

Что он делает: запускает скрипт, который запускает Gradio Demo.

3. Обучение модели ResNet

3.1 Изменение конфигурации

Сначала найдите ppcls-->configs-->ImageNet-->Res2Net-->Res2Net50_14w_8s.yaml в папке PaddleClas.

Измените эпохи на 100, категорию class_num на 9, путь к обучающему изображению, путь к проверочному изображению и файл метки соответственно. Всего было внесено 7 изменений.

  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 Использование Swanlab

Найдите инструменты ->train.py в папке PaddleClas. Инициализировать лебединую лабораторию

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

Найдите ppcls-->engine-->train-->utils.py в PaddleClas и добавьте следующий код:

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

Найдите ppcls-->engine-->engine.py в папке PaddleClas и добавьте следующий код:

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

3.3 Обучение модели

Введите в консоли следующую команду:

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

Просмотр подробностей эксперимента в swanlab

Результаты эксперимента следующие:

Посмотреть результаты экспериментов в swanlab

3.4 Модельное обоснование

Введите в консоль следующий код:

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

4.1 Изменение конфигурации

Сначала найдите ppcls-->configs-->ImageNet-->DarkNet-->DarkNet53.yaml в папке PaddleClas.

Измените эпохи на 100, категорию class_num на 9, путь к обучающему изображению, путь к проверочному изображению и файл метки соответственно. Всего было внесено 7 изменений.

  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 Использование Swanlab

Найдите инструменты ->train.py в папке PaddleClas. Изменить инициализацию 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 Обучение модели

Введите в консоли следующую команду:

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

Просмотр подробностей эксперимента в swanlab

Результаты эксперимента следующие:

4.4 Модельное обоснование

Введите в консоль следующий код:

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

Как видно из рисунка, модель ResNet50 работает лучше, чем модель DarkNet53, а swanlab предоставляет удобную функцию сравнительной диаграммы.

5. Демо-версия градиента

Продолжение следует. . .

6. Swanhub загружает и демонстрирует демо-версию

Продолжение следует. . .