基于yolov8的白血病检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】

基于YOLOv8的白血病检测系统是一项前沿的医疗技术,它利用深度学习算法对血细胞图像进行高效、精准的分析,以辅助医生进行白血病检测与诊断。该系统能够识别多种白血病类型,包括良性白血病(leukemia_benign)、早期白血病(leukemia_early)、潜在白血病(leukemia_pre)和进展期白血病(leukemia_pro)。

YOLOv8作为当前最先进的单阶段目标检测模型之一,具有出色的实时检测能力和高检测精度。通过训练和优化,该系统能够从显微镜图像中准确识别并分类不同类型的血细胞,包括白细胞及其异常形态,从而帮助医生及时发现白血病迹象。

该系统还结合了用户友好的界面,能够实时展示检测结果,便于医生进行快速分析和诊断。此外,系统还支持通过图片、视频等多种方式进行检测和计数,进一步提高了诊断的准确性和效率。

基于YOLOv8的白血病检测系统为医生提供了一种高效、准确的辅助诊断工具,有助于提升白血病检测的自动化水平和诊断效率,减少人为误差,为患者提供更及时、准确的医疗服务。

【效果展示】

测试环境】

windows10
anaconda3+python3.8
torch==2.3.0
ultralytics==8.3.81

【模型可以检测出4类别】

 白血病(leukemia_benign)、早期白血病(leukemia_early)、潜在白血病(leukemia_pre)和进展期白血病(leukemia_pro)

【训练数据集介绍】

图像分辨率都是224x224,有点模糊

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)

图片数量(jpg文件个数):835

标注数量(xml文件个数):835

标注数量(txt文件个数):835

标注类别数:4

标注类别名称(注意yolo格式类别顺序不和这个对应,而以labels文件夹classes.txt为准):["leukemia_benign","leukemia_erarly","leukemia_pre","leukemia_pro"]=>[良性,早期,潜伏期,进展期]

每个类别标注的框数:

leukemia_benign 框数 = 1436

leukemia_erarly 框数 = 1364

leukemia_pre 框数 = 2238

leukemia_pro 框数 = 2103

总框数:7141

使用标注工具:labelImg

标注规则:对类别进行画矩形框

重要说明:暂无

特别声明:本数据集不对训练的模型或者权重文件精度作任何保证,数据集只提供准确且合理标注

图片预览:

标注例子:

    【训练信息】

    参数
    训练集图片数589
    验证集图片数168
    训练map95.8%
    训练精度(Precision)93.4%
    训练召回率(Recall)94.3%

    【验证集精度】

    类别

    map50

    all

    96

    leukemia_benign

    92

    leukemia_early

    96

    leukemia_pre

    97

    leukemia_pro

    98

    【界面设计】

    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)首先根据官方框架安装好yolov8环境,并安装好pyqt5
    (2)切换到自己安装的yolov8环境后,并切换到源码目录,执行python main.py即可运行启动界面,进行相应的操作即可

    【提供文件】

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

    注意源码提供训练的数据集

    【常用评估参数介绍】

    在目标检测任务中,评估模型的性能是至关重要的。你提到的几个术语是评估模型性能的常用指标。下面是对这些术语的详细解释:

    1. Class
      • 这通常指的是模型被设计用来检测的目标类别。例如,一个模型可能被训练来检测车辆、行人或动物等不同类别的对象。
    2. Images
      • 表示验证集中的图片数量。验证集是用来评估模型性能的数据集,与训练集分开,以确保评估结果的公正性。
    3. Instances
      • 在所有图片中目标对象的总数。这包括了所有类别对象的总和,例如,如果验证集包含100张图片,每张图片平均有5个目标对象,则Instances为500。
    4. P(精确度Precision)
      • 精确度是模型预测为正样本的实例中,真正为正样本的比例。计算公式为:Precision = TP / (TP + FP),其中TP表示真正例(True Positives),FP表示假正例(False Positives)。
    5. R(召回率Recall)
      • 召回率是所有真正的正样本中被模型正确预测为正样本的比例。计算公式为:Recall = TP / (TP + FN),其中FN表示假负例(False Negatives)。
    6. mAP50
      • 表示在IoU(交并比)阈值为0.5时的平均精度(mean Average Precision)。IoU是衡量预测框和真实框重叠程度的指标。mAP是一个综合指标,考虑了精确度和召回率,用于评估模型在不同召回率水平上的性能。在IoU=0.5时,如果预测框与真实框的重叠程度达到或超过50%,则认为该预测是正确的。
    7. mAP50-95
      • 表示在IoU从0.5到0.95(间隔0.05)的范围内,模型的平均精度。这是一个更严格的评估标准,要求预测框与真实框的重叠程度更高。在目标检测任务中,更高的IoU阈值意味着模型需要更准确地定位目标对象。mAP50-95的计算考虑了从宽松到严格的多个IoU阈值,因此能够更全面地评估模型的性能。

    这些指标共同构成了评估目标检测模型性能的重要框架。通过比较不同模型在这些指标上的表现,可以判断哪个模型在实际应用中可能更有效。

     【常见问题】

    目标检测训练中,Mean Average Precision(MAP)偏低可能有以下原因:
    原因一:欠拟合:如果训练数据量过小,模型可能无法学习到足够的特征,从而影响预测效果,导致欠拟合,进而使MAP偏低。因此可以加大数据集数量
    原因二:小目标:如果数据集包含大部分小目标则一般会有可能产生map偏低情况,因为小目标特征不明显,模型很难学到特征。
    原因三:模型调参不对:比如学习率调整过大可能会导致学习能力过快,模型参数调节出现紊乱
    原因四:过拟合(现在模型基本不存在这种情况):如果模型在训练数据上表现非常好,但在验证或测试数据上表现较差,可能是出现了过拟合。这通常是因为模型参数过多,而训练数据量相对较小,导致模型学习到了训练数据中的噪声或特定模式,而无法泛化到新的数据。如今现在目标检测模型都对这个情况做的很好,很少有这种情况发生。
    原因五:场景不一样:验证集验证精度高,测试集不行,则有可能是与训练模型场景图片不一致导致测试map过低
    针对以上原因,可以采取以下措施来提高MAP:

    (1)优化模型结构:根据任务和数据集的特点选择合适的模型,并尝试使用不同的网络架构和构件来改进模型性能。
    (2)增强数据预处理:对数据进行适当的预处理和增强,如数据归一化、缺失值填充、数据扩增等,以提高模型的泛化能力。
    (3)调整损失函数:尝试使用不同的损失函数或组合多种损失函数来优化模型性能。
    (4)优化训练策略:调整学习率、批次大小、训练轮数等超参数,以及使用学习率衰减、动量等优化算法来改善模型训练效果。
    (5)使用预训练模型:利用在大规模数据集上预训练的模型进行迁移学习,可以加速模型收敛并提高性能。
    (6)增加数据集数量,尽可能提供多场景图片,提高模型泛化能力,增强模型特征学习能力。
    综上所述,提高目标检测训练的MAP需要从多个方面入手,包括优化模型结构、增强数据预处理、调整损失函数、优化训练策略以及使用预训练模型等。

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    FL1623863129

    你的打赏是我写文章最大的动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值