摘要
随着深度学习技术的发展,计算机视觉在农业领域的应用越来越广泛。本文将介绍如何构建一个基于YOLO(You Only Look Once)系列模型(包括YOLOv5、v6、v7、v8和v10)的水果新鲜程度检测系统。该系统通过用户界面(UI)实现图像上传和实时检测,并提供对应的YOLO训练数据集、配置文件(yaml文件)及完整代码。
目录
项目
以下是一个完整的基于深度学习的水果新鲜程度检测系统的代码,包括YOLO模型训练、用户界面设计及必要的配置文件。整个项目分为几个部分:
- 数据集准备
- 模型训练
- 用户界面
- 实时检测
请根据下列步骤实现该项目。
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. 系统架构
整个系统可以分为以下几个部分:
- 数据集准备:收集和标注水果图像数据集。
- 模型训练:使用YOLO模型对水果进行新鲜程度检测的训练。
- 用户界面设计:使用Tkinter设计简单的图形界面。
- 实时检测:实现实时检测功能,通过摄像头或上传图像进行检测。
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()