技術共有

国内フレームワークPaddleClasとSwanlabを組み合わせた雑草分類

2024-07-12

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

1. プロジェクト紹介

雑草は農業における主要な問題の 1 つであり、作物の成長と収量に深刻な脅威をもたらします。従来の手作業による識別および管理方法は非効率的で不正確であるため、農業生産の効率と品質を向上させるには高度なコンピュータービジョンテクノロジーが必要です。 ResNet は、深層学習モデルとして、複雑な画像分類タスクの処理に優れた性能を発揮します。これにより、農地における多様で複雑な雑草の問題を効果的に解決できるだけでなく、インテリジェント農業の開発を促進し、化学農薬への依存を軽減することもできます。持続可能な農業開発の実現に貢献します。 ResNet を雑草分類に使用することで、よりインテリジェントで正確な農業管理ソリューションを農家に提供し、農業生産効率の向上と農業産業の近代化を促進できます。したがって、このプロジェクトでは、ローカライズされたフレームワーク PaddleClas+Swanlab+Gradio+Swanhub を使用して雑草分類実験を実施します。

PaddlePaddle は、Baidu によって開発されたエンタープライズ レベルのディープ ラーニング プラットフォームで、モデル開発からデプロイメントまでのフルプロセスのディープ ラーニング アプリケーションをサポートするように設計されています。画像処理、自然言語処理、音声認識など、さまざまな深層学習タスクをサポートする豊富なツールとライブラリを提供します。パドルパドル

PaddleClas は、Paddle フレームワークでの画像分類タスクに特に使用されるツール ライブラリです。データ処理、モデル定義、トレーニング、評価、展開を含むエンドツーエンドのソリューションの完全なセットを提供し、開発者が効率的な画像分類モデルを迅速に構築および展開できるように設計されています。パドルクラス

SwanLab は、オープンソースの軽量 AI 実験追跡ツールであり、フレンドリーな API を提供し、ハイパーパラメーター追跡、インジケーター記録、オンライン コラボレーション、その他の機能を組み合わせることで、ML 実験追跡とコラボレーション エクスペリエンスを向上させます。SwanLab へようこそ | SwanLab 公式ドキュメント

Swanhub は、Geek Studio によって開発されたオープンソース モデルのコラボレーションおよび共有コミュニティです。 AI開発者にAIモデルのホスティング、トレーニング記録、モデル結果の表示、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. classnames ファイル: カテゴリラベルを保存するために使用されます。

2.3 PaddleClas フレームワークをダウンロードする

モデルリンク:PaddleClasモデル

解凍すると、PaddleClas フォルダーが得られます。

2.4 ファイルディレクトリの作成

PaddleClas フォルダーに app.py を作成します。

実行内容: Gradio デモを実行するスクリプトを実行します。

3. ResNet モデルのトレーニング

3.1 構成の変更

まず、PaddleClas フォルダーで ppcls-->configs-->ImageNet-->Res2Net-->Res2Net50_14w_8s.yaml を見つけます。

エポックを 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 スワンラボの使用

PaddleClas フォルダーで tools-->train.py を見つけます。スワンラボの初期化

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

PaddleClas で ppcls-->engine-->train-->utils.py を見つけて、次のコードを追加します。

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

PaddleClas フォルダーで ppcls-->engine-->engine.py を見つけて、次のコードを追加します。

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 構成の変更

まず、PaddleClas フォルダーで ppcls-->configs-->ImageNet-->DarkNet-->DarkNet53.yaml を見つけます。

エポックを 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 スワンラボの使用

PaddleClas フォルダーで tools-->train.py を見つけます。初期化の変更 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 スワンラボの結果表示

図からわかるように、ResNet50 モデルは DarkNet53 モデルよりも優れたパフォーマンスを示しており、swanlab には便利な比較チャート機能が提供されています。

5. グラデーションデモ

つづく。 。 。

6. Swanhub がデモをアップロードしてデモンストレーションします

つづく。 。 。