news 2026/4/16 9:00:55

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于深度学习YOLOv10的结核病检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)

一、项目介绍

项目背景

结核病(Tuberculosis, TB)是一种由结核分枝杆菌引起的传染病,是全球十大死亡原因之一。早期诊断和治疗对控制结核病传播和降低死亡率至关重要。目前,痰液涂片显微镜检查是结核病诊断的主要方法之一,但这种方法存在以下问题:

  1. 效率低:医生需要花费大量时间在显微镜下观察涂片。

  2. 漏检率高:结核杆菌可能因数量少或分布不均而被忽略。

  3. 主观性强:诊断结果依赖医生的经验和判断,可能存在误诊。

近年来,基于深度学习的目标检测技术(如YOLO系列)在医学图像分析领域取得了显著进展。YOLOv10作为YOLO系列的最新版本,具有更高的检测速度和精度,非常适合应用于结核杆菌检测场景。本项目旨在利用YOLOv10算法,结合痰液涂片图像数据,开发一套高效、准确的结核杆菌检测系统,为结核病诊断提供智能化支持。


项目意义

  1. 提升诊断效率:通过自动化检测,减少医生的工作负担,提高诊断速度。

  2. 提高诊断准确性:利用深度学习算法,降低漏检率和误检率,提升诊断的可靠性。

  3. 辅助医生决策:为医生提供客观的结核杆菌检测结果,辅助制定治疗方案。

  4. 推动医疗普惠:通过智能化诊断系统,弥补医疗资源不足地区的诊断能力,让更多患者受益。


主要技术

  1. 模型选择:采用YOLOv10作为核心检测算法,因其在速度和精度上的优异表现,非常适合医学图像分析场景。

  2. 数据增强:对训练集进行数据增强(如旋转、缩放、翻转等),以提高模型的鲁棒性。

  3. 模型训练:使用训练集对YOLOv10模型进行训练,优化损失函数,提升检测精度。

  4. 模型评估:使用验证集评估模型的性能,计算mAP(平均精度均值)等指标,确保模型达到预期效果。

  5. 部署应用:将训练好的模型部署到医疗诊断设备或移动终端中,实现实时结核杆菌检测。

目录

一、项目介绍

项目背景

项目意义

主要技术

系统功能

图片检测

视频检测

摄像头实时检测

三、数据集介绍

数据集使用

数据集配置文件data.yaml

数据集制作流程

四、项目环境配置

创建虚拟环境

pycharm中配置anaconda

安装所需要库

五、模型训练

训练代码

训练结果

六、核心代码

七、项目源码(视频下方简介内)


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

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

系统功能

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

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

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

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

  • 图片检测

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

  • 视频检测

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

  • 摄像头实时检测

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

核心特点:

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

三、数据集介绍

数据集名称:结核杆菌检测数据集
类别数量(nc):1类
类别名称

  1. TBbacillus(结核杆菌)

数据集规模

  • 训练集:1098张痰液涂片图像

  • 验证集:122张痰液涂片图像

数据集特点

  1. 目标单一:数据集中仅包含结核杆菌一种目标,专注于结核病的诊断任务。

  2. 复杂性:痰液涂片图像中可能存在杂质、细胞碎片等干扰因素,增加了检测的难度。

  3. 标注质量:每张图像都经过精确的标注,标注信息包括结核杆菌的边界框(Bounding Box),确保模型训练的准确性。

  4. 场景真实性:数据集中的图像均来自真实的痰液涂片显微镜检查场景,能够很好地反映实际应用中的挑战。


数据集使用

  • 训练集:用于训练YOLOv10模型,通过大量的痰液涂片图像数据,使模型能够学习到结核杆菌的特征。

  • 验证集:用于调整模型超参数,优化模型性能。

数据集配置文件data.yaml

train: .\datasets\images\train val: .\datasets\images\val test: .\datasets\images\test nc: 1 names: ['TBbacillus']

数据集制作流程

  • 标注数据:使用标注工具(如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_())

七、项目源码(视频下方简介内)

完整全部资源文件(包括测试图片、视频,py文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 10:04:08

大模型在测试中的应用

随着人工智能技术的快速发展&#xff0c;大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;如 OpenAI 的 GPT 系列、Baidu 文心一言、Qwen-2 等正在引领多个领域的技术变革。在软件测试领域&#xff0c;这些大模型通过其强大的自然语言处理和推理能力&am…

作者头像 李华
网站建设 2026/4/15 9:34:12

2026年1月20日人工智能早间新闻

各位读者&#xff0c;早上好。今天是2026年1月20日&#xff0c;星期二。欢迎收看人工智能早间新闻。在瑞士达沃斯&#xff0c;世界经济论坛2026年年会已进入第二天&#xff0c;全球领袖们正在探讨如何驾驭AI带来的深刻变革。与此同时&#xff0c;产业界的动态同样火热&#xff…

作者头像 李华
网站建设 2026/4/15 13:34:13

一文快速了解SEO(初学者必看)

一、先搞懂&#xff1a;SEO到底是什么&#xff0c;搜索引擎怎么工作 SEO的全称是搜索引擎优化&#xff0c;简单来说&#xff0c;就是通过对网站的内容、结构、技术等方面进行合理调整&#xff0c;让搜索引擎能更轻松地发现、理解我们的网站&#xff0c;同时让网站在搜索引擎的…

作者头像 李华
网站建设 2026/4/13 0:18:02

全网最全专科生必看!8款一键生成论文工具测评TOP8

全网最全专科生必看&#xff01;8款一键生成论文工具测评TOP8 2026年专科生论文写作工具测评&#xff1a;为何需要这份榜单&#xff1f; 随着高校教育的不断深化&#xff0c;专科生在学业中对论文写作的需求日益增加。然而&#xff0c;面对格式规范、内容逻辑、查重要求等多重…

作者头像 李华
网站建设 2026/4/15 19:12:18

告别演示噩梦!宏智树 AI 一键拿捏学术职场 PPT 高分密码

还在为开题报告 PPT 逻辑混乱被导师痛批&#xff1f;还在为论文答辩 PPT 数据堆砌抓不住重点&#xff1f;还在为工作汇报 PPT 颜值太低惨遭嫌弃&#xff1f;作为深耕论文写作科普的教育博主&#xff0c;我实测多款工具后发现&#xff0c;宏智树 AI 科研工具的 AI PPT 功能&…

作者头像 李华