简介液滴检测目标检测数据集是一份面向工业级流体监控与微观液滴分析的YOLO格式标注数据包适配主流目标检测框架适合目标检测算法研究者、工业视觉开发者以及农业、医药、医疗装备领域的技术人员使用。压缩包共2000个文件包含1918个YOLO格式txt标注文件对应训练集1342张、验证集576张的图片标注80张样例jpg图片、1个yaml配置文件及1份docx数据说明文档整体大小约17.26MB便于快速下载与部署。该数据集覆盖液滴单目标与多目标交互、重叠、飞溅、高速运动等复杂动态形态并兼顾不同光照、背景和拍摄角度边界框标注精确最小可识别至微小液滴。目前已有53人学习下载可用于喷涂质量检测、化学反应过程观测、植保无人机喷雾均匀性优化以及呼吸治疗雾化效果评估等场景帮助工程师快速完成模型训练与验证。1. 液滴检测为什么绕不开一张好数据集小目标、透明物体与标注分布的三重考验液滴检测在工业现场没有想象中那么“高大上”雾化喷头每秒喷出几十万个微米级液滴几乎没有人工肉眼去数的可能靠的就是目标检测模型把画面里的每个液滴找出来再换算成粒径分布和数量。液滴检测目标检测数据集.zip 这类资源解决的正是小目标、透明物体、运动模糊同时出现时模型“看不见”的问题。这个方向适合微流控芯片液滴分析、喷墨打印在线检测、喷雾粒径统计和表面润湿评估的从业者。如果你手头已经有采集视频或显微镜图像缺的是数据组织和训练流程这篇笔记就是冲这个来的。2. 拆开数据集的目录结构images、labels、split 三层决定训练上限拿到 zip 之后的第一件事不是解压直接训练而是先花半小时看目录布局。目标检测数据集最常见的组织方式是根目录下放 images、labels 和一个 dataset.yamltrain/val 划分要么在 images 下按子文件夹切要么用单独的 split 文件列出图像路径。先把目录结构摸清楚后面所有训练流程才不会反复改路径。2.1 目录检查与文件对应关系先确认图像和标签一一对应解压后先跑一遍完整性检查。很多数据在收集传输过程中会丢帧或漏标如果带着脏数据进训练模型不会报错只会默默把验证指标拉低。常见做法是写一段 shell 脚本同时统计图片数量和标签数量并找出没有对应 txt 的图像。unzip liquid_drop_detection_dataset.zip -d ./liquid_dataset cd ./liquid_dataset # 统计 images 与 labels 下的文件数量先确认对应关系是否完整 find images -name *.jpg -o -name *.png | wc -l find labels -name *.txt | wc -l # 找出图片存在但标签缺失的样本这类文件训练时会被 YOLO 静默跳过 for img in $(find images -type f); do base$(basename $img | sed s/\.[^.]*$//) [ ! -f labels/${base}.txt ] echo missing label: $img done这段逻辑很直白先解压到固定目录用 find 加 wc -l 看两侧文件数量差再用一个 for 循环把缺标签的图片名打印出来。实际数据集里最常见的坑是同一张图被复制了两份但只标了一份或者某个批次忘了标注这段脚本能直接定位到具体文件名。参数上只需要注意图片扩展名如果数据里混了 bmp、tif就在 find 的表达式里补上否则会把带扩展名的文件漏掉。这里顺带提一句目标检测常用标注工具LabelImg 和 X-AnyLabeling 输出的格式跟 YOLO 不完全一致前者导出的是 PASCAL VOC 的 XML后者能直接出 txt。如果数据集里既有 XML 又有 txt说明是多人协作标注的统一转换格式是训练前必做的一步。2.2 标注坐标的几何含义液滴的“准”是物理问题不只是像素问题YOLO 格式的 txt 每行是 class cx cy w h四个数值都是相对图片宽高的归一化比例。液滴检测的特殊之处在于边界定义液滴是透明曲面光照条件下边缘会有一圈高光人工标注时不同标注员对“哪里算边缘”的理解能差出 2 到 3 个像素。在 640×640 训练图里这个误差对应 0.004 到 0.005 的框偏移听着不大但对一个只有 30 像素宽的微液滴来说已经占到框宽的 10%。我一般会在训练前写脚本把所有标注的 w 和 h 单独统计分布如果框宽集中落在 0.02 到 0.05 区间就按小目标数据的策略来处理而不是用默认增强参数硬跑。另一个要留意的是长宽比微流控通道里的液滴常常被拉长框的宽高比会偏离 1 很多如果模型里 anchor 的默认长宽比覆盖不到收敛会明显变慢。2.3 标签初检类别不平衡与空标注文件怎么处理两类问题需要提前处理。第一类是类别分布极端不平衡液滴检测里可能“正常液滴”占了 99%而“卫星液滴”或“合并液滴”只有几十个样本模型训练完基本只认识大类。第二类是空 txt 文件大小为 0 的标注文件在 YOLO 训练中会被当作负样本背景图如果比例太高模型会倾向把画面大部分区域判为背景漏检率暴涨。import os from collections import Counter label_dir labels total_boxes Counter() empty_files 0 boxes_per_image [] for fn in os.listdir(label_dir): if not fn.endswith(.txt): continue with open(os.path.join(label_dir, fn)) as f: lines [ln.strip() for ln in f if ln.strip()] if not lines: empty_files 1 continue for ln in lines: cls int(ln.split()[0]) total_boxes[cls] 1 boxes_per_image.append(len(lines)) print(类别分布:, total_boxes) print(空标注文件数:, empty_files) print(平均每图目标数:, sum(boxes_per_image) / len(boxes_per_image))这段脚本遍历 labels 目录统计类别分布、空文件数量和每张图的平均目标数。逻辑上先按行读取 txt跳过空行再把每行的类别 ID 取出来计数。参数只改 label_dir 一个路径就够了输出的三个指标分别对应三个决策类别分布决定要不要做类别重加权空文件占比决定要不要剔除负样本平均目标数决定要不要用 mosaic 增强。如果空文件占比超过 10%优先怀疑收集时丢标了而不是真实负样本。3. 选模型与训练参数YOLOv8 是液滴场景的合理起点不是版本越新越好目标检测模型的版本迭代非常快从 yolov5 到 yolov8、yolov11最近社区里也在讨论 yolov26目标检测相关的内容。我的态度比较保守数据集规模在几千张量级、目标又是小尺寸液滴时YOLOv8 足够跑通全流程先把一套流程跑顺再根据瓶颈决定要不要换大模型。这一章按 yolov8训练自己的数据集的标准流程把选型理由和关键参数讲透。3.1 为什么不是一上来就追新版本液滴检测的瓶颈不在于模型容量不够而在于输入分辨率、标注精度和数据多样性。液滴目标通常只有几十像素模型的感受野对小目标天然不友好盲目换一个更大的 backbone 收益有限。新版本模型带来的收益更多体现在训练速度和部署生态上对液滴检测这种场景最优先的动作是提高输入分辨率而不是增大模型参数量。YOLOv8s 和 YOLOv11s 在液滴数据上的差异绝大多数时候小于“同模型下 imgsz 从 640 提到 1280”带来的提升。原因很简单模型容量解决的是特征提取能力但当目标的像素宽度从 20 变成 40 时模型能看到的细节翻倍这是容量无法替代的。另外小模型在工业部署上的延迟优势很明显产线相机每秒要处理 30 帧以上大模型再准也扛不住现场算力预算。3.2 三个影响收敛的关键参数imgsz、batch、epochs第一个参数是 imgsz液滴检测里最重要没有之一。工业相机拍的 1920×1080 原图如果直接缩到 640 训练液滴只有几个像素宽模型根本分不清液滴和噪点。常见做法是先统计标注框尺寸分布再决定用 1280 全图训练还是切块训练。切块就是把原图按 2×2 切成 960×540 的小块好处是保持目标相对尺寸不变坏处是跨块的目标会被切断需要额外处理。第二个参数是 batch直接受显卡显存约束。imgsz1280 时一张图在 16G 显存的卡上大概占 5 到 8Gbatch 设为 4 到 8 比较稳妥。这里有个常见误区batch 太小导致 BN 层统计不稳定模型收敛慢。如果显存有限优先降低 imgsz 而不是硬扛大 batch或者用梯度累积。第三个参数是 epochs液滴数据规模小300 轮起步比较常见。但不要闷头跑满配合 patience 早停才能避免过拟合。下面是一套可以直接跑的训练命令yolo detect train \ dataliquid.yaml \ modelyolov8s.pt \ imgsz1280 \ batch8 \ epochs300 \ patience50 \ cos_lrTrue \ close_mosaic10逐项说明参数含义data 指向第 2 章检查过的 liquid.yaml里面有 train/val 路径和类别数model 用官方预训练权重启动比从零训练快很多imgsz1280 是液滴场景的关键设定前面已经解释过了batch8 取决于显存可以先跑一次看显存占用再调epochs300 给足迭代空间patience50 表示连续 50 轮验证指标不提升就停止cos_lr 让学习率按余弦曲线衰减收敛更平滑close_mosaic10 的用途是最后 10 轮关闭 mosaic 增强因为 mosaic 生成的图像和真实分布有差异最后几轮去掉它能让模型回归正常分布。我一般会额外改两个默认增强参数关闭 scale 或者把 scale_limit 压到 0.1 以内同时把 hsv_h 调低到 0.01。原因后面第 4 章详细说这里先记住液滴是透明小目标大幅缩放和高饱和色相变化会让增强后的样本脱离物理真实。参数速查表如下参数建议值设置理由modelyolov8s.pt小模型起步显存和延迟友好imgsz1280保持液滴像素尺寸避免过度缩小batch4~8按 16G 显存估算优先稳定 BNepochs300配 patience50 防过拟合close_mosaic10末轮回归真实数据分布scale0.1 以内防止小目标增强后消失hsv_h0.01透明物体对色相变化不敏感3.3 训练过程看什么先看 P 和 R再看 mAP50-95训练日志里指标很多液滴检测场景下先看 Precision 和 Recall 的曲线再看 mAP50-95。液滴检测的漏检代价通常高于误检代价漏掉一个液滴意味着粒径统计少了一个样本而多框一个光斑可以通过后处理剔除。所以在训练阶段如果 P 和 R 只能保一个优先保 R后面可以通过提升置信度阈值把低分误检过滤掉。mAP50-95 这个指标对小目标特别苛刻因为 IoU 阈值高了以后标注的几个像素偏差就会导致分值大幅下降。如果 mAP50-95 在 0.3 以下但 mAP50 到了 0.8说明框定位精度不够优先回头查标注质量而不是换模型。4. 数据增强与小目标补充把液滴从“看不清”练到“认得出”小目标检测的增强策略跟通用目标检测有明显差异。通用场景里常见的操作是大幅度随机缩放、随机裁剪、颜色抖动这些在液滴数据上直接套用轻则无效重则把模型学歪。液滴是透明物体轮廓对比度低亮度受光源影响大增强的方向应该聚焦在“光照变化”和“运动模糊”上而不是几何变形。4.1 小目标检测的增强组合先把“看不清”变成“看不清但能认”液滴目标本身的像素量少随机缩放幅度一大目标就缩成几像素的亮点模型学到的是“亮点等于液滴”而不是液滴的轮廓特征。另一个常见误用是随机翻转液滴本身近似圆形水平翻转带来的信息增益接近于零反而可能把标注框和真实目标的对齐关系搞乱。适合液滴场景的增强组合是亮度对比度扰动模拟光源变化高斯模糊和运动模糊模拟快门时间偏长的情况小幅随机缩放和位移模拟液滴在不同通道位置的投影差异。这些增强的共同点是都在“保持目标可辨认”的前提下增加输入多样性不会把物理特征破坏掉。4.2 用 albumentations 写一套液滴专用增强管线YOLO 内置增强参数能覆盖大部分需求但我习惯在训练前用 albumentations 做一套离线增强把现场可能出现的干扰先注入到数据集里。下面这段代码处理的是单张图和对应标注import albumentations as A import cv2 # bbox 格式选择 yolo即 [cx, cy, w, h] 归一化 transform A.Compose([ A.HueSaturationValue(hue_shift_limit5, sat_shift_limit15, val_shift_limit15, p0.5), A.RandomBrightnessContrast(brightness_limit0.08, contrast_limit0.08, p0.5), A.GaussianBlur(blur_limit(3, 5), p0.3), A.MotionBlur(blur_limit5, p0.2), A.RandomScale(scale_limit(-0.1, 0.1), p0.5), ], bbox_paramsA.BboxParams(formatyolo, min_visibility0.4)) image cv2.imread(images/0001.jpg) with open(labels/0001.txt) as f: boxes [list(map(float, ln.strip().split()[1:])) for ln in f if ln.strip()] aug transform(imageimage, bboxesboxes)这段管线的设计逻辑是每个增强算子都对应一个真实场景。HueSaturationValue 和 RandomBrightnessContrast 模拟不同批次液滴在光源色温和强度上的差异GaussianBlur 和 MotionBlur 模拟相机对焦不准或液滴高速运动时的拖影RandomScale 的幅度被压到 ±0.1只做轻微尺度扰动防止小目标缩没。min_visibility0.4 的作用是如果增强后某个框被裁掉超过 60%直接丢弃这个框避免训练时出现残缺标注。参数上有几个值得注意的点brightness_limit 用 0.08 而不是默认的 0.2是因为液滴本体是透明的过大的亮度变化会让模型学到“高亮区域就是液滴”blur_limit(3,5) 保持小核高斯模糊大核模糊会把轮廓信息抹掉。这套管线跑一遍可以把数据量扩到原来的 3 到 5 倍注意增强后的图像和标签要写到新目录不要覆盖原始数据。4.3 合成数据与背景迁移把液滴贴到不同光照背景里真实采集数据最缺的是多样性尤其背景光照变化。常见做法是把液滴从原图中抠出来贴到不同的背景图像上生成合成样本。操作上要注意三点一是缩放时保持液滴直径与背景尺度的物理一致性比如背景是 50μm 尺度的微流控通道液滴就不能突然变成几百像素的大圆二是边缘要带羽化直接硬贴会在液滴周围留下一圈明显的高频轮廓模型学到的是“矩形边缘等于液滴”三是合成的类别分布要控制在合理范围合成样本占比别超过 30%否则模型会过拟合到合成模板上。合成数据的标注生成是自动的因为粘贴时记录了液滴在背景坐标系下的位置换算成 YOLO 格式直接写回 txt。这套流程能用少量真实样本扩展出数千张外加不同背景的训练图对提升现场泛化能力非常有效。4.4 光照归一化要不要做什么时候做很多液滴检测方案卡在光照上不同机台的光源角度、强度不一致同一模型在不同产线上表现差异很大。常见的两种做法是直方图均衡化和 CLAHE前者增强全局对比度后者在局部区域做对比度限制对液滴边缘的增强效果更好。但要注意CLAHE 会改变图像纹理细节如果用作训练增强部署时推理端也套同一套预处理否则训练和推理的数据分布不一致指标虚高上线翻车。我一般只在训练增强里加入 CLAHE推理端不开靠增强后的数据提升模型本身对光照的鲁棒性。5. 液滴训练避坑指南目标检测模型微调崩了、漏检翻车的 4 条血泪经验这个章节写的是我在液滴检测数据集上反复踩过的坑每一条都是真金白银换来的教训。目标检测模型微调崩了不一定是模型代码的问题绝大多数时候是数据和参数设置埋了雷。5.1 前 20 轮 loss 不降反升训练直接“微调崩了”现象加载预训练权重后前 20 轮训练 loss 波动剧烈不下降验证集的 P 和 R 一直在零附近抖动看起来就像模型完全没学到东西。原因最常见的是标注类别 ID 超出了 yaml 配置的 nc 范围。液滴数据集里类别编号从 0 开始如果某个 txt 里写了类别 2但 yaml 里 nc2这个样本会直接报错或跳过。第二个常见原因是前面第 2 章说的框偏移问题标注框和液滴实际位置偏差过大预训练权重微调时梯度方向被噪声主导。解决先跑第 2.3 小节的统计脚本把类别 ID 的最大值打出来跟 yaml 的 nc 对照。另一个快速定位方法是把异常样本的可视化结果画出来用以下命令把标注框直接画到图上yolo detect val \ modelyolov8s.pt \ dataliquid.yaml \ imgsz1280 \ save_jsonTrue跑完后看 runs/detect/val 目录里的标注可视化图框和液滴错位严重的样本会非常直观把这类样本挑出来重新标注或删除。5.2 验证集 mAP 很高换到现场相机直接打脸现象验证集 mAP50 到 0.92模型部署到产线摄像头后漏检率肉眼可见地高尤其是画面边缘的液滴几乎全丢。原因验证集用的是数据集原图分辨率是 1920×1080但部署相机可能输出的是裁剪后的 ROI 区域分辨率只有 800×600液滴在画面中的实际像素尺寸变小了。另一个原因是现场相机的快门时间短运动模糊比训练数据严重模型没见过这种模糊程度的样本。解决把验证集独立切一份抽出与部署相机同分辨率、同拍摄角度的样张作为“现场验证集”而不是复用训练时的 val 划分。同时在训练增强里把 MotionBlur 的概率从 0.2 提升到 0.4核大小从 5 提到 7让模型提前适应运动模糊。这是最简单也最容易被忽视的一步大部分指标虚高都是训练和推理数据分布不一致造成的。5.3 液滴粘连在一起模型把一个液滴漏成背景现象两个或多个液滴紧挨在一起时模型只输出一个框或者完全漏检统计出的液滴数量明显偏少。原因液滴间距小于框的大小时两个目标的 IoU 太高后处理 NMS 阶段把置信度较低的那个框合并掉了。另外一个深层原因是标注的时候粘连液滴的边界就不清晰标注员可能只标了一个框模型学到的就是“这地方只有一个液滴”。解决推理阶段把 NMS 的 IoU 阈值从默认的 0.45 调低到 0.35 或 0.3让相邻框更容易被保留。同时回查标注数据把明显漏标的粘连样本补上。如果粘连情况特别多建议把原始标注格式从水平框换成旋转框但 YOLO 原生不直接支持旋转框需要借助 mmrotate这个思路适合液滴排列方向固定的微流控场景。5.4 背景反光被当成液滴高光下误检一堆现象训练集里液滴大多在暗背景上拍摄测试时换到亮背景或有不锈钢反光的环境模型把反光光斑当成液滴误检数量大幅上升。原因模型学到的特征更偏向亮度和对比度而不是液滴的轮廓形状。训练数据里液滴亮度方差大、背景亮度方差小的分布让模型走了一条捷径高亮圆形区域就是液滴。反光光斑和液滴在灰度图上高度相似模型无法区分。解决这类问题靠调参解决不了只能加数据。把反光背景的负样本图片里没有任何液滴但包含大量光斑加进训练集YOLO 会把它们当作背景样本模型被迫学习液滴与光斑的差异。同时可以在增强里加 CLAHE把局部对比度归一化降低整体光照差异对特征提取的影响。负样本数量不用多占比 10% 到 15% 就能明显压住误检。6. 推理端的置信度校准与 TTA从模型输出到工艺参数训练完成只是开始真正到现场要的是可靠的数量和粒径分布。推理阶段有两个细节决定最终效果一个是置信度阈值一个是 TTA测试时增强。置信度阈值不要直接用验证集跑出来的默认值。液滴检测里漏检和误检的代价不对等漏掉一个液滴粒径分布就少一个样本多一个误检后处理还能滤掉。所以推理时把置信度从 0.25 下调到 0.15牺牲一点精度换召回输出更多候选框再用面积和圆度过滤。具体调多少可以拿一段现场视频测完精度和召回率后按业务需求定。TTA 的开启很简单predict 命令加一个参数yolo detect predict \ modelruns/detect/train/weights/best.pt \ source./test_videos \ conf0.15 \ iou0.35 \ augmentTrue \ imgsz1280 \ save_txtTrue参数说明conf0.15 和 iou0.35 的依据在前面避坑章节讲过一个保召回一个保粘连目标不合并。augmentTrue 会让模型对每帧图像做多尺度推理并融合结果对小目标检测通常能带来 1 到 3 个点的 mAP 提升代价是推理速度变成原来的 3 到 5 倍适合离线分析场景。save_txtTrue 把结果写成 YOLO 格式的 txt后续统计粒径分布直接读这些文件。TTA 的另一个用途是验证模型稳定性同一帧图跑 5 次 TTA如果输出的框数量和坐标波动大说明模型对输入噪声敏感需要回头补增强或标注修正而不是急着上线。最后说我个人的一个习惯部署目录下永远留一份“模型卡”记录训练数据来源、imgsz、增强参数、置信度阈值和已知失效场景。液滴检测这类项目过两个月再回头调光靠记忆肯定会忘记当时为什么把 brightness_limit 设为 0.08为什么把 NMS 调到 0.35。写清楚这些边界条件比保存十个版本的权重文件有用得多。这套从数据集检查到推理校准的流程是我做液滴检测项目固定的起点希望帮到你。本文还有配套的精品资源点击获取
