news 2026/9/11 23:13:20

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
岩石目标检测数据集实战: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

注意trainvalid下各有一个imageslabels子目录,图片与标签通过同名(前缀一致)关联。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_ok=True) # 这里需要确保与 classes.txt 中的类别顺序一致 CLASS_NAMES = [ "Granite", "Basalt", "Marble", "Limestone", "Coal", "Sandstone", "Gneiss", "Quartzite", "Slate" ] COLORS = np.random.randint(0, 255, size=(len(CLASS_NAMES), 3), dtype=np.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(f"missing 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(f"done, saved to {SAVE_DIR}")

这段代码做的事是:遍历训练集前 200 张图,读取同名标签文件,把归一化中心坐标反算成像素坐标,通过cv2.rectangle绘制目标框,并附上类别名。关键点在反归一化公式——x1 = (cx - bw / 2) * wbw是归一化的框宽,先乘以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.py(OpenCV)opencv-python快速批量出图检查
LabelImgPyQt5重新标注修正错误框
FiftyOne多依赖探索性数据分析、标签分布统计
CVATDocker团队协作、在线标注

对单个压缩包数据集,show.py 性价比最高,其他工具都是为持续标注流程服务的。

4. 用 YOLOv8 训练岩石检测模型的全配置

4.1 环境安装与 YAML 配置

先确认本机是否已有 YOLO 训练环境。如果没有,用下面的命令创建一个干净的虚拟环境:

conda create -n rock python=3.10 -y conda activate rock pip install ultralytics opencv-python

ultralytics包内置了 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: Slate

path是绝对路径,trainval是相对路径,训练器会自动拼成/home/user/datasets/rock/train/images来搜索图片。额外注意:trainval字段写入的是 images 目录而非数据集根目录,因为 YOLOv8 的 train 阶段会自动去同名 labels 目录找对应标签,这个目录后缀是硬编码的。nc必须和 names 列表长度一致,手动改类别时很容易在这块配错,导致训练起来后 loss 飘移。

4.2 预训练权重选择和训练参数

建议直接用 COCO 预训练权重yolov8m.pt做迁移学习。虽然 COCO 里没有岩石类别,但预训练模型已经学到了纹理、边缘、形状等低级视觉特征,这些特征对岩石识别同样有效。以下是我经过实验后认为比较合理的训练配置:

yolo detect train \ model=yolov8m.pt \ data=rock.yaml \ epochs=100 \ imgsz=640 \ batch=16 \ lr0=0.01 \ lrf=0.1 \ momentum=0.937 \ weight_decay=0.0005 \ optimizer=AdamW \ device=0 \ project=rock_experiments \ name=baseline_m

参数含义拆解:epochs=100对万级数据集足够,再多容易过拟合;imgsz=640是精度和显存的平衡点,如果想要检测更小的岩石碎块可以调大到 960,显存占用会增加约一倍;batch=16在 12GB 显存的 3060 上勉强够,24GB 显存可以开到 32;lr0=0.01是迁移学习场景的起始学习率,如果从头训练则建议降低到 0.005;optimizer=AdamW在训练后期收敛更平稳,SGD 则更依赖不错的学习率调度策略。停在project/name目录下的weights/best.pt是验证集 mAP 最高的权重,后续推理都用它。

4.3 训练中需要盯的指标

训练输出中,重点关注box_losscls_loss两个指标。box_loss是预测框和真实框的回归误差,训练初期下降速度应明显快于cls_loss——因为岩石类别的纹理区分本身更难。如果 30 个 epoch 后box_loss还在 1.2 以上徘徊,大概率是标签边界框本身不贴合边缘——上一章的 show.py 就是在做这件事,别让模型带病训练。

验证阶段用以下命令输出完整指标:

yolo detect val \ model=rock_experiments/baseline_m/weights/best.pt \ data=rock.yaml \ save_json=True

save_json=True会生成一个包含每个类别 mAP50、mAP50-95 的 JSON 文件,可以精确看到哪个类别拉低了整体分数。岩石数据集中通常大理石会让 mAP 掉 2 到 3 个百分点,因为大理石表面的纹理有大量透明反射,边界标注主观性极强,属于正常现象。

4.4 常见错误排查表

错误现象可能原因排查方案
训练启动即报AssertionError: train: No labelsdata.yaml 路径错误检查train/imagestrain/labels是否成对存在
loss 下降但 mAP 始终为 0类别文件与标签索引不对应yolo detect val后查看每类 AP,定位偏移的类别
显存溢出batch 过大或 imgsz 过大调小 batch 或开启cache=ram配合fraction=0.5
验证集的图片被裁掉图像尺寸不是 32 的倍数无需处理,网络会自动 padding

最后一个问题很多新手会卡住:图像在进入 YOLOv8 网络前会被缩放到 640x640,非 32 倍数的缩放会通过 letterbox 加灰边处理,而不是直接裁剪,所以不影响检测结果。

5. 推理部署与数据增强的组合拳

5.1 对单张图做推理并保留类别名

训练完成后,用以下命令对单张图像推理:

yolo predict \ model=rock_experiments/baseline_m/weights/best.pt \ source=test_images/sample_01.jpg \ conf=0.35 \ iou=0.5 \ save=True

关键参数是confiouconf=0.35表示只有置信度高于 0.35 的框才会保留;岩石场景中很多背景里的碎石头容易误报,如果发现框特别多,就把 conf 提到 0.5。iou=0.5是 NMS 的 IoU 阈值,值越大保留的重叠框越多,岩石密集堆叠场景可以尝试 0.6 以上,让重叠框尽可能合并。输出会保存在runs/detect/predict/,原图上的框会带上CLASS_NAMES里对应的名称。

5.2 用 Albumentations 做针对性增强

通用增强(Mosaic、MixUp)YOLOv8 已经内置,但对岩石数据针对性最强的两个操作是RandomBrightnessContrastHueSaturationValue。岩石外观受光照影响极大,同样的玄武岩在正午和傍晚看起来像两种东西。在训练配置中加入这些增强项:

from ultralytics import YOLO model = YOLO("yolov8m.pt") results = model.train( data="rock.yaml", epochs=100, imgsz=640, hsv_h=0.02, hsv_s=0.6, hsv_v=0.5, degrees=10, translate=0.1, scale=0.4, fliplr=0.5, )

hsv_h=0.02表示色调偏移范围设为 0.02(HSV 色相环的 2%),岩石颜色本身差异不大,过大的色相偏移会造成同类别颜色混乱。degrees=10允许旋转 10 度——岩石没有明显的方向性,旋转增强不会破坏语义,但注意旋转会引入黑色填充区域,配合scale=0.4让目标缩小后填充区域占比更大。这里要克制:任何增强参数翻倍都不一定带来精度提升,只会增加训练时间。

5.3 用混淆矩阵定位类别混淆

训练完最后一次验证后,模型会自动在results/目录下生成confusion_matrix.png。岩石数据集的混淆矩阵里最容易出现这种情况:Igneous_BasaltMetamorphic_Marble出现互认错误,原因是玄武岩深色表面常有气孔,而某些大理石也带深色纹路。这时有两种处理策略:

首先考虑合并类别再训练。如果业务不要求区分细分类别,把 9 类合并成 3 大成因类别(火成岩、变质岩、沉积岩),mAP 通常会提升 5 个百分点以上,这是性价比最高的策略。

其次提升高混淆类别的训练权重。在 data.yaml 中对每一类提供 class weights 参数予模型适度加权,但这个过程比较繁琐,连贯地讲,单纯地加权并不总能解决视觉相似性问题,反而容易让整体精度波动。

5.4 轻量部署到边缘设备

最后一步如果要把模型部署到 Jetson 或树莓派,先用以下命令导出为 TensorRT 引擎:

yolo export \ model=rock_experiments/baseline_m/weights/best.pt \ format=engine \ device=0 \ imgsz=640 \ half=True

half=True表示 FP16 精度,显存占用减半,推理速度提高 20% 左右。导出 TensorRT 引擎时需要在目标设备上执行,因为 TensorRT 是针对特定 GPU 架构编译的,在 PC 上生成的 engine 无法在 Jetson 上运行,这是和 ONNX 最不一样的地方。如果边缘设备是 CPU 部署,则选择format=onnx配合 OpenCV DNN 模块做推理,速度和精度都能接受。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 23:12:30

EFI系统分区(ESP)原理与实战:从启动失败到多系统共存

1. 什么是EFI/ESP系统分区:从开机第一秒说起 你有没有经历过这样的场景:电脑按下电源键后黑屏几秒,接着跳出一行小字“Boot device not found”或者“No bootable device”,再或者Windows启动管理器直接报错“0xc000000f”&#x…

作者头像 李华
网站建设 2026/9/11 23:10:47

WinApps 快速指南:Linux 上跑 Office

WinApps 快速指南:Linux 上跑 Office 【免费下载链接】winapps Run Windows apps such as Microsoft Office/Adobe in Linux (Ubuntu/Fedora) and GNOME/KDE as if they were a part of the native OS, including Nautilus integration. Hard fork of https://gith…

作者头像 李华
网站建设 2026/9/11 23:10:33

C++17塔防游戏开发:SFML架构与工程化实践

简介:这是一份基于C实现的《保卫萝卜》塔防游戏课程设计项目,面向计算机专业本科生及C初学者,用于巩固面向对象编程、Qt图形界面开发与游戏逻辑设计能力。资源包含294个文件,主体为66个cpp源码、55个h头文件、81张png素材图及3个可…

作者头像 李华
网站建设 2026/9/11 23:08:09

2026企业AI办公工具选型指南:场景匹配与能力评估

不少企业在调研AI办公产品阶段,容易陷入几个典型误区:对照功能清单逐项勾选、以席位单价作为核心决策依据、跟随行业声量选择知名度更高的产品,上线之后才发现工具和自身业务流程脱节、高频场景覆盖不足、数据权限无法满足管理要求。 2026年下…

作者头像 李华
网站建设 2026/9/11 23:07:09

南京壁挂炉噪音大维修处理,欧米到家检查风机水泵运行异常以及内部循环问题

文章简介南京冬季采暖需求较高,壁挂炉作为家庭供暖和生活热水的重要设备,长期使用后容易出现不点火、不供暖、热水忽冷忽热、故障代码报警、水压异常、漏水等问题。欧米到家专注南京壁挂炉维修服务,提供燃气壁挂炉、电壁挂炉、冷凝壁挂炉、采…

作者头像 李华