室内液体泼洒检测数据集 YOLOV11室内漏液检测数据集 室内跑冒滴漏检测数据集
室内液体泼洒检测数据集19606张提供yolo和voc两种标注方式训练集17121张验证集1667张测试集818张1类标注数量640*640类别名称: 每一类图像数 每一类标注数Spill: 19593,28814image num: 196062.模型代码模型训练使用yolov11n训练30个epoch训练结果map如描述图所示。3.qt界面运行界面采用pyqt编写本项目已经训练好模型配置好环境后可直接使用运行效果见描述图像室内液体泼洒检测项目完整方案一、数据集信息表项目详情数据集名称室内液体泼洒检测数据集总图片数量19606张标注格式YOLO.txt VOC.xml双格式目标类别单类Spill液体泼洒类别详情图像数19593张标注数28814个单图可含多个泼洒区域图像尺寸统一处理为640×640数据划分训练集17121张验证集1667张测试集818张适用场景室内地面液体泼洒识别、工业/公共区域安全监测、目标检测学习实验二、数据集目录结构spill_dataset/ ├── JPEGImages/ # 所有原始图片19606张 ├── Annotations/ # VOC格式标注19606个.xml ├── labels/ # YOLO格式标注19606个.txt ├── ImageSets/ │ └── Main/ │ ├── train.txt # 训练集图片ID列表 │ ├── val.txt # 验证集图片ID列表 │ └── test.txt # 测试集图片ID列表 ├── images/ │ ├── train/ # 训练集图片17121张 │ ├── val/ # 验证集图片1667张 │ └── test/ # 测试集图片818张 ├── labels/ │ ├── train/ # 训练集YOLO标签 │ ├── val/ # 验证集YOLO标签 │ └── test/ # 测试集YOLO标签 └── spill.yaml # YOLOv11 数据集配置文件三、核心配置文件与代码1.spill.yamlYOLOv11 配置文件path:./spill_datasettrain:images/trainval:images/valtest:images/testnc:1names:0:Spill ### 2. 水印去除脚本批量处理python import os import cv2 import numpy as np def remove_watermark(input_dir,output_dir,watermark_text深度学习master):if not os.path.exists(output_dir):os.makedirs(output_dir)for img_name in os.listdir(input_dir):if img_name.endswith((.jpg,.png)):img_path os.path.join(input_dir,img_name) img cv2.imread(img_path)# 1. 文字水印去除基于颜色填充# 水印多为黄色先提取黄色区域hsv cv2.cvtColor(img,cv2.COLOR_BGR2HSV) lower_yellow np.array([20,100,100]) upper_yellow np.array([30,255,255]) mask cv2.inRange(hsv,lower_yellow,upper_yellow)# 2. 修复填充kernel np.ones((5,5),np.uint8) mask cv2.dilate(mask,kernel,iterations1) img_clean cv2.inpaint(img,mask,3,cv2.INPAINT_TELEA)# 保存cv2.imwrite(os.path.join(output_dir,img_name),img_clean) print(水印去除完成)if __name__ __main__:remove_watermark(./spill_dataset/JPEGImages,./spill_dataset/JPEGImages_clean)3. VOC → YOLO 格式转换脚本importosimportxml.etree.ElementTreeasET class_names[Spill]xml_dir./spill_dataset/Annotationssave_txt_dir./spill_dataset/labelsifnotos.path.exists(save_txt_dir):os.makedirs(save_txt_dir)defconvert_xml_to_yolo(xml_path):treeET.parse(xml_path)roottree.getroot()sizeroot.find(size)wint(size.find(width).text)hint(size.find(height).text)txt_nameos.path.basename(xml_path).replace(.xml,.txt)txt_pathos.path.join(save_txt_dir,txt_name)withopen(txt_path,w)asf:forobjinroot.iter(object):cls_nameobj.find(name).textifcls_namenotinclass_names:continuecls_idclass_names.index(cls_name)bndobj.find(bndbox)x1float(bnd.find(xmin).text)y1float(bnd.find(ymin).text)x2float(bnd.find(xmax).text)y2float(bnd.find(ymax).text)# 归一化x_center(x1x2)/2/w y_center(y1y2)/2/h bw(x2-x1)/w bh(y2-y1)/h f.write(f{cls_id}{x_center:.6f}{y_center:.6f}{bw:.6f}{bh:.6f}\n)forxml_fileinos.listdir(xml_dir):ifxml_file.endswith(.xml):convert_xml_to_yolo(os.path.join(xml_dir,xml_file))print(VOC转YOLO完成)4. YOLOv11 训练脚本30 epochfromultralyticsimportYOLOdeftrain_spill():modelYOLO(yolov11n.pt)resultsmodel.train(data./spill_dataset/spill.yaml,epochs30,imgsz640,batch16,device0,workers4,patience5,pretrainedTrue,optimizerAdam,lr00.001,warmup_epochs2,mosaic0.8,mixup0.1,projectruns/spill_train,nameyolov11n_spill,exist_okTrue)print(训练完成最优模型路径,results.save_dir/weights/best.pt)if__name____main__:train_spill()四、PyQt5 检测界面代码importsysimportcv2importosfromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QWidget,QVBoxLayout,QHBoxLayout,QPushButton,QLabel,QFileDialog,QTableWidget,QTableWidgetItem,QComboBox)fromPyQt5.QtCoreimportQt,QThread,pyqtSignalfromPyQt5.QtGuiimportQPixmap,QImagefromultralyticsimportYOLOclassDetectThread(QThread):result_readypyqtSignal(object)def__init__(self,model,source):super().__init__()self.modelmodel self.sourcesource self.runningTruedefrun(self):capcv2.VideoCapture(self.source)whileself.runningandcap.isOpened():ret,framecap.read()ifnotret:breakresself.model.predict(frame,conf0.3)self.result_ready.emit(res[0])cap.release()defstop(self):self.runningFalseclassSpillDetectUI(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(基于YOLOv11的液体泼洒检测系统)self.setGeometry(100,100,1200,700)self.modelYOLO(./runs/spill_train/yolov11n_spill/weights/best.pt)self.detect_threadNoneself.init_ui()definit_ui(self):centralQWidget()self.setCentralWidget(central)main_layoutQHBoxLayout(central)# 左侧显示区left_layoutQVBoxLayout()self.label_viewQLabel(图像显示区)self.label_view.setFixedSize(640,480)left_layout.addWidget(self.label_view)# 右侧控制区right_layoutQVBoxLayout()self.btn_imgQPushButton(图片检测)self.btn_videoQPushButton(视频检测)self.btn_cameraQPushButton(摄像头检测)self.btn_saveQPushButton(保存结果)self.btn_exitQPushButton(退出)self.table_resultQTableWidget()self.table_result.setColumnCount(5)self.table_result.setHorizontalHeaderLabels([序号,文件路径,类别,置信度,坐标位置])right_layout.addWidget(QLabel(文件导入))right_layout.addWidget(self.btn_img)right_layout.addWidget(self.btn_video)right_layout.addWidget(self.btn_camera)right_layout.addWidget(QLabel(检测结果))right_layout.addWidget(self.table_result)right_layout.addWidget(self.btn_save)right_layout.addWidget(self.btn_exit)main_layout.addLayout(left_layout)main_layout.addLayout(right_layout)# 绑定信号self.btn_img.clicked.connect(self.detect_image)self.btn_video.clicked.connect(self.detect_video)self.btn_camera.clicked.connect(self.detect_camera)self.btn_exit.clicked.connect(self.close)defdetect_image(self):path,_QFileDialog.getOpenFileName(self,选择图片,,Images (*.jpg *.png))ifnotpath:returnimgcv2.imread(path)resself.model.predict(img,conf0.3)[0]self.show_result(res,path)defdetect_video(self):path,_QFileDialog.getOpenFileName(self,选择视频,,Videos (*.mp4 *.avi))ifnotpath:returnself.start_thread(path)defdetect_camera(self):self.start_thread(0)defstart_thread(self,source):ifself.detect_thread:self.detect_thread.stop()self.detect_thread.quit()self.detect_threadDetectThread(self.model,source)self.detect_thread.result_ready.connect(lambdares:self.show_result(res,实时流))self.detect_thread.start()defshow_result(self,res,path):imgres.plot()imgcv2.cvtColor(img,cv2.COLOR_BGR2RGB)h,w,cimg.shape qimgQImage(img.data,w,h,w*c,QImage.Format_RGB888)self.label_view.setPixmap(QPixmap.fromImage(qimg).scaled(640,480,Qt.KeepAspectRatio))# 更新表格self.table_result.setRowCount(len(res.boxes))fori,boxinenumerate(res.boxes):clsres.names[int(box.cls[0])]conffloat(box.conf[0])x1,y1,x2,y2map(int,box.xyxy[0])self.table_result.setItem(i,0,QTableWidgetItem(str(i1)))self.table_result.setItem(i,1,QTableWidgetItem(path))self.table_result.setItem(i,2,QTableWidgetItem(cls))self.table_result.setItem(i,3,QTableWidgetItem(f{conf:.2%}))self.table_result.setItem(i,4,QTableWidgetItem(f[{x1},{y1},{x2},{y2}]))if__name____main__:appQApplication(sys.argv)winSpillDetectUI()win.show()sys.exit(app.exec_())