基于yolov8的舌苔识别检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

devtools/2024/9/23 7:39:11/

【算法介绍】

基于YOLOv8的舌苔识别检测系统是一项融合了先进计算机视觉技术的创新应用。YOLOv8作为YOLO系列目标检测模型的最新版本,以其卓越的检测速度和精确度著称,能够实时、准确地识别和定位图像中的多个对象。在舌苔识别领域,YOLOv8的应用极大地提升了检测效率和准确性。

该系统通过训练YOLOv8模型,使其能够识别舌苔中的关键特征,如苔色、舌色、齿痕及裂纹等。这些特征对于中医体质辨识至关重要。用户只需上传舌苔图片,系统即可快速分析并展示识别结果,同时结合中医理论,给出相应的体质信息判断。

相比传统检测方法,基于YOLOv8的舌苔识别检测系统具有高速、高精度、多平台兼容及多任务支持等显著优势。它不仅能够简化检测流程,降低检测成本,还能提高检测结果的客观性和准确性,为中医体质辨识提供有力支持。此外,该系统还可广泛应用于医疗、健康管理等领域,为公众提供更加便捷、高效的健康服务。

【效果展示】

【测试环境】

windows10
anaconda3+python3.8
torch==1.9.0+cu111
ultralytics==8.2.95

【模型可以检测出类别】

houbai(厚白)
huihei(灰黑)
houhuang(厚黄)
fenhong(粉红)
bobai(薄白)

【训练信息】

参数
训练集图片数720
验证集图片数80
训练map98.9%
训练精度(Precision)96.0%
训练召回率(Recall)96.8%

验证集测试精度信息

Class

Images

Instances

P

R

mAP50

mAP50-95

                   all

80

80

0.96

0.968

0.989

0.847

                houbai

19

19

0.994

0.947

0.993

0.865

                huihei

10

10

0.995

1

0.995

0.782

              houhuang

15

15

0.933

1

0.987

0.881

               fenhong

20

20

0.95

0.954

0.983

0.855

                 bobai

16

16

0.929

0.938

0.988

0.854

【部分实现源码】

class Ui_MainWindow(QtWidgets.QMainWindow):signal = QtCore.pyqtSignal(str, str)def setupUi(self):self.setObjectName("MainWindow")self.resize(1280, 728)self.centralwidget = QtWidgets.QWidget(self)self.centralwidget.setObjectName("centralwidget")self.weights_dir = './weights'self.picture = QtWidgets.QLabel(self.centralwidget)self.picture.setGeometry(QtCore.QRect(260, 10, 1010, 630))self.picture.setStyleSheet("background:black")self.picture.setObjectName("picture")self.picture.setScaledContents(True)self.label_2 = QtWidgets.QLabel(self.centralwidget)self.label_2.setGeometry(QtCore.QRect(10, 10, 81, 21))self.label_2.setObjectName("label_2")self.cb_weights = QtWidgets.QComboBox(self.centralwidget)self.cb_weights.setGeometry(QtCore.QRect(10, 40, 241, 21))self.cb_weights.setObjectName("cb_weights")self.cb_weights.currentIndexChanged.connect(self.cb_weights_changed)self.label_3 = QtWidgets.QLabel(self.centralwidget)self.label_3.setGeometry(QtCore.QRect(10, 70, 72, 21))self.label_3.setObjectName("label_3")self.hs_conf = QtWidgets.QSlider(self.centralwidget)self.hs_conf.setGeometry(QtCore.QRect(10, 100, 181, 22))self.hs_conf.setProperty("value", 25)self.hs_conf.setOrientation(QtCore.Qt.Horizontal)self.hs_conf.setObjectName("hs_conf")self.hs_conf.valueChanged.connect(self.conf_change)self.dsb_conf = QtWidgets.QDoubleSpinBox(self.centralwidget)self.dsb_conf.setGeometry(QtCore.QRect(200, 100, 51, 22))self.dsb_conf.setMaximum(1.0)self.dsb_conf.setSingleStep(0.01)self.dsb_conf.setProperty("value", 0.25)self.dsb_conf.setObjectName("dsb_conf")self.dsb_conf.valueChanged.connect(self.dsb_conf_change)self.dsb_iou = QtWidgets.QDoubleSpinBox(self.centralwidget)self.dsb_iou.setGeometry(QtCore.QRect(200, 160, 51, 22))self.dsb_iou.setMaximum(1.0)self.dsb_iou.setSingleStep(0.01)self.dsb_iou.setProperty("value", 0.45)self.dsb_iou.setObjectName("dsb_iou")self.dsb_iou.valueChanged.connect(self.dsb_iou_change)self.hs_iou = QtWidgets.QSlider(self.centralwidget)self.hs_iou.setGeometry(QtCore.QRect(10, 160, 181, 22))self.hs_iou.setProperty("value", 45)self.hs_iou.setOrientation(QtCore.Qt.Horizontal)self.hs_iou.setObjectName("hs_iou")self.hs_iou.valueChanged.connect(self.iou_change)self.label_4 = QtWidgets.QLabel(self.centralwidget)self.label_4.setGeometry(QtCore.QRect(10, 130, 72, 21))self.label_4.setObjectName("label_4")self.label_5 = QtWidgets.QLabel(self.centralwidget)self.label_5.setGeometry(QtCore.QRect(10, 210, 72, 21))self.label_5.setObjectName("label_5")self.le_res = QtWidgets.QTextEdit(self.centralwidget)self.le_res.setGeometry(QtCore.QRect(10, 240, 241, 400))self.le_res.setObjectName("le_res")self.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(self)self.menubar.setGeometry(QtCore.QRect(0, 0, 1110, 30))self.menubar.setObjectName("menubar")self.setMenuBar(self.menubar)self.statusbar = QtWidgets.QStatusBar(self)self.statusbar.setObjectName("statusbar")self.setStatusBar(self.statusbar)self.toolBar = QtWidgets.QToolBar(self)self.toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)self.toolBar.setObjectName("toolBar")self.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)self.actionopenpic = QtWidgets.QAction(self)icon = QtGui.QIcon()icon.addPixmap(QtGui.QPixmap(":/images/1.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)self.actionopenpic.setIcon(icon)self.actionopenpic.setObjectName("actionopenpic")self.actionopenpic.triggered.connect(self.open_image)self.action = QtWidgets.QAction(self)icon1 = QtGui.QIcon()icon1.addPixmap(QtGui.QPixmap(":/images/2.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)self.action.setIcon(icon1)self.action.setObjectName("action")self.action.triggered.connect(self.open_video)self.action_2 = QtWidgets.QAction(self)icon2 = QtGui.QIcon()icon2.addPixmap(QtGui.QPixmap(":/images/3.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)self.action_2.setIcon(icon2)self.action_2.setObjectName("action_2")self.action_2.triggered.connect(self.open_camera)self.actionexit = QtWidgets.QAction(self)icon3 = QtGui.QIcon()icon3.addPixmap(QtGui.QPixmap(":/images/4.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)self.actionexit.setIcon(icon3)self.actionexit.setObjectName("actionexit")self.actionexit.triggered.connect(self.exit)self.toolBar.addAction(self.actionopenpic)self.toolBar.addAction(self.action)self.toolBar.addAction(self.action_2)self.toolBar.addAction(self.actionexit)self.retranslateUi()QtCore.QMetaObject.connectSlotsByName(self)self.init_all()

使用步骤】

使用步骤:
(1)首先根据官方框架https://github.com/ultralytics/ultralytics安装教程安装好yolov8环境,并安装好pyqt5
(2)切换到自己安装的yolov8环境后,并切换到源码目录,执行python main.py即可运行启动界面,进行相应的操作即可

【提供文件】

python源码
yolov8n.onnx模型(不提供pytorch模型)
训练的map,P,R曲线图(在weights\results.png)
测试图片(在test_img文件夹下面)

【源码下载地址】

https://download.csdn.net/download/FL1623863129/89764925


http://www.ppmy.cn/devtools/115891.html

相关文章

使用思科搭建企业网规划训练,让网络全部互通,使用规则提高工作效率。

1. 企业背景: 某企业分为销售部、行政部、人力资源部、财务部、业务部、接待中心等主要六个部门;配置网管中心,允许网络管理员登录企业交换机和路由器对企业网络进行管理;配置服务器集群,设置FTP、DNS、WEB服务器&am…

手机在网状态查询接口如何用PHP进行调用?

一、什么是手机在网状态查询接口? 手机在网状态查询接口,即输入手机号码查询手机号在网状态,返回有正常使用、停机、在网但不可用、不在网(销号/未启用/异常)、预销户等多种状态。 二、手机在网状态查询适用哪些场景…

python脚本转mac app+app签名公正

python脚本转mac appapp签名公正 1.python打包,有id的可以加上--codesign-identity,然后提交公正,可以避免给别人用的时候需要去设置中信任的问题。没有的话可以忽略,打完包也不用看2和3了创建完证书,本地双击打开一下…

HTTP的基本格式

HTTP是超文本传输协议,HTTP不仅可以传输文本还可以传输图片视频和其他各种数据。它是一种典型的一种一问一答的形式,与TCP不同HTTP是文本格式。 HTTP的基本格式有响应格式和请求格式。 请求格式:1)首行 2) 请求头(head…

IDEA2023.1添加java虚拟机启动参数,打开断言

IDEA2023.1添加java虚拟机启动参数,打开断言 idea 2023.1、java、assert、ea、enableassertions背景 编写测试框架,想用断言来判定最终结果是否符合预期。需要用到assert语句,不巧的是java默认禁用了断言。 轻量测试框架实现与使用的总篇可…

tasklist命令的应用实例

tasklist命令的应用实例 引言 在系统管理和故障排查过程中,了解当前正在运行的进程信息是至关重要的。Windows操作系统提供了一个强大的命令行工具——tasklist,它可以帮助用户查看当前系统中所有正在运行的进程及其相关信息。掌握这个命令的使用&…

python爬虫初体验(二)

在Python中,每个模块都有一个内置的变量 name,用于表示当前模块的名称。当一个Python文件被执行时,Python解释器会首先将该文件作为一个模块导入,并执行其中的代码。此时,__name__的值为模块的名称。 作用 模块可被导…

【Linux】Shell 编程规范及检查工具推荐

本文内容均来自个人笔记并重新梳理,如有错误欢迎指正! 如果对您有帮助,烦请点赞、关注、转发、订阅专栏! 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】(全…