当前位置: 首页 > news >正文

基于YOLOv10的昆虫识别检测系统(YOLOv10深度学习+YOLO数据集+UI界面+Python项目+模型)

一、项目介绍

本系统基于YOLOv10模型,专门设计用于检测和识别10类常见的农业害虫。这些害虫包括:army worm(粘虫)legume blister beetle(豆芫菁)red spider(红蜘蛛)rice gall midge(稻瘿蚊)rice leaf roller(稻纵卷叶螟)rice leafhopper(稻飞虱)rice water weevil(稻水象甲)wheat phloeothrips(麦蓟马)white backed plant hopper(白背飞虱)yellow rice borer(三化螟)。该系统旨在帮助农业从业者快速、准确地识别田间害虫,从而及时采取防治措施,减少农作物损失。

YOLOv10是一种高效的目标检测算法,能够在实时场景中快速定位和分类目标。通过训练和优化,本系统能够在复杂背景下准确识别上述10类昆虫,适用于农田监控、病虫害预警等场景。


数据集介绍

本系统的数据集包含以下三部分:

  1. 训练集:696张图像

    训练集用于训练YOLOv10模型,包含10类昆虫的标注数据。每张图像都经过精确标注,标注信息包括昆虫的类别和边界框(bounding box)。数据集中涵盖了不同光照条件、背景复杂度和昆虫姿态的图像,以确保模型的泛化能力。
  2. 验证集:199张图像

    验证集用于在训练过程中评估模型的性能,帮助调整超参数和防止过拟合。验证集的图像分布与训练集相似,但数据独立,以确保评估结果的可靠性。
  3. 测试集:100张图像

    测试集用于最终评估模型的性能,反映模型在真实场景中的表现。测试集的图像未参与训练和验证过程,确保评估结果的客观性。
数据集特点:
  • 类别多样性:涵盖10类常见农业害虫,每类昆虫的样本数量经过平衡处理,避免类别不均衡问题。

  • 场景多样性:数据集包含不同农田环境下的图像,如水稻田、麦田、豆田等,背景复杂度高,模拟真实场景。

  • 标注质量:每张图像均经过人工标注,确保边界框和类别标签的准确性。

基于深度学习的昆虫识别检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)_哔哩哔哩_bilibili

基于深度学习的昆虫识别检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)

二、项目功能展示

系统功能

图片检测:可对图片进行检测,返回检测框及类别信息。

视频检测:支持视频文件输入,检测视频中每一帧的情况。

摄像头实时检测:连接USB 摄像头,实现实时监测。

参数实时调节(置信度和IoU阈值)

演示与介绍视频:

  • 图片检测

该功能允许用户通过单张图片进行目标检测。输入一张图片后,YOLO模型会实时分析图像,识别出其中的目标,并在图像中框出检测到的目标,输出带有目标框的图像。

  • 批量图片检测

用户可以一次性上传多个图片进行批量处理。该功能支持对多个图像文件进行并行处理,并返回每张图像的目标检测结果,适用于需要大规模处理图像数据的应用场景。

  • 视频检测

视频检测功能允许用户将视频文件作为输入。YOLO模型将逐帧分析视频,并在每一帧中标记出检测到的目标。最终结果可以是带有目标框的视频文件或实时展示,适用于视频监控和分析等场景。

  • 摄像头实时检测

该功能支持通过连接摄像头进行实时目标检测。YOLO模型能够在摄像头拍摄的实时视频流中进行目标检测,实时识别并显示检测结果。此功能非常适用于安防监控、无人驾驶、智能交通等应用,提供即时反馈。

核心特点:

  • 高精度:基于YOLO模型,提供精确的目标检测能力,适用于不同类型的图像和视频。
  • 实时性:特别优化的算法使得实时目标检测成为可能,无论是在视频还是摄像头实时检测中,响应速度都非常快。
  • 批量处理:支持高效的批量图像和视频处理,适合大规模数据分析。

三、数据集介绍

本系统的数据集包含以下三部分:

  1. 训练集:696张图像

    • 训练集用于训练YOLOv10模型,包含10类昆虫的标注数据。每张图像都经过精确标注,标注信息包括昆虫的类别和边界框(bounding box)。数据集中涵盖了不同光照条件、背景复杂度和昆虫姿态的图像,以确保模型的泛化能力。

  2. 验证集:199张图像

    • 验证集用于在训练过程中评估模型的性能,帮助调整超参数和防止过拟合。验证集的图像分布与训练集相似,但数据独立,以确保评估结果的可靠性。

  3. 测试集:100张图像

    • 测试集用于最终评估模型的性能,反映模型在真实场景中的表现。测试集的图像未参与训练和验证过程,确保评估结果的客观性。

数据集特点:
  • 类别多样性:涵盖10类常见农业害虫,每类昆虫的样本数量经过平衡处理,避免类别不均衡问题。

  • 场景多样性:数据集包含不同农田环境下的图像,如水稻田、麦田、豆田等,背景复杂度高,模拟真实场景。

  • 标注质量:每张图像均经过人工标注,确保边界框和类别标签的准确性。

训练集

测试集

验证集

数据集配置文件data.yaml

train: \datasets\images\train val: \datasets\images\val test: \datasets\images\test nc: 10 names: ['army worm', 'legume blister beetle', 'red spider', 'rice gall midge', 'rice leaf roller', 'rice leafhopper', 'rice water weevil', 'wheat phloeothrips', 'white backed plant hopper', 'yellow rice borer'],

数据集制作流程

  • 标注数据:使用标注工具(如LabelImg、CVAT等)对图像中的目标进行标注。每个目标需要标出边界框,并且标注类别。

  • 转换格式:将标注的数据转换为YOLO格式。YOLO标注格式为每行:<object-class> <x_center> <y_center> <width> <height>,这些坐标是相对于图像尺寸的比例。

  • 分割数据集:将数据集分为训练集、验证集和测试集,通常的比例是80%训练集、10%验证集和10%测试集。

  • 准备标签文件:为每张图片生成一个对应的标签文件,确保标签文件与图片的命名一致。

  • 调整图像尺寸:根据YOLO网络要求,统一调整所有图像的尺寸(如416x416或608x608)。

四、项目环境配置

创建虚拟环境

首先新建一个Anaconda环境,每个项目用不同的环境,这样项目中所用的依赖包互不干扰。

终端输入

conda create -n yolov10 python==3.9

激活虚拟环境

conda activate yolov10

安装cpu版本pytorch

pip install torch torchvision torchaudio

pycharm中配置anaconda

安装所需要库

pip install -r requirements.txt

五、模型训练

训练代码

from ultralytics import YOLOv10 model_path = 'yolov10s.pt' data_path = 'datasets/data.yaml' if __name__ == '__main__': model = YOLOv10(model_path) results = model.train(data=data_path, epochs=500, batch=64, device='0', workers=0, project='runs/detect', name='exp', )
根据实际情况更换模型 yolov10n.yaml (nano):轻量化模型,适合嵌入式设备,速度快但精度略低。 yolov10s.yaml (small):小模型,适合实时任务。 yolov10m.yaml (medium):中等大小模型,兼顾速度和精度。 yolov10b.yaml (base):基本版模型,适合大部分应用场景。 yolov10l.yaml (large):大型模型,适合对精度要求高的任务。
  • --batch 64:每批次64张图像。
  • --epochs 500:训练500轮。
  • --datasets/data.yaml:数据集配置文件。
  • --weights yolov10s.pt:初始化模型权重,yolov10s.pt是预训练的轻量级YOLO模型。

训练结果

六、核心代码

import sys import cv2 import numpy as np from PyQt5.QtWidgets import QApplication, QMessageBox, QFileDialog from PyQt5.QtCore import QThread, pyqtSignal from ultralytics import YOLOv10 from UiMain import UiMainWindow import time import os class DetectionThread(QThread): frame_received = pyqtSignal(np.ndarray, np.ndarray, list) # 原始帧, 检测帧, 检测结果 finished_signal = pyqtSignal() # 线程完成信号 def __init__(self, model, source, conf, iou, parent=None): super().__init__(parent) self.model = model self.source = source self.conf = conf self.iou = iou self.running = True def run(self): try: if isinstance(self.source, int) or self.source.endswith(('.mp4', '.avi', '.mov')): # 视频或摄像头 cap = cv2.VideoCapture(self.source) while self.running and cap.isOpened(): ret, frame = cap.read() if not ret: break # 保存原始帧 original_frame = frame.copy() # 检测 results = self.model(frame, conf=self.conf, iou=self.iou) annotated_frame = results[0].plot() # 提取检测结果 detections = [] for result in results: for box in result.boxes: class_id = int(box.cls) class_name = self.model.names[class_id] confidence = float(box.conf) x, y, w, h = box.xywh[0].tolist() detections.append((class_name, confidence, x, y)) # 发送信号 self.frame_received.emit( cv2.cvtColor(original_frame, cv2.COLOR_BGR2RGB), cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB), detections ) # 控制帧率 time.sleep(0.03) # 约30fps cap.release() else: # 图片 frame = cv2.imread(self.source) if frame is not None: original_frame = frame.copy() results = self.model(frame, conf=self.conf, iou=self.iou) annotated_frame = results[0].plot() # 提取检测结果 detections = [] for result in results: for box in result.boxes: class_id = int(box.cls) class_name = self.model.names[class_id] confidence = float(box.conf) x, y, w, h = box.xywh[0].tolist() detections.append((class_name, confidence, x, y)) self.frame_received.emit( cv2.cvtColor(original_frame, cv2.COLOR_BGR2RGB), cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB), detections ) except Exception as e: print(f"Detection error: {e}") finally: self.finished_signal.emit() def stop(self): self.running = False class MainWindow(UiMainWindow): def __init__(self): super().__init__() # 初始化模型 self.model = None self.detection_thread = None self.current_image = None self.current_result = None self.video_writer = None self.is_camera_running = False self.is_video_running = False self.last_detection_result = None # 新增:保存最后一次检测结果 # 连接按钮信号 self.image_btn.clicked.connect(self.detect_image) self.video_btn.clicked.connect(self.detect_video) self.camera_btn.clicked.connect(self.detect_camera) self.stop_btn.clicked.connect(self.stop_detection) self.save_btn.clicked.connect(self.save_result) # 初始化模型 self.load_model() def load_model(self): try: model_name = self.model_combo.currentText() self.model = YOLOv10(f"{model_name}.pt") # 自动下载或加载本地模型 self.update_status(f"模型 {model_name} 加载成功") except Exception as e: QMessageBox.critical(self, "错误", f"模型加载失败: {str(e)}") self.update_status("模型加载失败") def detect_image(self): if self.detection_thread and self.detection_thread.isRunning(): QMessageBox.warning(self, "警告", "请先停止当前检测任务") return file_path, _ = QFileDialog.getOpenFileName( self, "选择图片", "", "图片文件 (*.jpg *.jpeg *.png *.bmp)") if file_path: self.clear_results() self.current_image = cv2.imread(file_path) self.current_image = cv2.cvtColor(self.current_image, cv2.COLOR_BGR2RGB) self.display_image(self.original_image_label, self.current_image) # 创建检测线程 conf = self.confidence_spinbox.value() iou = self.iou_spinbox.value() self.detection_thread = DetectionThread(self.model, file_path, conf, iou) self.detection_thread.frame_received.connect(self.on_frame_received) self.detection_thread.finished_signal.connect(self.on_detection_finished) self.detection_thread.start() self.update_status(f"正在检测图片: {os.path.basename(file_path)}") def detect_video(self): if self.detection_thread and self.detection_thread.isRunning(): QMessageBox.warning(self, "警告", "请先停止当前检测任务") return file_path, _ = QFileDialog.getOpenFileName( self, "选择视频", "", "视频文件 (*.mp4 *.avi *.mov)") if file_path: self.clear_results() self.is_video_running = True # 初始化视频写入器 cap = cv2.VideoCapture(file_path) frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = cap.get(cv2.CAP_PROP_FPS) cap.release() # 创建保存路径 save_dir = "results" os.makedirs(save_dir, exist_ok=True) timestamp = time.strftime("%Y%m%d_%H%M%S") save_path = os.path.join(save_dir, f"result_{timestamp}.mp4") fourcc = cv2.VideoWriter_fourcc(*'mp4v') self.video_writer = cv2.VideoWriter(save_path, fourcc, fps, (frame_width, frame_height)) # 创建检测线程 conf = self.confidence_spinbox.value() iou = self.iou_spinbox.value() self.detection_thread = DetectionThread(self.model, file_path, conf, iou) self.detection_thread.frame_received.connect(self.on_frame_received) self.detection_thread.finished_signal.connect(self.on_detection_finished) self.detection_thread.start() self.update_status(f"正在检测视频: {os.path.basename(file_path)}") def detect_camera(self): if self.detection_thread and self.detection_thread.isRunning(): QMessageBox.warning(self, "警告", "请先停止当前检测任务") return self.clear_results() self.is_camera_running = True # 创建检测线程 (默认使用摄像头0) conf = self.confidence_spinbox.value() iou = self.iou_spinbox.value() self.detection_thread = DetectionThread(self.model, 0, conf, iou) self.detection_thread.frame_received.connect(self.on_frame_received) self.detection_thread.finished_signal.connect(self.on_detection_finished) self.detection_thread.start() self.update_status("正在从摄像头检测...") def stop_detection(self): if self.detection_thread and self.detection_thread.isRunning(): self.detection_thread.stop() self.detection_thread.quit() self.detection_thread.wait() if self.video_writer: self.video_writer.release() self.video_writer = None self.is_camera_running = False self.is_video_running = False self.update_status("检测已停止") def on_frame_received(self, original_frame, result_frame, detections): # 更新原始图像和结果图像 self.display_image(self.original_image_label, original_frame) self.display_image(self.result_image_label, result_frame) # 保存当前结果帧用于后续保存 self.last_detection_result = result_frame # 新增:保存检测结果 # 更新表格 self.clear_results() for class_name, confidence, x, y in detections: self.add_detection_result(class_name, confidence, x, y) # 保存视频帧 if self.video_writer: self.video_writer.write(cv2.cvtColor(result_frame, cv2.COLOR_RGB2BGR)) def on_detection_finished(self): if self.video_writer: self.video_writer.release() self.video_writer = None self.update_status("视频检测完成,结果已保存") elif self.is_camera_running: self.update_status("摄像头检测已停止") else: self.update_status("图片检测完成") def save_result(self): if not hasattr(self, 'last_detection_result') or self.last_detection_result is None: QMessageBox.warning(self, "警告", "没有可保存的检测结果") return save_dir = "results" os.makedirs(save_dir, exist_ok=True) timestamp = time.strftime("%Y%m%d_%H%M%S") if self.is_camera_running or self.is_video_running: # 保存当前帧为图片 save_path = os.path.join(save_dir, f"snapshot_{timestamp}.jpg") cv2.imwrite(save_path, cv2.cvtColor(self.last_detection_result, cv2.COLOR_RGB2BGR)) self.update_status(f"截图已保存: {save_path}") else: # 保存图片检测结果 save_path = os.path.join(save_dir, f"result_{timestamp}.jpg") cv2.imwrite(save_path, cv2.cvtColor(self.last_detection_result, cv2.COLOR_RGB2BGR)) self.update_status(f"检测结果已保存: {save_path}") def closeEvent(self, event): self.stop_detection() event.accept() if __name__ == "__main__": app = QApplication(sys.argv) # 设置应用程序样式 app.setStyle("Fusion") # 创建并显示主窗口 window = MainWindow() window.show() sys.exit(app.exec_())

七、项目

基于深度学习的昆虫识别检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)_哔哩哔哩_bilibili

基于深度学习的昆虫识别检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)

http://www.jsqmd.com/news/119973/

相关文章:

  • iOS 商店上架全流程解析 从工程准备到审核通过的系统化实践指南 - 详解
  • 掌握这六点轻松入门LangGraph1.0,非常详细
  • iOS 商店上架全流程解析 从工程准备到审核通过的系统化实践指南 - 详解
  • 2025年度开发趋势有感
  • vivo 前端三剑客发展历程及原理揭秘
  • 【iOS】多线程学习 - 指南
  • 基于YOLOv10的疲劳驾驶检测系统(YOLOv10深度学习+YOLO数据集+UI界面+Python项目+模型)
  • 链动2+1模式、AI智能名片与S2B2C商城小程序在直播营销中的规范化应用研究
  • 好写作AI:当免费的GPT都能写论文,你为什么还需要专业工具?
  • COMSOL Multiphysics 实现裂隙传热数值模拟的奇妙之旅
  • TP-Link路由器高危漏洞解析:未初始化指针访问可导致设备完全沦陷
  • 未来十年职场生存战:当国际通用的AI证书成为HR不说的“潜规则”
  • 未来十年职场生存战:当国际通用的AI证书成为HR不说的“潜规则”
  • 华为OD机试(机考) - 机器人搬砖 (C++ Python JAVA JS GO)
  • 基于卡尔曼滤波的行人跟踪算法:MATLAB实战与误差分析
  • 投稿?别怕!宏智树AI的期刊“外挂”功能,给学术新手的进阶指南
  • 好写作AI:当所有AI写作工具都长一样,你的选择困难症犯了吗?
  • 【BuildFlow 筑流】unitrix_macros库 Cargo.toml 配置详解及依赖库用法
  • 人工智能之数学基础 微积分:第三章 基本法则
  • 好写作AI:AI写论文越用越“笨”?你可能需要一套“思维防沉迷系统”
  • 一张蓝图胜过一万行填鸭:为何顶尖AI把开题报告“活”成了你的开题战略家?
  • Windows系统文件fwpolicyiomgr.dll丢失或损坏 下载修复方法
  • “你用的那个AI,到底把你坑了还是救了?”——解锁宏智树论文的协作新范式
  • 好写作AI:别等学校采购了!你的论文“救命神器”自己就能用上
  • 货币汇率换算免费API接口(每日更新汇率)
  • python:报错:ModuleNotFoundError: No module named langchain_community
  • 系统文件gdi32.dll缺失或损坏 免费下载修复方法
  • 我发现LLM多语言解析跨境病历 远程会诊误诊率直降40%
  • 拒绝品牌碰瓷!如何通过影刀RPA为品牌IP搭建一套高效的“内容合规治理”工作流?
  • 国产操作系统 KylinOS 学习心得:从基础操作到实战部署