
简介本资源是面向计算机视觉初学者与工业检测算法研发者的石油泄漏目标检测专用数据集适用于YOLO系列、Faster R-CNN等主流目标检测模型的训练与验证。数据集共6633张真实场景航拍/遥感图像统一标注为单类别“oil”含8754个精确矩形框全部由labelImg工具人工标注同时提供Pascal VOC格式XML与YOLO格式TXT双标准标注文件开箱即用无需格式转换。压缩包内含2000个文件以1999个XML标注文件为核心辅以1个说明文本总大小270.54MB结构简洁、路径规范便于批量加载与数据增强实验。目前已有857人学习下载特别适合开展海上溢油监测、环境遥感分析等实际课题研究资源中已包含部分增强图像使用者可据此评估模型鲁棒性并快速构建端到端检测pipeline。 做工业视觉检测的人应该都有同感泄漏检测算法难的不是模型而是数据。现场拍回来的图往往几十个G真正有泄漏的没几张带标注的更少。我最近拿到一份石油泄漏检测数据集VOCYOLO格式6633张1个类别压缩包是7z。名字很直白内容也规整解压之后直接就能开工。这篇博文就围绕这个数据集把格式解析、转换、训练和落地这类活儿从头到尾捋一遍给准备做泄漏检测、环境监测或者工业安防的同行省点时间。1. 石油泄漏检测数据的稀缺性与这份数据集的定位1.1 为什么泄漏检测的数据集这么难找石油泄漏检测属于典型的工业细分子类。你很难在通用目标检测数据集里找到“泄漏”这个类别因为泄漏事件本身是低频、偶发的它不像行人、车辆那样每天都有大量样本。油田现场虽然摄像头很多但大部分时间拍到的是正常运行画面真正泄漏的画面可能一个月也就几次。想靠自然发生的事件攒数据时间周期长到不现实更别说后续还要人工标注。所以行业内更常见的做法是用模拟装置、定制漏油场景或者合成图像来补充正样本即便如此能拿出来公开分享的数据集依然少之又少。另外泄漏检测的图像场景和通用目标检测有本质区别。通用数据集里的目标通常结构完整、边缘清晰而泄漏液体往往没有固定形状会随重力流动、在表面反光、与背景油污混在一起。同样的标注原则在不同光照条件下会造成很大的边界差异。这也是为什么一份带规范标注的泄漏检测数据集在项目启动阶段非常宝贵——它能帮你把算法验证流程跑通而不是把时间浪费在采集和清洗数据上。1.2 6633张单类别数据集到底能做什么6633张图在深度学习数据集里算不上大但在泄漏检测这个细分赛道里已经属于可以用的规模。单类别的含义很直接模型只负责回答“这里有没有泄漏”以及“泄漏在哪”不需要区分泄漏类型。这种设定适合项目初期的基线验证、算法可行性评估也适合做内部demo给业务方看效果。我用这份数据集的感受是它更适合作为预训练或微调的基础。如果你是要做航拍视角的石油管道巡检那直接用这个数据集训练YOLO往往能在自己的小样本数据上加速收敛。如果现场有完全不同的光照、角度和背景那建议把它当作预训练数据再用现场数据微调。不要指望一份公开数据集能覆盖所有生产环境。2. 数据集内容与两种标注格式的底层逻辑2.1 解压7z后的目录结构先说解压。7z格式的压缩比通常比zip高所以很多数据集作者选它但你得提前装好工具。Windows下用7-Zip或者NanaZipLinux下用p7zip。解压命令很简单7z x 石油泄漏检测数据集VOCYOLO格式6633张1类别.7z -o./oil_leak_data解压后建议先核对文件数量避免传输过程中丢包。我习惯这样检查find ./oil_leak_data -type f | wc -l如果总数和6633对不上先别急着训练重新校验压缩包完整性。这类数据集通常会把VOC和YOLO两种格式分开存放常见的目录结构像这样oil_leak_data/ ├── VOC/ │ ├── JPEGImages/ │ ├── Annotations/ │ └── ImageSets/Main/ └── YOLO/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/具体目录名可能略有出入但核心就是VOC格式的JPEGImages Annotations以及YOLO格式的images labels。两种格式指向同一批图片标注内容等价。2.2 VOC XML标注里的关键字段VOC格式用XML文件描述每个图片里的目标位置。一个典型的标注文件长这样annotation folderJPEGImages/folder filenameleak_0001.jpg/filename size width1920/width height1080/height depth3/depth /size object nameleak/name bndbox xmin452/xmin ymin300/ymin xmax630/xmax ymax480/ymax /bndbox /object /annotationbndbox四种坐标都是像素级整数直接表示矩形框左上角和右下角。读取VOC标注时一定要从size字段拿图像宽高别拿一张固定尺寸去算所有图。我见过很多转换脚本因为忽略单个图像尺寸导致坐标全部偏移。2.3 YOLO格式的txt标注为什么是归一化坐标YOLO格式的每个标注文件对应一张图片文件名相同但后缀是txt。每行代表一个目标格式是class_id x_center y_center width height这些值必须归一化到0~1之间。比如上述框在1920x1080的图上转换结果应该是0 0.2818 0.3611 0.0927 0.1667计算公式是x_center (xmin xmax) / 2 / width y_center (ymin ymax) / 2 / height width (xmax - xmin) / width height (ymax - ymin) / height这里有一个容易懵的点YOLO格式里的class_id从0开始。如果你的类别列表是[leak]那leak就是0。如果你后续想扩展类别顺序必须统一否则标签就和类别名错位了。2.4 作者为什么同时给VOC和YOLO两份标注很多目标检测开源代码直接用YOLO格式训练的时候省去解析XML的步骤但调试和可视化时VOC格式更直观LabelImg、labelme这类工具也原生支持。双格式最大的价值是省掉了手动转换这个最容易出错的环节。我在自己项目里做过一次格式转换坐标算错、类别对不上、文件丢失各种问题折腾了两个晚上。所以看到现成的双格式数据集我的第一反应是作者是懂踩坑人的。3. 格式转换脚本与7z解压这些容易被忽略的细节3.1 数据校验拿到手先别急着训练无论你拿到的数据集是否已经提供YOLO格式我建议先做两个校验。第一用脚本比对VOC/Annotations下的xml文件和YOLO/labels下的txt文件是不是一一对应文件名前缀是否一致。第二抽样打开几张图片用OpenCV或PIL画框原图检查确认标签没有错位。这个检查在真实项目中比调参重要得多。一个简单的校验思路是遍历所有xml文件解析每张图的尺寸和标注坐标然后核对YOLO txt里归一化坐标乘回像素坐标后是否一致。开销不大但能发现很多隐藏问题。3.2 从VOC批量转YOLO格式的Python脚本如果你拿到的数据只有VOC或者想重新整理一份标签下面这个脚本可以直接改改用。它会把Annotations下的所有xml批量转成YOLO格式的txtimport xml.etree.ElementTree as ET from pathlib import Path voc_dir Path(VOC/Annotations) yolo_dir Path(YOLO/labels) class_names [leak] def convert_one(xml_file): tree ET.parse(xml_file) root tree.getroot() size root.find(size) img_w int(size.find(width).text) img_h int(size.find(height).text) lines [] for obj in root.iter(object): name obj.find(name).text.strip() if name not in class_names: continue cls_id class_names.index(name) box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) if xmax xmin or ymax ymin: continue x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) out_path yolo_dir / (xml_file.stem .txt) out_path.write_text(\n.join(lines)) for xml_file in voc_dir.glob(*.xml): convert_one(xml_file)脚本逻辑很简单解析XML读取图像宽高和每个目标的边界框按公式换算成归一化坐标写txt。唯一的坑是class_names顺序必须和后续训练配置文件保持一致。3.3 转换过程中最容易踩的坑基于我自己转格式的经验列几个高频问题坐标越界。部分标注框的xmax可能刚好等于图像宽度换算后是1.0这在YOLO格式里合法但不推荐很多增强操作会因此报错。建议把所有坐标clip到[0, 1]区间。空标注文件。如果某张图没有目标YOLO格式要求txt文件为空文件不能缺文件。少了文件训练时对应图片会被视为纯背景但有些框架行为不一致干脆保留空文件最稳妥。文件名不匹配。Windows下文件名大小写不敏感但Linux下敏感。如果图片叫Leak_0001.jpg标注叫leak_0001.xml在Linux上就会匹配失败。图片包含EXIF旋转信息。手机或无人机拍的照片可能带旋转信息如果预处理时没有矫正标注坐标会和实际内容错位。好在工业相机和无人机拍的照片一般不带自动旋转但二手数据很难说。这些坑都不是什么高深问题但每一个都能让你的训练过程变得莫名其妙。建议在任何公开数据集上训练之前都跑一遍完整性校验。4. 用YOLOv8在6633张泄漏图上训练检测模型4.1 环境安装与数据集配置文件当前这个时间点用Ultralytics YOLOv8训练目标检测模型是比较顺手的选择。安装很简单pip install ultralytics然后准备一个oil_leak.yaml告诉框架数据在哪、有几个类别、类别名是什么path: /home/user/oil_leak_data train: images/train val: images/val nc: 1 names: [leak]path可以用绝对路径也可以填数据集根目录的相对路径。注意train和val相对path来填。如果数据集里只有VOC和YOLO两个顶层目录你可以手动新建一个images目录把图片按train和val分好再把对应的txt放进去。4.2 划分训练集和验证集如果压缩包里已经带了train和val目录直接沿用即可。如果没有建议用固定随机种子划分保证实验可复现。我习惯用8:2的比例划分import random from pathlib import Path images list(Path(YOLO/images).glob(*.jpg)) random.Random(42).shuffle(images) split_idx int(len(images) * 0.8) train_imgs images[:split_idx] val_imgs images[split_idx:] # 然后创建目录并移动/复制图片和对应txt划分时最好保证同一场景的连续帧都进同一集合避免数据泄漏。泄漏检测的视频帧之间高度相似如果把相邻帧拆到训练和验证集合验证指标会虚高。4.3 训练参数选择与启动命令针对6633张图、单类别的任务模型不一定要很大。泄漏检测通常关注小目标我建议从yolov8s起步显存允许再试yolov8m。训练命令yolo detect train dataoil_leak.yaml modelyolov8s.pt epochs100 imgsz640 batch16 device0imgsz640是最稳的起点如果小目标很多可以尝试imgsz1280但显存和时间成本会明显增加。batch要结合显存调一般8GB显存跑yolov8s的batch16问题不大。epochs不用太少单类别收敛快但100轮能让你看完学习率曲线和过拟合趋势。训练过程中建议留意loss曲线和验证集指标不要在训练集loss降得很低就急着停。泄漏检测的难点是找全泄漏而不是在训练集上拟合所以每5轮用验证集测一次mAP50和召回率更可靠。4.4 评估指标怎么读YOLO训练结束会输出mAP50和mAP50-95。mAP50是IoU阈值0.5下的平均精度适合快速判断模型有没有学对目标mAP50-95把阈值从0.5到0.95平均更严格也更考验框的定位精度。对于泄漏检测我会优先看召回率。漏一次泄漏的代价远超误报几次所以在部署时可以把置信度阈值调低一些宁可多报几个怀疑区域让值班人员二次确认也不要漏掉真正的泄漏点。5. 石油泄漏检测从验证集到真实场景的落差与补救5.1 小目标泄漏和远距离监测怎么办实际巡检场景里泄漏区域经常不是画面主角。无人机飞在几十米高漏油点可能只占几十个像素用640的输入分辨率训练小目标的特征在深层特征图里几乎被抹掉。一个典型思路是做图像切块推理比如SAHISlicing Aided Hyper Inference把大图切成多个带重叠的小图分别推理再把结果拼回原图坐标。这种方案在通用小目标检测里已经证明有效用在泄漏检测上也合适。另一个思路是训练时就使用更高分辨率。如果你显存够把imgsz从640提高到1280对mAP50-95的提升往往很明显。代价是训练和推理时间变长部署时也要考虑边缘设备的算力。5.2 光照反光、油污干扰这些误判来源石油泄漏检测的真实场景比数据集里的干净图复杂很多。太阳反光、金属表面的油膜、旧油渍、管道阴影都可能被模型当成泄漏。这类误检很难靠调参彻底解决最有效的手段是收集现场难例加到训练集里重新微调。如果没有现场数据可以先写一个简单的后处理规则检测框在视频连续帧中出现的稳定程度、位置是否在管道或设备区域等都可以作为过滤条件。数据增强也能帮忙。除了常规的颜色抖动、随机翻转还可以针对性地做亮度扰动、加入高斯噪点、模拟油污纹理的MixUp。如果你用Ultralytics框架可以调节hsv_h、hsv_s、degrees这些增强参数但注意别增强过头把真实工业图中的颜色分布破坏掉。5.3 边缘设备部署与推理性能石油泄漏检测的部署环境通常在油田现场或无人机上数据传回云端不仅延迟高还可能涉及数据隐私问题。比较常见的是把模型导出成TensorRT engine或OpenVINO IR放到边缘盒子。Ultralytics支持一行导出yolo export modelbest.pt formatengine device0如果现场只有CPU可以先用formatopenvino导出推理速度比PyTorch直接跑快不少。泄漏检测对实时性的要求不像自动驾驶那么极端通常每秒处理几帧就能覆盖巡检需求所以FP16精度足够不必强行做INT8量化。6. 从这份数据集出发还能做哪些事6.1 数据清洗与标注质量复查单类别检测看起来简单但石油泄漏的标注质量参差不齐。泄漏区域没有固定边界标注员对“哪里算泄漏边缘”的判断会直接影响模型学习。我拿到数据集后习惯先用已训练的基础模型推理一遍训练集把置信度很低或很高的框挑出来人工复查。如果发现有框明显偏大、偏小或者把背景包进去回到LabelImg修正一下。这个过程可能枯燥但对最终精度的帮助比换模型结构更直接。6.2 从单类别检测升级到分割或细粒度分类矩形框对泄漏这种自然形态的目标并不友好泄漏区域往往是不规则流动的标注框里会混入大量非泄漏背景导致模型特征被污染。如果你的任务允许可以考虑用YOLOv8-seg做实例分割用掩码替代矩形框。分割模型虽然训练和推理更重但边界预测更准确后期做泄漏面积估算也方便得多。另外单类别数据集的标注信息有限如果业务需要区分“滴漏”“喷漏”“表面渗漏”那就得重新收集或补充标注。一个可行的路线是先用当前数据集训练检测模型把检测到的泄漏区域裁剪出来再用半自动方式做细粒度分类。6.3 结合无人机航拍和经纬度定位热词里经常出现无人机数据集和经纬度定位这在泄漏检测场景下很自然。无人机巡检拍到泄漏点后如果只是出一个检测框其实帮助有限更重要的是告诉运维人员泄漏发生在哪个经纬度。实现上可以在YOLO检测结果上做一个坐标映射检测框中心点像素坐标结合无人机GPS信息和相机内参转换成地理坐标。这个管线不复杂但需要标定和联调很多项目卡在误报太多导致坐标上报不可信。所以先把检测精度做扎实再接后端定位。最后说点个人体会。我拿到这类数据集后最先做的不是直接训练而是花时间把所有标注框过一遍。泄漏场景里“泄漏区域”和“非泄漏油污”的边界很容易模糊标注员手一抖框偏十几像素训练出来的模型在边界上就会飘。所以无论数据集名字写得多规整都要先清洗再训练。另外7z格式压缩比确实高但解压后要核对文件数别等到训练到一半才发现图片丢失。如果你正准备做石油泄漏检测我的建议是先跑通yolov8n的小模型把数据pipeline跑顺再做精度提升。与其一上来堆参数不如把数据整理清楚后者带来的收益往往更大。本文还有配套的精品资源点击获取