基于yolov8的糖尿病視網膜病變嚴重程度檢測系統python源碼+pytorch模型+評估指標曲線+精美GUI界面

【算法介紹】

基于YOLOv8的糖尿病視網膜病變嚴重程度檢測系統

基于YOLOv8的糖尿病視網膜病變嚴重程度檢測系統是一款利用深度學習技術,專為糖尿病視網膜病變早期診斷設計的智能輔助工具。該系統采用YOLOv8目標檢測模型,結合經過標注和處理的醫學影像數據集,能夠高效且準確地檢測并分類糖尿病視網膜病變的不同嚴重程度。

YOLOv8模型以其高速和高精度的特點,在處理眼底圖像時展現了強大的能力。通過優化模型的網絡結構和參數設置,該系統實現了對糖尿病視網膜病變的高精度檢測,有效輔助醫生進行病情評估和診斷。

該系統支持實時圖像檢測,操作簡便,用戶只需上傳眼底影像,系統即可快速分析并返回檢測結果,包括病變的類型和嚴重程度分類。這不僅提高了診斷效率,還降低了醫生的主觀經驗對診斷結果的影響,使診斷更加客觀和準確。

總之,基于YOLOv8的糖尿病視網膜病變嚴重程度檢測系統為糖尿病視網膜病變的早期診斷和治療提供了有力的支持。

【效果展示】

【測試環境】

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

【模型可以檢測出類別】

mild(輕度)
nodr(無病變)
proliferatedr(增殖性病變)
moderate(中度)
severe(嚴重)

【訓練信息】

參數
訓練集圖片數1606
驗證集圖片數179
訓練map79.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文件夾下面)

注意不提供數據集

【常用評估參數介紹】

在目標檢測任務中,評估模型的性能是至關重要的。你提到的幾個術語是評估模型性能的常用指標。下面是對這些術語的詳細解釋:

  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需要從多個方面入手,包括優化模型結構、增強數據預處理、調整損失函數、優化訓練策略以及使用預訓練模型等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70886.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70886.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70886.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學習路程八 langchin核心組件 Models補充 I/O和 Redis Cache

前序 之前了解了Models,Prompt,但有些資料又把這塊與輸出合稱為模型輸入輸出(Model I/O)?:這是與各種大語言模型進行交互的基本組件。它允許開發者管理提示(prompt),通過通用接口調…

DeepSeek 開源狂歡周(五)正式收官|3FS并行文件系統榨干SSD

千呼萬喚始出來!在 DeepSeek 開源周 的第五天,今日正式收官!在大模型訓練中,每個epoch都在與存儲系統進行光速競賽——數據加載延遲會扭曲計算時空,KVCache訪問瓶頸將引發推理坍縮。DeepSeek開源的 3FS文件系統&#x…

特征工程中的三大向量化工具詳解

特征工程中的三大向量化工具詳解 在文本處理和特征工程中,TfidfVectorizer、CountVectorizer 和 DictVectorizer 是常用的工具,用于將原始數據轉換為機器學習模型可用的數值特征。以下是它們的核心區別、用法及示例: 1. CountVectorizer&…

C++ Qt常見面試題(4):Qt事件過濾器

在 Qt 中,事件過濾器(Event Filter)提供了一種機制,可以攔截并處理對象的事件(如鼠標事件、鍵盤事件等),在事件到達目標對象之前對其進行預處理。事件過濾器通常用于以下場景: 捕獲和處理特定的事件(如鼠標點擊、按鍵等);對事件進行篩選或修改;實現全局的事件監聽功…

TCP基本入門-簡單認識一下什么是TCP

部分內容來源:小林Coding TCP的特點 1.面向連接 一定是“一對一”才能連接,不能像 UDP 協議可以一個主機同時向多個主機發送消息,也就是一對多是無法做到的 2.可靠的 無論的網絡鏈路中出現了怎樣的鏈路變化,TCP 都可以保證一個…

PING命令TTL解析

在 ping 命令中,TTL(Time to Live,生存時間) 是 IP 數據包的核心字段之一,用于控制數據包在網絡中的生命周期。以下是針對 TTL 的簡明解析: 1. TTL 的核心作用 防循環機制:TTL 是一個計數器&a…

PySide(PyQT)重新定義contextMenuEvent()實現鼠標右鍵彈出菜單

在 PySide中,contextMenuEvent() 是 QWidget 類(以及繼承自它的所有子類)的一個事件處理方法,主要用于處理上下文菜單事件,也就是當用戶在控件上右鍵點擊時觸發的事件。 ? 通過重新定義contextMenuEvent()來實現自定…

GitHub SSH連接問題解決指南

🔍 GitHub SSH連接問題解決指南 問題描述 遇到錯誤:ssh: connect to host github.com port 22: Connection refused 說明您的網絡環境無法訪問GitHub的SSH端口22,常見原因: 防火墻/網絡運營商限制(國內常見&#xf…

Go紅隊開發—并發編程

文章目錄 并發編程go協程chan通道無緩沖通道有緩沖通道創建?緩沖和緩沖通道 等協程sync.WaitGroup同步Runtime包Gosched()Goexit() 區別 同步變量sync.Mutex互斥鎖atomic原子變量 SelectTicker定時器控制并發數量核心機制 并發編程階段練習重要的細節端口掃描股票監控 并發編程…

RabbitMQ 的介紹與使用

一. 簡介 1> 什么是MQ 消息隊列(Message Queue,簡稱MQ),從字面意思上看,本質是個隊列,FIFO先入先出,只不過隊列中存放的內容是message而已。 其主要用途:不同進程Process/線程T…

常用的AI文本大語言模型匯總

AI文本【大語言模型】 1、文心一言https://yiyan.baidu.com/ 2、海螺問問https://hailuoai.com/ 3、通義千問https://tongyi.aliyun.com/qianwen/ 4、KimiChat https://kimi.moonshot.cn/ 5、ChatGPThttps://chatgpt.com/ 6、魔塔GPT https://www.modelscope.cn/studios/iic…

在自己的數據上復現一下LlamaGen

git倉庫:https://github.com/FoundationVision/LlamaGen 數據集準備 如果用ImageFolder讀取,則最好和ImageNet一致。 data_path/class_1/image_001.jpgimage_002.jpg...class_2/image_003.jpgimage_004.jpg......class_n/image_005.jpgimage_006.jpg.…

Go入門之接口

type Usber interface {start()stop() } type Phone struct {Name string }func (p Phone) start() {fmt.Println(p.Name, "啟動") } func (p Phone) stop() {fmt.Println(p.Name, "關機") } func main() {p : Phone{Name: "華為手機",}var p1 U…

【數據結構進階】哈希表

🌟🌟作者主頁:ephemerals__ 🌟🌟所屬專欄:數據結構 目錄 前言 一、哈希表的概念 二、哈希函數的實現方法 1. 直接定址法 2. 除留余數法 三、哈希沖突 1. 開放定址法(閉散列&#xff0…

《深度學習實戰》第4集:Transformer 架構與自然語言處理(NLP)

《深度學習實戰》第4集:Transformer 架構與自然語言處理(NLP) 在自然語言處理(NLP)領域,Transformer 架構的出現徹底改變了傳統的序列建模方法。它不僅成為現代 NLP 的核心,還推動了諸如 BERT、…

高效管理 React 狀態和交互:我的自定義 Hooks 實踐

高效管理 React 狀態和交互:自定義 Hooks 實踐 在 React 中,Hooks 是一種使我們能夠在函數組件中使用狀態和副作用的強大工具。隨著項目的增大,重復的邏輯可能會出現在多個組件中,這時使用自定義 Hooks 就非常合適。它們幫助我們…

Exoplayer(MediaX)實現音頻變調和變速播放

在K歌或錄音類應用中變調是個常見需求,比如需要播出蘿莉音/大叔音等。變速播放在影視播放類應用中普遍存在,在傳統播放器Mediaplayer中這兩個功能都比較難以實現,特別在低版本SDK中,而Exoplayer作為google官方推出的Mediaplayer替…

Meta最新研究:從單張照片到3D數字人的革命性突破

隨著人工智能技術的發展,3D建模和虛擬人物生成逐漸變得更加普及和高效。Meta(前身為Facebook)的最新研究成果展示了如何僅通過一張普通手機拍攝的照片就能生成高質量、全方位的3D數字人。這項技術不僅適用于虛擬試衣、游戲角色建模,還能廣泛應用于AR/VR內容生成等領域。本文…

軟件供應鏈安全工具鏈研究系列——RASP自適應威脅免疫平臺(上篇)

1.1 基本能力 RASP是一種安全防護技術,運行在程序執行期間,使程序能夠自我監控和識別有害的輸入和行為。也就是說一個程序如果注入或者引入了RASP技術,那么RASP就和這個程序融為一體,使應用程序具備了自我防護的能力,…

2025-02-27 學習記錄--C/C++-PTA 7-29 刪除字符串中的子串

合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、題目描述 ?? 二、代碼&#xff08;C語言&#xff09;?? #include <stdio.h> // 引入標準輸入輸出庫&#xff0c…