室内液体泼洒检测数据集 YOLOV11室内漏液检测数据集 室内跑冒滴漏检测数据集

室内液体泼洒检测数据集 YOLOV11室内漏液检测数据集 室内跑冒滴漏检测数据集

室内液体泼洒检测数据集,19606张,提供yolo和voc两种标注方式
训练集:17121张,验证集:1667张,测试集:818张
1类,标注数量:640*640
类别名称: 每一类图像数 ,每一类标注数
Spill: 19593,28814
image num: 19606

2.模型代码:模型训练使用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.yaml(YOLOv11 配置文件)

path:./spill_datasettrain:images/trainval:images/valtest:images/testnc:1names:0:Spill ```![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ad78ef548ef24730b6b3c833c0bbb291.png)### 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,iterations=1) 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/Annotations"save_txt_dir="./spill_dataset/labels"ifnotos.path.exists(save_txt_dir):os.makedirs(save_txt_dir)defconvert_xml_to_yolo(xml_path):tree=ET.parse(xml_path)root=tree.getroot()size=root.find("size")w=int(size.find("width").text)h=int(size.find("height").text)txt_name=os.path.basename(xml_path).replace(".xml",".txt")txt_path=os.path.join(save_txt_dir,txt_name)withopen(txt_path,"w")asf:forobjinroot.iter("object"):cls_name=obj.find("name").textifcls_namenotinclass_names:continuecls_id=class_names.index(cls_name)bnd=obj.find("bndbox")x1=float(bnd.find("xmin").text)y1=float(bnd.find("ymin").text)x2=float(bnd.find("xmax").text)y2=float(bnd.find("ymax").text)# 归一化x_center=(x1+x2)/2/w y_center=(y1+y2)/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 epoch)

fromultralyticsimportYOLOdeftrain_spill():model=YOLO("yolov11n.pt")results=model.train(data="./spill_dataset/spill.yaml",epochs=30,imgsz=640,batch=16,device=0,workers=4,patience=5,pretrained=True,optimizer="Adam",lr0=0.001,warmup_epochs=2,mosaic=0.8,mixup=0.1,project="runs/spill_train",name="yolov11n_spill",exist_ok=True)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_ready=pyqtSignal(object)def__init__(self,model,source):super().__init__()self.model=model self.source=source self.running=Truedefrun(self):cap=cv2.VideoCapture(self.source)whileself.runningandcap.isOpened():ret,frame=cap.read()ifnotret:breakres=self.model.predict(frame,conf=0.3)self.result_ready.emit(res[0])cap.release()defstop(self):self.running=FalseclassSpillDetectUI(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("基于YOLOv11的液体泼洒检测系统")self.setGeometry(100,100,1200,700)self.model=YOLO("./runs/spill_train/yolov11n_spill/weights/best.pt")self.detect_thread=Noneself.init_ui()definit_ui(self):central=QWidget()self.setCentralWidget(central)main_layout=QHBoxLayout(central)# 左侧显示区left_layout=QVBoxLayout()self.label_view=QLabel("图像显示区")self.label_view.setFixedSize(640,480)left_layout.addWidget(self.label_view)# 右侧控制区right_layout=QVBoxLayout()self.btn_img=QPushButton("图片检测")self.btn_video=QPushButton("视频检测")self.btn_camera=QPushButton("摄像头检测")self.btn_save=QPushButton("保存结果")self.btn_exit=QPushButton("退出")self.table_result=QTableWidget()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:returnimg=cv2.imread(path)res=self.model.predict(img,conf=0.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_thread=DetectThread(self.model,source)self.detect_thread.result_ready.connect(lambdares:self.show_result(res,"实时流"))self.detect_thread.start()defshow_result(self,res,path=""):img=res.plot()img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)h,w,c=img.shape qimg=QImage(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):cls=res.names[int(box.cls[0])]conf=float(box.conf[0])x1,y1,x2,y2=map(int,box.xyxy[0])self.table_result.setItem(i,0,QTableWidgetItem(str(i+1)))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__":app=QApplication(sys.argv)win=SpillDetectUI()win.show()sys.exit(app.exec_())