西红柿番茄成熟度目标检测数据集介绍

article/2025/6/24 14:35:33

随着智能农业的发展,果蔬成熟度识别逐渐成为自动化采摘与质量控制中的核心问题之一。为了支持基于深度学习的目标检测算法对西红柿不同成熟阶段进行识别与分类,我们构建了一个西红柿成熟度目标检测数据集,该数据集包含三种成熟度类别:green(未成熟)、half_ripened(半成熟)和 fully_ripened(完全成熟)。

一、数据集概述

本数据集主要采集自自然光条件下的温室或露天种植环境,图像具有良好的代表性,涵盖了不同角度、不同遮挡程度、不同光照强度下的西红柿样本。

  • 📸 数量:图片共计 643张、总框数7781个其中green 框数为5134个,half_ripened 框数为 1317个,fully_ripened 框数为1330个

  • 🏷 标注类别:

    • green:果实呈绿色,尚未进入成熟阶段;

    • half_ripened:果实部分转红,处于成熟过渡期;

    • fully_ripened:果实整体呈红色,达到采摘标准。

所有图像均已按目标检测任务进行了手工标注,每个目标框标注了类别与位置坐标。如下所示:

二、数据标注说明

该数据集包含三种成熟度类别:green(未成熟)、half_ripened(半成熟)和 fully_ripened(完全成熟)。并提供了三种格式的标签,分别为json、xml和YOLO格式。在json和xml标签中,标签名称为英文。在yolo标签中,标签名字为从0开始的阿拉伯数字。其中类别编号与中英文名称的对应关系如下表所示:

类别编号类别名称英文名称
0完全成熟fully_ripened
1未成熟green
2半成熟half_ripened

三、数据增强

为提升模型对复杂环境下西红柿图像的鲁棒性,本项目在原始图像基础上引入了多种数据增强手段。增强方法主要模拟了自然环境中的光照变化与成像模糊等常见扰动,增强后的图像与原始标签一一对应,扩展了训练样本的多样性,帮助模型更好泛化。(如果需要,请自己运行下面代码进行扩充

具体包括以下三种增强方式:

1. 光照变暗(Gamma 校正)

使用随机范围在 1.6 - 2.6 的伽马值对图像进行非线性调整,模拟阴天或背光等低照度场景,增强模型在弱光环境下的检测能力。

2. 光照变亮(Gamma 校正)

设置伽马值在 0.3 - 0.7 之间,对图像进行亮度增强,模拟强光直射、正午阳光等过曝场景,提升模型在高光条件下的稳定性。

3. 模糊处理(均值模糊)

通过 11×11 的卷积核进行均值模糊,模拟摄像头抖动、对焦不准等真实采集中的模糊情况,有助于模型识别边缘不清晰的目标。

🔧 标签同步处理

每次增强后,图像的对应标签(YOLO 格式)文件会被自动复制并重命名,确保增强样本与其目标框信息一致,从而可直接用于训练。

import random
import shutil
import cv2
import numpy as np
import os
from tqdm import tqdm# 光照变暗
def gamma_transform_low(name, img, label_path, output_path):gamma = random.uniform(1.6, 2.6)  # 变暗is_gray = img.ndim == 2 or img.shape[1] == 1if is_gray:img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)illum = hsv[..., 2] / 255.illum = np.power(illum, gamma)v = illum * 255.v[v > 255] = 255v[v < 0] = 0hsv[..., 2] = v.astype(np.uint8)img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)if is_gray:img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)out_image_path = os.path.join(output_path, "images", "Low_" + name)cv2.imwrite(out_image_path, img)out_label_path = os.path.join(output_path, "labels_yolo", "Low_" + name.split(".jpg")[0] + ".txt")shutil.copyfile(label_path, out_label_path)# 光照变亮
def gamma_transform_high(name, img, label_path, output_path):gamma = random.uniform(0.3, 0.7)   # 变亮is_gray = img.ndim == 2 or img.shape[1] == 1if is_gray:img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)illum = hsv[..., 2] / 255.illum = np.power(illum, gamma)v = illum * 255.v[v > 255] = 255v[v < 0] = 0hsv[..., 2] = v.astype(np.uint8)img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)if is_gray:img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)out_image_path = os.path.join(output_path, "images", "High_" + name)cv2.imwrite(out_image_path, img)out_label_path = os.path.join(output_path, "labels_yolo", "High_" + name.split(".jpg")[0] + ".txt")shutil.copyfile(label_path, out_label_path)# 光照变亮
def Mohu(name, img, label_path, output_path):img1 = cv2.blur(img, (11, 11))  # 模糊处理,卷积核越大,效果越明显out_path = os.path.join(output_path, "images", "MoHu_" + name)cv2.imwrite(out_path, img1)out_label_path = os.path.join(output_path, "labels_yolo", "MoHu_" + name.split(".jpg")[0] + ".txt")shutil.copyfile(label_path, out_label_path)def main():images_input_path = "./data_sum\images"label_input_path = "./labels_yolo"output_path = "./output"image_list = os.listdir(images_input_path)for name in tqdm(image_list):img_path = os.path.join(images_input_path, name)label_path = os.path.join(label_input_path, name.split(".jpg")[0] + ".txt")image = cv2.imread(img_path)gamma_transform_low(name, image, label_path, output_path)gamma_transform_high(name, image, label_path, output_path)Mohu(name, image, label_path, output_path)if __name__ == "__main__":main()

四、数据集划分

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

  1. 读取数据源路径:程序首先定义了包含所有图像和YOLO标签的原始路径。

  2. 获取图像列表并打乱顺序:通过读取图像文件名列表并使用 random.shuffle() 随机打乱,实现数据的随机分布。

  3. 按照7:2:1的比例划分数据集:分别确定训练集、验证集和测试集的数量,并获取对应文件名。(可自行地定义划分比例)

  4. 创建目标文件夹并复制文件:程序依次为训练集、验证集和测试集创建对应的图像与标签保存路径,并将图像文件和标签文件分别复制过去。

import os
import random
import shutilroot_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.1num_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)

 本文数据集是在一些网站上搜集的,由于搜集的图片大多不带标注,自己进行了准确地标注,识别效果良好。如有需求,请支持。数据集链接——西红柿番茄成熟度目标检测数据集


http://www.hkcw.cn/article/oBqPDOBTdq.shtml

相关文章

大数据-275 Spark MLib - 基础介绍 机器学习算法 集成学习 随机森林 Bagging Boosting

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大模型篇章已经开始&#xff01; 目前已经更新到了第 22 篇&#xff1a;大语言模型 22 - MCP 自动操作 FigmaCursor 自动设计原型 Java篇开…

贪心算法应用:线性规划贪心舍入问题详解

贪心算法应用&#xff1a;线性规划贪心舍入问题详解 贪心算法是一种在每一步选择中都采取当前状态下最优的选择&#xff0c;从而希望导致结果是全局最优的算法策略。在线性规划问题中&#xff0c;贪心算法特别是贪心舍入技术有着广泛的应用。下面我将全面详细地讲解这一主题。…

【LLM vs Agent】从语言模型到智能体,人工智能迈出的关键一步

目录 一、什么是 LLM&#xff1f;语言的天才&#xff0c;思维的起点 ✅ 特点小结&#xff1a; 二、什么是 Agent&#xff1f;智能的执行者&#xff0c;自主的决策者 ✅ 特点小结&#xff1a; 三、LLM 与 Agent 的关系&#xff1a;是工具&#xff0c;更是大脑 四、案例实战…

esp32 platformio lvgl_gif的使用和踩坑情况

踩坑一&#xff1a;白屏 不显示 开启custom内存这里 以及 gif显示 踩坑二&#xff1a;只有图片 不显示动态 没开时间 要打开这个时基 网站:转成c数组的官方网站 Image Converter — LVGL 以及显示代码&#xff1a;在setup里面调用 LV_IMG_DECLARE(my_gif);lv_obj_t *img;img…

华南沿海等地较强降雨持续 局地伴有强对流天气

今明两天(6月3日至4日),我国降雨主要出现在云南和华南沿海、东北地区等地,局地还可能伴有强对流天气。随着高压脊东移,北方大部气温逐渐升高,华北、黄淮等地高温天气将发展增多,南方多地5日起也将加入高温行列。昨天,冷空气南下导致南方强降雨区域南压至华南和云南一带…

黄金白银原油大涨 市场热度持续升温

黄金原油市场收盘大涨,贵金属与能源品种展现出强劲涨势。COMEX黄金期货和白银期货分别以显著涨幅收盘,其中黄金期货收涨2.74%,报3406.4美元/盎司;白银期货收涨5.76%,报34.93美元/盎司。原油市场同样表现抢眼,WTI原油期货收于每桶62.52美元,上涨1.73美元,涨幅为2.85%;布…

“蹦床外长”当选联大主席 外交新挑战

蹦床外长当选联大主席!一夜醒来,联合国大会发生了重大变化。周一下午,在纽约联合国总部举行的全体会议上,被称为“蹦床外长”的安娜莱娜贝尔伯克以167票当选为联合国大会主席。这距离她离开德国外长之位不到一个月。这份工作需要相当强的外交技巧,一些批评人士认为这是贝尔…

python依赖库管理工具

软件名称&#xff1a;Python依赖管理工具 版本&#xff1a;1.0适用系统&#xff1a;Windows 7/10/11&#xff0c;Python 项目环境管理辅助工具 开发语言&#xff1a;Python 3 PyQt5 开发者&#xff1a;Thebzk 软件功能简介&#xff1a; 本工具是专为Python 开发者设计的图…

labuladong刷题之前缀和与差分数组技巧(空间换时间)

Q1题目链接&#xff1a;https://leetcode.com/problems/range-sum-query-immutable/ leetcode 303 看到题目的第一思路&#xff1a; 代码随想录之后的想法和总结&#xff1a; 如何用 prefix 查询区间和&#xff1f; 如果你想查询&#xff1a;nums[left] nums[left1] ... …

基于爬取的典籍数据重新设计前端界面

1.BooksView(书籍列表页) 2.ClassicsView&#xff08;目录页&#xff09; 3.管理员端

Origin将杂乱的分组散点图升级为美观的带颜色映射的气泡图

图形初步了解 带颜色映射的气泡图&#xff0c;是一种含有三个变量的高级散点图&#xff0c;前两个变量分别为横纵坐标&#xff0c;第三个变量通过气泡的大小和颜色来呈现。在视觉上辅助读者直观地比较三个变量的关系。 在本例图中&#xff0c;通过pH、Group和Solubility三个指…

初识Linux指令(笔记2)

&#xff08;1&#xff09;man指令&#xff08;重要&#xff09; Linux的命令有很多参数&#xff0c;我们不可能全记住&#xff0c;我们可以通过查看联机手册获取帮助。访问Linux手册页的命令是man 语法: man [选项] 命令 &#xff08;2&#xff09;cp指令&#xff08;重要&…

w374预报名管理系统设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

JAVA-springboot整合Mybatis

SpringBoot从入门到精通-第15章 MyBatis框架 学习MyBatis心路历程 2022年学习java基础时候&#xff0c;想着怎么使用java代码操作数据库&#xff0c;咨询了项目上开发W同事&#xff0c;没有引用框架&#xff0c;操作数据库很麻烦&#xff0c;就帮我写好多行代码&#xff0c;就…

Torch Geometric GCN训练心得

我训练的是直推式的图卷积神经网络GCN 对于直推式GCN训练&#xff0c;控制参数量是非常重要的&#xff0c;我的网络大小30个节点&#xff1a; 不像归纳式学习训练&#xff0c;可以通过提升样本数量来承受巨大的模型参数量&#xff0c;直推式学习一次训练的目标就一个样本&…

张雪峰宣布暂停直播两个月 深情感言引共鸣

张雪峰宣布暂停直播两个月 深情感言引共鸣。5月31日晚,有网友发布视频称张雪峰结束了2025届高考季的直播,并宣布将暂停直播两个月。在直播中,张雪峰表示这个行业不容易,因为他触动了太多人的利益,有些事情不能说得太直白。他希望能在8月1日恢复直播,如果不行的话,9月1日…

线程池详细解析(一)

java中的线程池是运用场景最多的并发框架&#xff0c;几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中&#xff0c;合理的使用线程池能够带来三个好处。 1. 降低资源消耗&#xff1a;频繁的创建线程和销毁线程会产生不少的资源上的消耗&#xff0c;通过重…

韩国大选今日开始投票 五候选人竞逐总统

韩国第21届总统大选于当地时间6月3日6时正式开始,全国共设有14295个投票站。未参加提前投票的选民凭身份证件前往指定投票站即可参与投票,投票将于当日20时结束。本次大选共有7位候选人登记,但其中两位宣布退出并支持国民力量党候选人金文洙。因此,选民将从以下五位候选人中…

米奇盖顿:音乐架起中美交流桥梁 纯粹情感共鸣

米奇盖顿在湖南卫视《歌手2025》的舞台上演唱完《If I Were a Boy》后,不禁潸然泪下。这位来自美国得克萨斯州的乡村音乐女歌手,曾在2021年获得格莱美最佳乡村独唱表演提名,成为首位提名该奖项的黑人女歌手。在中国观众毫无保留的情感反馈中,她感受到了一种久违的真诚。在美…

字节跳动社招面经 —— BSP驱动工程师(6)

接前一篇文章&#xff1a;字节跳动社招面经 —— BSP驱动工程师&#xff08;5&#xff09; 本文内容参考&#xff1a; 嵌入式硬件平台修改启动地址-CSDN博客 特此致谢&#xff01; 上一回开始针对于“嵌入式充电站”发的一篇文章字节跳动社招面经——BSP驱动工程师中的面试题…