【算法介紹】
基于YOLOv11的鐵路軌道鐵軌缺陷檢測系統是一種高效、準確的自動化檢測技術,專門用于識別和檢測鐵軌上的各種缺陷。該系統利用YOLOv11這一先進的深度學習模型,實現了對Corrugation(波紋磨耗)、Spalling(剝落)、Squat(壓潰)和Wheel Burn(輪燒)等四種常見鐵軌缺陷的精準識別。
YOLOv11作為YOLO系列的最新版本,在速度和精度上均有所提升,尤其適用于實時檢測任務。該系統通過訓練大量鐵軌缺陷圖像數據集,使模型能夠學習到不同缺陷的特征,并在實際應用中準確識別出這些缺陷。
在檢測過程中,系統首先通過圖像采集設備獲取鐵軌表面的圖像,然后利用YOLOv11模型對圖像進行實時分析,最后輸出缺陷的位置、類型和嚴重程度等信息。這些信息可以為鐵路維護人員提供及時、準確的決策支持,幫助他們及時采取修復措施,確保鐵路運輸的安全和穩定。
總的來說,基于YOLOv11的鐵路軌道鐵軌缺陷檢測系統是一種具有廣泛應用前景的自動化檢測技術,它能夠提高鐵路維護的效率和準確性,為鐵路運輸的安全保駕護航。
【效果展示】
【訓練數據集介紹】
數據集里面有很多增強圖片
數據集格式:Pascal VOC格式+YOLO格式(不包含分割路徑的txt文件,僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件)
圖片數量(jpg文件個數):4020
標注數量(xml文件個數):4020
標注數量(txt文件個數):4020
標注類別數:4
標注類別名稱(注意yolo格式類別順序不和這個對應,而以labels文件夾classes.txt為準):["Corrugation","Spalling","Squat","Wheel Burn"]
每個類別標注的框數:
Corrugation 框數 = 1452
Spalling 框數 = 2208
Squat 框數 = 2949
Wheel Burn 框數 = 546
總框數:7155
使用標注工具:labelImg
標注規則:對類別進行畫矩形框
重要說明:暫無
特別聲明:本數據集不對訓練的模型或者權重文件精度作任何保證,數據集只提供準確且合理標注
圖片預覽:
標注例子:
【訓練信息】
參數 | 值 |
訓練集圖片數 | 3618 |
驗證集圖片數 | 402 |
訓練map | 96.6% |
訓練精度(Precision) | 93.4% |
訓練召回率(Recall) | 93.2% |
驗證集評估精度信息
Class | Images | Instances | P | R | mAP50 | mAP50-95 |
all | 402 | 733 | 0.934 | 0.932 | 0.966 | 0.678 |
Corrugation | 91 | 131 | 0.977 | 1 | 0.994 | 0.796 |
Spalling | 155 | 233 | 0.854 | 0.897 | 0.936 | 0.605 |
Squat | 178 | 308 | 0.933 | 0.946 | 0.977 | 0.656 |
Wheel?Burn | 51 | 61 | 0.974 | 0.885 | 0.955 | 0.654 |
【測試環境】
windows10
anaconda3+python3.8
torch==2.3.0
ultralytics==8.3.81
onnxruntime==1.16.3
【界面代碼】
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()
?【模型可檢測出4類】
Corrugation(波紋磨耗)、Spalling(剝落)、Squat(壓潰)和Wheel Burn(輪燒)
【常用評估參數介紹】
在目標檢測任務中,評估模型的性能是至關重要的。你提到的幾個術語是評估模型性能的常用指標。下面是對這些術語的詳細解釋:
- 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閾值,因此能夠更全面地評估模型的性能。
這些指標共同構成了評估目標檢測模型性能的重要框架。通過比較不同模型在這些指標上的表現,可以判斷哪個模型在實際應用中可能更有效。
【使用步驟】
使用步驟:
(1)首先根據官方框架ultralytics安裝教程安裝好yolov11環境,并安裝好pyqt5
(2)切換到自己安裝的yolo11環境后,并切換到源碼目錄,執行python main.py即可運行啟動界面,進行相應的操作即可
【提供文件】
python源碼
yolo11n.pt模型
訓練的map,P,R曲線圖(在weights\results.png)
測試圖片(在test_img文件夾下面)
注意提供訓練的數據集