YOLOv5植物识别系统
项目描述
本项目旨在开发一个基于YOLOv5的植物识别系统,该系统能够通过图像识别技术自动检测和分类植物。项目使用YOLOv5作为核心检测模型,并结合Python编程语言,构建了一个高效、准确的植物识别工具。该系统不仅可以用于科研工作者的研究,还可以辅助农业、园艺、生态学等多个领域的专业人员快速识别植物种类。
关键功能
-
植物检测与分类:
- 使用YOLOv5模型进行植物的检测与分类,能够识别出图像中的植物及其种类。
- 模型能够处理不同角度、不同光线条件下的植物图像。
-
实时检测:
- 支持从摄像头实时捕获图像并进行植物检测。
- 用户可以通过摄像头实时观察并识别植物。
-
离线检测:
- 用户可以从本地文件系统中上传单张或多张图片进行批量检测。
- 系统会返回每张图片中检测到的植物种类及其位置信息。
-
用户界面:
- 构建一个易于使用的图形用户界面(GUI),方便用户选择使用摄像头或是上传图片进行检测。
- 提供清晰的结果展示,包括植物种类、置信度等信息。
技术栈
- YOLOv5:用于植物检测与分类的核心模型。
- Python:项目的主要编程语言。
- OpenCV:用于图像处理和摄像头流的捕获。
- PyQt5 或 Pyside6:用于构建图形用户界面。
- Pillow:用于图像处理。
关键代码示例
以下是一个简化的代码示例,展示如何使用YOLOv5进行植物识别,并构建一个简单的命令行接口(CLI)版本的应用。对于GUI版本的应用,可以参考之前提供的Pyside6示例进行修改。
1import torch
2import cv2
3from PIL import Image
4import numpy as np
5
6# 加载YOLOv5模型
7model = torch.hub.load('ultralytics/yolov5', 'custom', path='path/to/best_plant_detection_model.pt') # 请替换为你的模型路径
8
9def detect_plants(image_path):
10 # 加载图像
11 img = Image.open(image_path)
12 # 转换为numpy数组
13 img_array = np.array(img)
14 # 使用YOLOv5模型进行检测
15 results = model(img_array)
16 # 获取检测结果
17 detections = results.pandas().xyxy[0]
18 return detections
19
20def main():
21 # 从命令行接收图像路径
22 import sys
23 if len(sys.argv) != 2:
24 print("Usage: python plant_recognition.py <path_to_image>")
25 sys.exit(1)
26
27 image_path = sys.argv[1]
28 # 检测植物
29 detections = detect_plants(image_path)
30 # 打印检测结果
31 print(detections)
32
33if __name__ == "__main__":
34 main()
用户界面示例(使用PyQt5)
以下是一个使用PyQt5构建的GUI示例,允许用户选择上传图片或使用摄像头进行植物识别。
1import sys
2from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QFileDialog, QLabel, QTextEdit
3from PyQt5.QtGui import QImage, QPixmap
4from PyQt5.QtCore import QTimer
5
6class PlantRecognitionApp(QMainWindow):
7 def __init__(self):
8 super().__init__()
9 self.setWindowTitle('Plant Recognition System')
10 self.setGeometry(100, 100, 800, 600)
11
12 self.central_widget = QWidget()
13 self.setCentralWidget(self.central_widget)
14
15 self.layout = QVBoxLayout()
16 self.central_widget.setLayout(self.layout)
17
18 self.image_label = QLabel()
19 self.layout.addWidget(self.image_label)
20
21 self.result_text = QTextEdit()
22 self.layout.addWidget(self.result_text)
23
24 self.button_layout = QVBoxLayout()
25
26 self.camera_button = QPushButton('Use Camera')
27 self.camera_button.clicked.connect(self.use_camera)
28 self.button_layout.addWidget(self.camera_button)
29
30 self.file_button = QPushButton('Upload File')
31 self.file_button.clicked.connect(self.upload_file)
32 self.button_layout.addWidget(self.file_button)
33
34 self.layout.addLayout(self.button_layout)
35
36 self.cap = None
37 self.timer = QTimer()
38 self.timer.timeout.connect(self.update_frame)
39
40 def use_camera(self):
41 self.cap = cv2.VideoCapture(0) # 使用默认摄像头
42 self.timer.start(30) # 每30毫秒更新一次图像
43
44 def upload_file(self):
45 file_name, _ = QFileDialog.getOpenFileName(self, 'Open Image File', '', 'Image Files (*.jpg *.jpeg *.png)')
46 if file_name:
47 self.detect_plants(file_name)
48
49 def update_frame(self):
50 ret, frame = self.cap.read()
51 if ret:
52 # 调用YOLOv5模型进行植物检测
53 results = detect_plants(frame)
54 # 在图像中标注检测结果
55 for index, row in results.iterrows():
56 if row['name'] == 'plant': # 假设类别名为'plant'
57 x1, y1, x2, y2 = int(row['xmin']), int(row['ymin']), int(row['xmax']), int(row['ymax'])
58 cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 255), 2)
59 self.result_text.setText(f'Detection: Plant at ({x1}, {y1}) - ({x2}, {y2})')
60
61 # 将OpenCV图像转换为QPixmap以便在QLabel中显示
62 height, width, channel = frame.shape
63 bytes_per_line = 3 * width
64 q_img = QImage(frame.data, width, height, bytes_per_line, QImage.Format_RGB888).rgbSwapped()
65 pixmap = QPixmap.fromImage(q_img)
66 self.image_label.setPixmap(pixmap)
67
68 def detect_plants(self, image_path):
69 # 加载图像
70 img = cv2.imread(image_path)
71 # 使用YOLOv5模型进行检测
72 results = detect_plants(img)
73 # 在图像中标注检测结果
74 for index, row in results.iterrows():
75 if row['name'] == 'plant': # 假设类别名为'plant'
76 x1, y1, x2, y2 = int(row['xmin']), int(row['ymin']), int(row['xmax']), int(row['ymax'])
77 cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
78 self.result_text.setText(f'Detection: Plant at ({x1}, {y1}) - ({x2}, {y2})')
79
80 # 将OpenCV图像转换为QPixmap以便在QLabel中显示
81 height, width, channel = img.shape
82 bytes_per_line = 3 * width
83 q_img = QImage(img.data, width, height, bytes_per_line, QImage.Format_RGB888).rgbSwapped()
84 pixmap = QPixmap.fromImage(q_img)
85 self.image_label.setPixmap(pixmap)
86
87 def closeEvent(self, event):
88 if self.cap is not None:
89 self.cap.release()
90 self.timer.stop()
91 event.accept()
92
93if __name__ == '__main__':
94 app = QApplication(sys.argv)
95 window = PlantRecognitionApp()
96 window.show()
97 sys.exit(app.exec_())
说明
- YOLOv5模型:确保已经加载了预训练的YOLOv5模型,并且该模型已经被训练用于检测植物。
- PyQt5 GUI:构建了一个简单的用户界面,允许用户选择使用摄像头或上传图片进行检测。界面中包含一个用于显示检测结果的图像区域和一个用于显示文本信息的区域。
- 图像处理:当用户选择使用摄像头或上传图片后,程序会读取图像并通过YOLOv5模型进行检测。检测结果会在图像中标注出来,并在界面上显示。
总结
此YOLOv5植物识别系统通过结合深度学习模型YOLOv5和PyQt5构建的GUI,实现了对植物的实时或离线检测。系统提供了用户友好的界面,使得用户可以方便地选择使用摄像头或上传图片进行检测,并查看检测结果。该系统适用于科研工作者的研究、农业、园艺、生态学等多个领域的应用,帮助专业人士快速识别植物种类。