水果识别、智慧农业、采摘机器人、自动分拣系统、果园产量预估中利用AI YOLOv8训练评估检测数据集,检测识别果园苹果的识别
文章目录
苹果数据集。
目标检测数据集,3000张

1

1

1

水果识别、智慧农业、采摘机器人、自动分拣系统、果园产量预估 等 AI 视觉任务。
以下是 从零开始搭建环境 → 数据准备 → 使用 YOLOv8 训练 → 推理 → 评估 → 部署 的完整全流程,适用于单类(苹果)目标检测任务。
✅ 一、系统环境搭建(CUDA + Anaconda + Python)
1. 确认 CUDA 驱动(GPU 加速)
nvidia-smi
确保输出中显示 CUDA 版本 ≥ 11.8(推荐 12.1),如未安装,请前往 NVIDIA 官网 安装对应驱动。
2. 安装 Anaconda(Python 包管理器)
前往 https://www.anaconda.com/products/distribution 下载并安装 Anaconda(Windows / Linux / macOS)。
3. 创建 Python 虚拟环境
# 创建名为 apple_detection 的环境
conda create -n apple_detection python=3.9
# 激活环境
conda activate apple_detection
4. 安装必要依赖
# 安装 PyTorch(以 CUDA 11.8 为例)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# 安装 YOLOv8 官方库
pip install ultralytics opencv-python numpy matplotlib tqdm scikit-learn pandas pillow
# 可选:TensorBoard 可视化
pip install tensorboard
# 验证 GPU 是否可用
python -c "import torch; print(torch.cuda.is_available())"
# 应输出 True
✅ 二、数据集结构与 data.yaml 配置
目录结构
apple_dataset/
├── images/
│ ├── train/
│ ├── val/
│ └── test/
├── labels/
│ ├── train/
│ ├── val/
│ └── test/
└── data.yaml
✅ 确保图像与
.txt标注文件一一对应,使用 YOLO 格式(归一化坐标)
data.yaml 文件内容
# data.yaml
train: ./apple_dataset/images/train
val: ./apple_dataset/images/val
test: ./apple_dataset/images/test
# 类别数量
nc: 1
# 类别名称
names:
- apple # 苹果
# 中文名称(用于可视化)
names_zh:
- 苹果
⚠️ 注意:
- 所有标注文件
.txt中的 class ID 必须为0(因为只有一类)- 图像格式支持
.jpg,.png,.tif等- 建议按 8:1:1 划分 train/val/test
✅ 三、调用 YOLOv8 官方预训练模型进行训练
由于苹果在树上可能存在遮挡、光照变化、大小不一等问题,建议使用 YOLOv8m 或 YOLOv8l 提升检测精度。
from ultralytics import YOLO
# 加载官方预训练模型
model = YOLO('yolov8m.pt') # 推荐使用中等模型(也可用 yolov8s.pt 轻量级)
# 开始训练
results = model.train(
data='data.yaml', # 数据配置文件路径
epochs=150, # 训练轮数(农业数据建议 100~200)
batch=32, # 根据显存调整(RTX 3090 可用 64)
imgsz=640, # 图像尺寸(提升小目标或遮挡检测)
optimizer='AdamW', # 更稳定优化器
lr0=0.001, # 初始学习率
weight_decay=0.0005,
momentum=0.937,
# 数据增强(关键!提升泛化)
augment=True,
hsv_h=0.015,
hsv_s=0.7,
hsv_v=0.4,
degrees=10.0,
translate=0.1,
scale=0.5,
shear=0.0,
flipud=0.0,
fliplr=0.5,
mosaic=1.0,
mixup=0.1,
copy_paste=0.1, # 对小目标和遮挡有效
# 正则化
dropout=0.2,
label_smoothing=0.05, # 缓解过拟合
# 学习率调度
cos_lr=True, # 余弦退火
# 保存与日志
project='runs/train',
name='apple_yolov8m',
save=True,
save_period=10,
exist_ok=False,
# 缓存(内存充足时开启)
cache=True
)
✅ 提示:
- 若显存不足,改用
yolov8s.pt或降低batch=16copy_paste和mosaic对遮挡、小样本特别有效- 可开启
close_mosaic在最后 10 轮关闭 Mosaic 增强
✅ 四、推理代码(单图 / 批量 / 视频)
1. 单张图像推理
from ultralytics import YOLO
from PIL import Image
# 加载最佳模型
model = YOLO('runs/train/apple_yolov8m/weights/best.pt')
# 推理
results = model('test_orchard.jpg', conf=0.3)
# 显示结果
for r in results:
im_array = r.plot() # 绘制边界框和标签
im = Image.fromarray(im_array[..., ::-1]) # BGR to RGB
im.show()
2. 批量图像推理
results = model.predict(
source='apple_dataset/images/test',
save=True,
project='runs/detect',
name='apple_test_results',
conf=0.3,
imgsz=640
)
print("批量推理完成")
3. 视频检测(如果园无人机巡检)
results = model.predict(
source='orchard_survey.mp4',
save=True,
project='runs/detect/video',
name='apple_detection_video',
conf=0.3,
imgsz=640
)
print("视频检测完成")
4. 实时摄像头检测(OpenCV)
import cv2
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
results = model(frame, conf=0.3)
annotated_frame = results[0].plot()
cv2.imshow('Apple Detection', annotated_frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
✅ 五、模型评估(验证集 + 测试集)
1. 在验证集上评估
metrics = model.val(
data='data.yaml',
split='val',
batch=32,
imgsz=640,
save_json=False,
project='runs/val',
name='apple_eval'
)
print(f"mAP@0.5: {metrics.box.map50:.4f}")
print(f"mAP@0.5:0.95: {metrics.box.map:.4f}")
print(f"Precision: {metrics.box.p:.4f}")
print(f"Recall: {metrics.box.r:.4f}")
2. 在测试集上独立评估(最终性能)
# 使用 test split 进行最终性能评估
test_metrics = model.val(
data='data.yaml',
split='test',
save_json=True,
name='test_final'
)
print(f"Test mAP@0.5: {test_metrics.box.map50:.4f}")
print(f"Test mAP@0.5:0.95: {test_metrics.box.map:.4f}")
✅ 六、可视化与分析
1. 使用中文标签显示
# 修改模型类名显示为中文
model.names = ['苹果']
results = model('test_orchard.jpg')
results[0].plot() # 显示中文标签
2. 查看训练曲线
tensorboard --logdir runs/train/apple_yolov8m
✅ 七、模型导出(ONNX / TensorRT / TFLite)
# 导出为 ONNX(通用部署)
model.export(format='onnx', dynamic=True, opset=13, imgsz=640)
# 导出为 TensorRT(NVIDIA GPU 加速)
model.export(format='engine', half=True, dynamic=True)
# 导出为 TFLite(移动端)
model.export(format='tflite', int8=True)
# 导出为 CoreML(iOS)
model.export(format='coreml')
1149

被折叠的 条评论
为什么被折叠?



