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

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

【算法介绍】

基于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.mrgr.cn/news/29349.html

相关文章:

  • 【AI声音克隆整合包及教程】第二代GPT-SoVITS V2:创新与应用
  • 解决Oracle DECODE函数字符串截断问题的深度剖析20241113
  • kafka 生产经验——数据积压(消费者如何提高吞吐量)
  • LeetCode【0038】外观数列
  • 七大经典基于比较排序算法【Java实现】
  • spring中entity的作用
  • 阳光乳业业绩下滑:核心业务承压显著,区域之困如何突围?
  • mac提示“文件已损坏“的处理方法
  • 微信小程序跳转路径的方式
  • 【github】.gitignore不能忽略一些文件的时候
  • redis 在企业开发实践中注意事项
  • 激发组织数字化转型活力,开启发展新征程
  • 一、Numpy使用
  • 工控自动化人必知的7种PLC通讯协议!
  • 从数据仓库到数据中台再到数据飞轮:我了解的数据技术进化史
  • SpringBoot如何在使用MongoRepository时启用@Created
  • 【Linux】探索文件I/O奥秘,解锁软硬链接与生成动静态库知识
  • C++学习, 文件
  • 5分钟部署Prometheus+Grafana批量监控Linux服务器
  • 性能测试的五大目标
  • 力扣300-最长递增子序列(Java详细题解)
  • 家居小程序有什么用?
  • CefSharp_Vue交互(Element UI)_WinFormWeb应用(4)--- 最小化最大化关闭窗体交互(含示例代码)
  • 7 种有助于压缩图像的最佳图像压缩工具
  • 推动公平学习与身份归一化的视网膜神经疾病数据集
  • 1035. 不相交的线