尧图精选

岩石矿物检测数据集:超1000张YOLO标注图,让目标检测训练少走弯路

🕒 发布时间:2026/10/1 17:27:36 📁 来源:尧图网络
简介一份面向地质学、矿业工程与计算机视觉研究者的目标检测数据集——岩石表面矿物质检测数据集内含861张岩石表面jpg图像及对应1138个txt标注文件已按YOLO格式完成预处理并做数据增广可直接用于YOLO系列网络训练省去格式转换环节数据集划分了训练集与验证集附class类别文件并配有show.py脚本可将检测框绘制到原图上便于调试和评估模型。整体压缩包共2000个文件大小约59.08MB除图像与标签外另含1个Python可视化脚本txt记录类别与边界框坐标jpg为高分辨率岩面图像py用于结果展示。类别覆盖石英、斑铜矿、黄铁矿等8种常见矿物标签清晰、结构规范能直接支撑矿物识别与定位实验。目前已有455人浏览学习适合需要快速获取标注矿样数据、训练目标检测模型或验证算法性能的工程师与研究者。1. 岩石表面矿物质检测数据集超过 1000 张图和标签拿到手就能训 YOLO如果你是做地质、矿业或者材料视觉方向的人可能体会过这种滋味想训一个矿物识别模型第一件事不是调参而是到处找带标注的图片。公共数据集不是缺岩石类样本就是几十张图只够当 demo 用根本扛不住训练。这份岩石表面矿物质检测数据集超过 1000 张图片和标签针对岩石表面场景收集。图片不是原始堆砌而是已经处理成 YOLO 格式也就是每个标注框和类别都写在同名 txt 文件里数据集本身也划分好了训练集和验证集并包含了 class 类别文件。对新手来说最容易卡住的数据预处理环节已经被跨过了一大半对熟手来说这份数据可以直接拿来当训练基准或者做迁移学习的起点适配 YOLO 全系列网络。它适合两类人一类是刚接触目标检测想用现成数据完整走一遍训练流程的同学另一类是矿物、地质检测方向的研究者想快速验证 YOLO 在不规则纹理目标上的效果。整份资源的核心价值就一句话——省去从零整理的脏活把时间留给模型和数据本身。2. 从压缩包到可训练数据读懂文件构成与 YOLO 标签格式拿到数据集后第一件事不是急着训练而是先把文件结构和标签格式摸清楚。很多翻车事故都发生在这一层路径配错、标签没对上、图片和 txt 编码不一致后面所有训练结论全部作废。这一章先把格式讲透。2.1 目录结构与文件分布解压后你看到的文件名长这样0011_jpg.rf.7a7655516b6ade13a199ad135383cba7.jpg 0011_jpg.rf.7a7655516b6ade13a199ad135383cba7.txt 0070_jpg.rf.16ee84cd49c4df36a32a40a4f9c98b9e.jpg 0070_jpg.rf.16ee84cd49c4df36a32a40a4f9c98b9e.txt注意图片和标签是同名文件只是扩展名不同。文件名中间那串哈希字符是标注工具生成时留下的唯一编号不需要关心它的含义只要保证一对图片和 txt 的名字完全一致就行。这个数据集默认采用 Roboflow 系的数据组织方式常见的目录结构是 images 与 labels 分开存放外加 train.txt、valid.txt、class.txt 这类索引和类别文件。# 解压后先统计图片和标签是否一一对应 unzip rock_mineral_dataset.zip -d rock_mineral cd rock_mineral find . -name *.jpg | wc -l find . -name *.txt | wc -l # 输出两个数字正常情况下应该完全相等如果图片数大于标签数说明存在漏标注的图片如果标签数大于图片数说明有残留的无效 txt建议单独建一个文件夹存起来避免混入训练集。我一般会顺手跑一个脚本把只有图没有 txt 的文件挑出来单独备份而不是直接删万一后面要对齐验证集还要回头查。2.2 标签坐标归一化后的四个字段YOLO 格式的每个 txt 文件里每行对应一个目标行内是用空格分隔的五个数字class x_center y_center width height举例来说某一行长这样3 0.6145 0.5521 0.1720 0.2253第一个数字 3 是类别 id从 0 开始计数对应 class.txt 里的第 4 行。后四个数字分别表示目标中心点的 x 坐标、y 坐标、框的宽度、框的高度并且全部做了归一化处理——分子是像素坐标除以图片的宽或高所以值域在 0 到 1 之间。这样做的好处是无论图片分辨率是 640 还是 4000标签都不受影响模型输入尺寸可以随意缩放。我习惯拿到数据后先写一个小脚本把归一化坐标换算回像素坐标再用肉眼确认几个值是否合理import os def read_yolo_label(label_path, img_w1280, img_h720): 读取 YOLO 格式标签把归一化坐标换算成像素坐标。 img_w/img_h 用实际图片分辨率这里只做示例。 with open(label_path, r, encodingutf-8) as f: lines f.readlines() for line in lines: parts line.strip().split() if len(parts) ! 5: print(f异常行: {line.strip()}) continue cls_id int(parts[0]) x_center float(parts[1]) * img_w y_center float(parts[2]) * img_h box_w float(parts[3]) * img_w box_h float(parts[4]) * img_h x1 x_center - box_w / 2 y1 y_center - box_h / 2 x2 x_center box_w / 2 y2 y_center box_h / 2 print(f类别 {cls_id}: 左上角({x1:.1f}, {y1:.1f}) 右下角({x2:.1f}, {y2:.1f})) read_yolo_label(0011_jpg.rf.7a7655516b6ade13a199ad135383cba7.txt)这段脚本做的事情很简单把归一化坐标还原成像素坐标。运行后如果出现 x1、y1 小于 0 或者 x2、y2 大于图片宽高的情况说明标注边界出界了这类样本需要重视。正常数据集里偶尔有一两个出界框问题不大但如果出界比例超过 5%建议先做一轮清洗否则训练时那些极端位置的锚框会干扰损失计算。顺便一提某些标注工具导出的坐标是左上角和右下角的像素坐标和 YOLO 格式不一样别搞混了这也是误用数据集时最常见的坑之一。2.3 数据增强已经提前做过了这份数据集在发布前已经做过数据增强data augmentation。图片里会出现同一块区域的多种变换版本比如旋转、水平翻转、亮度调整。对应的标签也同步做了变换所以不会出现图变了框没变的情况。这一点其实是双刃剑正面来说样本量被放大模型见过更多形态变化反面来说如果训练集和验证集同时包含同一原始图的增强版本会被模型“记住”导致 mAP 指标虚高这个我会在第五章节重点展开。这里先记住一个验证原则拿到增强过的数据集第一步不是直接训练而是检查 train 和 valid 之间是否存在来自同一张原始图的相似样本。你不需要去肉眼对比写一个感知哈希的脚本就能快速筛出来后面避坑章会给具体方案。3. 8 个矿物类别与 class 文件把类别体系落到训练配置里数据集的类别个数是 8涵盖石英、斑铜矿、黄铁矿等矿物类型。但类别检测的难点不在数量而在类间相似度和纹理干扰。比如黄铁矿和某些铜矿在表面光照下的颜色非常接近模型很容易混淆。这一章讲清楚如何把 class 文件转换成模型训练实际使用的配置。3.1 从 class.txt 到 data.yaml数据集里附带一个 class 文本文件打开后大概是这样的格式Quartz Bornite Pyrite ...如果做 YOLOv8 或 YOLOv5 训练不能直接把这个文件喂给模型需要手工写一个 data.yaml。常见做法是创建一个 data.yaml内容包括路径、类别数和类别名# data.yaml path: ../rock_mineral # 数据集根目录 train: images/train # 训练图片目录 val: images/valid # 验证图片目录 nc: 8 # 类别数量必须与 class.txt 行数一致 names: 0: Quartz 1: Bornite 2: Pyrite 3: Chalcopyrite 4: Galena 5: Sphalerite 6: Hematite 7: Malachite这里的类别名只是示例具体以你收到的 class 文本文件内容为准不要照抄。names 列表的顺序必须和 class.txt 里的顺序完全一致因为标签文件里写的类别 id 是按行号从 0 开始排的。如果顺序错位整个模型就会系统性错检——比如把黄铁矿的样本当成了石英去训练验证时 mAP 还很高因为模型真的学到了一个错误映射这也正是标注数据最难排查的坑。一个稳妥的检查方式是写个脚本把 class.txt 的内容加载到列表再和 data.yaml 里的 names 做对比import yaml # 读取类别文件 with open(class.txt, r) as f: class_names [line.strip() for line in f if line.strip()] # 读取 data.yaml with open(data.yaml, r, encodingutf-8) as f: cfg yaml.safe_load(f) yaml_names [cfg[names][i] for i in range(cfg[nc])] print(类别文件数量:, len(class_names)) print(yaml数量:, cfg[nc]) print(是否完全一致:, class_names yaml_names)如果输出 False优先检查是不是 class.txt 末尾有空行被过滤掉了或者 yaml 里 names 少写了一个。这个脚本很小但每次换数据集我都会先跑一遍已经帮我避免了两次低级的类别错位事故。3.2 类别不均衡与增强样本量的取舍岩石矿物的类别分布通常并不均匀因为野外取样时石英表面相对常见而斑铜矿这种出现频率就低。类别不均衡带来的典型问题是模型对样本量少的类别学习不充分验证时有一个类别的 recall 明显低于其他类。解决思路有三种一是对少类别做过采样二是调整 loss 中的类别权重三是干脆用数据增强再多生成一些少类别样本。但第三种方案在这个数据集上要小心因为原图已经增强过一轮继续增强容易让模型对同一块岩石纹理过拟合。先跑一个统计脚本看清每个类别的样本量再决定策略import os from collections import defaultdict label_dir labels/train class_count defaultdict(int) for file in os.listdir(label_dir): if not file.endswith(.txt): continue with open(os.path.join(label_dir, file), r) as f: for line in f: parts line.strip().split() if len(parts) 5: class_count[int(parts[0])] 1 print(各类别样本数:, dict(class_count))输出大概长这样类别 id矿物类型示例框数量0石英3561斑铜矿1222黄铁矿2873-7其他五类每类 80-200如果最低类别样本量不到最高类别的三分之一训练时建议给数据加载器传入类别权重或者计算一下每类框面积的中位数看是不是存在大量小目标。岩石表面矿物检测里一个典型现象是同一块岩石上某个矿物只露出指甲盖大小标注框很小模型很难召回。这个数据集的图片来自岩石表面天然带有这种挑战训练时不必强求 mAP 50-95 拉满先保证 mAP 50 和类别 recall 均衡更现实。3.3 小目标与标注框面积分布对小目标问题我的习惯是训练前统计一下每个框面积占图片面积的比例。如果大量框面积占比小于 2%YOLOv8 默认的 P2 检测头可能都不够用需要开启多尺度训练或者把 imgsz 调大。比如原图是 1280 分辨率的直接设 imgsz640 训练相当于所有目标缩小一半小矿物框几乎消失了。4. 交给模型前先可视化show 脚本与自绘边界框验证数据准备完成后最忌讳直接开训。训练跑几十个 epoch 才发现某个类别的标签画错了位置浪费的时间可能是一整天。可视化是训练前最后一道质检这个数据集里带了 show 脚本可以把边界框直接绘制在图像上用来人工检查标注质量。4.1 show 脚本的使用方式show 脚本的作用是读取图片和对应标签把检测框和类别文本画到图上。它的使用方式很直接一般会接受两个参数一个是图片目录一个是标签目录python show.py --img_dir ./images --label_dir ./labels --save_dir ./visual_check脚本会遍历图片目录对每个图片找到同名 txt读取五个字段用 OpenCV 的 rectangle 和 putText 把框和类别画上去。输出目录里会生成带标注的图片从头翻一遍就能发现大部分标注问题。参数含义大致是这样--img_dir图片存放路径脚本用 glob 搜索 jpg、png 文件。--label_dir标签 txt 路径脚本按文件名匹配。--save_dir可视化结果的保存路径建议单独建目录不要覆盖原图。如果脚本支持--class_file参数就传 class.txt这样画出来的框上方是类别名称而不是数字检查效率高很多。如果脚本报错说不认识--img_dir那可能是它的参数名不一样比如--images或者--source。可以先用python show.py --help查看它实际支持的参数列表改一下再执行。有的版本还带置信度阈值参数但那是用来可视化模型推理结果的用在这个数据集上意义不大因为标签文件没有置信度。4.2 不依赖 show 脚本的自绘兜底方案如果 show 脚本的某个依赖库版本不兼容或者你想快速验证某一张图没必要去调试脚本直接用 OpenCV 自己写一个绘制函数更省事import cv2 def draw_yolo_boxes(img_path, label_path, class_names): img cv2.imread(img_path) h, w img.shape[:2] with open(label_path, r) as f: lines f.readlines() for line in lines: parts line.strip().split() if len(parts) ! 5: continue cls_id int(parts[0]) x_center float(parts[1]) * w y_center float(parts[2]) * h box_w float(parts[3]) * w box_h float(parts[4]) * h x1 int(x_center - box_w / 2) y1 int(y_center - box_h / 2) x2 int(x_center box_w / 2) y2 int(y_center box_h / 2) color (0, 255, 0) cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) label class_names[cls_id] cv2.putText(img, label, (x1, y1 - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2) return img # 使用示例 class_names [Quartz, Bornite, Pyrite] img draw_yolo_boxes(images/0011_jpg.rf.7a7655516b6ade13a199ad135383cba7.jpg, labels/0011_jpg.rf.7a7655516b6ade13a199ad135383cba7.txt, class_names) cv2.imwrite(check_0011.jpg, img)这段代码的逻辑很清晰先读图片拿到实际宽高再把归一化坐标还原成像素坐标最后用矩形框和文字叠加到图上。一个细节是cv2.rectangle的坐标必须转成int否则 OpenCV 会报 type error。检查时重点关注三类问题框是否偏出图外、框是否明显过大或过小、框的中心点是否落在矿物纹理上。岩石表面数据里最常出现的问题是一个大框包含了好几种矿物说明标注粒度偏粗后续训练时模型学会的也是“把整片区域标成一类”而不是精确定位单个矿物。4.3 可视化检查的抽检比例不需要每张图都看到吐但建议至少在训练集和验证集里各抽 30 张覆盖到每个类别至少 5 个框。抽检时不要只看前几张因为文件夹排序往往导致同批次图片内容相似要随机抽样。脚本里加个random.sample就能做到这算是数据质检里成本最低收益最高的一步。5. 训练避坑标签、划分与数据增强的四个常见问题数据集本身质量不错但使用增强过的数据集训练有几类问题几乎每个人都会遇到。这一章把最常见的四类问题拆开讲每条都是按现象、原因、解决的顺序来内容都是踩过坑之后沉淀下来的经验。5.1 训练集和验证集同源mAP 虚高现象训练完验证mAP 50 高达 0.95 以上但把模型放到现场拍摄的新照片上测试效果惨不忍睹检测框乱跳。原因数据增强是在发布前做的同一张原始图经过翻转、旋转、调亮度后生成多个副本这些副本如果被同时分到训练集和验证集模型相当于提前见过验证图的变形版本指标自然好看但这个分数没有实际参考价值。解决先扫描训练集和验证集之间是否存在近重复图片。简单的方式是用文件名的哈希前缀判断更可靠的方式是计算图片的感知哈希把相似度高于阈值的图片对找出来再从验证集里移除与训练集相似的样本。以这个数据集的命名规则为例0011_jpg.rf.xxxxx.jpg里的0011_jpg是原始图标识如果训练集和验证集出现同名但哈希不同的文件说明是同一原始图的增强版本需要处理。删掉验证集里的重复样本后mAP 会降一些但那个数字才是真实水平。5.2 类别 id 偏移模型系统性错检现象训练结果看起来收敛但推理时黄铁矿的框总是标成石英而且是所有图都错不是偶发。原因class.txt、data.yaml 的 names 列表、标签文件里的 id 三者顺序不一致。例如 class.txt 里第 0 行是 Quartz但 data.yaml 里第 0 行写成了 Pyrite那标签里所有 id 为 0 的目标都会被当成 Pyrite 训练。这类错误在训练时几乎不会有明显征兆因为损失的下降趋势是正常的。解决用第 3 章的对比脚本把 class.txt 和 data.yaml 逐行比对。另外抽几张贴好标签的可视化图片核对类别名称是否和肉眼判断一致。推荐在训练前跑固定流程读取 class.txt 生成 names 列表再按行号写入 data.yaml而不是手打这样能从源头避开 id 偏移。yaml 里的 names 顺序错了模型是不会有任何报错的这就是它隐蔽的地方。5.3 空标签文件被静默跳过现象训练日志里显示的图片数量小于实际图片数量或者某个类别完全没被模型学到recall 为 0。原因数据集中某些 txt 文件是空的0 字节表示这张图没有任何标注框。这种文件在读取时会被跳过但对应图片还是会被加载为纯背景图相当于无形中给训练集加了无目标样本。少量空标签问题不大但如果空标签集中分布在某个类别对应的图片上就相当于该类别的正样本被削掉了一部分模型自然学不到。解决扫描标签目录统计非空 txt 的数量和空 txt 的数量find labels -name *.txt -size 0 | wc -l如果空文件数量占总数超过 2%建议把对应的图片和空 txt 一并放到 backup 目录不参与训练。需要注意的是不能只删 txt 不删图否则图片目录和标签目录数量对不上某些框架会在检查时报 mismatch 错误。处理完空标签后重新统计每个类别的框数量确认类别分布没有发生剧烈变化。5.4 增强副本过多导致训练集内部高度相似现象训练损失降得很快但在验证集上的表现停滞不前甚至 epoch 越往后验证损失越高。原因数据增强生成了大量近似副本训练集内部相似度太高模型相当于在反复记忆同一块岩石纹理的轻微变化而不是在学矿物形态的泛化特征。放大倍数过高时这类增强反而变成过拟合催化剂。解决如果我们想处理这个数据集并用于严肃实验建议做一个去重对训练集内部图片两两计算感知哈希删除高度相似的样本。但要注意去重比例如果超过 20%数据集的有效样本量就回到了原始规模数据增强的意义被削弱了。一个折中做法是保留增强后的训练集但把验证集换成完全没有参与增强的原始图。如果资源允许最稳妥的还是自己重新划分一份全新的验证集确保任何一张图在训练和验证阶段都没有以任何形式被模型提前见过。6. 走通一次 YOLOv8 训练目录焊接、参数设置与混淆矩阵验证格式看懂了类别核对了可视化也通过了现在可以进入真正的训练环节。这一章把 YOLOv8 作为示例框架因为它是目前把配置和命令简化得比较成熟的版本。数据集的 YOLO 格式直接兼容不需要任何转换脚本你要做的只是把目录结构摆好。6.1 把数据组织成 YOLOv8 需要的目录形态YOLOv8 的默认约定是 images 和 labels 分开放而且相对路径要写准确。我一般会搭成这样rock_mineral/ ├── images/ │ ├── train/ │ └── valid/ ├── labels/ │ ├── train/ │ └── valid/ ├── class.txt └── data.yaml如果你的压缩包里图片和标签是混在一起放的先用一行命令分开mkdir -p images/train images/valid labels/train labels/valid # 把训练图片移动到对应目录按实际划分文件名索引来归类注意 YOLOv8 会在训练时自动到 labels 目录下找与 images 相同文件名、后缀为 .txt 的文件。所以 images/train 里的一张图其标签文件必须放在 labels/train 下目录层级要对称不能图在 train、标签在 valid那样框架会直接报找不到标签。6.2 训练命令与 mAP 指标解读把前面写的 data.yaml 放到数据集根目录后执行训练命令yolo train datarock_mineral/data.yaml modelyolov8n.pt epochs100 imgsz640 batch16几个关键参数的考量modelyolov8n.pt是 nano 版本适合第一次跑通流程显存占用小。如果显卡是 8G 以上换成yolov8s.pt或yolov8m.pt会明显提升小目标的召回。imgsz640是基准尺寸。如果原图里有大量小矿物框建议试试imgsz1280但训练时间会增加到四倍左右需要自行权衡。batch16要根据显存调整用 nano 模型配合 16 基本能在 8G 卡上跑起来如果报 CUDA out of memory降成 8 或 4。训练结束后验证命令是yolo val modelruns/detect/train/weights/best.pt datarock_mineral/data.yaml关注两个指标mAP 50 和 mAP 50-95。对于矿物检测mAP 50 更符合实际需求因为矿物表面边界本身存在模糊带不需要非常精确的框。如果 mAP 50 超过 0.8 而 50-95 低于 0.4说明框的定位精度一般但召回能力不错这在岩石矿物这种天然纹理复杂的目标上是可以接受的。6.3 混淆矩阵是定位类别混淆的利器训练完不要只看 mAP一定要打开runs/detect/train/confusion_matrix.png。混淆矩阵能精确告诉你哪两个类别互相认错。比如 Quartz 和 Pyrite 的混淆块颜色很深说明这两个类别在特征空间里挨得太近。处理办法不是盲目加数据而是回到类别定义——看看这两类矿物在标注时是否存在边界重叠或者把共生矿物标成一个框的情况。常见做法是把易混淆类别合并成一个大类或者对样本较少的那个类做针对性增强。如果没有现成的混淆矩阵图也可以手动提取yolo val modelruns/detect/train/weights/best.pt datarock_mineral/data.yaml --save_conf之后在runs/detect/val/下查看生成的 .npz 文件用代码加载并输出每类的 recall。从那以后我每次拿到新数据集都会强制走一遍固定流程先 diff 标签文件名再核查类别 id 和 class.txt 是否对应然后随机抽 30 张图看可视化最后算一遍 train/valid 相似度四步做完才敢点训练按钮。这套习惯帮我提前挡住过至少三次低级的标注错位事故也节省了反复重训的时间。希望能帮到你让这份岩石矿物数据集的每一步使用都尽量少走弯路。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →