草莓成熟度检测数据集,共800余张大棚内实景拍摄,区分为成熟,未成熟,草莓花梗三类,提供yolo标注
草莓成熟度检测数据集,共800余张大棚内实景拍摄,区分为成熟,未成熟,草莓花梗三类,提供yolo标注
草莓成熟度检测数据集介绍
数据集概览
- 总图像数量: 800余张
- 类别数量:
- 成熟 (Ripe)
- 未成熟 (Unripe)
- 草莓花梗 (Strawberry Peduncle)
- 任务类型: 目标检测
- 标注格式: YOLO格式
- 拍摄环境: 大棚内实景拍摄
- 数据集大小: 根据图像分辨率和数量,估计在几百MB到几GB之间
类别划分
- 成熟 (Ripe): 完全成熟的草莓。
- 未成熟 (Unripe): 未完全成熟的草莓。
- 草莓花梗 (Strawberry Peduncle): 连接草莓果实和植株的花梗。
数据集结构
假设数据集文件夹结构如下:
strawberry_ripeness_dataset/
├── images/
│ ├── train/
│ ├── val/
│ └── test/
├── labels/
│ ├── train/ # YOLO格式
│ ├── val/
│ └── test/
└── README.md
images/
目录下存放图像文件。labels/
目录下存放YOLO格式的标注文件。README.md
文件包含数据集的使用说明和字段解释。
YOLO标注文件示例
YOLO格式的标注文件是与图像文件同名的.txt
文件,每行表示一个目标对象,格式为:
<class_id> <x_center> <y_center> <width> <height>
其中:
<class_id>
是类别的索引(从0开始)。<x_center>
和<y_center>
是边界框中心点相对于图像宽度和高度的比例坐标。<width>
和<height>
是边界框的宽度和高度相对于图像宽度和高度的比例。
示例:
# 示例:labels/train/00001.txt
0 0.456 0.321 0.123 0.089 # Ripe
1 0.678 0.456 0.154 0.123 # Unripe
2 0.789 0.567 0.189 0.156 # Strawberry Peduncle
使用场景
- 成熟度检测: 用于自动识别和分类草莓的成熟程度。
- 智能农业: 结合其他技术如机器人采摘,实现自动化收割和分拣。
- 质量控制: 帮助农民和食品加工厂快速筛选出不同成熟度的草莓。
Keras 训练代码示例
为了训练一个目标检测模型,我们可以使用预训练的YOLOv5模型。这里我们使用PyTorch和YOLOv5来进行训练。如果你更喜欢使用Keras,可以考虑使用YOLOv3或YOLOv4的Keras实现,但YOLOv5目前主要支持PyTorch。
以下是一个使用YOLOv5进行训练的代码示例。
YOLOv5 训练代码示例
首先,确保你已经安装了YOLOv5所需的依赖项。你可以通过以下命令克隆YOLOv5仓库并安装依赖项:
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
然后,创建一个配置文件 data/strawberry_ripeness.yaml
来指定数据集路径和类别信息:
train: /path/to/strawberry_ripeness_dataset/images/train
val: /path/to/strawberry_ripeness_dataset/images/val
test: /path/to/strawberry_ripeness_dataset/images/test
nc: 3 # 类别数量
names: ['Ripe', 'Unripe', 'Strawberry_Peduncle']
接下来,使用以下脚本进行训练:
import torch
from pathlib import Path
from models.experimental import attempt_load
from utils.datasets import create_dataloader
from utils.general import check_img_size, non_max_suppression, scale_coords, set_logging
from utils.torch_utils import select_device, time_synchronized
# 设置日志
set_logging()
# 模型配置
weights = 'yolov5s.pt' # 预训练权重
data = 'data/strawberry_ripeness.yaml' # 数据集配置文件
imgsz = 640 # 输入图像尺寸
batch_size = 16 # 批处理大小
epochs = 100 # 训练轮数
device = '' # 设备选择(默认为GPU,如果可用)
# 加载模型
model = attempt_load(weights, map_location=device) # 加载预训练模型
device = select_device(device, batch_size=batch_size)
# 数据加载器
train_path = data['train']
val_path = data['val']
train_loader = create_dataloader(train_path, imgsz, batch_size, augment=True, cache=False, rect=False, workers=8)[0]
val_loader = create_dataloader(val_path, imgsz, batch_size, augment=False, cache=False, rect=True, workers=8)[0]
# 优化器
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 训练循环
for epoch in range(epochs):
model.train()
for i, (imgs, targets, paths, _) in enumerate(train_loader):
imgs = imgs.to(device).float() / 255.0 # 归一化
targets = targets.to(device)
# 前向传播
pred = model(imgs)
# 计算损失
loss, _ = compute_loss(pred, targets, model)
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 验证
with torch.no_grad():
model.eval()
for i, (imgs, targets, paths, _) in enumerate(val_loader):
imgs = imgs.to(device).float() / 255.0 # 归一化
targets = targets.to(device)
# 前向传播
pred = model(imgs)
# 计算损失
loss, _ = compute_loss(pred, targets, model)
# 打印验证损失
print(f'Epoch {epoch + 1}/{epochs}, Val Loss: {loss.item()}')
# 保存模型
torch.save(model.state_dict(), f'runs/train/exp{epoch}.pt')
print('Training complete.')
代码说明
-
数据加载器:
- 使用
create_dataloader
函数加载训练集和验证集的数据。 - 图像会被归一化,并且标签会被转换为适合YOLOv5的格式。
- 使用
-
模型加载:
- 使用
attempt_load
函数加载预训练的YOLOv5模型。 - 选择设备(CPU或GPU)。
- 使用
-
优化器:
- 使用Adam优化器进行参数更新。
-
训练循环:
- 对每个批次的数据进行前向传播、计算损失、反向传播和参数更新。
- 在每个epoch结束时,对验证集进行评估,并打印验证损失。
- 保存每个epoch的模型权重。