农业病虫害11类目标检测数据集

53 阅读4分钟

 在现代农业领域,病虫害防控始终是保障作物产量与品质的关键环节。随着人工智能技术的不断进步,基于深度学习的图像识别与目标检测手段正在逐步应用于病虫害智能识别中。为此,构建高质量的病虫害目标检测数据集显得尤为重要。本文将介绍一个涵盖常见农业害虫类别的目标检测数据集,供相关研究者和开发者参考。

一、数据集概述

病虫害数据集一共有5007张包含了11类常见病虫害图像,类别分别为:蚂蚁、蜜蜂、甲虫、毛毛虫、蠼螋、蚱蜢、蛾类、鼻涕虫、蜗牛、黄蜂、象甲, 各类别数量分布均匀。标签包含了 json、xml、yolo三种格式。 每张图像都经过人工手动标注,保证了标签的准确性,旨在支持如YOLO、Faster R-CNN、SSD等主流目标检测算法的训练与评估。

二、类别定义

数据集中共包含以下11类典型农业害虫,涵盖了不同形态与危害方式的代表性虫害类型。在json和xml标签中,标签名称为英文。在yolo标签中,标签名字为从0开始的阿拉伯数字。其中类别编号与中英文名称的对应关系如下表所示:

类别编号类别名称英文名称
0蚂蚁ants
1蜜蜂bees
2甲虫beetle
3毛毛虫caterpillar
4蠼螋earwig
5蚱蜢grasshopper
6蛾类moth
7鼻涕虫slug
8蜗牛snail
9黄蜂wasp
10象甲weevil

三、数据集展示

数据集中包含多个自然环境下拍摄的虫害图像,背景复杂度适中,具备较好的通用性。样本来源多样,图像中虫体大小、姿态、光照等具备一定的变异性,有助于提升模型的泛化能力。其中部分标注示例如下所示:

四、数据集划分

下面代码主要作用是将原始数据集按比例划分为训练集、验证集和测试集,并分别保存对应的图像和YOLO格式标签文件。具体过程如下:

  1. 读取数据源路径:程序首先定义了包含所有图像和YOLO标签的原始路径。
  2. 获取图像列表并打乱顺序:通过读取图像文件名列表并使用 random.shuffle() 随机打乱,实现数据的随机分布。
  3. 按照7:2:1的比例划分数据集:分别确定训练集、验证集和测试集的数量,并获取对应文件名。(可自行地定义划分比例)
  4. 创建目标文件夹并复制文件:程序依次为训练集、验证集和测试集创建对应的图像与标签保存路径,并将图像文件和标签文件分别复制过去。
import os
import random
import shutil

root_dir = r"./data_sum"
save_root_dir = r"./data_split"

image_sum_dir = os.path.join(root_dir, "images")
label_yolo_sum_dir = os.path.join(root_dir, "labels_yolo")

# 获取文件夹下所有图片名称
image_list = os.listdir(image_sum_dir)
image_list = [name for name in image_list if name.endswith(".jpg")]

# 随机打乱文件名列表
random.shuffle(image_list)

# 划分训练集和验证集
train_ratio = 0.7
val_ratio = 0.2
test_ratio = 0.1

num_images = len(image_list)
num_train = int(num_images * train_ratio)
num_val = int(num_images * val_ratio)
num_test = num_images - num_train - num_val
print("num_images:{}  num_train:{}  num_val:{}  num_test:{}".format(num_images, num_train, num_val, num_test))

# 获取训练集和验证集名字
train_names = image_list[:num_train]
val_names = image_list[num_train: num_train + num_val]
test_names = image_list[num_train + num_val: num_images]



# 训练集图片及标签保存路径
save_train_images_path = os.path.join(save_root_dir, "images", "train")
save_train_labels_path = os.path.join(save_root_dir, "labels", "train")

if not os.path.exists(save_train_images_path):
    os.makedirs(save_train_images_path)

if not os.path.exists(save_train_labels_path):
    os.makedirs(save_train_labels_path)

for name in train_names:
    # 图像
    image_path = os.path.join(image_sum_dir, name)
    label_path = os.path.join(label_yolo_sum_dir, name.split(".jpg")[0] + ".txt")
    assert os.path.exists(image_path), "file:{} not exist ...".format(image_path)
    assert os.path.exists(label_path), "file:{} not exist ...".format(label_path)
    shutil.copy(image_path, save_train_images_path)
    shutil.copy(label_path, save_train_labels_path)


# 验证集图片及标签保存路径
save_val_images_path = os.path.join(save_root_dir, "images", "val")
save_val_labels_path = os.path.join(save_root_dir, "labels", "val")

if not os.path.exists(save_val_images_path):
    os.makedirs(save_val_images_path)

if not os.path.exists(save_val_labels_path):
    os.makedirs(save_val_labels_path)

for name in val_names:
    # 图像
    image_path = os.path.join(image_sum_dir, name)
    label_path = os.path.join(label_yolo_sum_dir, name.split(".jpg")[0] + ".txt")
    assert os.path.exists(image_path), "file:{} not exist ...".format(image_path)
    assert os.path.exists(label_path), "file:{} not exist ...".format(label_path)
    shutil.copy(image_path, save_val_images_path)
    shutil.copy(label_path, save_val_labels_path)


# 测试图片及标签保存路径
save_test_images_path = os.path.join(save_root_dir, "images", "test")
save_test_labels_path = os.path.join(save_root_dir, "labels", "test")

if not os.path.exists(save_test_images_path):
    os.makedirs(save_test_images_path)

if not os.path.exists(save_test_labels_path):
    os.makedirs(save_test_labels_path)

for name in test_names:
    # 图像
    image_path = os.path.join(image_sum_dir, name)
    label_path = os.path.join(label_yolo_sum_dir, name.split(".jpg")[0] + ".txt")
    assert os.path.exists(image_path), "file:{} not exist ...".format(image_path)
    assert os.path.exists(label_path), "file:{} not exist ...".format(label_path)
    shutil.copy(image_path, save_test_images_path)
    shutil.copy(label_path, save_test_labels_path)

本文数据集是在一些网站上搜集的,由于搜集的图片大多不带标注,自己进行了准确地标注,识别效果良好。如有需求,请支持。数据集链接——病虫害目标检测数据集(带标签)