基于yolov11的3D打印缺陷检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面

【算法介绍】

基于YOLOv11的3D打印缺陷识别系统是一种创新的解决方案,专为提升3D打印质量控制而设计。该系统融合了YOLOv11这一尖端的深度学习模型,以及专用的3D打印缺陷数据集,能够高效、准确地识别并分类3D打印过程中常见的缺陷类型,包括意大利面缺陷(Spaghetti)、拉丝(Stringing)和小疙瘩(Zits)等。

在实际应用中,该系统通过摄像头或图像输入设备实时捕获3D打印件的图像,并自动进行缺陷检测。YOLOv11模型凭借其强大的特征提取和分类能力,能够从图像中快速识别出缺陷区域,同时提供详细的缺陷信息,如缺陷位置、大小和置信度等。这些信息通过直观的图形用户界面(GUI)实时展示给操作人员,使他们能够迅速识别和处理3D打印件上的缺陷。

该系统的核心优势在于其高精度和高效率。通过深度学习算法的优化和大量标注数据的训练,YOLOv11模型在3D打印缺陷检测方面表现出色,准确率高达87.3%以上。此外,该系统还具有良好的可扩展性和适应性,可以针对不同品牌和规格的3D打印机进行定制和优化,以满足不同客户的实际需求。

总的来说,基于YOLOv11的3D打印缺陷识别系统为3D打印质量控制提供了一种智能化、自动化的解决方案。它不仅提高了缺陷检测的准确性和效率,还降低了人工检查的成本和主观性影响,为3D打印行业的持续发展注入了新的活力。随着3D打印技术的不断普及和应用领域的不断拓展,该系统有望在未来发挥更加重要的作用。

【效果展示】

 

【训练数据集介绍】

 数据集大约1/3是原图,剩余为增强图片,请认真观看图片预览

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

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

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

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

标注类别数:3

标注类别名称(注意yolo格式类别顺序不和这个对应,而以labels文件夹classes.txt为准):["spaghetti","stringing","zits"]

每个类别标注的框数:

spaghetti 框数 = 9339

stringing 框数 = 2353

zits 框数 = 30427

总框数:42119

使用标注工具:labelImg

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

重要说明:暂无

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

图片预览:

标注例子:

【训练信息】

参数
训练集图片数5137
验证集图片数500
训练map60.1%
训练精度(Precision)64.3%
训练召回率(Recall)57.1%

验证集评估精度信息

Class

Images

Instances

P

R

mAP50

mAP50-95

all

500

3657

0.643

0.571

0.601

0.354

spaghetti

332

672

0.844

0.909

0.927

0.718

stringing

65

255

0.453

0.408

0.362

0.16

zits

103

2730

0.633

0.396

0.515

0.184

 

【测试环境】

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()

【模型可检测出3类】

意大利面缺陷(Spaghetti)、拉丝(Stringing)和小疙瘩(Zits)

【常用评估参数介绍】

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

  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阈值,因此能够更全面地评估模型的性能。

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

【使用步骤】

使用步骤:
(1)首先根据官方框架ultralytics安装教程安装好yolov11环境,并安装好pyqt5
(2)切换到自己安装的yolo11环境后,并切换到源码目录,执行python main.py即可运行启动界面,进行相应的操作即可

【提供文件】

python源码
yolo11n.pt模型
训练的map,P,R曲线图(在weights\results.png)
测试图片600张(在test_img文件夹下面)

注意不提供训练的数据集

### 3D打印缺陷检测技术概述 3D打印作为一种先进的制造技术,在多个行业中得到了广泛应用,然而其生产过程中可能出现的各种缺陷会直接影响最终产品的质量和性能。为了提高3D打印的质量并减少废品率,实时缺陷检测成为一项关键技术。 #### 基于深度学习的实时监控方法 一种有效的解决方案是利用基于YOLOv10的缺陷检测系统进行实时监控[^1]。此系统能够在3D打印的过程中自动识别常见的缺陷类型,例如spaghetti(乱丝)、zits(表面瑕疵)以及stringing(拉丝现象)。通过这种方式,不仅可以显著提升产品质量,还能有效降低材料浪费和后期修复的成本。此外,这种系统的通用性和可扩展性使其能够适应更多类型的缺陷检测需求。 #### 计算机视觉中的Blob分析技术 除了上述提到的深度学习框架外,还可以采用传统的计算机视觉技术来辅助完成这项工作。具体来说,Blob(二值图像区域)分析作为图像处理领域的一项重要工具,同样适用于3D打印件表面上特定模式或者异常情况下的特征提取与分类任务[^2]。这种方法通过对目标对象轮廓线长度、面积大小以及其他几何属性测量实现初步筛选功能;再配合形态学操作去除噪声干扰项之后得到较为纯净的目标候选区供后续深入判断使用。 #### 面向资源受限环境优化模型部署方案 考虑到实际应用场景可能存在计算能力有限的情况,YOLO系列最新版本(YOLOv8)引入了针对边缘端设备友好的改进措施——即支持模型压缩与量化的特性[^3]。这意味着即使是在低功耗条件下运行的小型化硬件平台上也能顺利完成高效精准度保持不变前提下速度更快更省电效果更好的预测作业流程执行全过程。 ```python import cv2 from ultralytics import YOLO def detect_defects(image_path): model = YOLO('yolov8n.pt') # 加载预训练模型 image = cv2.imread(image_path) results = model.predict(source=image, conf=0.5) for r in results: boxes = r.boxes.xyxy.cpu().numpy() labels = r.names[r.probs.top1].cpu().numpy() for box,label in zip(boxes,labels): x_min,y_min,x_max,y_max = map(int,box) cv2.rectangle(image,(x_min,y_min),(x_max,y_max),color=(0,255,0)) return image ``` 以上代码片段展示了如何加载YOLOv8模型并对输入图片执行预测操作的过程。它可以帮助快速定位到可能存在的质量问题所在位置以便采取相应补救措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FL1623863129

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

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

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

打赏作者

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

抵扣说明:

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

余额充值