ARTICLE DETAIL

资讯详情

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

岩石目标检测数据集实战:YOLO格式解析与训练指南

岩石目标检测数据集实战:YOLO格式解析与训练指南 简介这是一份面向目标检测任务的石头、岩石图像数据集包含约1.2万张训练图像与1000张验证图像覆盖砂岩、石灰岩、大理石、玄武岩等9个常见岩石类别标签已处理为YOLO格式可直接用于YOLO系列模型的训练与评估。资源内共2000个文件以txt格式的标注文件为主另提供一个Python脚本show.py用于将检测框绘制到图像上便于快速检查标签质量与训练效果。压缩包整体约687.21MB文件结构清晰适合地质勘探、岩矿识别、建筑骨料检测等场景的算法研究和工程落地。目前已有604人学习下载作为现成的高质量岩石目标检测数据集能为研究者省去大量数据采集和标注时间快速开展模型训练与调优。1. 岩石检测为什么比通用目标检测更考验数据集做通用目标检测时COCO 里的猫狗车人边界清晰、类间差异大模型很容易学到判别特征。但岩石不一样同一块玄武岩在不同光照、不同风化程度下颜色能从深灰变到红褐同一张图里砂岩和石灰岩肉眼几乎无法区分只能靠纹理和层理结构判断。这就是为什么石头、岩石目标检测数据集在算法圈里一直稀缺——不是拍几张照片就行而是要保证类别标签的地质学准确性。这个数据集正好补上这块缺口超过 1.2 万张训练图像、1000 张验证图像标注了 9 个岩石类别且直接处理成 YOLO 格式省去从 VOC/COCO 转格式的中间环节。对做地质巡检、矿山监测、建筑材料分拣的团队来说拿到手就能直接进模型训练流程配套的 show.py 还能快速验证标注质量。这篇文章就围绕这个数据集的格式、可视化、训练配置和踩坑点展开每一节都能直接在你的机器上复现。2. YOLO 标签格式与目录结构解剖2.1 文件名编码了什么信息先看一个实际的文件名Igneous_Basalt67_jpg.rf.b95924aa2812cf4790968be991d0aaeb.txt拆解之后这个文件名携带了三条关键信息。最前面的大类前缀Igneous表示岩石成因分类即火成岩中间的Basalt67是细分类别和样本编号表示玄武岩的第 67 张样本最后的.rf.加一串哈希值是 Roboflow 平台导出时的唯一标识用于追踪这张图在原始数据集中的位置。明白这一点你在做数据集检查时就能快速定位某张问题图片的来源。2.2 标签文件内容与归一化坐标打开任何一个 txt 标签文件内容格式如下2 0.492187 0.423611 0.343750 0.201389 5 0.715625 0.588889 0.162500 0.233333 8 0.281250 0.711111 0.109375 0.150000每行对应一个目标框五个值依次是class_id center_x center_y width height其中坐标值全部归一化到 0~1 之间即除以了图像原始宽度和高度。这样做的优势是无论后续 resize 成 640x640 还是 1280x1280标签都不需要重新换算模型在训练时只需要按输入尺寸缩放坐标即可。class_id对应classes.txt里的索引从 0 开始。不要以为这是 YOLOv5 之后才有的标准——YOLOv3 时代就是这个格式所以这个数据集可以平滑兼容 YOLOv3 到 v11 的所有系列。2.3 数据集的目录组织方式项目的目录组织遵守 YOLO 系列训练器的默认约定dataset/ ├── train/ │ ├── images/ │ │ ├── Sedimentary_Limestone45_jpg.rf.b42b0773fed4e4e490c5f9ee7fa97f98.jpg │ │ └── ... │ └── labels/ │ ├── Sedimentary_Limestone45_jpg.rf.b42b0773fed4e4e490c5f9ee7fa97f98.txt │ └── ... ├── valid/ │ ├── images/ │ └── labels/ ├── classes.txt └── data.yaml注意train和valid下各有一个images和labels子目录图片与标签通过同名前缀一致关联。classes.txt列出了全部 9 个类别名称data.yaml是训练器直接读取的配置文件包含路径和类别名。实际下载的压缩包里可能把data.yaml命名为rock.yaml或类似的名字但这个 YAML 是搭建训练入口的关键后续训练配置要从它开始改。2.4 类别信息核对清单拿到数据集后第一件事不是训练而是核对类别。常见数据集在打包时容易丢失一个类别的标注比如某张图上漏标了煤块所以先要确认类别索引预期类别名检查标签中出现次数0Igneous_Granite统计1Igneous_Basalt统计2Metamorphic_Marble统计3Sedimentary_Limestone统计4Sedimentary_Coal统计5其余类别统计检查命令用awk直接对 labels 目录做频次统计cat train/labels/*.txt | awk {print $1} | sort | uniq -c | sort -rn这段命令的含义是用cat拼接所有标签文件awk提取每行第一列的类别 ID排序后统计每个 ID 出现的次数。如果某个类别 ID 一次都没出现说明该类别图片缺失或标注文件为空需要补充数据才能保证 9 类均衡训练。这一步能避免你带着残缺的标签训练出偏科模型而不自知。3. show.py 可视化脚本批量验证标注是否贴框3.1 为什么必须做可视化检查坐标数值正确不代表标注质量合格。最常见的三种问题是边界框偏离目标主体、同一目标被重复框选、目标过小导致框内有效像素不足。数值层面这些情况都合法但模型会学到错误的定位模式。show.py 存在的意义就是把训练集抽样转换为可视化图片直接看到红框和岩石的相对位置。3.2 基于 OpenCV 的绘制实现数据集的 show.py 核心逻辑并不复杂下面是基于 OpenCV 的标注可视化实现只依赖 opencv-python 和 numpy。import os import cv2 import numpy as np IMG_DIR train/images LABEL_DIR train/labels SAVE_DIR visual_check os.makedirs(SAVE_DIR, exist_okTrue) # 这里需要确保与 classes.txt 中的类别顺序一致 CLASS_NAMES [ Granite, Basalt, Marble, Limestone, Coal, Sandstone, Gneiss, Quartzite, Slate ] COLORS np.random.randint(0, 255, size(len(CLASS_NAMES), 3), dtypenp.uint8) for img_name in os.listdir(IMG_DIR)[:200]: if not img_name.endswith((.jpg, .png)): continue base os.path.splitext(img_name)[0] img cv2.imread(os.path.join(IMG_DIR, img_name)) h, w img.shape[:2] label_path os.path.join(LABEL_DIR, base .txt) if not os.path.exists(label_path): print(fmissing label: {img_name}) continue with open(label_path, r) as f: lines f.read().strip().split(\n) for line in lines: parts line.split() if len(parts) ! 5: continue cls int(parts[0]) cx, cy, bw, bh map(float, parts[1:]) # 反归一化得到像素坐标 x1 int((cx - bw / 2) * w) y1 int((cy - bh / 2) * h) x2 int((cx bw / 2) * w) y2 int((cy bh / 2) * h) color COLORS[cls].tolist() cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) # 在边界框上方绘制类别标签 label f{CLASS_NAMES[cls]} cv2.putText(img, label, (x1, max(0, y1 - 6)), cv2.FONT_HERSHEY_SIMPLEX, 0.6, color, 2) save_path os.path.join(SAVE_DIR, img_name) cv2.imwrite(save_path, img) print(fdone, saved to {SAVE_DIR})这段代码做的事是遍历训练集前 200 张图读取同名标签文件把归一化中心坐标反算成像素坐标通过cv2.rectangle绘制目标框并附上类别名。关键点在反归一化公式——x1 (cx - bw / 2) * w中bw是归一化的框宽先乘以w还原为像素宽再除以 2 得到左边界到中心的距离最后用中心点坐标减去它。如果这里顺序颠倒框就会偏移半个身位。运行后去visual_check目录随机翻几十张图一张图里如果有大量框位置偏到一个角落通常是标签归一化计算误差需要重新检查数据生成脚本。3.3 批量裁剪局部区域做精细校验整体可视化只能看到大框是否贴合对边缘贴合度要求高的场景比如判断石灰岩块的边界是否精确贴合轮廓建议再做一个局部放大功能将每个目标框从原图中裁出并拼接对比。import os import cv2 def crop_by_label(img_path, label_path, output_dir): img cv2.imread(img_path) h, w img.shape[:2] with open(label_path, r) as f: lines f.read().strip().split(\n) for idx, line in enumerate(lines): parts line.split() if len(parts) ! 5: continue cls int(parts[0]) cx, cy, bw, bh map(float, parts[1:]) x1 int((cx - bw / 2) * w) y1 int((cy - bh / 2) * h) x2 int((cx bw / 2) * w) y2 int((cy bh / 2) * h) crop img[max(0, y1):y2, max(0, x1):x2] if crop.size 0: continue out_path os.path.join(output_dir, f{cls}_{idx}.jpg) cv2.imwrite(out_path, crop)这里的裁剪直接用数组切片img[y1:y2, x1:x2]因为 OpenCV 的图像本质就是 numpy 数组。注意max(0, y1)防止坐标越界当目标框贴近图像边缘时坐标反算可能有几个像素的负值不做保护会直接报错。裁剪出来的图片按类别编号命名你可以快速翻看每一类图片的尺度分布如果某一类目标的裁剪图大多数明显偏暗或过曝说明该类的原始图像采集环境有系统性偏差需要在训练时针对这个类别做亮度增强不能指望模型自己在训练中自适应——样本太少时模型会走捷径。3.4 表格可视化工具选型对比工具依赖速度适用场景show.pyOpenCVopencv-python快快速批量出图检查LabelImgPyQt5慢重新标注修正错误框FiftyOne多依赖中探索性数据分析、标签分布统计CVATDocker中团队协作、在线标注对单个压缩包数据集show.py 性价比最高其他工具都是为持续标注流程服务的。4. 用 YOLOv8 训练岩石检测模型的全配置4.1 环境安装与 YAML 配置先确认本机是否已有 YOLO 训练环境。如果没有用下面的命令创建一个干净的虚拟环境conda create -n rock python3.10 -y conda activate rock pip install ultralytics opencv-pythonultralytics包内置了 YOLOv8 及后续版本的模型定义和训练器一条pip install就能满足全部依赖。安装完成后下载的数据集目录应解压到某个确定路径建议放在/home/user/datasets/rock不要放在带空格的路径下进入项目目录新建rock.yaml这是整个训练流程的入口配置path: /home/user/datasets/rock train: train/images val: valid/images nc: 9 names: 0: Granite 1: Basalt 2: Marble 3: Limestone 4: Coal 5: Sandstone 6: Gneiss 7: Quartzite 8: Slatepath是绝对路径train和val是相对路径训练器会自动拼成/home/user/datasets/rock/train/images来搜索图片。额外注意train和val字段写入的是 images 目录而非数据集根目录因为 YOLOv8 的 train 阶段会自动去同名 labels 目录找对应标签这个目录后缀是硬编码的。nc必须和 names 列表长度一致手动改类别时很容易在这块配错导致训练起来后 loss 飘移。4.2 预训练权重选择和训练参数建议直接用 COCO 预训练权重yolov8m.pt做迁移学习。虽然 COCO 里没有岩石类别但预训练模型已经学到了纹理、边缘、形状等低级视觉特征这些特征对岩石识别同样有效。以下是我经过实验后认为比较合理的训练配置yolo detect train \ modelyolov8m.pt \ datarock.yaml \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.1 \ momentum0.937 \ weight_decay0.0005 \ optimizerAdamW \ device0 \ projectrock_experiments \ namebaseline_m参数含义拆解epochs100对万级数据集足够再多容易过拟合imgsz640是精度和显存的平衡点如果想要检测更小的岩石碎块可以调大到 960显存占用会增加约一倍batch16在 12GB 显存的 3060 上勉强够24GB 显存可以开到 32lr00.01是迁移学习场景的起始学习率如果从头训练则建议降低到 0.005optimizerAdamW在训练后期收敛更平稳SGD 则更依赖不错的学习率调度策略。停在project/name目录下的weights/best.pt是验证集 mAP 最高的权重后续推理都用它。4.3 训练中需要盯的指标训练输出中重点关注box_loss和cls_loss两个指标。box_loss是预测框和真实框的回归误差训练初期下降速度应明显快于cls_loss——因为岩石类别的纹理区分本身更难。如果 30 个 epoch 后box_loss还在 1.2 以上徘徊大概率是标签边界框本身不贴合边缘——上一章的 show.py 就是在做这件事别让模型带病训练。验证阶段用以下命令输出完整指标yolo detect val \ modelrock_experiments/baseline_m/weights/best.pt \ datarock.yaml \ save_jsonTruesave_jsonTrue会生成一个包含每个类别 mAP50、mAP50-95 的 JSON 文件可以精确看到哪个类别拉低了整体分数。岩石数据集中通常大理石会让 mAP 掉 2 到 3 个百分点因为大理石表面的纹理有大量透明反射边界标注主观性极强属于正常现象。4.4 常见错误排查表错误现象可能原因排查方案训练启动即报AssertionError: train: No labelsdata.yaml 路径错误检查train/images和train/labels是否成对存在loss 下降但 mAP 始终为 0类别文件与标签索引不对应yolo detect val后查看每类 AP定位偏移的类别显存溢出batch 过大或 imgsz 过大调小 batch 或开启cacheram配合fraction0.5验证集的图片被裁掉图像尺寸不是 32 的倍数无需处理网络会自动 padding最后一个问题很多新手会卡住图像在进入 YOLOv8 网络前会被缩放到 640x640非 32 倍数的缩放会通过 letterbox 加灰边处理而不是直接裁剪所以不影响检测结果。5. 推理部署与数据增强的组合拳5.1 对单张图做推理并保留类别名训练完成后用以下命令对单张图像推理yolo predict \ modelrock_experiments/baseline_m/weights/best.pt \ sourcetest_images/sample_01.jpg \ conf0.35 \ iou0.5 \ saveTrue关键参数是conf和iou。conf0.35表示只有置信度高于 0.35 的框才会保留岩石场景中很多背景里的碎石头容易误报如果发现框特别多就把 conf 提到 0.5。iou0.5是 NMS 的 IoU 阈值值越大保留的重叠框越多岩石密集堆叠场景可以尝试 0.6 以上让重叠框尽可能合并。输出会保存在runs/detect/predict/原图上的框会带上CLASS_NAMES里对应的名称。5.2 用 Albumentations 做针对性增强通用增强Mosaic、MixUpYOLOv8 已经内置但对岩石数据针对性最强的两个操作是RandomBrightnessContrast和HueSaturationValue。岩石外观受光照影响极大同样的玄武岩在正午和傍晚看起来像两种东西。在训练配置中加入这些增强项from ultralytics import YOLO model YOLO(yolov8m.pt) results model.train( datarock.yaml, epochs100, imgsz640, hsv_h0.02, hsv_s0.6, hsv_v0.5, degrees10, translate0.1, scale0.4, fliplr0.5, )hsv_h0.02表示色调偏移范围设为 0.02HSV 色相环的 2%岩石颜色本身差异不大过大的色相偏移会造成同类别颜色混乱。degrees10允许旋转 10 度——岩石没有明显的方向性旋转增强不会破坏语义但注意旋转会引入黑色填充区域配合scale0.4让目标缩小后填充区域占比更大。这里要克制任何增强参数翻倍都不一定带来精度提升只会增加训练时间。5.3 用混淆矩阵定位类别混淆训练完最后一次验证后模型会自动在results/目录下生成confusion_matrix.png。岩石数据集的混淆矩阵里最容易出现这种情况Igneous_Basalt和Metamorphic_Marble出现互认错误原因是玄武岩深色表面常有气孔而某些大理石也带深色纹路。这时有两种处理策略首先考虑合并类别再训练。如果业务不要求区分细分类别把 9 类合并成 3 大成因类别火成岩、变质岩、沉积岩mAP 通常会提升 5 个百分点以上这是性价比最高的策略。其次提升高混淆类别的训练权重。在 data.yaml 中对每一类提供 class weights 参数予模型适度加权但这个过程比较繁琐连贯地讲单纯地加权并不总能解决视觉相似性问题反而容易让整体精度波动。5.4 轻量部署到边缘设备最后一步如果要把模型部署到 Jetson 或树莓派先用以下命令导出为 TensorRT 引擎yolo export \ modelrock_experiments/baseline_m/weights/best.pt \ formatengine \ device0 \ imgsz640 \ halfTruehalfTrue表示 FP16 精度显存占用减半推理速度提高 20% 左右。导出 TensorRT 引擎时需要在目标设备上执行因为 TensorRT 是针对特定 GPU 架构编译的在 PC 上生成的 engine 无法在 Jetson 上运行这是和 ONNX 最不一样的地方。如果边缘设备是 CPU 部署则选择formatonnx配合 OpenCV DNN 模块做推理速度和精度都能接受。本文还有配套的精品资源点击获取
返回列表