기술나눔

잡초 분류를 위한 Swanlab과 결합된 국내 프레임워크 PaddleClas

2024-07-12

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

1. 프로젝트 소개

잡초는 농업의 주요 문제 중 하나로 작물의 성장과 수확량에 심각한 위협을 가합니다. 전통적인 수동 식별 및 관리 방법은 비효율적이고 부정확하므로 농업 생산의 효율성과 품질을 향상시키기 위해서는 고급 컴퓨터 비전 기술이 필요합니다. 딥 러닝 모델인 ResNet은 농지의 다양하고 복잡한 잡초 문제를 효과적으로 해결할 수 있을 뿐만 아니라 지능형 농업의 발전을 촉진하고 화학 살충제에 대한 의존도를 줄이는 데도 효과적입니다. 지속가능한 농업 발전의 잡초 분류에 ResNet을 사용함으로써 농부들에게 보다 지능적이고 정확한 농업 관리 솔루션을 제공하고, 농업 생산 효율성 향상과 농업 산업의 현대화를 촉진할 수 있습니다. 따라서 이 프로젝트에서는 현지화된 프레임워크인 PaddleClas+Swanlab+Gradio+Swanhub를 사용하여 잡초 분류 실험을 수행합니다.

PaddlePaddle은 바이두가 개발한 엔터프라이즈급 딥러닝 플랫폼으로, 모델 개발부터 배포까지 전체 프로세스 딥러닝 애플리케이션을 지원하도록 설계되었습니다. 이미지 처리, 자연어 처리, 음성 인식 등 다양한 딥 러닝 작업을 지원하는 풍부한 도구와 라이브러리를 제공합니다.패들패들

PaddleClas는 Paddle 프레임워크의 이미지 분류 작업에 특별히 사용되는 도구 라이브러리입니다. 개발자가 효율적인 이미지 분류 모델을 신속하게 구축하고 배포할 수 있도록 설계된 데이터 처리, 모델 정의, 교육, 평가 및 배포를 포함한 완전한 엔드투엔드 솔루션 세트를 제공합니다.패들클라스

SwanLab은 친숙한 API를 제공하고 하이퍼파라미터 추적, 지표 기록, 온라인 협업 및 기타 기능을 결합하여 ML 실험 추적 및 협업 경험을 향상시키는 오픈 소스 경량 AI 실험 추적 도구입니다.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 Demo를 실행하는 스크립트를 실행하는 것입니다.

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를 찾으세요. 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()

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 Swanlab 결과 표시

그림에서 알 수 있듯이 ResNet50 모델은 DarkNet53 모델보다 성능이 뛰어나며 swanlab은 편리한 비교 차트 기능을 제공합니다.

5. 그라디오 데모

계속됩니다. . .

6. Swanhub가 데모를 업로드하고 시연합니다.

계속됩니다. . .