ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

液滴检测数据集实战:YOLO格式转换与小目标训练优化

液滴检测数据集实战:YOLO格式转换与小目标训练优化 简介这是一份面向液滴检测场景的目标检测数据集适用于工业流体监测、化学实验分析、农业喷雾优化及医疗雾化设备研发等方向的技术人员与算法工程师。数据集中共包含1,918张工业级图像其中训练集1,342张、验证集576张类别为Droplet液滴全部采用YOLO格式标注归一化中心坐标与边界框尺寸可直接用于yolov5/yolov8/yolov12等主流框架训练。压缩包内共2000个文件以txt标注文件为主1918个另含80张jpg原图、1个yaml配置文件和1份docx说明文档整体约17.26MB便于快速下载与解压。数据覆盖液滴聚合、飞溅、重叠、高速运动等复杂状态并包含不同光照、背景及拍摄角度可有效提升动态检测场景下的模型泛化能力。目前已有54人学习下载适合需要快速构建液体颗粒识别模型的开发者和研究者直接使用。1. 液滴检测目标检测数据集先搞懂它到底难在哪做液滴检测的人都有个共识液滴检测目标检测数据集这类资源稀缺程度远超人脸和车辆数据集。原因很简单——液滴是半透明的高速相机拍出来的液滴边界往往是一圈干涉亮带而不是实体轮廓尺寸又小一颗 50 微米的微流控液滴在 1280 分辨率的图像里可能只占十几个像素背景还不干净通道壁、折射光斑、残留液膜全都长得像液滴。这套数据集的价值就是把最难啃的采集和标注环节替你省掉了让你直接拿到一套带标注的图像把精力集中在检测模型的训练和调参上。它适合微流控、喷墨打印、喷雾特性测量、液液萃取这类做视觉检测的工程师和研究者。拿到手第一件事不是急着训练而是先把标注格式、坐标体系和标签边界摸清楚。2. 拆开 zip 看门道液滴数据集的目录结构、标注格式和标签设计2.1 解压后的标准布局images 和 labels 的命名如何对应这套液滴检测数据集解压后最常见的目录组织是训练集、验证集和测试集三张皮每张皮下面再分 images 和 labels。一个典型布局长这样liquid_droplet_dataset/ ├── images/ │ ├── train/ │ │ ├── 0001.jpg │ │ ├── 0002.jpg │ └── val/ ├── labels/ │ ├── train/ │ │ ├── 0001.txt │ │ ├── 0002.txt │ └── val/ ├── test/ └── data.yaml命名对应关系是硬性的0001.jpg和0001.txt文件名必须一致后缀不同。标注工具LabelImg、X-AnyLabeling 或 Roboflow 导出生成时一般会自动对应但如果有人手动整理过文件很容易出现图片有、标注缺失的情况。我在接手任何数据集时第一件事永远是跑一遍脚本核对缺失和多余文件对而不是直接开训。这个习惯帮我至少省过两次苦等三小时训练后才发现切图漏了标注的尴尬。需要注意test目录里往往只有 images没有 labels。CT 影像、工业视觉这类数据集通常都是这样——test 集的标注由评测方保留。如果你想自己评估可以从 train 里切一部分出来当 test或者干脆用 val 集做最终指标。这里还有个细节有些液滴数据集的标注是相对整张原图的矩形框有些则是多边形分割的 mask 转出的框两者在透明液滴上差异不小后面章节会细说。2.2 标注字段解读bbox、面积和关键点用什么坐标系不管是 COCO 格式的 JSON 还是 YOLO 格式的 txt液滴检测数据集里每个目标对象通常包含几个核心字段。拿 COCO JSON 片段为例{ id: 3, image_id: 17, category_id: 1, bbox: [482.5, 213.0, 36.2, 38.7], area: 1400.9, iscrowd: 0, segmentation: [] }我一般这样理解这些字段bbox是[x, y, width, height]坐标系原点在图片左上角单位是像素。液滴检测里这个框有个特殊问题——因为液滴是椭圆或近圆形水平矩形框必然包含四角背景area一定偏大。用这个框训练没问题但如果你的评估指标是 IoU矩形框和真实液滴轮廓之间的差异会直接压低分数。iscrowd为 0 表示该目标不是密集人群那种无法分清的群体液滴检测中这个字段通常全为 0但密集液滴群会让 NMS 阶段出问题这点后面避坑章展开。YOLO txt 格式则是另一套0 0.62109375 0.31250000 0.02828125 0.03023438这里 5 个数分别是class_id, x_center, y_center, width, height全部对图片宽高做了归一化取值在 0 到 1 之间。转换时最容易翻车的一步就是用bbox[2] / image_width算框宽却忘记原图已经 resize 过。2.3 标签体系怎么设计一类到底还是多类细分液滴检测数据集的标签设计常见做法有两种。一种是只设一个droplet类别专注做“有没有液滴、在哪”通常是给在线监控或液滴计数用的。另一种是拆分多类normal_droplet主液滴、satellite_droplet卫星小液滴、bubble气泡、impurity杂质。气泡和杂质在图像上确实很像液滴但物理意义完全不同——气泡是光亮的圆形边缘有强反射杂质通常是不规则暗斑。对微流控芯片的液滴生成稳定性检测来说多类细分能直接统计卫星液滴占比这是判断两相流是否稳定的关键指标。我实际踩过的坑是类别设多了每类样本量不够模型在小类上疯狂漏检。液滴数据集的标注者有时会把气泡和液滴混标。如果你拿到的数据是单类droplet且图像里确实存在气泡我的建议是宁可所有圆形目标都算液滴也别费力去拆——因为拆错类比不拆更糟。你可以在训练后通过尺寸阈值和后处理把气泡滤掉而不是在标注层面较劲。3. 转到 YOLO 格式JSON 转 txt 的转换脚本和四条边界规则3.1 JSON 标注怎么转成 YOLO 训练能吃的 txt现在用 YOLOv8 或 YOLOv11 训练自己的数据集第一步就是把 COCO JSON 转成 YOLO txt。这个转换脚本我几乎每次都会被问到核心逻辑不复杂但边界条件多。下面是我常用的一个最小可用版本import json import os from PIL import Image # 统计原图宽高注意不是用 JSON 里的宽高直接算 # 因为某些数据集作者会在导出时把图压缩过 def get_image_size(img_path): with Image.open(img_path) as img: return img.size # (width, height) def coco_to_yolo(coco_json, image_root, label_root): with open(coco_json, r, encodingutf-8) as f: data json.load(f) # 先建立 image_id 到文件名的映射 img_id_to_name {img[id]: img[file_name] for img in data[images]} # 再建立 category_id 到类序号的映射注意保持和为 0 cat_id_to_cls {cat[id]: idx for idx, cat in enumerate(data[categories])} # 把每个 image 的标注归组 anns_by_img {} for ann in data[annotations]: img_id ann[image_id] anns_by_img.setdefault(img_id, []).append(ann) for img_id, anns in anns_by_img.items(): img_name img_id_to_name[img_id] img_path os.path.join(image_root, img_name) w, h get_image_size(img_path) # 同名的 txt 写到 labels 目录 label_name os.path.splitext(img_name)[0] .txt label_path os.path.join(label_root, label_name) with open(label_path, w, encodingutf-8) as out: for ann in anns: if ann[iscrowd] 1: continue # crowd 样本直接跳过 cls cat_id_to_cls[ann[category_id]] x, y, bw, bh ann[bbox] # COCO 的 (x,y) 是左上角需要换成中心点 cx (x bw / 2) / w cy (y bh / 2) / h nw bw / w nh bh / h # 四条边界钳制防止坐标略超 0~1 导致训练异常 cx min(max(cx, 0.0), 1.0) cy min(max(cy, 0.0), 1.0) nw min(max(nw, 0.0), 1.0) nh min(max(nh, 0.0), 1.0) out.write(f{cls} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}\n) print(转换完成注意核对 classes.txt 顺序)这个脚本的关键点有两个。第一原图宽高必须通过PIL实时读取不能用 JSON 里的width和height字段。液滴数据集里的图像经常是多分辨率混合的——有的来自高速相机全幅输出有的来自裁剪区域JSON 里的原始尺寸大概率和你实际拿到的图像不一致。第二坐标钳制到 [0,1] 很重要。透明液滴的标注有时手滑会给出略微越界的框YOLO 在计算 loss 时对越界坐标的惩罚方式比较奇怪轻则 loss 抖动重则完全发散。四行min/max就能挡住这种低级事故。3.2 转换时的四条边界坑圆框、小目标、空 txt、比例失衡第一个坑是“圆形液滴转矩形框后框面积虚高”。前面说过液滴接近椭圆水平框四角带入背景虽然没法完全避免但转换时我至少会检查一下nw和nh的比例。如果液滴框宽高比超过 2:1多半是标注时把两个挨着的液滴标成了一个框这种情况要在转换阶段就把标注拆分或剔除否则 YOLO 的 anchor 匹配会非常难受。第二个坑是小目标归一化后数值太小。一个 12×10 像素的卫星液滴在 1920×1080 的图像里nw只有 0.00625。保存成 txt 时如果用round保留三位小数精度直接丢了一倍。脚本里我用.6f保留六位就是为了保住小目标的坐标精度。同样的道理验证阶段画框时不要随便做坐标取整否则可视化出来框全偏了一两个像素。第三个坑是空 txt 文件。有一些液滴图像背景干净确实没有目标。转换脚本会生成零字节的 txt这在 YOLO 训练里是合法的但很多新手把空文件当成异常删了导致图像和标注对不上。你有两个选择保留空文件或者在data.yaml里给训练器传一个过滤参数。至少要做到“有图无 txt”和“有 txt 无图”在训练前清点干净。第四个坑是类别 id 映射错位。COCO 的category_id往往从 1 开始且不连续而 YOLO 的类别序号必须从 0 开始连续。如果你的数据集里 categories 是{液滴: 2, 气泡: 5}在cat_id_to_cls里不做重映射YOLO 会把所有样本按 id 原样写进 txt出现类别 2 却只有 0 和 1 两类的情况。训练不报错但 mAP 的每一行都会错位。3.3 data.yaml 的正确写法和半透明类别下的先验 anchor 设置转完 txt下一步是准备data.yaml。液滴数据集这个文件容易写错的地方是路径基准。我用相对路径的标准写法# data.yaml path: ../liquid_droplet_dataset # 数据集根目录相对于当前运行的 workspace train: images/train val: images/val # test: images/test # 没有标注先注释掉 names: 0: droplet # 1: bubble # 2: satellitepath字段是 YOLOv8 风味的新参数它指定数据集的根目录训练时直接用train: images/train这种相对路径。很多老教程还在写train: ../liquid_droplet_dataset/images/train配合path一起用会拼出重复路径。另一点是nc类别数不需要手写YOLOv8 会根据names自动推导。我自己习惯在训练前先跑一下yolo detect val modelyolov8n.pt datadata.yaml做空转验证确认路径能被正确解析而不是等到训练报错才发现路径拼错。至于 anchor 设置YOLOv8 已经改成 anchor-free 的 Decoupled Head不再需要手工指定先验框尺寸。这是它相比 YOLOv3 的一大进步因为液滴的宽高比变化其实很小多数接近 1:1anchor-free 天然适合这种近圆形目标。如果你用的是 YOLOv5 这类 anchor-based 模型记得跑一下自动聚类kmeans_anchors不要用默认的 COCO 80 类 anchor——那组锚框对行人、汽车、自行车调过参用在微小的液滴上会让小目标匹配率偏低。4. 用 YOLOv8 / YOLOv11 训练液滴检测环境、命令和三个必调参数4.1 环境配置零基础步骤ultralytics 安装和显卡选择热词里提到“yolov11(ultralytics)环境配置适合 0 基础纯小白”这里给一套最省心的路径。Ultralytics 的安装非常简单conda create -n droplet python3.10 -y conda activate droplet pip install ultralytics pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121ultralytics包里已经包含yolo命令和模型权重下载逻辑。显卡注意一点液滴数据集的图像分辨率高、目标小显存小6G 以下的卡建议先用yolov8n而不是直接上yolov8x。如果报 CUDA out of memory把batch减半不要先动imgsz。实在没有独显CPU 也能训只是慢三到五倍务必把devicecpu显式传进去否则它会反复尝试调用不存在的 CUDA。4.2 最小训练命令和 data.yaml 的配合转到 YOLO 格式并写好后训练命令其实只有一行yolo detect train \ modelyolov8n.pt \ datadata.yaml \ imgsz640 \ batch16 \ epochs100 \ device0 \ project./runs \ namedroplet_v8n这是我的起步配置几个参数说明如下。modelyolov8n.pt意味着加载 ImageNet 预训练权重做迁移学习不是从零训练——对液滴这种小样本数据集从头训练基本等于自杀。imgsz640是 YOLO 的默认输入尺寸但对液滴来说 640 可能太小下文单独展开。epochs100看起来够用实际要看 loss 曲线经常是跑了 80 轮才见分晓。project和name决定了输出目录训练完的权重在runs/droplet_v8n/weights/best.pt。训练一旦开始不要干等。我习惯开第二个终端跑nvidia-smi -l 2看显存占用如果显存恒定在 90% 以上但没有报错就是健康的。如果吃了 40% 就卡住不动多半是 dataloader 出了问题——检查图像的通道数和后缀名液滴数据集的图像若是 16 位 PNG 或 TIFFYOLO 的默认加载器读不了必须先转 8 位 RGB。4.3 图像分辨率和推理尺寸小液滴要不要上 1280液滴检测最大的参数纠结就是imgsz。物体检测有个规律目标框像素面积小于输入图像的 0.5% 时下采样几轮后特征基本就没了。YOLOv8 在 640 输入下最后一次下采样是 32 倍特征图上 1 个像素对应原图 32×32。一颗 16×16 像素的液滴在下采样后只有 0.5×0.5 像素基本只剩一个响应点。我一般建议这样做实验先看数据集中标注框尺寸的直方图用标注文件里的面积做统计。如果超过 30% 的目标小于 32×32 像素直接上imgsz1280。训练命令改成yolo detect train \ modelyolov8n.pt \ datadata.yaml \ imgsz1280 \ batch8 \ epochs100 \ device0 \ project./runs \ namedroplet_v8n_1280注意 batch 从 16 降到 8因为 1280×1280 的输入显存占用是 640 的四倍。这对小目标非常有效代价是训练和推理都慢不少。预算不够的话折中方案是训练用 1280推理用 960实测在小液滴上召回率能提升 10 到 15 个点。如果你用的是 YOLOv11imgsz这个参数的行为和 v8 完全一致可以直接替换模型名。4.4 增强策略Mosaic 和 HSV 增强如何毁掉透明液滴YOLO 默认开启 Mosaic 数据增强把四张图拼一张。这个增强对通用目标检测很好但对液滴数据集是双刃剑。液滴是半透明的Mosaic 拼接时不同图像的光照条件、背景灰度差异巨大拼在一起的合成图会让模型学到“边缘高亮 液滴”而不是“圆形轮廓 液滴”。我自己的经验是当训练集只有几百张液滴图时Mosaic 增强可以留但要在hyp.yaml里把mosaic从默认 1.0 降到 0.5mixup从默认 0.0 提到 0.2 也要谨慎透明目标经不起线性叠加。HSV 增强更危险。默认hsv_h: 0.015, hsv_s: 0.7, hsv_v: 0.4图像色相微调问题不大但饱和度这样大幅变化会让原本几乎透明的液滴和背景的灰度差被压缩液滴直接被“增强没了”。做液滴检测我的建议是把hsv_v降到 0.1 以下hsv_s降到 0.3 左右。你可以在备份后用自己的图像做一轮增强预览肉眼能看出液滴边界的灰度对比度掉得很厉害那就要把 HSV 参数再调保守。4.5 训练后看什么mAP50 和 mAP50-95 对液滴检测的意义训练结束results.csv里一堆指标。对液滴检测我只看三个数。第一个是mAP50IoU 阈值 0.5 下的平均精度——液滴框本身就不准矩形框包含背景mAP50-95从 0.5 到 0.95 每挡算平均对矩形框和圆轮廓的差异极度敏感一个 40 像素的液滴框 IoU 到 0.7 就顶天了。所以液滴检测如果 mAP50 能到 0.9mAP50-95 只有 0.6不一定是模型差而是标注形式本身的度量天花板。另一个要看的指标是per-class的召回率多类别数据里卫星液滴的召回率通常比主液滴低 20 个点这直接说明小目标还没学好。5. 液滴检测避坑五个高频问题的现象、原因和解决路径5.1 训练 mAP 很高验证集却大面积漏检现象训练集 mAP 到 0.95验证集 mAP 只有 0.6可视化验证集图片发现漏检集中在某些特定帧。原因液滴数据集常有很强的背景一致性——微流控芯片的同一块区域反复出现模型学会了“这个位置有液滴”而不是“液滴长这样”。这是一种过拟合却不像经典过拟合那样体现在 loss 曲线上。解决把验证集换成和训练集完全不同的实验工况比如把不同通道结构、不同光照下的图像单独抽出来验证。如果条件允许用交叉验证方式按实验轮次划分数据而不是随机切分。我后来都是按“实验编号”分数据而不是按“帧号”分这样做出来的指标才有说服力。5.2 密集液滴互相重叠NMS 之后框被吞掉现象一张图里有几十个紧挨着的液滴推理结果显示只剩零星几个置信度不低但框大量缺失。原因NMS非极大值抑制的默认 IoU 阈值在 0.5 左右。密集液滴的框互相交叠大量超过 0.5NMS 会认为它们是同一个目标直接抑制掉置信度稍低的框。解决把预测时的 IoU 阈值调低到 0.3 或 0.2。这个参数在predict阶段的iou0.3传入。注意它只在推理时生效训练时的 NMS 用于计算 loss通常不动。如果调低后出现同一液滴被重复框出的情况说明阈值调过头回到 0.4 附近。5.3 液滴肉眼清晰可见置信度却只有 0.2现象模型把明显的液滴框出来了但置信度上不去看起来像“不自信”。原因半透明目标的边界本来就不是硬边训练时标注框和实际轮廓之间的差异被模型当作不确定性学到了。另一个可能是背景里有大量类似液滴的圆形光斑模型无法区分仅凭视觉信息可信的目标和背景杂散光。解决先检查是否在增强参数里把 HSV 调得太激进导致训练图像和推理图像风格不一致。如果增强没问题则尝试调整决策阈值——预测时conf0.1代替默认 0.25硬性接受低置信度框再通过后处理按尺寸过滤。液滴检测要的是“宁可多框不可漏检”的场景置信度低不是罪。5.4 液滴边缘有一圈亮带标注偏移导致 mAP 上不去现象可视化预测框总是紧贴亮带外沿比肉眼看的液滴实体大一整圈。原因标注者在透明液滴上对标框的标准不统一。有人按液滴实体边界标注有人把干涉亮带也包进去了。这两者的差异在 40 像素的液滴上能有 5 到 8 个像素IoU 直接被拉到 0.7 以下。解决统一标注口径——看液滴中心暗区到亮带内沿不要框到亮带外侧。如果你要批量修正已有标注写一个脚本对所有标注框按比例缩小 10% 到 15%。这个粗暴调整不一定完美但比模型自己去学两种边界快得多。5.5 转好的 txt 里有越界坐标训练 loss 直接 NaN现象训练刚开始 loss 就出现 NaN或者第一个 epoch 结束后验证集预测框全在原图外面。原因转换脚本没做坐标钳制或者标框本身超了图像边界。COCO 的 bbox 偶尔会因标注工具精度问题给出负坐标或超出宽高的值。解决用脚本扫一遍 label 目录找出所有小于 0 或大于 1 的坐标值把对应图片拉出来人工看一眼再决定修或不修。只修坐标不换图像的方案是缩放钳制但这个只能应急要根治还是得看标注原图有没有框错。6. 从公开数据集到自己的实验微调、伪标注和热力图验证6.1 用公开液滴数据做预训练冻结骨干先跑通拿到自己的液滴图像之后不要直接拿 COCO 预训练权重从头训。正确的迁移顺序是先在公开液滴数据集上做一轮完整训练得到best.pt再在自己的小样本数据上微调。微调时前几个 epoch 冻结骨干backbone只训检测头这样能避免小数据集把骨干的通用特征破坏掉。Ultralytics 没有内置冻结参数的命令行开关需要改训练脚本或者在data.yaml里配置freeze层数。常见做法是freeze10冻结前十个模块。6.2 用训练好的模型做伪标注扩自己的数据集自己采集的液滴图像往往只有几百张不够训练手动标注又太慢。我常用一条捷径用公开数据集训出的模型对自己的图像做推理生成初步标注再人工修。YOLOv8 推理时带save_txt参数可以直接输出 YOLO 格式的标签文件yolo detect predict \ model./runs/droplet_v8n_1280/weights/best.pt \ source./my_raw_frames \ save_txtTrue \ conf0.1 \ iou0.3注意conf特意调低到 0.1让模型尽量多猜而不是少猜。伪标注修起来比从零画框省力得多尤其对密集液滴场景框都给你了你只需要删掉多余的、把偏移的微调一下。有条件的还能用“开放词汇目标检测”这类方案辅助修正漏检但我一般先保证基础标注质量再谈花活。6.3 用特征热力图验证模型到底在看什么热词里有一条叫“目标检测特征图和热力图”这对液滴检测是很好的验证手段。训练结束后把验证集里漏检严重的图挑出来跑一次梯度加权热力图能直观看到模型把注意力放在液滴上还是放在了通道壁的纹理上。YOLOv8 可以用钩子抓取最后一层卷积的特征图输出绘制成热力图叠加在原图上。如果热力图的亮区集中在液滴边缘的亮带而不是液滴内部基本可以断定模型把“高亮环”当成了检测依据这时候就要回到标注口径和增强策略去修正。最后说一个我自己的教训一开始拿到液滴检测数据集时我急着用默认参数跑了个 YOLOv8s结果在小液滴上的召回率惨不忍睹当时第一反应是数据集质量问题。熬了两天之后老老实实回去看标注尺寸分布、把imgsz提到 1280、调低增强强度才真正跑出稳定结果。数据集质量可以怀疑但先复查自己的流程更高效。希望帮到你。本文还有配套的精品资源点击获取
返回列表