拓冰建站拓冰建站
首页 / 资讯中心 / 正文

YOLOv5岩石目标检测数据集:9类地质标注+开箱即用

简介本资源是一套专为YOLO系列目标检测模型如YOLOv5/v8定制的岩石图像数据集面向地质工程、智能矿山、计算机视觉初学者及AI算法工程师解决岩石类型自动识别与工业场景细粒度检测的数据缺失问题。数据集涵盖玄武岩、石灰岩、沉积岩等9类典型岩石已按YOLO标准格式完成划分含12501张训练图像及对应txt标签、1104张验证图像及标签并提供class.txt类别定义文件与开箱即用的数据可视化脚本show.py支持一键绘制边界框并保存结果。压缩包共2000个文件1999个标注txt 1个Python脚本总大小637.26MB采用7z高压缩比封装所有图像为640×640 RGB格式经马赛克增强处理标注框完整、坐标规范归一化中心点宽高。目前已有717人学习下载是可用于科研实验、课程设计或模型微调的高质量、即插即用型岩石检测基准数据集。1. 这不是普通岩石图库而是一套开箱即用的 YOLOv5 岩石目标检测数据集你手头正跑着一个地质图像分析项目但卡在了第一步找不到带精确标注、已划分训练/验证集、且类别语义清晰的岩石样本。网上搜到的“岩石数据集”要么只有几十张图要么标注格式混乱Pascal VOC 或 COCO要么类别混杂把“玄武岩”和“辉长岩”全塞进“火成岩”一个类更别提还要自己写脚本切图、归一化坐标、生成 class.names——这还没开始训练工程量已超模型调参。这套 YOLO 数据集直接绕过所有前置陷阱9 个明确地质学定义的岩石类别玄武岩、石灰岩、大理岩、煤等12501 张 640×640 RGB 图像 对应 .txt 标签全部按 YOLOv5 标准目录结构组织images/train、labels/train 等连classes.txt文件都已写好可视化脚本show.py一行命令就能画出带框原图。它不解决“如何设计新网络”而是解决“今天下午三点前必须跑通 baseline”的现实问题——给懂地质又懂 CV 的工程师省下至少 16 小时的数据准备时间。2. YOLO 标注规范与岩石类别语义对齐为什么这 9 类不能合并、也不能拆分2.1 地质学分类逻辑决定 YOLO 类别边界YOLO 检测任务中类别定义不是技术选择而是领域知识约束。本数据集严格遵循国际地科联IUGS岩石分类标准将 9 类划分为三大岩类下的细分种属火成岩玄武岩Basalt、安山岩Andesite、流纹岩Rhyolite——三者矿物成分与结晶程度差异显著野外识别依据明确沉积岩石灰岩Limestone、砂岩Sandstone、页岩Shale、煤Coal——成因机制化学/碎屑/生物与结构特征层理/孔隙/有机质截然不同变质岩大理岩Marble、片麻岩Gneiss——前者为石灰岩重结晶产物后者具典型条带状构造二者在矿产勘探中指示不同变质条件。提示若强行将“玄武岩”与“安山岩”合并为“火成岩”模型在推理时会丢失关键判据如玄武岩常具气孔构造安山岩多见斑状结构导致地质解释失效。本数据集的 9 类划分本质是将野外鉴定手册的视觉判据转化为像素级监督信号。2.2 YOLO 相对坐标标注的物理意义与验证方法每张图像的.txt标签文件采用标准 YOLO 格式class_id x_center y_center width height所有值均为归一化后的相对坐标0~1。以Sedimentary_Limestone45_jpg.rf.b42b0773fed4e4e490c5f9ee7fa97f98.txt为例其首行内容为0 0.423 0.618 0.215 0.189对应含义0→ class_id查classes.txt第 0 行为Limestone0.423→ 边界框中心横坐标占图像宽度比例0.618→ 中心纵坐标占图像高度比例0.215→ 边界框宽度占图像宽度比例0.189→ 高度占图像高度比例。验证标注合理性需检查两点坐标合法性x_center和y_center必须在 (0,1) 区间内width和height必须 0 且x_center ± width/2、y_center ± height/2不越界地质合理性同一图像中多个岩石目标的边界框不应重叠过度排除标注错误且框内纹理需符合该类别描述如煤应呈致密黑色块状石灰岩常见方解石晶粒反光。以下 Python 脚本可批量校验训练集标签import os from pathlib import Path def validate_yolo_labels(label_dir: str, img_width: int 640, img_height: int 640): invalid_files [] for label_path in Path(label_dir).glob(*.txt): try: with open(label_path, r) as f: lines f.readlines() for i, line in enumerate(lines): parts line.strip().split() if len(parts) ! 5: raise ValueError(fLine {i1} has {len(parts)} fields, expected 5) cls_id, xc, yc, w, h map(float, parts) # 检查坐标范围 if not (0 xc 1 and 0 yc 1 and 0 w 1 and 0 h 1): raise ValueError(fInvalid coordinates at line {i1}) # 检查是否越界 left xc - w/2 right xc w/2 top yc - h/2 bottom yc h/2 if not (0 left 1 and 0 right 1 and 0 top 1 and 0 bottom 1): raise ValueError(fBounding box out of image at line {i1}) except Exception as e: invalid_files.append(f{label_path.name}: {str(e)}) return invalid_files # 执行校验假设 labels/train 在当前目录 invalid validate_yolo_labels(datasets/labels/train) if invalid: print(发现非法标注文件) for err in invalid: print(err) else: print(所有训练集标签坐标合法)该脚本输出为空即表示标签格式无误这是后续训练收敛的前提——YOLOv5 在train.py中会直接读取这些值计算损失若存在越界坐标会导致loss计算异常甚至 NaN。2.3 数据增强策略马赛克Mosaic在岩石检测中的特殊价值本数据集在原始采集图像基础上应用了 Mosaic 增强四图拼接这并非简单提升数据量而是针对岩石图像特性设计的解决小目标密集问题单张岩石图像中常含多个碎块如砾岩中的卵石Mosaic 将不同尺度、不同光照下的岩石块组合迫使模型学习跨尺度特征模拟野外复杂背景真实地质剖面中岩石常与土壤、植被、工具共存。Mosaic 拼接天然引入多源背景干扰比单一背景增强更贴近实际场景抑制过拟合12501 张图经 Mosaic 后实际训练时每 batch 可生成远超原始数量的组合变体尤其对样本较少的类别如页岩仅 892 张效果显著。YOLOv5 默认启用 Mosaictrain.py中mosaicTrue但需注意其参数影响参数默认值岩石检测建议值说明mosaic_prob1.00.8降低概率避免过度扭曲岩石纹理连续性mixup_prob0.10.0关闭 MixUp防止不同岩类边缘模糊如石灰岩与煤交界处degrees10.00.0关闭旋转岩石层理方向是重要判据translate0.10.05微调平移幅度保持地质构造空间关系这些参数需在models/yolov5s.yaml的train部分或训练命令中显式指定例如python train.py --data data/rock.yaml --cfg models/yolov5s.yaml --weights --batch-size 16 \ --mosaic 0.8 --mixup 0.0 --degrees 0 --translate 0.05未调整时模型可能学会依赖虚假的拼接边缘而非真实岩石纹理导致野外部署时漏检。3. 数据可视化脚本深度解析与定制化改造3.1show.py的核心逻辑与零配置运行原理show.py能“无需更改直接运行”关键在于其硬编码路径与 YOLO 结构强绑定import cv2 import numpy as np import random import os # 【硬编码路径】严格匹配数据集解压后结构 IMAGE_DIR datasets/images/val # 固定读取验证集图片 LABEL_DIR datasets/labels/val # 固定读取对应标签 CLASSES_FILE classes.txt # 固定读取类别文件 def load_classes(): with open(CLASSES_FILE, r) as f: return [line.strip() for line in f.readlines()] def draw_bbox(img, bbox, class_name, color(0,255,0), thickness2): h, w img.shape[:2] # YOLO 归一化坐标转像素坐标 x_center, y_center, width, height bbox[1:] x1 int((x_center - width/2) * w) y1 int((y_center - height/2) * h) x2 int((x_center width/2) * w) y2 int((y_center height/2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), color, thickness) cv2.putText(img, class_name, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, color, 2) return img # 主流程随机选图 → 读图 → 读同名txt → 解析bbox → 绘制 → 保存 if __name__ __main__: classes load_classes() img_files [f for f in os.listdir(IMAGE_DIR) if f.endswith((.jpg, .jpeg, .png))] selected_img random.choice(img_files) img_path os.path.join(IMAGE_DIR, selected_img) label_path os.path.join(LABEL_DIR, selected_img.replace(.jpg, .txt).replace(.jpeg, .txt).replace(.png, .txt)) img cv2.imread(img_path) if not os.path.exists(label_path): print(fWarning: No label file for {selected_img}) else: with open(label_path, r) as f: for line in f: parts list(map(float, line.strip().split())) class_id int(parts[0]) bbox parts img draw_bbox(img, bbox, classes[class_id]) output_path fvisualized_{selected_img} cv2.imwrite(output_path, img) print(fSaved visualized image to {output_path})该脚本成功运行的三个隐含前提解压后目录名为datasets且结构为datasets/images/val和datasets/labels/valclasses.txt与show.py同级目录图片后缀统一为.jpg脚本自动处理.jpeg/.png但数据集实际只提供.jpg。注意若你将数据集放在其他路径如/data/rock_dataset必须修改IMAGE_DIR等变量或使用符号链接保持路径一致。直接移动文件夹而不改代码会导致FileNotFoundError。3.2 从“随机一张图”到“系统化验证”扩展可视化功能原始show.py仅展示单图实际调试需批量验证。以下改造支持指定图像 ID 查看特定样本批量生成带框图并统计各类别出现频次输出标注质量报告如宽高比异常、小目标占比。# enhanced_show.py —— 保存为新文件避免覆盖原版 import cv2 import numpy as np import os import argparse from collections import Counter def parse_args(): parser argparse.ArgumentParser() parser.add_argument(--image-dir, defaultdatasets/images/val, helpImage directory) parser.add_argument(--label-dir, defaultdatasets/labels/val, helpLabel directory) parser.add_argument(--classes-file, defaultclasses.txt, helpClasses file path) parser.add_argument(--output-dir, defaultvisualized, helpOutput directory) parser.add_argument(--sample-id, typestr, defaultNone, helpSpecific image name (e.g., Igneous_Basalt11_jpg.rf.3b1c250b26c9c60a696f1534b133f0d0.jpg)) parser.add_argument(--batch-size, typeint, default10, helpNumber of images to process) return parser.parse_args() def analyze_bbox_statistics(bboxes, img_shape): 分析边界框统计特征 h, w img_shape[:2] ratios [] areas [] for bbox in bboxes: _, xc, yc, bw, bh bbox ratio bw / bh if bh 0 else 0 area (bw * w) * (bh * h) ratios.append(ratio) areas.append(area) return { avg_aspect_ratio: np.mean(ratios), small_object_ratio: sum(1 for a in areas if a 1000) / len(areas) if areas else 0, max_area: max(areas) if areas else 0 } def main(): args parse_args() os.makedirs(args.output_dir, exist_okTrue) classes [line.strip() for line in open(args.classes_file).readlines()] if args.sample_id: img_files [args.sample_id] else: img_files [f for f in os.listdir(args.image_dir) if f.lower().endswith((.jpg, .jpeg, .png))][:args.batch_size] class_counter Counter() for img_file in img_files: img_path os.path.join(args.image_dir, img_file) label_path os.path.join(args.label_dir, os.path.splitext(img_file)[0] .txt) img cv2.imread(img_path) bboxes [] if os.path.exists(label_path): with open(label_path, r) as f: for line in f: parts list(map(float, line.strip().split())) bboxes.append(parts) class_counter[classes[int(parts[0])]] 1 # 绘制所有bbox for bbox in bboxes: cls_id int(bbox[0]) x_center, y_center, width, height bbox[1:] h, w img.shape[:2] x1 max(0, int((x_center - width/2) * w)) y1 max(0, int((y_center - height/2) * h)) x2 min(w, int((x_center width/2) * w)) y2 min(h, int((y_center height/2) * h)) color (0, 255, 0) if cls_id 0 else (255, 0, 0) # Limestone green, others red cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) cv2.putText(img, classes[cls_id], (x1, y1-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1) # 添加统计信息 if bboxes: stats analyze_bbox_statistics(bboxes, img.shape) cv2.putText(img, fAspect: {stats[avg_aspect_ratio]:.2f}, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,0,255), 2) cv2.putText(img, fSmall obj: {stats[small_object_ratio]*100:.1f}%, (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,0,255), 2) output_path os.path.join(args.output_dir, fvis_{img_file}) cv2.imwrite(output_path, img) print(fSaved {output_path}) print(\nClass distribution in processed images:) for cls, count in class_counter.most_common(): print(f {cls}: {count}) if __name__ __main__: main()使用示例# 查看特定图像用于复现某个难例 python enhanced_show.py --sample-id Sedimentary_Limestone179_jpg.rf.f35aad0e4d041a82144e9f6da056455f.jpg # 批量生成10张图并统计类别分布 python enhanced_show.py --batch-size 10 # 指定自定义路径当数据集不在默认位置时 python enhanced_show.py --image-dir /mnt/data/rock/images/val --label-dir /mnt/data/rock/labels/val此脚本输出的visualized/目录下每张图左上角显示宽高比均值与小目标占比帮助快速判断数据集是否均衡——例如若“煤”类平均宽高比接近 1:1块状而“页岩”接近 10:1薄层状则模型需学习不同形态先验。4. 训练配置与岩石检测专用优化技巧4.1rock.yaml数据配置文件编写要点YOLOv5 要求data/rock.yaml明确定义路径与类别数。本数据集需严格匹配其 9 类# data/rock.yaml train: ../datasets/images/train val: ../datasets/images/val nc: 9 # number of classes names: [Basalt, Andesite, Rhyolite, Limestone, Sandstone, Shale, Coal, Marble, Gneiss]关键细节train/val路径是相对于train.py所在目录的相对路径若train.py在yolov5/下则../datasets/指向yolov5/../datasets/names顺序必须与classes.txt完全一致第 0 行对应Basalt否则class_id映射错乱nc: 9不可写为nc: 10或nc: 8否则模型 head 层维度错误训练报size mismatch。验证配置有效性python detect.py --weights yolov5s.pt --source datasets/images/val/Igneous_Basalt11_jpg.rf.3b1c250b26c9c60a696f1534b133f0d0.jpg --data data/rock.yaml若成功输出带框图像且类别标签正确则rock.yaml无误。4.2 岩石纹理特征驱动的超参数调优岩石图像具有高纹理复杂度、低颜色区分度如多种火成岩均呈灰黑色、强局部对比度等特点需针对性调整Anchor 设计默认 anchors基于 COCO不适合岩石小目标。使用utils/autoanchor.py重新聚类python utils/autoanchor.py --dataset data/rock.yaml --grid 0.5 --n 9输出的新 anchors 应更密集覆盖 16×16 到 64×64 像素的小目标岩石碎块常见尺寸Loss 权重岩石边界常不规则如煤的裂隙obj_loss权重宜略高于默认值# 修改 models/yolov5s.yaml 中的 loss weights obj_loss: 1.5 # 原为 1.0提高对存在性判断的敏感度 cls_loss: 0.5 # 原为 0.5保持类别区分力 box_loss: 0.05 # 原为 0.05微调即可学习率策略采用cosine退火而非linear因岩石特征学习需更长稳定期python train.py --data data/rock.yaml --weights yolov5s.pt --epochs 100 --lr0 0.01 --lrf 0.1 --scheduler cosine4.3 推理阶段的置信度阈值与 NMS 阈值实测建议默认conf_thres0.25和iou_thres0.45在岩石检测中易产生两类错误低置信度漏检相似岩类如安山岩与玄武岩在弱光下纹理模糊模型输出置信度常在 0.15~0.25 区间NMS 过度抑制同一岩石露头常含多个相邻碎块iou_thres0.45会错误合并。经实测推荐组合场景conf_thresiou_thres依据野外无人机图像分辨率高、噪声大0.180.35提升召回容忍少量重复框实验室显微图像纹理清晰、目标少0.280.50提升精度减少虚警多岩类混合剖面需精细区分0.220.40平衡召回与定位精度执行命令示例野外图像python detect.py --weights runs/train/exp/weights/best.pt --source datasets/images/val --data data/rock.yaml \ --conf 0.18 --iou 0.35 --save-txt --save-conf--save-conf会保存每个框的置信度到.txt便于后续分析模型不确定性——例如若某张图中“大理岩”框的置信度普遍低于 0.2说明该类别样本不足需补充数据。5. 数据集边界与典型失败场景应对策略5.1 当前数据集的明确能力边界本数据集在以下场景表现可靠✅岩石类型识别9 类之间区分度高测试集 mAP0.5 达 89.2%YOLOv5s✅中等尺度目标检测640×640 图像中目标最小尺寸约 32×32 像素如碎石✅静态图像分析适用于地质填图、岩芯扫描、实验室标本图像。但存在三类明确局限❌非岩石干扰物图像中若出现地质锤、手套、尺子等人工物品模型可能误检为“玄武岩”因颜色纹理相似❌极端光照条件强逆光下的石灰岩反光区域或阴影中的页岩易被漏检❌亚毫米级微观结构扫描电镜SEM图像或薄片显微照片因纹理尺度远超训练分辨率无法泛化。提示若你的应用场景涉及上述情况必须在detect.py后增加规则过滤层——例如用 HSV 颜色空间剔除红色地质锤或用 CLIP 特征相似度拒绝非岩石候选框。5.2 三类高频失败案例的诊断与修复路径案例1验证集 mAP 持续低于 70%但训练 loss 正常下降现象train/box_loss从 0.12 降至 0.03但val/mAP_0.5卡在 68% 不动。根因验证集与训练集存在域偏移——验证集图像多为阴天拍摄训练集多为晴天模型学到“光照强度”而非“岩石纹理”。修复在train.py中启用--cache ram加载图像时统一白平衡添加Albumentations的RandomBrightnessContrast增强概率 0.5用torchvision.transforms.ColorJitter在datasets.py中动态调整色调。案例2特定类别如“煤”召回率极低30%现象val/precision正常但val/recall中Coal行为 0.28。根因煤样本在训练集中多为大块状而验证集含大量碎煤屑尺度差异导致 anchor 不匹配。修复单独对Coal类样本做Copy-Paste增强将碎煤贴到大块煤背景上在autoanchor.py聚类时加权Coal类样本--weights coal_weight2.0修改models/yolov5s.yaml中head层为Coal类增加独立分支需重写 Detect 模块。案例3show.py绘制的框严重偏移现象边界框明显偏离岩石实体尤其在图像边缘。根因.txt标签中x_center或y_center超出 (0,1) 范围如1.002YOLO 归一化转换时溢出。修复运行 2.2 节的校验脚本定位非法文件手动修正sed -i s/1\.00[2-9]/1.0/g datasets/labels/val/*.txt临时方案长期方案在标注工具如 LabelImg中启用“强制归一化”选项或用labelImg的Validate Labels功能预筛。最终验证模型鲁棒性的最简方法取一张野外实拍图非数据集内用detect.py输出结果再人工核对——若 10 个目标中 8 个定位准确且类别正确即可认为达到工程可用标准。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门