国产化框架PaddleClas结合Swanlab进行杂草分类

news2024/11/13 13:17:08

1. 项目介绍

杂草是农业中的主要问题之一,对作物生长和产量造成严重威胁。传统的手动识别和管理方式效率低下且不够精确,因此需要借助先进的计算机视觉技术来提升农业生产的效率和质量。ResNet作为一种深度学习模型,在处理复杂的图像分类任务中表现出色,不仅可以有效解决农田中杂草多样化、形态复杂的问题,还能够推动农业智能化发展,减少对化学农药的依赖,实现农业可持续发展的目标。通过利用ResNet进行杂草分类,可以为农民提供更智能、精确的农业管理方案,促进农业生产效率的提升和农业产业的现代化进程。因此,本项目使用国产化框架PaddleClas+Swanlab+Gradio+Swanhub进行杂草分类实验。

PaddlePaddle(飞桨)是百度开发的企业级深度学习平台,旨在支持从模型开发到部署的全流程深度学习应用。它提供了丰富的工具和库,支持多种深度学习任务,包括图像处理、自然语言处理、语音识别等。PaddlePaddle

PaddleClas是Paddle框架中专门用于图像分类任务的工具库。它提供了一整套端到端的解决方案,包括数据处理、模型定义、训练、评估和部署,旨在帮助开发者快速构建和部署高效的图像分类模型。PaddleClas

SwanLab是一款开源、轻量级的AI实验跟踪工具,通过提供友好的API,结合超参数跟踪、指标记录、在线协作等功能,提高ML实验跟踪和协作体验。欢迎使用SwanLab | SwanLab官方文档

Swanhub是由极客工作室开发的一个开源模型协作分享社区。它为AI开发者提供了AI模型托管、训练记录、模型结果展示、API快速部署等功能。欢迎使用Swanhub

Gradio是一个开源的Python库,旨在帮助数据科学家、研究人员和从事机器学习领域的开发人员快速创建和共享用于机器学习模型的用户界面。Gradio

 2. 准备部分

2.1 环境安装

安装以下3个库:

paddle
swanlab
gradio

安装命令:

pip install paddle swanlab gradio

2.2 下载数据集

杂草分类数据集:DeepWeeds

DeepWeeds
--images
----1.jpg
----2.jpg
--train.txt
--val.txt
--test.txt
--classnames.txt

它们各自的作用与意义:

1.  DeepWeeds文件夹:该文件夹用于存储图片文件夹images、训练集测试集验证集文件和标签文件

2.  images文件夹:该文件夹用于保存训练、测试、验证图片文件夹。

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。

分别修改epochs为100,类别class_num为9,训练图片路径,验证图片路径和标签文件。一共修改7处。

# 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]

3.2 使用Swanlab

在PaddleClas文件夹中找tools-->train.py。初始化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()

在PaddleClas中找ppcls-->engine-->train-->utils.py中添加以下代码:

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

在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。

分别修改epochs为100,类别class_num为9,训练图片路径,验证图片路径和标签文件。一共修改7处。

# 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]

4.2 使用Swanlab

在PaddleClas文件夹中找tools-->train.py。修改初始化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()

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. Gradio演示

未完待续。。。

6. Swanhub上传并演示demo

未完待续。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1908699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频压缩软件哪个压缩最小,视频用什么软件压缩最小

在数字媒体时代,视频内容的生产与分享已成为生活常态。但随之而来的问题就是,大视频文件占用过多存储空间,上传和分享也变得不便。本文将为你揭示如何将视频压缩到最小,同时保持画质清晰。让我们一起探索吧! 下载并文件…

第九篇——军形篇:先胜后战,赢了再打

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 微观层面的,洞察千里之外;提前预防以做到规避风险…

数据结构——二叉树相关习题3

1.求另一棵树的子树 题目 前序遍历一样,形状不一定一样。 子树:以任何一个节点做根都可以看做是根子树。 也就是说需要让subroot和每一个子树都比较相同的时候就一样。找出左边这棵树的所有子树 思路:如何找到左边的所有子树? …

初识数组!

目录 1.概念 2.一维数组的创建和初始化 1)数组创建 2)数组的初始化 3)数组的类型 3.一维数组的使用 1) 数组下标 2) 数组元素的打印 3) 数组的输入 4.一维数组在内存中的存储 5.sizeof计算数组元素个数 6.二维数组的创建 1.概念 …

Hugging face Transformers(4)—— Model

Hugging Face 是一家在 NLP 和 AI 领域具有重要影响力的科技公司,他们的开源工具和社区建设为NLP研究和开发提供了强大的支持。它们拥有当前最活跃、最受关注、影响力最大的 NLP 社区,最新最强的 NLP 模型大多在这里发布和开源。该社区也提供了丰富的教程…

Android 10.0 FolderIcon文件夹图标内预览图标超出边距解决方案

1.前言 在10.0的系统rom定制化产品开发中,在进行Launcher3的功能定制化过程中,在实现文件夹功能的时候,由于产品分辨率等原因 在拖拽图标进文件夹的时候,在3*3的布局中,会发现图标出了folder边距,所以就需要分析相关的功能,然后实现解决这个问题 2.FolderIcon文件夹图标…

麒麟桌面操作系统上鼠标右键菜单中打开终端栏消失的解决方法

原文链接:麒麟桌面操作系统上鼠标右键菜单中打开终端栏消失的解决方法 Hello,大家好啊!今天给大家带来一篇关于在麒麟桌面操作系统上解决鼠标右键菜单中“打开终端”选项消失的方法的文章。鼠标右键菜单中的“打开终端”选项是一个非常便捷的…

JAVA基础-----包装类,自动装箱、拆箱

一、包装类: Java中的数据类型总体上分为基本数据类型和引用数据类型。引用类型的数据可以通过对象的属性和方法来进行操作,但对于基本数据类型的数据,我们能不能像操作对象那样来操作呢?为了实现这个目标,Java为8种基…

JAVA基础-----final关键字

一、前言 final关键字的含义: final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你用final修饰,你将不能改变被修饰的代码,编译器会检查代码,如果你试图将变量再次初始化的话&#xff0…

MindsDB:一个利用企业数据构建 AI 的平台

MindsDB作为一个开源项目,它旨在将机器学习模型无缝集成到现有的数据库系统中,为用户提供实时的数据预测能力。这个项目的创新之处在于,它能够以简单、直观的方式让开发者和非技术人员都能够利用AI进行数据分析和预测。 它是根据企业数据库定…

(1)滑动窗口算法介绍与练习:长度最小的子数组

滑动窗口算法介绍 所谓滑动窗口,即为同向双指针移动过程中形成的间隔区域,并且这两个指针在移动的过程中不会回退 对于滑动窗口的题目可以抽象为三个步骤: 定义窗口两端指针left和right进入窗口判断离开窗口循环2、3和4步 滑动窗口练习 长度最…

华为 eNSP 路由器 实现双wan出口 访问外网nat 策略路由配置

1 实验拓扑 2 路由器配置 #R1配置 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sysn [Huawei]sysname R1 [R1]int GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 255.255.255.0 [R1-GigabitEthernet0/0/0]qu [R1…

YASKAWA安川Σ-V系列伺服驱动器AC设计维护手侧

YASKAWA安川Σ-V系列伺服驱动器AC设计维护手侧

Milvus lite start 及存储策略

背景 今天开始写下Milvus&#xff0c;为了方便&#xff0c;我直接使用的是 milvus-lite 版本&#xff0c;default 情况下&#xff0c;你可能不知道他到底将 db 存储到什么位置了。启动 default-server&#xff0c;看下Milvus 的start及存储逻辑 主逻辑 def start(self):sel…

EasyCVR视频汇聚平台:存储系统怎么选?分布式存储vs.集中式存储的区别在哪?

在当今的数字化时代&#xff0c;安防监控已成为维护社会秩序和公共安全的重要手段。随着监控设备的普及和监控数据的不断增加&#xff0c;如何高效、安全地存储和管理这些视频数据&#xff0c;成为了安防行业面临的重要挑战。EasyCVR视频存储系统凭借其卓越的性能和灵活的架构&…

MacOS 安装 mtr 网络检测工具

Install sudo brew install mtr sudo chown root $(which mtr) sudo chmod us $(which mtr) sudo chown root $(which mtr-packet) sudo chmod us $(which mtr-packet) Test mtr google.com

Mock.js 的使用方法代码示例

mock.js 的安装 npm install -D vite-plugin-mock mock.jsvite.config.ts配置&#xff1a; import { viteMockServe } from vite-plugin-mock import { userConfigExport, ConfigEnv } from viteexport default defineConfig(({ command }) > {return {plugins: [viteMock…

智能气象站:气象监测的“智慧眼”

在当今日新月异的科技时代&#xff0c;气象监测与预报早已不再是简单的风云变幻的预测&#xff0c;而是融入了大量先进技术&#xff0c;成为了影响社会生产生活的重要因素。 智能气象站&#xff0c;顾名思义&#xff0c;是运用现代物联网、大数据、云计算等先进技术&#xff0c…

R包:蛋白质组学质控评估PTXQC包

介绍 PTXQC包是2016年发表在J Proteome Res期刊上的R包&#xff0c;它主要是对MaxQuant输出结果进行提取处理从而获得评估蛋白质质量结果。 安装 从github安装&#xff0c;安装过程会自动构建tutorial。 devtools::install_github("cbielow/PTXQC", build_vignet…

精确计算应用的冷启动耗时

在iOS项目中&#xff0c;冷启动时间是指从用户点击应用图标开始&#xff0c;到应用完全加载并呈现出第一个界面&#xff08;可能需要网络请求必要的数据&#xff09;所花费的时间。这里以 main 函数为界&#xff0c;分为两个时间段&#xff1a; 从用户点击应用图标 ~ invoke m…