在这里插入图片描述

APP部署效果预览

APP前后端代码已上传到Github仓库 - https://github.com/JiehangXie/appleleaf-deseases-classification

前言

病虫害是严重危害农业生产的自然灾害之一。根据联合国粮农组织估计,全世界的粮食和棉花生产因病害常年损失在10%以上。植物病害不仅可引起农作物产量的减少,而且在一定程度上还严重威胁到农产品的质量安全及其国际贸易。历史上有很多因植物病害的大面积爆发和流行给人类带来重大灾难的事件,著名的"爱尔兰大饥荒",即1845年由于马铃薯晚疫病的严重流行危害而造成"饿殍遍地及流离失所"的重大案例。植物病虫害同样严重威胁人类宝贵的森林资源。林业病虫害被称为无烟的森林火灾。

苹果是世界上最重要的温带水果作物之一。叶病对苹果种植园的整体生产力和质量构成重大威胁。目前苹果种植园的植物疾病诊断的过程主要依赖于人工,既费时又昂贵。培养一个能精准识别苹果病虫害的专家需要很长时间,而且不同的农作物病害也不一样。但使用AI技术,在短短几个小时至一天的时间完成训练,让计算机成为病虫害识别的专家。

数据集处理

解压数据集

!unzip data/data100996/Plant_Pathology_2021.zip -d data > /dev/null 2>&1

查看数据分布

import pandas as pd

data_csv = pd.read_csv('data/train.csv',header=0)
labels_counts = data_csv['labels'].value_counts()
labels_counts.plot.bar()
<matplotlib.axes._subplots.AxesSubplot at 0x7f63d5947bd0>

在这里插入图片描述

数据集采集技巧

  • 采集图像要求特征清晰
  • 采集目标尽量居中放大
  • 尽量多时间段采集,充分考虑光照等外界因素影响
  • 如果条件允许,建议把相机取景框设置成正方形

数据分类

在这里插入图片描述

import os
import shutil
from tqdm import tqdm

# 创建新的文件夹
datasetPath = './dataset'
if not os.path.exists(datasetPath):
    os.makedirs('./dataset')

for index in tqdm(data_csv.index):
    # 逐行读取照片并根据标签复制到对应的文件夹
    imagePath = os.path.join('./data/train_images',data_csv.loc[index]['image'])
    imageLabels = data_csv.loc[index]['labels'].replace(' ','-')
    
    labelDir = os.path.join(datasetPath, imageLabels)
    if not os.path.exists(labelDir):
        os.makedirs(labelDir)

    shutil.copy(imagePath, labelDir)
!pip install --upgrade paddlex
!paddlex --split_dataset --format ImageNet --dataset_dir ./dataset/ --val_value 0.3

查看训练集和验证集数量

with open('./dataset/train_list.txt', 'r') as f:
    trainList = f.readlines()
with open('./dataset/val_list.txt', 'r') as f:
    valList = f.readlines()

print('训练集共有 {} 张图片数据'.format(len(trainList)))
print('验证集共有 {} 张图片数据'.format(len(valList)))
训练集共有 13046 张图片数据
验证集共有 5586 张图片数据

PaddleClas套件

下载套件

!git clone https://gitee.com/paddlepaddle/PaddleClas.git
Cloning into 'PaddleClas'...
remote: Enumerating objects: 33953, done.[K
remote: Counting objects: 100% (13836/13836), done.[K
remote: Compressing objects: 100% (4190/4190), done.[K
remote: Total 33953 (delta 10382), reused 12788 (delta 9521), pack-reused 20117[K
Receiving objects: 100% (33953/33953), 189.60 MiB | 14.36 MiB/s, done.
Resolving deltas: 100% (24167/24167), done.
Checking connectivity... done.

训练策略

数据增强

Q:数据集中图片的光照条件都有所差异,为什么不做对比度亮度的随机变化以增强模型的鲁棒性?
A:不做,因为植物数据区别于其他数据,颜色不一样就可能是另外一种植物或者另外一种病虫害了(比如叶片红斑或者黄斑)

多尺度训练

多尺度训练/测试作为一种提升性能的有效技巧被应用在MS COCO等比赛中。输入图片的尺寸对模型的性能影响相当明显,事实上,多尺度是提升精度最明显的技巧之一。在基础网络部分常常会生成比原图小数十倍的特征图,导致小物体的特征描述不容易被检测网络捕捉。通过输入更大、更多尺寸的图片进行训练,能够在一定程度上提高检测模型对物体大小的鲁棒性,仅在测试阶段引入多尺度,也可享受大尺寸和多尺寸带来的增益。

  • 多尺度训练对全卷积网络有效,在训练时,每隔一定的 iterations,在一定尺寸范围内,随机选取一种 img_size 进行训练。
  • 通过对不同尺度的图像进行训练,在一定程度上提高检测模型对物体大小的鲁棒性。
  • 使用尺度小的图片测试速度快些,但准确度低,用尺度大的图片测试速度慢,但准确度高。

模型选择

本文选择的模型是飞桨专门为产业界打造的图像分类模型PPLCNetV2,该模型具有 轻量化、高性能、易部署 等优点,具体介绍详解Github:https://github.com/PaddlePaddle/PaddleClas/blob/release/2.4/docs/zh_CN/models/PP-LCNetV2.md
在这里插入图片描述

训练配置

# global configs
Global:
  checkpoints: null
  pretrained_model: https://paddle……PPLCNetV2_base_pretrained.pdparams
  output_dir: ./output/
  device: gpu
  save_interval: 10
  eval_during_train: True
  eval_interval: 2
  epochs: 50
  print_batch_step: 10
  use_visualdl: True
  # used for static mode and model export
  image_shape: [3, 224, 224]
  save_inference_dir: ./inference

# model architecture
Arch:
  name: PPLCNetV2_base
  class_num: 12

# 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.02
    warmup_epoch: 5
  regularizer:
    name: 'L2'
    coeff: 0.00004

# data loader for train and eval
DataLoader:
  Train:
    dataset:
      name: MultiScaleDataset
      image_root: ./dataset/
      cls_label_path: ./dataset/train_list.txt
      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: ''

    # support to specify width and height respectively:
    # scales: [(160,160), (192,192), (224,224) (288,288) (320,320)]
    sampler:
      name: MultiScaleSampler
      scales: [160, 192, 224, 288, 320]
      # first_bs: batch size for the first image resolution in the scales list
      # divide_factor: to ensure the width and height dimensions can be devided by downsampling multiple
      first_bs: 128
      divided_factor: 32
      is_training: True
    loader:
      num_workers: 4
      use_shared_memory: True

  Eval:
    dataset: 
      name: ImageNetDataset
      image_root: ./dataset/
      cls_label_path: ./dataset/val_list.txt
      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: 32
      drop_last: False
      shuffle: False
    loader:
      num_workers: 4
      use_shared_memory: True

Metric:
  Train:
    - TopkAcc:
        topk: [1, 3]
  Eval:
    - TopkAcc:
        topk: [1, 3]

开始训练

!python PaddleClas/tools/train.py -c PPLCnetV2.yml

模型效果

在这里插入图片描述

模型导出

!python PaddleClas/tools/export_model.py \
    -c PPLCnetV2.yml \
    -o Global.pretrained_model="output/PPLCNetV2_base/best_model"

模型部署

FastDeploy是一款简单易用的推理部署工具箱,站在开发者视角,模型在硬件上部署的最佳实践的完整集合。覆盖Paddle、 Pytorch等AI框架的主流优质预训练模型,提供开箱即用的开发体验,包括图像分类、目标检测、图像分割、人脸检测、人体关键点识别、文字识别、NLP等多任务,满足开发者多场景,多硬件、多平台的快速部署需求。
Github仓库地址:https://github.com/PaddlePaddle/FastDeploy

下载安装Fastdeploy

!pip install fastdeploy_python-0.2.0-cp37-cp37m-manylinux1_x86_64.whl

推理配置文件

Global:
  batch_size: 1
  use_gpu: True #是否使用GPU
  enable_mkldnn: True #是否使用mkldnn加速
  cpu_num_threads: 10
  enable_benchmark: True
  use_fp16: False
  ir_optim: True
  use_tensorrt: False
  gpu_mem: 8000
  enable_profile: False

PreProcess:
  transform_ops:
    - ResizeImage:
        resize_short: 256
    - CropImage:
        size: 224
    - NormalizeImage:
        scale: 0.00392157
        mean: [0.485, 0.456, 0.406]
        std: [0.229, 0.224, 0.225]
        order: ''
        channel_num: 3
    - ToCHWImage:

推理代码

import fastdeploy as fd
import cv2

model = fd.vision.classification.PaddleClasModel(
                        model_file = 'inference/inference.pdmodel',
                        params_file = 'inference/inference.pdiparams',
                        config_file = 'inference.yml',
)

img = cv2.imread('dataset/healthy/81935a3879e1f68e.jpg')
result = model.predict(img)
print(result)
ClassifyResult(
label_ids: 3, 
scores: 0.888799, 
)

取出分类id,并读取labels.txt获取id对应的分类映射

labelId = result.label_ids[0]
with open("dataset/labels.txt", 'r') as o:
    labelmap = o.readlines()
label = labelmap[labelId].replace('\n', '')
label
'healthy'

APP制作

详见代码:https://github.com/JiehangXie/appleleaf-deseases-classification

总结

本文是面对农业产业落地的实操项目,以苹果叶面病害识别为主题演示了从数据集到训练、部署再到APP结合的全流程,旨在为农业产业其他应用提供产业示例参考,如有不足,还望包含和指正。

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐