基于YOLOv8的桃子成熟度检测系统,支持图片、视频、摄像头输入,PyQt5界面检测。识别并分类桃子的成熟度(未熟、半熟、成熟)

基于YOLOv8的桃子成熟度检测系统,支持图片、视频、摄像头输入,PyQt5界面检测。识别并分类桃子的成熟度(未熟、半熟、成熟)


文字及代码仅供参考。
桃子成熟度分类检测数据集,

主要用于桃子成熟度分类检测应用任务
在这里插入图片描述

数据背景:
模拟实际田间条件,涵盖多种可能影响桃子检测准确性的因素,如变化的自然光照强度、多果粘连现象以及由枝叶引起的遮挡等

数据规模
图片数量:3849 张图像,分为训练集和验证集。
训练集:2690 张图像
验证集:1159 张图像
在这里插入图片描述

桃子品种
数据集中包含 9 种不同的桃子品种:
大红袍 庆丰 春美 春蜜 春雪 松森 毛桃 油蟠桃 霞晖5号

标签分布(成熟度分类)
三类,xml标注,txt格式
在这里插入图片描述

桃子的成熟度被主观地划分为三个阶段:
未熟:3669 (训练集) / 1717 (测试集)
半熟:2768 (训练集) / 1140 (测试集)
成熟:1403 (训练集) / 589 (测试集)

,包括数据预处理、模型训练、评估以及构建一个用于实时检测的GUI应用程序。我们将使用YOLOv8作为目标检测模型,并利用PyQt5来创建用户界面。

项目结构
深色版本
Peach_Ripeness_Detection/
├── data/ # 数据集
│ ├── images/ # 图片文件夹
│ ├── labels_txt/ # YOLO格式标签文件(txt格式)
│ ├── labels_xml/ # VOC格式标签文件(xml格式)
│ ├── train.txt # 训练集列表
│ ├── val.txt # 验证集列表
├── models/ # 模型权重
│ ├── yolov8.pt # YOLOv8预训练权重
│ ├── best.pt # 训练后的最佳权重
├── utils/ # 工具函数
│ ├── dataset_utils.py # 数据集处理工具
│ ├── eval_utils.py # 评估工具
├── gui/ # GUI 文件
│ ├── main_gui.py # 主界面逻辑
│ ├── ui_main.ui # PyQt5 UI 设计文件
├── requirements.txt # Python 依赖包列表
├── train.py # 训练脚本
├── evaluate.py # 评估脚本
├── inference.py # 推理脚本
└── README.md # 项目说明文档

  1. 安装依赖
    在 requirements.txt 中列出所需的依赖库:

txt
深色版本
torch2.0.1
torchvision
0.15.2
opencv-python4.7.0.72
PyQt5
5.15.9
ultralytics8.0.43 # YOLOv8 库
numpy
1.23.5
matplotlib==3.7.1
安装依赖:

bash
深色版本
pip install -r requirements.txt
2. 数据集准备
根据描述,数据集已经按照训练和验证进行了划分。我们需要将这些信息写入对应的 .txt 文件中。

创建训练和验证集列表 (dataset_utils.py)
python
深色版本
import os

def create_dataset_files(image_dir, label_dir, output_dir):
sets = [‘train’, ‘val’]
counts = {‘train’: 2690, ‘val’: 1159}

for set_name in sets:
    with open(os.path.join(output_dir, f"{set_name}.txt"), "w") as f:
        for i in range(counts[set_name]):
            image_file = os.path.join(image_dir, f"{set_name}_{i+1}.jpg")
            if os.path.exists(image_file):
                f.write(f"{image_file}\n")

调用示例

create_dataset_files(“data/images”, “data/labels_txt”, “data”)
3. 配置 YOLOv8
创建 yolov8.yaml 文件,定义类别和数据集路径。

yaml
深色版本
train: data/train.txt
val: data/val.txt

nc: 3 # 类别数(未熟、半熟、成熟)
names: [‘unripe’, ‘half_ripe’, ‘ripe’]
4. 训练与评估
训练脚本 (train.py)
python
深色版本
from ultralytics import YOLO

加载预训练模型

model = YOLO(“models/yolov8.pt”)

开始训练

model.train(data=“data/yolov8.yaml”, epochs=100, imgsz=640, batch=16, device=0)
评估脚本 (evaluate.py)
python
深色版本
from ultralytics import YOLO

加载训练好的模型

model = YOLO(“runs/train/weights/best.pt”)

在验证集上评估

metrics = model.val()
print(metrics)
5. 构建 GUI 应用程序
main_gui.py
python
深色版本
from PyQt5.QtWidgets import QMainWindow, QFileDialog, QLabel
from PyQt5.QtGui import QImage, QPixmap
from ui_main import Ui_MainWindow
from inference import run_inference
import cv2

class MainWindow(QMainWindow, Ui_MainWindow):
def init(self):
super(MainWindow, self).init()
self.setupUi(self)

    # 连接按钮事件
    self.btn_image.clicked.connect(self.select_image)
    self.btn_video.clicked.connect(self.select_video)
    self.btn_camera.clicked.connect(self.start_camera)

def select_image(self):
    file_path, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "Image Files (*.jpg *.jpeg *.png)")
    if file_path:
        result_image = run_inference(file_path)
        self.display_image(result_image)

def select_video(self):
    file_path, _ = QFileDialog.getOpenFileName(self, "选择视频", "", "Video Files (*.mp4 *.avi)")
    if file_path:
        cap = cv2.VideoCapture(file_path)
        while True:
            ret, frame = cap.read()
            if not ret:
                break
            result_frame = run_inference(frame)
            self.display_image(result_frame)
            if cv2.waitKey(30) & 0xFF == ord('q'):
                break
        cap.release()
        cv2.destroyAllWindows()

def start_camera(self):
    cap = cv2.VideoCapture(0)
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        result_frame = run_inference(frame)
        self.display_image(result_frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()

def display_image(self, image):
    rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    h, w, ch = rgb_image.shape
    bytes_per_line = ch * w
    q_img = QImage(rgb_image.data, w, h, bytes_per_line, QImage.Format_RGB888)
    self.label_image.setPixmap(QPixmap.fromImage(q_img))
  1. 推理脚本 (inference.py)
    python
    深色版本
    from ultralytics import YOLO
    import cv2

加载训练好的模型

model = YOLO(“runs/train/weights/best.pt”)

def run_inference(input_data):
if isinstance(input_data, str): # 如果是图片路径
results = model(input_data)
img = cv2.imread(input_data)
else: # 如果是视频帧
results = model(input_data)
img = input_data

# 绘制检测框
for box in results[0].boxes:
    x1, y1, x2, y2 = map(int, box.xyxy[0])
    label = model.names[int(box.cls)]
    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
    cv2.putText(img, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

return img
  1. 运行程序
    bash
    深色版本
    python main_gui.py
    总结

基于YOLOv8的桃子成熟度检测系统,支持图片、视频、摄像头输入,并通过PyQt5界面展示检测结果。系统能够识别并分类桃子的成熟度(未熟、半熟、成熟),并提供直观的可视化效果。此外,该框架允许进一步扩展,如添加更多的类别或改进现有模型以提高准确性。

请确保所有路径和文件名正确无误,并根据实际情况调整配置。

数据集中有多种桃子品种且需要同时进行品种和成熟度的分类,可考虑在模型输出层增加相应的类别数,并相应地调整 yolov8.yaml 文件中的 nc 参数和 names 列表。例如,如果要同时识别9种桃子品种和它们的成熟度阶段,则 nc 应设为 9*3=27,并在 names 中详细列出每个品种的各个成熟度阶段名称。

以上所以内容仅供参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值