基于 YOLOv8 模型进行操作训练 小麦病害检测数据集 识别小麦病害8类的检测 使用已经训练好的 YOLOv8 模型 建立基于深度学习的小麦病害检测系统

小麦叶片病害检测数据集
数据集包括8类
类别名字分别是:[‘wheat bacterial leaf streak -black chaff-’, ‘wheat head scab’, ‘wheat leaf rust’, ‘wheat loose smut’, ‘wheat powdery mildew’, ‘wheat septoria blotch’, ‘wheat stem rust’, ‘wheat stripe rust’]
‘小麦细菌性叶斑病(黑秆病)’, ‘小麦穗病(麦穗霉病)’,‘小麦叶锈病’, ‘小麦松秕病’, ‘小麦白粉病’, ‘小麦叶斑病(赤霉病)’,‘小麦茎锈病’, ‘小麦条锈病’
3688张,训练集是3206张,验证集测314张、测试集168张在这里插入图片描述
1
在这里插入图片描述
1
在这里插入图片描述
小麦病害检测数据集,基于 YOLOv8 模型进行操作。YOLOv8 是一个强大的对象检测模型,

1. 数据准备

首先,同学你需要确保你的数据集已经按照 YOLO 的格式组织好。每个类别需要有一个对应的标签文件(通常是 .txt 文件),以及相应的图像文件。标签文件的每一行代表一个目标,包含如下信息:类别索引、中心点的 x 和 y 坐标(相对于宽度和高度的比例)、宽度和高度(同样相对于图像尺寸的比例)。

假设同学的数据集结构如下:

dataset/
├── images/
│   ├── train/
│   ├── val/
│   └── test/
└── labels/
    ├── train/
    ├── val/
    └── test/

2. 创建配置文件

创建一个 data.yaml 文件来描述你的数据集路径和类别信息。示例内容如下:

train: ./dataset/images/train/
val: ./dataset/images/val/
test: ./dataset/images/test/

nc: 8  # 类别数量
names: ['wheat bacterial leaf streak -black chaff-', 'wheat head scab', 'wheat leaf rust', 'wheat loose smut', 'wheat powdery mildew', 'wheat septoria blotch', 'wheat stem rust', 'wheat stripe rust']  # 类别名称列表

3. 安装依赖

确保安装了 YOLOv8 及其相关依赖项:

pip install ultralytics

4. 开始训练

使用以下命令开始训练你的模型:

from ultralytics import YOLO

# 加载预训练的YOLOv8模型或从头开始
model = YOLO('yolov8n.yaml')  # 使用YOLOv8 nano版本作为起点,可以根据需要选择其他规模的模型

# 训练模型
results = model.train(data='path/to/data.yaml', epochs=100, imgsz=640)  # 根据实际情况调整参数
  • epochs: 训练周期数,根据数据集大小和计算资源调整。
  • imgsz: 输入图像的尺寸,建议设置为640或更高以提高精度。

5. 验证与测试

训练完成后,同学可以通过以下命令评估模型在验证集上的表现:

results = model.val()

对于测试集的评估,可以使用相似的方式或者直接调用模型的预测方法对单张或多张图片进行推理。

6. 导出模型

训练完成后,同学可以导出模型用于部署:

success = model.export(format='onnx')  # 导出为ONNX格式,也可以选择其他格式如TensorRT

基于深度学习的小麦病害检测系统,使用已经训练好的 YOLOv8 模型来实现。这个系统将能够识别并标注出图像中的小麦病害类型。
代码示例,仅供参考。

一、准备环境

确保你已经安装了必要的依赖库:

pip install ultralytics opencv-python numpy flask

二、加载模型与数据组织

假设同学你已经完成了模型的训练,你的权重PT文件以及训练好了,并且拥有一个训练好的权重文件(例如 best.pt)。接下来,我们将使用这些权重来初始化我们的检测系统。

三、构建检测系统

1. 单张图片的推理

下面是一个简单的 Python 脚本示例,用于加载训练好的模型并对单张图片进行推理:

from ultralytics import YOLO
import cv2

# 加载训练好的模型
model = YOLO('runs/train/exp/weights/best.pt')  # 替换为你自己的路径

def detect_image(image_path):
    # 推理
    results = model(image_path)
    
    # 获取绘制后的图像
    annotated_image = results[0].plot()
    
    # 显示结果
    cv2.imshow("Wheat Disease Detection", annotated_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    image_path = 'test_images/wheat_leaf_001.jpg'  # 替换为你要测试的图片路径
    detect_image(image_path)
2. 视频流实时检测

如果你想对视频流或摄像头进行实时检测,可以使用以下代码:

def detect_video(source=0):
    cap = cv2.VideoCapture(source)
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break

        results = model(frame)
        annotated_frame = results[0].plot()

        cv2.imshow("Real-time Wheat Disease Detection", annotated_frame)
        if cv2.waitKey(1) == 27:  # ESC键退出
            break

    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    detect_video()  # source=0 表示摄像头,source='video.mp4' 表示视频文件
3. 批量图像检测

想对一批图像进行批量处理,可以参考以下代码:

import os

image_folder = 'test_images/'
output_folder = 'output/'

os.makedirs(output_folder, exist_ok=True)

for img_file in os.listdir(image_folder):
    if img_file.endswith('.jpg') or img_file.endswith('.png'):
        img_path = os.path.join(image_folder, img_file)
        results = model(img_path)
        annotated_img = results[0].plot()
        output_path = os.path.join(output_folder, img_file)
        cv2.imwrite(output_path, annotated_img)

print("✅ Batch detection completed, results saved to output/")

四、构建 Web API(可选)

系统封装为远程服务接口,可以使用 Flask 构建 RESTful API。

文件名:app.py
from flask import Flask, request, jsonify
import base64
import numpy as np
import cv2
from ultralytics import YOLO

app = Flask(__name__)
model = YOLO('runs/train/exp/weights/best.pt')

@app.route('/detect', methods=['POST'])
def detect():
    data = request.json.get("image")  # base64编码的图像
    img_bytes = base64.b64decode(data)
    img_np = np.frombuffer(img_bytes, dtype=np.uint8)
    img = cv2.imdecode(img_np, flags=1)

    results = model(img)
    annotated_img = results[0].plot()

    _, buffer = cv2.imencode('.jpg', annotated_img)
    response_data = base64.b64encode(buffer).decode('utf-8')
    
    return jsonify({"result_image": response_data})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

五、部署与打包建议

目标 建议
本地运行 Python 脚本直接运行
打包成exe 使用 pyinstaller 工具将 Python 脚本打包成独立的可执行文件
边缘设备部署 导出 ONNX/TensorRT 并部署在 Jetson 等设备上
服务器部署 使用 Flask/Django 构建 API 服务

六、进阶功能建议

功能 实现方式
病害面积估算 根据 bounding box 大小估算病害覆盖区域的比例
日志记录 记录每次检测的时间、位置、结果等信息到数据库或日志文件中
RTSP 流媒体支持 支持网络摄像头接入,使用 OpenCV 的 VideoCapture 函数读取 RTSP 流
统计图表 使用 Dash 或 Streamlit 展示检测统计结果,如不同病害类型的分布情况

基于 YOLOv8 的小麦病害检测系统。该系统不仅能识别并标注图像中的病害类型,还能根据需要扩展为实时监控系统或提供Web服务接口。

(8类小麦病害),请确保在 data.yaml 文件中正确配置类别名称和数量,并在训练过程中使用正确的标签文件格式。这将确保模型能够准确地学习和预测每种病害类型。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐