当前位置: 首页 > AI > 文章内容页

使用PaddleX实现的智慧农业病虫检测项目

时间:2025-07-24    作者:游乐小编    

本项目借助PaddleX组件,基于自制的1080张30类病虫图片数据集(分训练、验证、测试集),采用PPYOLO算法实现智慧农业病虫检测。通过数据预处理、模型训练与评估,模型测试集mAP达68.44%。虽因硬件限制未部署于无人机,但已完成检测算法开发,可检测病虫并反馈,助力早发现早解决虫灾。

使用paddlex实现的智慧农业病虫检测项目 - 游乐网

使用PaddleX实现的智慧农业病虫检测项目

在本项目中,使用PaddlX组件,在自制的病虫数据集上,采用ppyolo算法实现了农业的病虫检测。预期成功是将其部署在无人机上,使用无人机巡视农业区并自动化地统计病虫种类数量及时与相关工作人员进行汇报。

一、项目背景

随着计算机视觉领域的技术不断成熟,越来越多的相关技术落地到实际应用场景中。在智慧农业方面,害虫对作物的侵蚀程度不亚于人类经历的各种灾难,但是与天灾不同,作物受到害虫的侵害是可以经过人工处理后避免的,传统的人工农业管理通常是通过农民手工进行检查和除虫 这种传统的生产已经不能满足现在社会生活的需要。为此,本项目引入了计算机视觉领域的目标检测算法,旨在尽可能多的检测出作物上的病虫,同时将其结果反馈给相关工作人员,使得虫灾及早被发现,及早被解决,将病虫扼杀在萌芽之中。

二、数据集介绍

本项目采用的是AIStudio公开数据集中提供的常见病虫识别样本数据集,经过对数据的清洗和格式的重新编写,符合了VOC数据集的格式。

改数据集一共1080张病虫图片,其中训练集864张,验证集162张,测试集54张,共30种不同的病虫类别(区分成虫与幼虫)。

部分数据集数据如下图所示:

 

1. 数据集解压

In [2]
%cd /home/aistudio/work/!tar -xf /home/aistudio/work/Pears.tar
登录后复制        
/home/aistudio/work
登录后复制        In [1]
%cd /home/aistudio/work/!pip install paddlex
登录后复制    

2.检查数据集的图片是否均可读取

In [16]
# 检查数据集是否可用%cd /home/aistudio/work/Pears/!python check.py
登录后复制        
/home/aistudio/work/Pears 51%|█████████████████████                    | 445/866 [00:09<00:10, 41.99it/s]JPEGImages/619.jpg 91%|█████████████████████████████████████▎   | 789/866 [00:14<00:01, 55.37it/s]
登录后复制        

3. 查看数据集的类别信息

In [4]
import osimport tqdmimport xml.etree.ElementTree as ET  paths = "./Pears/Annotations/"classes = []files = os.listdir(paths)for i in files:        path = paths+i    with open(path,'r') as f:        text = f.read()        root = ET.fromstring(text)        for obj in root.iter("object"):                obname = obj.find("name").text                classes.append(obname)classes = set(classes)print(classes)print(len(classes))
登录后复制        
{'Larva_Apriona_Germari', 'Larva_Micromelalopha_Troglodyta_Graeser', 'Larva_Cnidocampa_Flavescens_Walker', 'Larva_Anoplophora_Chinensis', 'Larva_Erthesina_Fullo_Thunberg', 'Larva_Monochamus_Alternatus', 'Adult_Plagiodera_Versicolora', 'Adult_Spilarctia_Subcarnea', 'Larva_Latoia_Consocia_Walker', 'Adult_Apriona_Germari', 'Larva_Jewel_Beetle', 'Adult_Erthesina_Fullo_Thunberg', 'Adult_Monochamus_Alternatus', 'Adult_Psilogramma_Menephron', 'Adult_Giant_Mealy_Bug', 'Adult_Latoia_Consocia_Walker', 'Larva_Clostera_Anachoreta_Fabricius', 'Adult_Cnidocampa_Flavescens_Walker', 'Adult_Sericinus_Montelus_Gray', 'Larva_Hyphantria_Cunea', 'Larva_Psilogramma_Menephron', 'Adult_Jewel_Beetle', 'Adult_Micromelalopha_Troglodyta_Graeser', 'Adult_Hyphantria_Cunea', 'Adult_Anoplophora_Chinensis', 'Larva_Plagiodera_Versicolora', 'Larva_Spilarctia_Subcarnea', 'Adult_Clostera_Anachoreta_Fabricius', 'Larva_Giant_Mealy_Bug', 'Larva_Sericinus_Montelus_Gray'}30
登录后复制        

4.划分数据集

这一步可以跳过,在开发阶段已经执行过了

In [5]
# 划分数据集!paddlex --split_dataset --format VOC --dataset_dir /home/aistudio/work/Pears --val_value 0.15  --test_value 0.05
登录后复制        
Dataset Split Done.Train samples: 866Eval samples: 162Test samples: 54Split files saved in /home/aistudio/work/Pears
登录后复制        In [ ]
#制作COCO数据集#提取文件下img目录所有照片名不要后缀import pandas as pd import osfilelist = os.listdir("/home/aistudio/work/Pears/JPEGImages")train_name = []for file_name in filelist:    name, point ,end =file_name.partition('.')    train_name.append(name)df = pd.DataFrame(train_name) df.head(8)df.to_csv('/home/aistudio/work/Pears/train_all.txt', sep='\t', index=None,header=None)
登录后复制    In [ ]
%cd /home/aistudio/work/PaddleDetection/!mkdir -p dataset/PearsDetection/ImageSets/Main!mv dataset/Pears/train_all.txt dataset/PearsDetection/ImageSets!cp dataset/PearsDetection/label_list.txt dataset/PearsDetection/ImageSets/
登录后复制        
/home/aistudio/work/PaddleDetection
登录后复制        

5. 数据集加载和预处理

In [2]
from paddlex.det import transformsimport paddlex as pdx# 定义训练和验证时的transforms# API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/det_transforms.htmltrain_transforms = transforms.Compose([    transforms.MixupImage(mixup_epoch=250),    transforms.RandomExpand(),     transforms.Resize(        target_size=608, interp='RANDOM'),    transforms.RandomHorizontalFlip(),    transforms.Normalize()])eval_transforms = transforms.Compose([    transforms.Resize(        target_size=608, interp='CUBIC'), transforms.Normalize()])test_transforms = transforms.Compose([    transforms.Resize(        target_size=608, interp='CUBIC'), transforms.Normalize()])train_dataset = pdx.datasets.VOCDetection(    data_dir= './Pears',    file_list='./Pears/train_list.txt',    label_list='./Pears/labels.txt',    transforms=train_transforms,    num_workers=1,    shuffle=True)eval_dataset = pdx.datasets.VOCDetection(    data_dir='./Pears',    file_list='./Pears/val_list.txt',    label_list='./Pears/labels.txt',    num_workers=1,    transforms=eval_transforms)test_dataset = pdx.datasets.VOCDetection(    data_dir='./Pears',    file_list='./Pears/test_list.txt',    label_list='./Pears/labels.txt',    num_workers=1,    transforms=eval_transforms)
登录后复制        
/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/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/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
登录后复制        
2024-08-11 11:51:55 [INFO]Starting to read file list from dataset...2024-08-11 11:51:56 [INFO]864 samples in file ./Pears/train_list.txtcreating index...index created!2024-08-11 11:51:56 [INFO]Starting to read file list from dataset...2024-08-11 11:51:56 [INFO]162 samples in file ./Pears/val_list.txtcreating index...index created!2024-08-11 11:51:56 [INFO]Starting to read file list from dataset...2024-08-11 11:51:57 [INFO]54 samples in file ./Pears/test_list.txtcreating index...index created!
登录后复制        

三、模型选择和开发

1. 模型选择

在本项目中直接调用pdx模型库中目标检测模型,修改好对应的类别信息即可轻松载入模型,在本项目中使用的是PPYOLO模型,采用默认的ResNet50_vd_ssld作为骨干网络

In [3]
# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.htmlnum_classes = len(train_dataset.labels)# API说明: https://paddlex.readthedocs.io/zh_CN/develop/apis/models/detection.html#paddlex-det-yolov3model = pdx.det.PPYOLO(num_classes=num_classes)
登录后复制    

2.训练模型

In [4]
# API说明: https://paddlex.readthedocs.io/zh_CN/develop/apis/models/detection.html#id1# 各参数介绍与调整说明:https://paddlex.readthedocs.io/zh_CN/develop/appendix/parameters.htmlmodel.train(    num_epochs=270,    train_dataset=train_dataset,    train_batch_size=30,    eval_dataset=eval_dataset,    learning_rate=0.000125,    lr_decay_epochs=[210, 240],    save_dir='output/ppyolo',    pretrain_weights="/home/aistudio/output/ppyolo/best_model",    use_vdl=True)
登录后复制    

3.模型评估测试

In [5]
model.evaluate(eval_dataset = test_dataset)
登录后复制        
2024-08-12 05:28:01 [INFO]Start to evaluating(total_samples=54, total_steps=54)...
登录后复制        
100%|██████████| 54/54 [00:12<00:00,  4.40it/s]
登录后复制        
OrderedDict([('bbox_map', 68.43517045311577)])
登录后复制                

4. 模型预测

In [6]
model = pdx.load_model("/home/aistudio/output/ppyolo/best_model")res = model.predict(img_file="/home/aistudio/work/Pears/JPEGImages/250.jpg")
登录后复制        
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/io.py:2358: UserWarning: This list is not set, Because of Paramerter not found in program. There are: create_parameter_0.w_0 create_parameter_1.w_0 create_parameter_2.w_0 create_parameter_3.w_0 create_parameter_4.w_0 create_parameter_5.w_0 create_parameter_6.w_0 create_parameter_7.w_0 create_parameter_8.w_0 create_parameter_9.w_0 create_parameter_10.w_0 create_parameter_11.w_0 create_parameter_12.w_0 create_parameter_13.w_0 create_parameter_14.w_0 create_parameter_15.w_0 create_parameter_16.w_0 create_parameter_17.w_0 create_parameter_18.w_0 create_parameter_19.w_0 create_parameter_20.w_0 create_parameter_21.w_0 create_parameter_22.w_0 create_parameter_23.w_0 create_parameter_24.w_0 create_parameter_25.w_0 create_parameter_26.w_0 create_parameter_27.w_0 create_parameter_28.w_0 create_parameter_29.w_0 create_parameter_30.w_0 create_parameter_31.w_0 create_parameter_32.w_0 create_parameter_33.w_0 create_parameter_34.w_0 create_parameter_35.w_0 create_parameter_36.w_0 create_parameter_37.w_0 create_parameter_38.w_0 create_parameter_39.w_0 create_parameter_40.w_0 create_parameter_41.w_0 create_parameter_42.w_0 create_parameter_43.w_0 create_parameter_44.w_0 create_parameter_45.w_0 create_parameter_46.w_0 create_parameter_47.w_0  format(" ".join(unused_para_list)))
登录后复制        
2024-08-12 05:28:17 [INFO]Model[PPYOLO] loaded.
登录后复制        

登录后复制        

5. 预测结果

由于昆虫名字过长这里用ID表示,具体是什么昆虫可以查看Pears数据集中的labels.txt和昆虫编号.xlsx

In [8]
import matplotlib.pyplot as pltimport cv2%matplotlib inlineplt.figure()img = cv2.imread("/home/aistudio/work/Pears/JPEGImages/250.jpg",-1)img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)for data in res:    if data["score"]>=0.5:        box = data["bbox"]        text = f"{data['category_id']}_%.2f"%(data["score"])        img = cv2.rectangle(img,(int(box[0]),int(box[1])),(int(box[0]+box[2]),int(box[1]+box[3])),(0,255,0), 2)        img = cv2.putText(img, text, (int(box[0]),int(box[1])), cv2.FONT_HERSHEY_PLAIN, 2, (255, 0, 0), 2)plt.imshow(img)plt.show()img = cv2.cvtColor(img,cv2.COLOR_RGB2BGR)cv2.imwrite("test3.jpg",img)
登录后复制        
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2349: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working  if isinstance(obj, collections.Iterator):/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2366: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working  return list(data) if isinstance(data, collections.MappingView) else data
登录后复制        
登录后复制                
True
登录后复制                

四、成果展示

在本项目中,只需要在当前的AIStudio中按顺序运行即可成功运行,目前项目完成了检测模型的开发。最终成果需要部署在无人机上进行病虫检测,然而由于缺乏硬件,因此暂时只能完成检测算法。检测结果如下图所示

热门推荐

更多

热门文章

更多

首页  返回顶部

本站所有软件都由网友上传,如有侵犯您的版权,请发邮件youleyoucom@outlook.com