工业-齿轮缺陷检测系统YOLO带数据集模型948张 3类
【标注好的齿轮缺陷检测YOLO数据集】共【948】张,按照8比2划分为训练集和验证集,其中训练集【758】张,验证集【190】张,模型分为【3】类,分类为:【‘生锈’, ‘完好’, ‘缺损’】
【齿轮缺陷检测YOLO模型】训练结果图片见下图
【齿轮检测系统】支持单张/多张图片检测、视频检测、检测结果、检测统计、数据导出
齿轮缺陷检测系统(YOLOv8/YOLOv11)
一、项目与数据集信息表
| 项目 | 详情说明 |
|---|---|
| 系统名称 | 齿轮缺陷智能检测系统 |
| 技术框架 | 后端:Python + PyQt + Ultralytics YOLO 前端:PyQt界面 |
| 核心功能 | 单张/批量图片检测、视频/摄像头实时检测、检测结果可视化、检测统计、JSON/CSV数据导出 |
| 数据集规模 | 共 948 张齿轮图像 |
| 数据集划分 | 训练集:758 张(约80%) 验证集:190 张(约20%) |
| 标注格式 | YOLO 标准格式 |
| 目标类别(3类) | 0: 生锈 1: 完好 2: 缺损 |
| 模型指标 | 训练完成后,mAP@50 可达 0.98+,模型收敛良好 |
| 应用场景 | 工业生产线齿轮质检、设备预防性维护、高校毕设/课程项目、缺陷检测算法验证 |
二、数据集目录结构
gear_dataset/ ├── images/ │ ├── train/ # 758 张训练图片 │ └── val/ # 190 张验证图片 ├── labels/ │ ├── train/ # 对应YOLO格式标注txt文件 │ └── val/ └── gear.yaml # 数据集配置文件三、数据集配置文件gear.yaml
path:./gear_datasettrain:images/trainval:images/valnc:3names:0:生锈1:完好2:缺损四、YOLO训练代码(Ultralytics)
1. 环境依赖
pipinstallultralytics opencv-python numpy2. 训练主代码train_gear.py
fromultralyticsimportYOLOdefmain():# 加载预训练模型(YOLOv8s/YOLOv11s)model=YOLO("yolov8s.pt")# 开始训练results=model.train(data="./gear_dataset/gear.yaml",epochs=100,imgsz=640,batch=16,device=0,# 有GPU写0,无GPU写"cpu"workers=4,patience=15,# 早停机制project="runs/train",name="gear_defect",exist_ok=True,pretrained=True,mosaic=1.0)print("训练完成!模型保存在 runs/train/gear_defect/weights/")# 在验证集上评估模型metrics=model.val()print(f"mAP@50:{metrics.box.map50:.4f}")print(f"mAP@50-95:{metrics.box.map:.4f}")if__name__=="__main__":main()五、PyQt检测系统核心代码(界面+推理)
importsysimportcv2importjsonimportcsvfromPyQt5.QtWidgetsimport*fromPyQt5.QtCoreimport*fromPyQt5.QtGuiimport*fromultralyticsimportYOLOclassGearDefectDetector(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("齿轮缺陷智能检测系统")self.setGeometry(100,100,1200,800)self.model=Noneself.results=[]self.initUI()definitUI(self):# 左侧控制面板left_widget=QWidget()left_layout=QVBoxLayout(left_widget)# 模型设置self.conf_spin=QDoubleSpinBox()self.conf_spin.setRange(0.1,1.0)self.conf_spin.setValue(0.7)left_layout.addWidget(QLabel("置信度阈值:"))left_layout.addWidget(self.conf_spin)# 按钮self.btn_select_img=QPushButton("选择单张图像")self.btn_detect=QPushButton("开始检测")self.btn_export_json=QPushButton("导出为JSON")self.btn_export_csv=QPushButton("导出为CSV")self.btn_select_img.clicked.connect(self.select_image)self.btn_detect.clicked.connect(self.run_detection)self.btn_export_json.clicked.connect(self.export_json)self.btn_export_csv.clicked.connect(self.export_csv)left_layout.addWidget(self.btn_select_img)left_layout.addWidget(self.btn_detect)left_layout.addWidget(self.btn_export_json)left_layout.addWidget(self.btn_export_csv)# 统计信息self.stat_label=QLabel("检测统计:\n生锈: 0\n完好: 0\n缺损: 0\n总计: 0")left_layout.addWidget(self.stat_label)# 右侧图像显示self.image_label=QLabel("图像显示区域")self.image_label.setAlignment(Qt.AlignCenter)# 主布局main_layout=QHBoxLayout()main_layout.addWidget(left_widget,1)main_layout.addWidget(self.image_label,3)central_widget=QWidget()central_widget.setLayout(main_layout)self.setCentralWidget(central_widget)# 加载模型self.model=YOLO("runs/train/gear_defect/weights/best.pt")defselect_image(self):path,_=QFileDialog.getOpenFileName(self,"选择图像","","Images (*.png *.jpg *.jpeg)")ifpath:self.img_path=path self.image_label.setPixmap(QPixmap(path).scaled(self.image_label.size(),Qt.KeepAspectRatio))defrun_detection(self):ifnothasattr(self,'img_path'):returnconf=self.conf_spin.value()results=self.model.predict(self.img_path,conf=conf,save=False)self.results=results[0].boxes self.update_statistics()self.draw_result()defdraw_result(self):img=cv2.imread(self.img_path)forboxinself.results:x1,y1,x2,y2=map(int,box.xyxy[0])cls=int(box.cls[0])conf=float(box.conf[0])label=["生锈","完好","缺损"][cls]color=(0,0,255)ifcls==0else(0,255,0)ifcls==1else(255,0,0)cv2.rectangle(img,(x1,y1),(x2,y2),color,2)cv2.putText(img,f"{label}:{conf:.2f}",(x1,y1-10),cv2.FONT_HERSHEY_SIMPLEX,0.8,color,2)img_rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)h,w,c=img_rgb.shape bytes_per_line=c*w qimg=QImage(img_rgb.data,w,h,bytes_per_line,QImage.Format_RGB888)self.image_label.setPixmap(QPixmap.fromImage(qimg).scaled(self.image_label.size(),Qt.KeepAspectRatio))defupdate_statistics(self):counts=[0,0,0]forboxinself.results:cls=int(box.cls[0])counts[cls]+=1self.stat_label.setText(f"检测统计:\n生锈:{counts[0]}\n完好:{counts[1]}\n缺损:{counts[2]}\n总计:{len(self.results)}")defexport_json(self):ifnotself.results:returndata=[]forboxinself.results:data.append({"class":["生锈","完好","缺损"][int(box.cls[0])],"confidence":float(box.conf[0]),"bbox":list(map(int,box.xyxy[0].tolist()))})withopen("detection_result.json","w",encoding="utf-8")asf:json.dump(data,f,ensure_ascii=False,indent=4)defexport_csv(self):ifnotself.results:returnwithopen("detection_result.csv","w",newline="",encoding="utf-8")asf:writer=csv.writer(f)writer.writerow(["class","confidence","x1","y1","x2","y2"])forboxinself.results:x1,y1,x2,y2=map(int,box.xyxy[0])writer.writerow([["生锈","完好","缺损"][int(box.cls[0])],float(box.conf[0]),x1,y1,x2,y2])if__name__=="__main__":app=QApplication(sys.argv)window=GearDefectDetector()window.show()sys.exit(app.exec_())六、应用场景
| 场景 | 具体用途 |
|---|---|
| 工业自动化质检 | 齿轮生产线中自动识别生锈、缺损等缺陷,替代人工检测,提高效率 |
| 设备预防性维护 | 对在用设备的齿轮进行定期检测,提前发现缺陷,避免故障 |
| 高校毕设/课程项目 | 计算机视觉、深度学习课程的目标检测实战项目 |
| 缺陷检测算法验证 | 用于测试和对比不同YOLO模型在工业缺陷检测任务上的性能 |
关键标签
#YOLO#齿轮缺陷检测#工业质检#目标检测#PyQt#Python#数据集#毕业设计#智能检测#缺陷识别