2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Les mauvaises herbes constituent l’un des problèmes majeurs de l’agriculture et constituent une menace sérieuse pour la croissance et le rendement des cultures. Les méthodes traditionnelles d’identification et de gestion manuelles sont inefficaces et imprécises. Une technologie avancée de vision par ordinateur est donc nécessaire pour améliorer l’efficacité et la qualité de la production agricole. En tant que modèle d'apprentissage profond, ResNet fonctionne bien dans la gestion de tâches complexes de classification d'images. Il peut non seulement résoudre efficacement le problème des mauvaises herbes diverses et complexes dans les terres agricoles, mais également promouvoir le développement d'une agriculture intelligente et réduire la dépendance aux pesticides chimiques. du développement agricole durable. En utilisant ResNet pour la classification des mauvaises herbes, nous pouvons fournir aux agriculteurs des solutions de gestion agricole plus intelligentes et précises, promouvoir l'amélioration de l'efficacité de la production agricole et la modernisation de l'industrie agricole. Par conséquent, ce projet utilise le framework localisé PaddleClas+Swanlab+Gradio+Swanhub pour mener des expériences de classification des mauvaises herbes.
PaddlePaddle est une plateforme d'apprentissage profond au niveau de l'entreprise développée par Baidu, conçue pour prendre en charge les applications d'apprentissage profond complets, du développement du modèle au déploiement. Il fournit une multitude d'outils et de bibliothèques pour prendre en charge une variété de tâches d'apprentissage en profondeur, notamment le traitement d'images, le traitement du langage naturel, la reconnaissance vocale, etc.PagaiePagaie
PaddleClas est une bibliothèque d'outils spécifiquement utilisée pour les tâches de classification d'images dans le framework Paddle. Il fournit un ensemble complet de solutions de bout en bout, comprenant le traitement des données, la définition de modèles, la formation, l'évaluation et le déploiement, conçues pour aider les développeurs à créer et déployer rapidement des modèles de classification d'images efficaces.PaddleClas
SwanLab est un outil open source et léger de suivi des expériences d'IA qui améliore le suivi des expériences de ML et l'expérience de collaboration en fournissant une API conviviale et en combinant le suivi des hyperparamètres, l'enregistrement des indicateurs, la collaboration en ligne et d'autres fonctions.Bienvenue dans la documentation officielle de SwanLab |
Swanhub est une communauté de collaboration et de partage de modèles open source développée par Geek Studio. Il fournit aux développeurs d'IA des fonctions telles que l'hébergement de modèles d'IA, les enregistrements de formation, l'affichage des résultats du modèle et le déploiement rapide d'API.Bienvenue sur Swanhub
Gradio est une bibliothèque Python open source conçue pour aider les scientifiques des données, les chercheurs et les développeurs travaillant dans le domaine de l'apprentissage automatique à créer et partager rapidement des interfaces utilisateur pour les modèles d'apprentissage automatique.Gradio
Installez les 3 bibliothèques suivantes :
- paddle
- swanlab
- gradio
Commande d'installation :
pip install paddle swanlab gradio
Ensemble de données de classification des mauvaises herbes : DeepWeeds
- DeepWeeds
- --images
- ----1.jpg
- ----2.jpg
- --train.txt
- --val.txt
- --test.txt
- --classnames.txt
Leurs fonctions et significations respectives :
1. Dossier DeepWeeds : ce dossier est utilisé pour stocker les images du dossier d'images, les fichiers d'ensemble de test d'ensemble de formation et les fichiers d'étiquettes.
2. dossier images : ce dossier est utilisé pour enregistrer les dossiers d’images de formation, de test et de vérification.
3. Fichiers train.txt, val.txt, test.txt : ce fichier est utilisé pour enregistrer les chemins d'image et les catégories d'ensembles de formation, de test et de validation.
4. fichier classnames : utilisé pour enregistrer les étiquettes de catégorie
Lien du modèle :Modèle PaddleClas
Après la décompression, vous obtiendrez le dossier PaddleClas.
Créez app.py dans le dossier PaddleClas.
Ce qu'il fait, c'est : exécuter le script qui exécute Gradio Demo
Recherchez d'abord ppcls-->configs-->ImageNet-->Res2Net-->Res2Net50_14w_8s.yaml dans le dossier PaddleClas.
Modifiez respectivement les époques à 100, la catégorie class_num à 9, le chemin de l'image d'entraînement, le chemin de l'image de vérification et le fichier d'étiquette. Au total, 7 modifications ont été apportées.
- # global configs
- Global:
- checkpoints: null
- pretrained_model: null
- output_dir: ./output/
- device: gpu
- save_interval: 1
- eval_during_train: True
- eval_interval: 1
- epochs: 100###########################1##############################
- print_batch_step: 10
- use_visualdl: False
- # used for static mode and model export
- image_shape: [3, 224, 224]
- save_inference_dir: ./inference
-
- # model architecture
- Arch:
- name: Res2Net50_14w_8s
- class_num: 9############################2##############################
-
- # loss function config for traing/eval process
- Loss:
- Train:
- - CELoss:
- weight: 1.0
- epsilon: 0.1
- Eval:
- - CELoss:
- weight: 1.0
-
-
- Optimizer:
- name: Momentum
- momentum: 0.9
- lr:
- name: Cosine
- learning_rate: 0.1
- regularizer:
- name: 'L2'
- coeff: 0.0001
-
-
- # data loader for train and eval
- DataLoader:
- Train:
- dataset:
- name: ImageNetDataset
- image_root: ./weeds/images/#################3#######################
- cls_label_path: ./weeds/train.txt###########4########################
- transform_ops:
- - DecodeImage:
- to_rgb: True
- channel_first: False
- - RandCropImage:
- size: 224
- - RandFlipImage:
- flip_code: 1
- - NormalizeImage:
- scale: 1.0/255.0
- mean: [0.485, 0.456, 0.406]
- std: [0.229, 0.224, 0.225]
- order: ''
- batch_transform_ops:
- - MixupOperator:
- alpha: 0.2
-
- sampler:
- name: DistributedBatchSampler
- batch_size: 64
- drop_last: False
- shuffle: True
- loader:
- num_workers: 4
- use_shared_memory: True
-
- Eval:
- dataset:
- name: ImageNetDataset
- image_root: ./DeepWeeds/images/###############5#######################
- cls_label_path: ./DeepWeeds/val.txt###########6########################
- transform_ops:
- - DecodeImage:
- to_rgb: True
- channel_first: False
- - ResizeImage:
- resize_short: 256
- - CropImage:
- size: 224
- - NormalizeImage:
- scale: 1.0/255.0
- mean: [0.485, 0.456, 0.406]
- std: [0.229, 0.224, 0.225]
- order: ''
- sampler:
- name: DistributedBatchSampler
- batch_size: 64
- drop_last: False
- shuffle: False
- loader:
- num_workers: 4
- use_shared_memory: True
-
- Infer:
- infer_imgs: docs/images/inference_deployment/whl_demo.jpg
- batch_size: 10
- transforms:
- - DecodeImage:
- to_rgb: True
- channel_first: False
- - ResizeImage:
- resize_short: 256
- - CropImage:
- size: 224
- - NormalizeImage:
- scale: 1.0/255.0
- mean: [0.485, 0.456, 0.406]
- std: [0.229, 0.224, 0.225]
- order: ''
- - ToCHWImage:
- PostProcess:
- name: Topk
- topk: 5
- class_id_map_file: ./DeepWeeds/classnaems.txt###########7##################
-
- Metric:
- Train:
- Eval:
- - TopkAcc:
- topk: [1, 5]
Recherchez tools-->train.py dans le dossier PaddleClas. Initialiser Swanlab
- # Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
-
- from __future__ import absolute_import
- from __future__ import division
- from __future__ import print_function
- import os
- import sys
-
- __dir__ = os.path.dirname(os.path.abspath(__file__))
- sys.path.append(os.path.abspath(os.path.join(__dir__, '../')))
-
- from ppcls.utils import config
- from ppcls.engine.engine import Engine
- import swanlab
- # -*- coding: utf-8 -*-
-
- if __name__ == "__main__":
- args = config.parse_args()
- config = config.get_config(
- args.config, overrides=args.override, show=False)
- config.profiler_options = args.profiler_options
- engine = Engine(config, mode="train")
-
- ## 初始化swanlab
- swanlab.init(
- experiment_name="Swanlab_ResNet50_PaddleClas",
- description="Train ResNet50 for weeds classification.",
- project="Swanhub_Weeds_Classification",
- config={
- "model": "ResNet50",
- "optim": "Adam",
- "lr": 0.001,
- "batch_size": 64,
- "num_epochs": 100,
- "num_class": 9,
- }
- )
- engine.train()
Recherchez ppcls-->engine-->train-->utils.py dans PaddleClas et ajoutez le code suivant :
- swanlab.log({"train_lr_msg": lr_msg.split(": ")[1]}) #
- swanlab.log({"train_CELoss": metric_msg.split(",")[0].split(': ')[1]}) ##
- swanlab.log({'train_loss': metric_msg.split(",")[1].split(': ')[1]})
Recherchez ppcls-->engine-->engine.py dans le dossier PaddleClas et ajoutez le code suivant :
swanlab.log({'best_metric': best_metric.get('metric')})
Entrez la commande suivante sur la console :
python -m paddle.distributed.launch tools/train.py -c ./ppcls/configs/ImageNet/Res2Net/Res2Net50_14w_8s.yaml
Afficher les détails de l'expérience dans Swanlab
Les résultats expérimentaux sont les suivants :
Afficher les résultats expérimentaux dans Swanlab
Entrez le code suivant dans la 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
Recherchez d'abord ppcls-->configs-->ImageNet-->DarkNet-->DarkNet53.yaml dans le dossier PaddleClas.
Modifiez respectivement les époques à 100, la catégorie class_num à 9, le chemin de l'image d'entraînement, le chemin de l'image de vérification et le fichier d'étiquette. Au total, 7 modifications ont été apportées.
- # global configs
- Global:
- checkpoints: null
- pretrained_model: null
- output_dir: ./output/
- device: gpu
- save_interval: 1
- eval_during_train: True
- eval_interval: 1
- epochs: 100
- print_batch_step: 10
- use_visualdl: False
- # used for static mode and model export
- image_shape: [3, 256, 256]
- save_inference_dir: ./inference
-
- # model architecture
- Arch:
- name: DarkNet53
- class_num: 9
-
- # loss function config for traing/eval process
- Loss:
- Train:
- - CELoss:
- weight: 1.0
- epsilon: 0.1
- Eval:
- - CELoss:
- weight: 1.0
-
-
- Optimizer:
- name: Momentum
- momentum: 0.9
- lr:
- name: Cosine
- learning_rate: 0.1
- regularizer:
- name: 'L2'
- coeff: 0.0001
-
-
- # data loader for train and eval
- DataLoader:
- Train:
- dataset:
- name: ImageNetDataset
- image_root: F:/datasets/DeepWeeds/images
- cls_label_path: F:/datasets/DeepWeeds/train.txt
- transform_ops:
- - DecodeImage:
- to_rgb: True
- channel_first: False
- - RandCropImage:
- size: 256
- - RandFlipImage:
- flip_code: 1
- - NormalizeImage:
- scale: 1.0/255.0
- mean: [0.485, 0.456, 0.406]
- std: [0.229, 0.224, 0.225]
- order: ''
- batch_transform_ops:
- - MixupOperator:
- alpha: 0.2
-
- sampler:
- name: DistributedBatchSampler
- batch_size: 64
- drop_last: False
- shuffle: True
- loader:
- num_workers: 4
- use_shared_memory: True
-
- Eval:
- dataset:
- name: ImageNetDataset
- image_root: F:/datasets/DeepWeeds/images
- cls_label_path: F:/datasets/DeepWeeds/val.txt
- transform_ops:
- - DecodeImage:
- to_rgb: True
- channel_first: False
- - ResizeImage:
- resize_short: 292
- - CropImage:
- size: 256
- - NormalizeImage:
- scale: 1.0/255.0
- mean: [0.485, 0.456, 0.406]
- std: [0.229, 0.224, 0.225]
- order: ''
- sampler:
- name: DistributedBatchSampler
- batch_size: 64
- drop_last: False
- shuffle: False
- loader:
- num_workers: 4
- use_shared_memory: True
-
- Infer:
- infer_imgs: docs/images/inference_deployment/whl_demo.jpg
- batch_size: 10
- transforms:
- - DecodeImage:
- to_rgb: True
- channel_first: False
- - ResizeImage:
- resize_short: 292
- - CropImage:
- size: 256
- - NormalizeImage:
- scale: 1.0/255.0
- mean: [0.485, 0.456, 0.406]
- std: [0.229, 0.224, 0.225]
- order: ''
- - ToCHWImage:
- PostProcess:
- name: Topk
- topk: 5
- class_id_map_file: F:/datasets/DeepWeeds/classnames
-
- Metric:
- Train:
- Eval:
- - TopkAcc:
- topk: [1, 5]
Recherchez tools-->train.py dans le dossier PaddleClas. Modifier l'initialisation Swanlab
- # Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
-
- from __future__ import absolute_import
- from __future__ import division
- from __future__ import print_function
- import os
- import sys
-
- __dir__ = os.path.dirname(os.path.abspath(__file__))
- sys.path.append(os.path.abspath(os.path.join(__dir__, '../')))
-
- from ppcls.utils import config
- from ppcls.engine.engine import Engine
- import swanlab
- # -*- coding: utf-8 -*-
-
- if __name__ == "__main__":
- args = config.parse_args()
- config = config.get_config(
- args.config, overrides=args.override, show=False)
- config.profiler_options = args.profiler_options
- engine = Engine(config, mode="train")
-
- ## 初始化swanlab
- swanlab.init(
- experiment_name="Swanlab_DrakNet53_PaddleClas",
- description="Train DarkNet53 for weeds classification.",
- project="Swanhub_Weeds_Classification",
- config={
- "model": "DarkNet53",
- "optim": "Adam",
- "lr": 0.001,
- "batch_size": 64,
- "num_epochs": 100,
- "num_class": 9,
- }
- )
- engine.train()
Entrez la commande suivante sur la console :
python -m paddle.distributed.launch tools/train.py -c ./ppcls/configs/ImageNet/DarkNet/DarknetNet53.yaml
Afficher les détails de l'expérience dans Swanlab
Les résultats expérimentaux sont les suivants :
Entrez le code suivant dans la 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 Affichage des résultats Swanlab
Comme le montre la figure, le modèle ResNet50 fonctionne mieux que le modèle DarkNet53 et swanlab fournit une fonction de tableau de comparaison pratique.
À suivre. . .
À suivre. . .