煤矸石识别数据集实战:102张现场图从COCO到YOLO训练避坑指南

发布时间:2026/10/11 20:44:35
煤矸石识别数据集实战:102张现场图从COCO到YOLO训练避坑指南 简介这份煤矸石识别数据集面向煤炭分选、矿物识别方向的算法开发者与高校研究人员可用于目标检测或图像分类模型的训练与验证帮助解决煤炭、煤矸石与高岭石三类目标在复杂现场环境下难以区分的问题。资源包共105个文件以102张现场采集的原始jpg图片为主体另附2个txt说明文件与1个json标注文件整体约2.27MB采用COCO JSON格式组织标注可直接对接主流检测框架的数据加载流程。图片均来自真实作业场景覆盖不同光照与堆叠状态便于检验模型泛化能力。目前已有426人学习下载适合作为小样本训练、标注格式转换与算法对比实验的基础数据也可用于扩充自建数据集或验证预处理与增强策略的效果。1. 煤矸石识别数据集102 张现场图能撑起一个可用模型吗去年冬天我在一个选煤厂做皮带异物检测的预研甲方张口就要“煤炭、煤矸石、高岭石三分类现场实时识别”。我第一反应是找公开数据集翻了一圈发现工业场景的煤矸石识别数据集少得可怜要么是实验室传送带摆拍要么是几百张合成图真正现场采集、带 COCO JSON 标注的更是稀缺。标题里这个数据集的价值就在这102 张现场采集原始图片标注了煤炭、煤矸石、高岭石三类COCO JSON 格式拿来就能直接喂给主流检测框架。它解决的不是“从零造数据”的问题而是“快速验证技术路线是否跑得通”的问题。适合两类人一是刚接手煤矸石分选项目、需要先跑 baseline 的算法工程师二是想评估现场图像质量、判断要不要自建采集流程的技术负责人。102 张不算多但现场图的分布、光照、遮挡、粉尘干扰比几千张实验室图更能暴露真实问题。2. 先看清数据COCO JSON 里到底存了什么2.1 现场采集图的三个隐性特征拿到一个煤矸石识别数据集别急着写 dataloader。先打开几张图看直方图和 EXIF现场采集原始图片通常有三个特征一是光照不均选煤厂皮带上方补光灯偏黄阴影区煤和矸石灰度接近二是粉尘和泥浆导致边缘模糊高岭石表面反光弱和暗色煤矸石容易混三是目标尺度差异大大块矸石可能占画面三分之一碎煤颗粒只有几十像素。这三点直接决定后面增强策略和 anchor 设置。102 张图如果按 8:1:1 切验证集只有 10 张指标波动会很大所以评估时不能只看 mAP要配合混淆矩阵看类别间误判。2.2 COCO JSON 的字段结构与读取验证COCO JSON 标准结构包含 images、annotations、categories 三个顶层键。现场采集数据集常见的问题是 categories 的 id 不连续或者 annotations 里 iscrowd 字段缺失。下面这段代码用来做完整性校验顺便统计每类实例数。import json from collections import Counter with open(coal_gangue_coco.json, r, encodingutf-8) as f: data json.load(f) # 校验顶层键 assert set(data.keys()) {images, annotations, categories}, 缺少 COCO 必需字段 # 类别映射 cat_map {c[id]: c[name] for c in data[categories]} print(类别:, cat_map) # 统计每类实例数 counter Counter() for ann in data[annotations]: counter[cat_map[ann[category_id]]] 1 print(实例分布:, dict(counter)) # 检查图片与标注对应关系 img_ids {img[id] for img in data[images]} ann_img_ids {ann[image_id] for ann in data[annotations]} print(无标注图片数:, len(img_ids - ann_img_ids)) print(标注指向不存在图片:, len(ann_img_ids - img_ids))逻辑说明先断言顶层键完整避免后续训练时报 KeyError再用 Counter 统计三类实例数如果某一类少于 30 个实例训练时该类召回率会明显偏低需要针对性过采样。参数上注意 category_id 不要求从 0 开始但很多框架内部会重映射所以读取后最好自己建一个 name 到 index 的字典不要直接拿原始 id 当类别索引。最后检查图片和标注的对应关系现场采集数据常出现标注文件里引用了已删除图片的情况不查出来训练中途会崩。2.3 可视化抽检别让标注错误拖垮训练102 张图人工过一遍是值得的。用 pycocotools 把框画出来重点看三类边界煤炭和煤矸石混叠处框是否重复、高岭石是否被漏标、小目标是否只标了部分。常见错误是标注员把整片煤流框成一个大框导致模型学到“整图即目标”。抽检时至少覆盖 20% 图片发现系统性错误就退回重标否则后面调参全是玄学。3. 从 COCO 到 YOLO格式转换与训练配置3.1 转换脚本与四个边界坑COCO 转 YOLO 格式是绕不开的一步。YOLO 要求每张图一个 txt每行class x_center y_center width height全部归一化到 0-1。下面脚本处理转换同时把类别名映射成连续索引。import json, os from PIL import Image with open(coal_gangue_coco.json, r, encodingutf-8) as f: data json.load(f) # 建立连续类别索引按 name 排序保证可复现 cats sorted(data[categories], keylambda x: x[name]) cat2idx {c[id]: i for i, c in enumerate(cats)} print(索引映射:, {c[name]: i for i, c in enumerate(cats)}) img_info {img[id]: img for img in data[images]} os.makedirs(labels, exist_okTrue) for ann in data[annotations]: info img_info[ann[image_id]] w, h info[width], info[height] x, y, bw, bh ann[bbox] # COCO 格式为左上角 x,y 加宽高 # 归一化并转为中心点格式 xc (x bw / 2) / w yc (y bh / 2) / h nw, nh bw / w, bh / h # 裁剪到 [0,1]防止标注越界 xc, yc min(max(xc, 0), 1), min(max(yc, 0), 1) nw, nh min(max(nw, 0), 1), min(max(nh, 0), 1) line f{cat2idx[ann[category_id]]} {xc:.6f} {yc:.6f} {nw:.6f} {nh:.6f}\n with open(flabels/{os.path.splitext(info[file_name])[0]}.txt, a) as f: f.write(line)逻辑说明COCO 的 bbox 是左上角坐标加宽高YOLO 要中心点加宽高转换时先加半宽半高再除以图像尺寸。四个边界坑一是标注越界现场图边缘目标常被截断不裁剪会导致归一化值大于 1训练时 loss 异常二是图片文件名带空格或中文YOLO 读取时会找不到建议统一重命名三是空标注图片要保留一个空 txt否则 YOLO 会当成背景图跳过四是类别索引必须连续原始 category_id 可能是 1、3、5直接拿来当索引会越界。3.2 小样本下的增强与训练参数102 张图训练检测模型增强是刚需。但工业现场图不能乱用翻转和色彩抖动水平翻转会改变皮带运行方向语义煤炭和煤矸石的相对位置有方向性色彩抖动过强会让高岭石的灰白色偏成煤的黑色。我一般用 Mosaic 加轻微 HSV 扰动HSV 的 h 增益控制在 0.015 以内s 和 v 控制在 0.4 以内。训练配置上输入尺寸设 640batch 设 8 或 16epoch 先跑 200 看收敛。学习率用余弦退火初始 0.01。因为样本少权重衰减设 0.0005防止过拟合。验证集只有 10 张左右每 10 个 epoch 存一次权重最后用混淆矩阵挑最佳而不是只看 mAP。3.3 用混淆矩阵定位类别混淆三类任务里煤炭和煤矸石的混淆最致命因为分选执行机构会把矸石当煤放过去。训练完导出验证集预测画 3x3 混淆矩阵。如果煤矸石被预测成煤炭的比例超过 15%优先检查标注里是否有把暗色矸石标成煤的情况其次看增强是否让两类纹理趋同。高岭石通常召回高但精确率低因为它的白色反光区域容易被误检成煤矸石边缘。针对高岭石可以在损失里给该类更高权重或者单独裁一批高岭石小图做二次分类。4. 避坑与排查现场数据训练的五个血泪教训4.1 验证集指标虚高上线就翻车现象验证集 mAP 到 0.85现场测试掉到 0.5。原因102 张图如果按随机切分同一时段、同一光照的图会同时进训练和验证造成数据泄漏。解决按采集时段或皮带批次切分确保验证集来自不同时段。如果图片文件名带时间戳直接按时间排序后切后 20%。4.2 粉尘区域被当成目标现象模型在无目标的空皮带区域输出大量低置信度框。原因现场粉尘和泥浆纹理与碎煤颗粒相似标注时未把纯粉尘区域标为背景。解决在训练集中加入 10 到 20 张纯背景图或者把置信度阈值从 0.25 提到 0.4同时用 NMS 的 IoU 阈值 0.5 过滤重叠框。4.3 高岭石漏标导致召回低现象高岭石召回只有 0.4精确率却很高。原因高岭石与煤矸石混在一起时标注员只标了煤矸石大框漏掉旁边的高岭石。解决重新抽检含高岭石的图片补标漏标实例训练时对高岭石类加 2 倍损失权重并在增强里减少对该类的裁剪。4.4 图片尺寸不一致导致训练报错现象dataloader 报尺寸不匹配。原因现场采集原始图片来自不同设备分辨率有 1920x1080 也有 1280x720。解决在转换脚本里统一读取 width 和 height 做归一化训练时用 letterbox 缩放到 640不要直接 resize 导致长宽比失真。4.5 类别不平衡让模型偏向煤炭现象煤炭精确率高煤矸石和高岭石召回低。原因煤炭实例数可能是其他两类的两倍以上。解决用加权采样器让每个 batch 里三类样本比例接近 1:1:1或者对少样本类做复制增强但复制后要加不同噪声避免完全重复。5. 小样本煤矸石识别的进阶技巧从 102 张到可用模型102 张现场图直接训练上限有限。我一般会走两步先在这个数据集上跑通 baseline确认流程无误再用它做预训练或伪标签起点去未标注的现场视频里抽帧。具体做法是用训练好的模型对抽帧图片推理置信度高于 0.7 的框作为伪标签人工只复核低置信度区域这样一轮能扩到 500 到 800 张。伪标签训练时学习率降到初始的十分之一防止噪声标签带偏。另一个技巧是切图推理现场大图里目标只占一小块把 1920x1080 切成 640x640 重叠 128 像素分别推理再合并小目标召回能提升 10 到 15 个百分点。验证时别只看 mAP按类别看 F1煤矸石的 F1 低于 0.7 就说明分选阈值还不能定。最后说个习惯每次改完增强或损失固定用同一批 10 张验证图跑一遍把预测框画出来肉眼比对比盯数字有用得多。这套流程我踩过不少坑希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询