辣椒病虫害图像识别挑战赛

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

一、辣椒病虫害图像识别挑战赛简介

比赛地址:challenge.xfyun.cn/topic/info?…

1.赛事背景

农作物病虫害严重制约着农业生产,因为农作物病虫害种类多、密度大,极易造成农作物大量减产。同时由于传统人眼识别病虫害的方法速度较慢、准确度较低,会导致农药的滥用,破坏自然环境。如今随着精准农业和智慧农业概念的兴起和发展,利用信息技术辅助农业生产,实现对农作物病虫害的智能识别和检测,以减少不必要的农药喷施,对保护生态系统均衡,保障农作物安全生产,提高农作物的质量方面,有着十分重要的促进作用。

2.赛事任务

最为有效的病虫害识别方法是图片识别,本次大赛提供了大量农民在田间地头拍摄的辣椒的病虫害图片,涉及病虫害种类较多,参赛选手需基于提供的样本构建模型,实现辣椒的病虫害图像识别。

3.数据介绍

本次比赛为参赛选手提供了辣椒的病虫害图像数据:包括图像及其所属病虫害标签。数据主体为农民在不同环境条件下拍摄的辣椒的农作物图像,每张图像的主体突出度,背景复杂程度、光照条件,图像清晰度均存在一定差别。 其中疾病分类:

  • 炭疽病 d1
  • 疫病 d2
  • 用药不当 d3
  • 病毒病 d4
  • 温度不适 d5
  • 螨虫 d6
  • 细菌性病害 d7
  • 根腐病 d8
  • 缺素 d9
  • 脐腐病 d10
  • 蓟马 d11

二、PaddleX环境准备

飞桨图像识别套件PaddleClas是飞桨为工业界和学术界所准备的一个图像识别任务的工具集,助力使用者训练出更好的视觉模型和应用落地。此次计划使用端到端的PaddleClas图像分类套件来快速完成分类。此次使用PaddleClas框架完成比赛。

!pip install --upgrade paddlex >log.log
!pip list|grep paddlex

三、数据准备

1.数据解压缩

#解压缩
!unzip -qoa data/data153190/辣椒病虫害图像识别挑战赛公开数据.zip -d data/
# 重命名目录
!mv data/└▒╜╖▓б│ц║ж═╝╧ё╩╢▒Ё╠Ї╒╜╚№╣л┐к╩¤╛▌ data/pepper
!mv data/pepper/└р▒Ё║м╥х.txt data/pepper/label.txt
!mv data/pepper/╠с╜╗╩╛└¤.csv data/pepper/test.csv
!head data/pepper/label.txt

2.数据集划分

!paddlex --split_dataset --format ImageNet --dataset_dir data/pepper/train --val_value 0.1

3.导入PaddleX库

# 环境变量配置,用于控制是否使用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

4.数据增强

# 定义训练和验证时的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()
])

5.定义数据集

# 定义训练和验证所用的数据集
# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/datasets.md
train_dataset = pdx.datasets.ImageNet(
    data_dir='data/pepper/train',
    file_list='data/pepper/train/train_list.txt',
    label_list='data/pepper/train/labels.txt',
    transforms=train_transforms,
    shuffle=True)

eval_dataset = pdx.datasets.ImageNet(
    data_dir='data/pepper/train',
    file_list='data/pepper/train/val_list.txt',
    label_list='data/pepper/train/labels.txt',
    transforms=eval_transforms)
2022-06-28 18:32:02 [INFO]	Starting to read file list from dataset...
2022-06-28 18:32:02 [INFO]	6804 samples in file data/pepper/train/train_list.txt
2022-06-28 18:32:02 [INFO]	Starting to read file list from dataset...
2022-06-28 18:32:02 [INFO]	752 samples in file data/pepper/train/val_list.txt

四、模型训练

1.模型初始化

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

# 自定义优化器:使用CosineAnnealingDecay
train_batch_size = 256
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())

2.开始训练

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/darknet53',
    save_interval_epochs=2,
    use_vdl=True)

五、预测并提交

重启环境,释放现存,预测结果

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

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

# 结果文件
f=open("result.csv","w")
f.write('image,label\n')
# 遍历文件夹
test_data_dir = pathlib.Path('data/pepper/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()
2022-06-29 07:11:53 [INFO]	Model[DarkNet53] loaded.


Corrupt JPEG data: 114 extraneous bytes before marker 0xd9
Invalid SOS parameters for sequential JPEG

下载提交即可获得成绩

猜你喜欢

转载自juejin.im/post/7126178071148757005