基于深度学习的水果新鲜程度检测系统:YOLOv5/v6/v7/v8/v10模型实现、UI界面集成、数据集

摘要

随着深度学习技术的发展,计算机视觉在农业领域的应用越来越广泛。本文将介绍如何构建一个基于YOLO(You Only Look Once)系列模型(包括YOLOv5、v6、v7、v8和v10)的水果新鲜程度检测系统。该系统通过用户界面(UI)实现图像上传和实时检测,并提供对应的YOLO训练数据集、配置文件(yaml文件)及完整代码。

目录

摘要

项目

1. 数据集准备

1.1 数据集标注

1.2 YAML配置文件

2. 模型训练

2.1 环境准备

2.2 训练模型

3. 用户界面设计

4. 实时检测

5. 项目结构

6. 运行项目

1. 引言

2. 系统架构

3. 数据集准备

3.1 数据集收集

3.2 数据集标注

3.3 YAML配置文件

4. 模型训练

4.1 环境准备

4.2 训练模型

5. 用户界面设计

5.1 代码说明

5.2 用户界面功能

6. 实时检测

6.1 模型评估

6.2 评估示例代码


项目

以下是一个完整的基于深度学习的水果新鲜程度检测系统的代码,包括YOLO模型训练、用户界面设计及必要的配置文件。整个项目分为几个部分:

  1. 数据集准备
  2. 模型训练
  3. 用户界面
  4. 实时检测

请根据下列步骤实现该项目。

1. 数据集准备

首先,您需要收集水果的新鲜程度数据集,并将其按照以下结构组织:

 
dataset/
├── images/
│   ├── train/
│   │   ├── fresh/
│   │   ├── slightly_fresh/
│   │   └── overripe/
│   └── val/
│       ├── fresh/
│       ├── slightly_fresh/
│       └── overripe/
└── labels/
    ├── train/
    └── val/

1.1 数据集标注

使用标注工具(如LabelImg)对图像进行标注,并生成YOLO格式的标签文件。标签文件的格式为:<class_id> <x_center> <y_center> <width> <height>,所有值均归一化到[0, 1]范围。

1.2 YAML配置文件

创建一个名为fruits_dataset.yaml的配置文件,内容如下:

 
# fruits_dataset.yaml
train: ./images/train
val: ./images/val

nc: 3
names: ['fresh', 'slightly_fresh', 'overripe']

2. 模型训练

2.1 环境准备

确保您已安装YOLOv5及其依赖项。克隆YOLOv5库并安装必要的库:

 
git clone https://github.com/ultralytics/yolov5.git
cd yolov5
pip install -r requirements.txt

2.2 训练模型

在YOLOv5目录下,使用以下命令进行模型训练:

 
python train.py --img 640 --batch 16 --epochs 50 --data fruits_dataset.yaml --weights yolov5s.pt
  • --img:输入图像的大小。
  • --batch:每批处理的图像数量。
  • --epochs:训练的轮数。
  • --data:数据集的配置文件。
  • --weights:预训练权重。

训练完成后,模型权重将保存在runs/train/exp/weights/best.pt中。

3. 用户界面设计

使用Tkinter库设计一个简单的用户界面,允许用户上传图像并进行实时检测。以下是完整的用户界面代码:

 
# fruits_detection_ui.py
import tkinter as tk
from tkinter import filedialog
import torch
import cv2
import numpy as np
from PIL import Image, ImageTk

class FruitsDetectionApp:
    def __init__(self, root, model_path):
        self.root = root
        self.root.title("水果新鲜程度检测系统")
        self.model = torch.hub.load('ultralytics/yolov5', 'custom', path=model_path, force_reload=True)

        # 创建画布
        self.canvas = tk.Canvas(root, width=640, height=480)
        self.canvas.pack()

        # 创建按钮
        self.upload_button = tk.Button(root, text="上传图片", command=self.upload_image)
        self.upload_button.pack(side=tk.LEFT)

        self.camera_button = tk.Button(root, text="摄像头检测", command=self.detect_from_camera)
        self.camera_button.pack(side=tk.LEFT)

        # 创建结果标签
        self.result_label = tk.Label(root, text="检测结果:")
        self.result_label.pack()

    def upload_image(self):
        file_path = filedialog.askopenfilename()
        if file_path:
            img = Image.open(file_path)
            img = img.resize((640, 480))
            self.img_tk = ImageTk.PhotoImage(img)
            self.canvas.create_image(0, 0, anchor=tk.NW, image=self.img_tk)

            # YOLO模型检测
            self.perform_detection(img)

    def detect_from_camera(self):
        cap = cv2.VideoCapture(0)

        while True:
            ret, frame = cap.read()
            if not ret:
                break

            # YOLO模型检测
            results = self.model(frame)

            # 将检测结果绘制在帧上
            self.draw_boxes(frame, results)

            # 将BGR转为RGB以适应PIL图像
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            img_pil = Image.fromarray(frame)
            img_tk = ImageTk.PhotoImage(img_pil)
            self.canvas.create_image(0, 0, anchor=tk.NW, image=img_tk)

            # 更新界面
            self.root.update()

        cap.release()

    def perform_detection(self, img):
        results = self.model(np.array(img))
        detection_results = results.pandas().xyxy[0]
        self.result_label.config(text=f"检测结果:\n{detection_results}")

    def draw_boxes(self, frame, results):
        for i in range(len(results.xyxy[0])):
            x1, y1, x2, y2, conf, cls = results.xyxy[0][i]
            label = f"{self.model.names[int(cls)]} {conf:.2f}"
            cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
            cv2.putText(frame, label, (int(x1), int(y1)-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

# 启动应用
if __name__ == "__main__":
    root = tk.Tk()
    app = FruitsDetectionApp(root, model_path='runs/train/exp/weights/best.pt')  # 请根据您的模型路径修改
    root.mainloop()

4. 实时检测

您可以在用户界面中选择上传图片进行检测,或使用摄像头实时检测水果的新鲜程度。YOLO模型会返回检测结果,并在界面上显示。

5. 项目结构

确保您的项目目录结构如下:

 
fruit_freshness_detection/
├── fruits_detection_ui.py
├── fruits_dataset.yaml
└── yolov5/             # YOLOv5文件夹
    ├── train.py
    ├── val.py
    ├── ...             # 其他YOLOv5文件

6. 运行项目

在命令行中,进入fruit_freshness_detection目录,然后运行用户界面代码:

 
python fruits_detection_ui.py

1. 引言

水果的新鲜程度直接影响到消费者的购买决策和食品安全。传统的检测方法往往依赖人工经验,效率低且易出错。基于深度学习的图像识别技术能够通过对水果图像的分析,准确判断其新鲜程度。本文将逐步介绍构建该检测系统的过程,包括数据准备、模型训练、用户界面设计等。

2. 系统架构

整个系统可以分为以下几个部分:

  1. 数据集准备:收集和标注水果图像数据集。
  2. 模型训练:使用YOLO模型对水果进行新鲜程度检测的训练。
  3. 用户界面设计:使用Tkinter设计简单的图形界面。
  4. 实时检测:实现实时检测功能,通过摄像头或上传图像进行检测。

3. 数据集准备

3.1 数据集收集

我们需要一个包含不同新鲜程度水果的图像数据集。您可以使用公开数据集,或自己拍摄水果图像。图像应包含以下几个类别:

  • 新鲜水果
  • 次新鲜水果
  • 过期水果

3.2 数据集标注

使用标注工具(如LabelImg)对图像进行标注,并生成YOLO格式的标签文件。标注文件的格式为:<class_id> <x_center> <y_center> <width> <height>,所有值均归一化到[0, 1]范围。

3.3 YAML配置文件

创建一个名为fruits_dataset.yaml的配置文件,内容如下:

 
# fruits_dataset.yaml
train: ./images/train
val: ./images/val

nc: 3
names: ['fresh', 'slightly_fresh', 'overripe']

4. 模型训练

4.1 环境准备

首先,确保您已安装YOLOv5及其依赖项。克隆YOLOv5库并安装必要的库:

 
git clone https://github.com/ultralytics/yolov5.git
cd yolov5
pip install -r requirements.txt

4.2 训练模型

在YOLOv5目录下,使用以下命令进行模型训练:

 
python train.py --img 640 --batch 16 --epochs 50 --data fruits_dataset.yaml --weights yolov5s.pt

  • --img:输入图像的大小。
  • --batch:每批处理的图像数量。
  • --epochs:训练的轮数。
  • --data:数据集的配置文件。
  • --weights:预训练权重。

训练完成后,模型权重将保存在runs/train/exp/weights/best.pt中。

5. 用户界面设计

使用Tkinter库设计一个简单的用户界面,允许用户上传图像并进行实时检测。以下是完整代码:

 
# fruits_detection_ui.py
import tkinter as tk
from tkinter import filedialog, messagebox
import torch
import cv2
import numpy as np
from PIL import Image, ImageTk

class FruitsDetectionApp:
    def __init__(self, root, model_path):
        self.root = root
        self.root.title("水果新鲜程度检测系统")
        self.model = torch.hub.load('ultralytics/yolov5', 'custom', path=model_path, force_reload=True)

        # 创建画布
        self.canvas = tk.Canvas(root, width=640, height=480)
        self.canvas.pack()

        # 创建按钮
        self.upload_button = tk.Button(root, text="上传图片", command=self.upload_image)
        self.upload_button.pack(side=tk.LEFT)

        self.camera_button = tk.Button(root, text="摄像头检测", command=self.detect_from_camera)
        self.camera_button.pack(side=tk.LEFT)

        # 创建结果标签
        self.result_label = tk.Label(root, text="检测结果:")
        self.result_label.pack()

    def upload_image(self):
        file_path = filedialog.askopenfilename()
        if file_path:
            img = Image.open(file_path)
            img = img.resize((640, 480))
            self.img_tk = ImageTk.PhotoImage(img)
            self.canvas.create_image(0, 0, anchor=tk.NW, image=self.img_tk)

            # YOLO模型检测
            self.perform_detection(img)

    def detect_from_camera(self):
        cap = cv2.VideoCapture(0)

        while True:
            ret, frame = cap.read()
            if not ret:
                break

            # YOLO模型检测
            results = self.model(frame)

            # 将检测结果绘制在帧上
            self.draw_boxes(frame, results)

            # 将BGR转为RGB以适应PIL图像
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            img_pil = Image.fromarray(frame)
            img_tk = ImageTk.PhotoImage(img_pil)
            self.canvas.create_image(0, 0, anchor=tk.NW, image=img_tk)

            # 更新界面
            self.root.update()

        cap.release()

    def perform_detection(self, img):
        results = self.model(np.array(img))
        detection_results = results.pandas().xyxy[0]
        self.result_label.config(text=f"检测结果:\n{detection_results}")

    def draw_boxes(self, frame, results):
        for i in range(len(results.xyxy[0])):
            x1, y1, x2, y2, conf, cls = results.xyxy[0][i]
            label = f"{self.model.names[int(cls)]} {conf:.2f}"
            cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
            cv2.putText(frame, label, (int(x1), int(y1)-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

# 启动应用
if __name__ == "__main__":
    root = tk.Tk()
    app = FruitsDetectionApp(root, model_path='best.pt')  # 请根据您的模型路径修改
    root.mainloop()

5.1 代码说明

  • Tkinter: 用于创建GUI界面。
  • torch: 用于加载YOLO模型。
  • OpenCV: 用于图像处理和视频捕捉。
  • PIL: 用于处理图像显示。

5.2 用户界面功能

  • 上传图片: 用户可以从本地选择水果图像进行新鲜程度检测。
  • 摄像头检测: 用户可以通过摄像头实时检测水果的新鲜程度。

6. 实时检测

6.1 模型评估

在训练完成后,您可以使用以下命令进行模型测试:

 
python val.py --data fruits_dataset.yaml --weights best.pt

您可以根据需要进行各种评估,例如混淆矩阵、精度、召回率等。

6.2 评估示例代码

以下是一个使用混淆矩阵评估模型的示例代码:

 
from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt

# 假设y_true为真实标签,y_pred为模型预测标签
def plot_confusion_matrix(y_true, y_pred):
    cm = confusion_matrix(y_true, y_pred)
    sns.heatmap(cm, annot=True, fmt='d')
    plt.xlabel('Predicted')
    plt.ylabel('True')
    plt.show()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度学习实战项目

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值