★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>

1 赛事背景

农作物病害严重制约着农业生产,农作物生长过程中的各种叶片病害会显著降低农产品的数量和质量,为了提高农业生产效率,及时发现和早期预防农作物病害对提高产量至关重要。苹果是世界上果树栽培面积较广的树种之一,也是我国最重要的水果之一,我国的苹果种植总面积达到3800多万亩,苹果总产量达到4200多万吨,无论是种植面积,还是产量,我国均占全球的50%以上,所以我国可以说是世界第一苹果大国,然而我国的苹果种植业同样面临病害导致的减产这一问题。而由于田地的复杂性,从农作物图像中识别和诊断病害是一项高度复杂的任务,针对大果园的人工诊断和识别方法费时低效,速度慢、准确度低,易导致农药的误用、滥用,破坏自然环境。图像处理和机器视觉能够适应复杂多变的自然场景,为苹果病害的识别和诊断奠定基础。利用计算机视觉和图像处理策略设计的苹果叶片病害智能识别算法,可以快速、低成本和精确地对农作物病害进行诊断和识别,有助于建立病害预测机制,及时进行防控,具有重大的实用意义。

【赛题链接】

2 赛事任务

最为有效的病害识别方法是图片识别,本次大赛提供了具有长尾分布特征的大量苹果叶片的病害图片集,涉及9类病害,参赛选手需基于提供的样本构建模型,实现苹果的病害图像识别。

3 评审规则

3.1 数据说明

本次比赛为参赛选手提供了九类自然环境下苹果叶片的病害图像数据:包括图像及其所属病害标签。数据主体为实验室和自然环境条件下的农作物图像,每张图像的主体突出度,背景复杂程度、光照条件,图像清晰度均存在一定差别。

3.2 评估指标

本模型依据提交的结果文件,采用准确率进行评价,考虑到应用场景,模型的体积限制在100MB以下,鼓励使用模型压缩和轻量化方法。

  • 统计TL(正确标签),FL(错误标签)

  • 通过第一步的统计值计算模型的TOP1准确率Facc,Facc=TL/(TL+FL)

3.3 评测及排行

  • 本赛题均提供下载数据,选手在本地进行算法调试,在比赛页面提交结果。

  • 排行按照得分从高到低排序,排行榜将选择团队的历史最优成绩进行排名。

  • 前三名团队选手需提供源代码及可执行的生成提交结果的程序,供出题方进行审核。

4 作品提交要求

  1. 文件格式:按照csv格式提交,编码为UTF-8

  2. 文件大小:无要求

  3. 提交次数限制:每支队伍每天最多3次

  4. 文件详细说明:

    (1)前三名选手需提交模型、源代码和训练文档,以zip文件格式提交

    (2)参赛队伍需要在比赛过程中使用版本控制系统来记录代码的变化,最终提交时需要包括全部代码(包括预处理代码、模型定义和训练脚本等)。代码必须经过注释和整理,以便评委能够理解和测试代码。

    (3)技术说明文档以PDF格式提交,技术文档完整,包括模型运行的环境和使用的程序语言说明,数据预处理过程说明(如数据增强等,此部分如果有就在技术文档说明),使用的模型框架说明,针对数据集特点进行的模型改进说明,模型最终结果展示说明。

!git clone https://github.com/paddlepaddle/paddleclas.git -b develop

5 数据预处理

对数据集进行解压,并划分数据集。

# 解压数据集
!unzip /home/aistudio/data/data215559/苹果病害图像识别挑战赛公开数据.zip
# 将解压后的数据集移动至指定路径
!mkdir /home/aistudio/work/apple
!mv /home/aistudio/╞╗╣√▓б║ж═╝╧ё╩╢▒Ё╠Ї╒╜╚№╣л┐к╩¤╛▌/* /home/aistudio/work/apple/
!mv /home/aistudio/work/apple/train/labletoclass.txt /home/aistudio/work/apple/
!rm -rf /home/aistudio/╞╗╣√▓б║ж═╝╧ё╩╢▒Ё╠Ї╒╜╚№╣л┐к╩¤╛▌
# 安装paddlex,方便后续数据集划分和模型训练

!pip install --upgrade paddlex >log.log

!pip list|grep paddlex
paddlex                        2.1.0
# 查看类别标签
!head /home/aistudio/work/apple/labletoclass.txt
d1 Alternaria leaf spot
d2 Brown spot
d3 Frogeye leaf spot
d4 Grey spot
d5 Health
d6 Mosaic
d7 Powdery mildew
d8 Rust
d9 Scab
# 删除文件名中的空格,否则会找不到文件
import os
for i in range (1, 10):
    filepath="/home/aistudio/work/apple/train/d" + str(i) # 文件目录名
    zimulus = os.listdir(filepath)
    
    for musicname in zimulus: # 改目录下的文件名
        oldmusicpath = filepath +'/' + musicname
        newmusicname = musicname.replace(' ','_')
        newmusicpath = filepath +'/' + newmusicname
        os.rename(oldmusicpath,newmusicpath)
    print(zimulus)

paddlex划分数据集

  • –split_dataset 划分数据集

  • –format ImageNet 数据集类型

  • –dataset_dir 数据集路径

  • –train_value 训练集比例

  • –val_value 验证集比例

# paddlex划分数据集
# 训练集、验证集和测试集
!paddlex --split_dataset --format ImageNet --dataset_dir /home/aistudio/work/apple/train --val_value 0.1
[32m[05-11 10:23:12 MainThread @logger.py:242][0m Argv: /opt/conda/envs/python35-paddle120-env/bin/paddlex --split_dataset --format ImageNet --dataset_dir /home/aistudio/work/apple/train --val_value 0.1
[0m[33m[05-11 10:23:12 MainThread @utils.py:79][0m [5m[33mWRN[0m paddlepaddle version: 2.4.0. The dynamic graph version of PARL is under development, not fully tested and supported
[0m/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/parl/remote/communication.py:38: FutureWarning: 'pyarrow.default_serialization_context' is deprecated as of 2.0.0 and will be removed in a future version. Use pickle or the pyarrow IPC functionality instead.
  context = pyarrow.default_serialization_context()
[0m/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/__init__.py:107: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  from collections import MutableMapping
[0m/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/rcsetup.py:20: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  from collections import Iterable, Mapping
[0m/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/colors.py:53: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  from collections import Sized
[0m2023-05-11 10:23:13,919-WARNING: type object 'QuantizationTransformPass' has no attribute '_supported_quantizable_op_type'
[0m2023-05-11 10:23:13,919-WARNING: If you want to use training-aware and post-training quantization, please use Paddle >= 1.8.4 or develop version
[0m2023-05-11 10:23:16 [INFO]	Dataset split starts...[0m
[0m2023-05-11 10:23:16 [INFO]	Dataset split done.[0m
[0m2023-05-11 10:23:16 [INFO]	Train samples: 9195[0m
[0m2023-05-11 10:23:16 [INFO]	Eval samples: 1016[0m
[0m2023-05-11 10:23:16 [INFO]	Test samples: 0[0m
[0m2023-05-11 10:23:16 [INFO]	Split files saved in /home/aistudio/work/apple/train[0m
[0m[0m

6 模型训练

6.1 环境变量配置

环境变量配置,用于控制是否使用GPU

说明文档:https://paddlex.readthedocs.io/zh_CN/develop/appendix/parameters.html#gpu

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'

import paddle
import paddlex as pdx
from paddlex import transforms as T

6.2 定义数据增强部分

定义训练和验证时的transforms

API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/transforms/transforms.md

train_transforms = T.Compose([
    T.RandomCrop(crop_size=224),
    T.RandomHorizontalFlip(),
    T.RandomDistort(),
    T.RandomBlur(prob=0.1),
    T.Normalize()])

eval_transforms = T.Compose([
    T.ResizeByShort(short_size=256),
    T.CenterCrop(crop_size=224),
    T.Normalize()
])

6.3 定义数据加载

定义训练和验证所用的数据集

API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/datasets.md

train_dataset = pdx.datasets.ImageNet(
    data_dir='work/apple/train/',
    file_list='work/apple/train/train_list.txt',
    label_list='work/apple/train/labels.txt',
    transforms=train_transforms,
    shuffle=True)

eval_dataset = pdx.datasets.ImageNet(
    data_dir='work/apple/train/',
    file_list='work/apple/train/val_list.txt',
    label_list='work/apple/train/labels.txt',
    transforms=eval_transforms)
2023-05-11 10:25:56 [INFO]	Starting to read file list from dataset...
2023-05-11 10:25:57 [INFO]	9195 samples in file work/apple/train/train_list.txt
2023-05-11 10:25:57 [INFO]	Starting to read file list from dataset...
2023-05-11 10:25:57 [INFO]	1016 samples in file work/apple/train/val_list.txt

6.4 设置超参数

num_classes = len(train_dataset.labels)
model = pdx.cls.PPLCNet_ssld(num_classes=num_classes)

# 自定义优化器:使用CosineAnnealingDecay
train_batch_size = 64
num_steps_each_epoch = len(train_dataset) // train_batch_size
num_epochs = 100
scheduler = paddle.optimizer.lr.CosineAnnealingDecay(
    learning_rate=.001, T_max=num_steps_each_epoch * num_epochs)
warmup_epoch = 5
warmup_steps = warmup_epoch * num_steps_each_epoch
scheduler = paddle.optimizer.lr.LinearWarmup(
    learning_rate=scheduler,
    warmup_steps=warmup_steps,
    start_lr=0.0,
    end_lr=.001)
custom_optimizer = paddle.optimizer.Momentum(
    learning_rate=scheduler,
    momentum=.9,
    weight_decay=paddle.regularizer.L2Decay(coeff=.00002),
    parameters=model.net.parameters())
W0511 10:26:07.839133   408 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 11.2
W0511 10:26:07.853029   408 gpu_resources.cc:91] device: 0, cuDNN Version: 8.2.

6.5 模型训练

model.train(
    num_epochs=num_epochs,
    train_dataset=train_dataset,
    train_batch_size=train_batch_size,
    eval_dataset=eval_dataset,
    optimizer=custom_optimizer,
    save_dir='output/pplcnet_ssld',
    save_interval_epochs=5,
    use_vdl=True)

7 结果文件生成

# test_images文件夹批量预测
import pathlib
import os
import paddlex as pdx

# 载入模型
model = pdx.load_model('output/pplcnet_ssld/best_model')

# 结果文件
f=open("result.csv","w")
f.write('uuid,label\n')
# 遍历文件夹
test_data_dir = pathlib.Path('work/apple/test')
# 不带目录,直接图片
test_files=list(test_data_dir.glob('*.jpg'))
for myfile in test_files:    
    result = model.predict(str(myfile))
    filename=os.path.basename(myfile)
    # 写入文件
    f.write(f"{filename},{result[0]['category']}\n")
f.close()
2023-05-11 10:27:27 [INFO]	Model[PPLCNet_ssld] loaded.

[INFO] Model[PPLCNet_ssld] loaded.

8 提分技巧

  • 训练集增加更多的数据增强操作;

  • 调整超参数,如Epochs、batch_size、learning_rate等;

  • 使用更好的学习率衰减函数和优化器,如Adamw等;

  • 可以使用PaddleClas,其中有更多的精度较高的模型。

请点击此处查看本环境基本用法.

Please click here for more detailed instructions.
此文章为搬运
原项目链接

Logo

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

更多推荐