【算法介紹】
基于YOLOv8的糖尿病視網膜病變嚴重程度檢測系統
基于YOLOv8的糖尿病視網膜病變嚴重程度檢測系統是一款利用深度學習技術,專為糖尿病視網膜病變早期診斷設計的智能輔助工具。該系統采用YOLOv8目標檢測模型,結合經過標注和處理的醫學影像數據集,能夠高效且準確地檢測并分類糖尿病視網膜病變的不同嚴重程度。
YOLOv8模型以其高速和高精度的特點,在處理眼底圖像時展現了強大的能力。通過優化模型的網絡結構和參數設置,該系統實現了對糖尿病視網膜病變的高精度檢測,有效輔助醫生進行病情評估和診斷。
該系統支持實時圖像檢測,操作簡便,用戶只需上傳眼底影像,系統即可快速分析并返回檢測結果,包括病變的類型和嚴重程度分類。這不僅提高了診斷效率,還降低了醫生的主觀經驗對診斷結果的影響,使診斷更加客觀和準確。
總之,基于YOLOv8的糖尿病視網膜病變嚴重程度檢測系統為糖尿病視網膜病變的早期診斷和治療提供了有力的支持。
【效果展示】
【測試環境】
windows10
anaconda3+python3.8
torch==2.3.0
ultralytics==8.3.79
【模型可以檢測出類別】
mild(輕度)
nodr(無病變)
proliferatedr(增殖性病變)
moderate(中度)
severe(嚴重)
【訓練信息】
參數 | 值 |
訓練集圖片數 | 1606 |
驗證集圖片數 | 179 |
訓練map | 79.0% |
訓練精度(Precision) | 67.7% |
訓練召回率(Recall) | 79.7% |
驗證集測試精度信息
Class | Images | Instances | P | R | mAP50 | mAP50-95 |
all | 179 | 179 | 0.677 | 0.797 | 0.79 | 0.64 |
mild | 42 | 42 | 0.71 | 0.81 | 0.825 | 0.582 |
nodr | 55 | 55 | 0.962 | 0.982 | 0.992 | 0.855 |
proliferatedr | 15 | 15 | 0.359 | 0.867 | 0.765 | 0.683 |
moderate | 47 | 47 | 0.609 | 0.894 | 0.749 | 0.547 |
severe | 20 | 20 | 0.743 | 0.434 | 0.618 | 0.534 |
【部分實現源碼】
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.pt模型
訓練的map,P,R曲線圖(在weights\results.png)
測試圖片(在test_img文件夾下面)
注意不提供數據集
【常用評估參數介紹】
在目標檢測任務中,評估模型的性能是至關重要的。你提到的幾個術語是評估模型性能的常用指標。下面是對這些術語的詳細解釋:
- Class:
- 這通常指的是模型被設計用來檢測的目標類別。例如,一個模型可能被訓練來檢測車輛、行人或動物等不同類別的對象。
- Images:
- 表示驗證集中的圖片數量。驗證集是用來評估模型性能的數據集,與訓練集分開,以確保評估結果的公正性。
- Instances:
- 在所有圖片中目標對象的總數。這包括了所有類別對象的總和,例如,如果驗證集包含100張圖片,每張圖片平均有5個目標對象,則Instances為500。
- P(精確度Precision):
- 精確度是模型預測為正樣本的實例中,真正為正樣本的比例。計算公式為:Precision = TP / (TP + FP),其中TP表示真正例(True Positives),FP表示假正例(False Positives)。
- R(召回率Recall):
- 召回率是所有真正的正樣本中被模型正確預測為正樣本的比例。計算公式為:Recall = TP / (TP + FN),其中FN表示假負例(False Negatives)。
- mAP50:
- 表示在IoU(交并比)閾值為0.5時的平均精度(mean Average Precision)。IoU是衡量預測框和真實框重疊程度的指標。mAP是一個綜合指標,考慮了精確度和召回率,用于評估模型在不同召回率水平上的性能。在IoU=0.5時,如果預測框與真實框的重疊程度達到或超過50%,則認為該預測是正確的。
- 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需要從多個方面入手,包括優化模型結構、增強數據預處理、調整損失函數、優化訓練策略以及使用預訓練模型等。