ARTICLE DETAIL

资讯详情

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

YOLOv8小样本训练:132张火星月球陨石坑检测数据集实战

YOLOv8小样本训练:132张火星月球陨石坑检测数据集实战 简介这是一份面向计算机视觉与行星科学领域学习者的陨石坑检测数据集可用于训练和评估YOLO、Faster R-CNN等目标检测模型。数据围绕火星与月球地表影像中的撞击坑类别keng进行标注共132张JPG原图配套132个VOC格式XML文件和134个TXT文件其中XML与TXT分别对应Pascal VOC与YOLO两种主流训练格式便于不同框架直接读取。压缩包共398个文件整体大小仅10.27MB数据量轻量但标注完整所有标注均由labelImg人工绘制矩形框完成单一类别共包含1044个真实框。目前已有243人学习使用适合作为入门目标检测或行星地貌识别的练习数据集下载后可直接划分训练集与验证集无需额外格式转换能帮助读者快速跑通数据加载与模型训练流程。1. 火星月球陨石坑检测数据集132张图能做什么拿到名为“火星月球陨石坑检测数据集VCOYOLO格式132张1类别.7z”的压缩包第一反应往往是132张图能训练出什么像样的模型实际体验是这个规模足够验证从数据准备、目标检测训练到评估的整个闭环关键是学会在小样本上控制过拟合。数据集已经给出YOLO格式的标注省掉了从KITTI或VOC转换的步骤但解压方式、目录组织、训练参数和数据划分仍然会直接影响结果。下面我按处理一个真实训练任务的顺序把这套流程拆开讲。2. 解压 .7z 包并确认 VCOYOLO 数据集的真实结构2.1 Linux 下用 7z 命令行解压与校验哈希拿到 .7z 包后第一步是在 Linux 下完成安装、完整性和解压。很多服务器上默认没有7z工具需要先装p7zip。如果你只是临时用也可以直接解压但我习惯先把内容列出来确认内部目录是否符合预期避免解压到错误层级。# 安装 p7zip 工具包Debian/Ubuntu 下执行 sudo apt update sudo apt install -y p7zip-full # 列出压缩包内容不实际解压先看目录结构 7z l 火星月球陨石坑检测数据集VCOYOLO格式132张1类别.7z # 计算整个压缩包的 SHA256 哈希值用于和发布方提供的数值比对 sha256sum 火星月球陨石坑检测数据集VCOYOLO格式132张1类别.7z这里的7z l是 list 的简称只显示压缩包内的文件列表不会产生解压文件。-o参数用于指定输出目录注意如果目录不存在7z 会报错可以先mkdir。sha256sum输出了一个 64 位十六进制字符串这个串必须与下载页或数据卡上给出的值一致否则说明文件在传输过程中损坏强行解压可能得到不完整的标签文件。解压命令mkdir -p crater_dataset 7z x 火星月球陨石坑检测数据集VCOYOLO格式132张1类别.7z -o./crater_datasetx是 extract-o指定输出目录且目录名后不要有空格。解压完成后用tree crater_dataset查看结构。我见过不少数据集会给出images/和labels/两个顶层目录也可能有raw/和annotations/之类。这里既然标题里同时出现 VCO 和 YOLO通常可以理解为VCO 是数据采集时的任务标识或传感器来源YOLO 表示最终标签文件已经按 YOLO 格式归一化。我们实际训练时只需要关心.jpg和.txt文件能否一一对应。2.2 核对图片尺寸、标签格式与边界值解压后不要急着训练先写一个 Python 脚本统计图数量、格式和尺寸再抽查几个标签文件内容。from pathlib import Path from PIL import Image import random img_dir Path(crater_dataset/images) label_dir Path(crater_dataset/labels) imgs sorted(img_dir.glob(*.jpg)) print(JPG 图片数量:, len(imgs)) # 随机挑一张图看尺寸 sample Image.open(random.choice(imgs)) print(随机图片尺寸:, sample.size) # 找一个有对应标签的图打印前几行标签 for imp in imgs: lab label_dir / (imp.stem .txt) if lab.exists(): print(标签文件:, lab) for line in lab.read_text().strip().splitlines()[:3]: print(line) breakYOLO 标签每一行由 5 个数组成class_id x_center y_center width height其中x_center、y_center、width、height都是相对于图片宽度和高度的归一化值范围应该在 0 到 1 之间。这个数据集的类别数为 1所以class_id只会有 0。如果你看到class_id出现 1 或更大的值说明标注文件和应用描述不一致直接训练会出问题。这里再补一个边界检查因为有些标注工具会导出负数或超过 1 的坐标YOLO 训练时不会被报错但损失值会异常偏高。bad_count 0 for lab in label_dir.glob(*.txt): lines lab.read_text().strip().splitlines() for line in lines: parts line.split() if len(parts) ! 5: bad_count 1 continue xc, yc, w, h map(float, parts[1:]) if not (0.0 xc 1.0 and 0.0 yc 1.0 and 0.0 w 1.0 and 0.0 h 1.0): bad_count 1 print(越界或格式错误的标签行数:, bad_count)统计框面积也很有用陨石坑有大有小如果大量框面积集中在0.01以下说明图像里的目标更多是小陨石坑后续训练时imgsz不能设得太小。3. 将 VCO/YOLO 混合目录重构成 YOLOv8 训练目录3.1 认识 YOLO 训练集的标准目录结构虽然标签已经是 YOLO 格式但 YOLOv8 的detect train默认要求数据集按固定目录组织train/images、train/labels、val/images、val/labels并且每个图片和标签的文件名必须相同只是扩展名不同。原始压缩包内部结构未必符合这个约定所以我们要先做一次重整理。常见做法是在工程目录下新建crater_yolo/把图片和标签按 train/val 两个集合复制过去然后写一个data.yaml描述路径和类别。这里的拆分比例我习惯用 8:2 或 9:1因为只有 132 张图验证集太小会导致评估不稳定如果你有充裕时间更建议用 5 折交叉验证来产出稳定指标。3.2 用 Python 脚本完成数据划分和 yaml 生成下面脚本先把 132 张图随机打乱然后按 20% 比例切出验证集保持图片与标签的对应关系。随机种子必须固定不然下次运行会得到不同划分影响实验可重复性。import random import shutil from pathlib import Path src_img Path(crater_dataset/images) src_label Path(crater_dataset/labels) out_root Path(crater_yolo) imgs sorted(src_img.glob(*.jpg)) random.seed(42) random.shuffle(imgs) val_num int(len(imgs) * 0.2) val_imgs imgs[:val_num] train_imgs imgs[val_num:] for split, image_list in [(train, train_imgs), (val, val_imgs)]: (out_root / split / images).mkdir(parentsTrue, exist_okTrue) (out_root / split / labels).mkdir(parentsTrue, exist_okTrue) for img_path in image_list: label_path src_label / (img_path.stem .txt) if not label_path.exists(): continue shutil.copy(img_path, out_root / split / images / img_path.name) shutil.copy(label_path, out_root / split / labels / label_path.name) if len(train_imgs) 0: continue逻辑说明先创建目标目录然后逐个复制。img_path.stem .txt是 YOLO 标签命名规则如果原标签文件名后缀不是.txt需要再单独处理。另外如果发现某些图片没有对应标签脚本会跳过但应该统计并打印出来避免最后训练时报数据不匹配。接着生成data.yaml# crater_yolo/data.yaml path: /absolute/path/to/crater_yolo # 改成你自己的绝对路径 train: train/images val: val/images nc: 1 names: 0: crater这里的path字段在 YOLOv8 中必须是一个绝对或可解析的相对路径train和val是相对于path的路径。如果你把path写错训练时会提示找不到图片目录。nc是类别数names的索引从 0 开始和标签文件里的class_id对应。3.3 检查标签与图像是否一一对应重整理完成后还要做一次一致性校验。我一般会写一个快速脚本找出train/images里有图像但train/labels里没有对应.txt的样本以及反过来有标签但没有图片的样本。from pathlib import Path for split in [train, val]: img_dir Path(crater_yolo) / split / images lab_dir Path(crater_yolo) / split / labels img_names {p.stem for p in img_dir.glob(*.jpg)} lab_names {p.stem for p in lab_dir.glob(*.txt)} missing_label img_names - lab_names missing_image lab_names - img_names if missing_label: print(f{split} 缺少标签的图片数量:, len(missing_label), list(missing_label)[:3]) if missing_image: print(f{split} 缺少图片的标签数量:, len(missing_image), list(missing_image)[:3])这个脚本打印出来的集合在数据清洗时非常关键。尤其是从 VCO 等异源数据转换过来的数据集图片名和标签名可能存在后缀不一致、空标签文件等坑。如果出现空.txtYOLO 训练时会直接报错或忽略该图导致有效样本更少。4. 用 YOLOv8 在 132 张图上训练陨石坑检测模型4.1 安装 YOLOv8 并跑通最小训练命令这个数据集只有 132 张图我推荐直接用 YOLOv8 的n版本预训练权重作为起点而不是从随机权重开始训练。迁移学习能大幅缩小模型在小数据集上收敛的难度。pip install ultralytics yolo detect train \ datacrater_yolo/data.yaml \ modelyolov8n.pt \ epochs200 \ imgsz640 \ batch16 \ patience30 \ projectcrater_result \ nameexp1参数说明modelyolov8n.pt会从 ultralytics 官方地址下载权重如果服务器无法访问下载源需要手动把权重文件放到当前目录并直接把yolov8n.pt替换为本地路径。imgsz640是输入图像短边缩放到 640对大多数遥感图像来说够用。batch16在 8GB 显存上可以跑如果显存不足可降到 8。patience30表示验证集 mAP 超过 30 轮没有提升就提前停止这对小数据集很有必要因为模型很容易在几十轮后过拟合。训练结束后crater_result/exp1/下会生成weights/best.pt和last.pt以及其他训练曲线图。用best.pt做后续推理和评估。4.2 小数据集必调的 5 个训练参数132 张图属于典型小样本场景直接套默认参数很容易过拟合。下表给出我在这类任务里常用的调整方向。参数默认值建议值调整理由seed042固定数据划分和初始化保证实验结果可复现epochs100200配合早停宁可设大再提前停止mosaic1.00.5马赛克增强在小数据集上可能挤压原始特征降低比例更稳fliplr0.50.3陨石坑左右翻转没问题但过多会缩小有效信息量optimizerautoAdamW小样本下 AdamW 比 SGD 收敛更快且对学习率不敏感在 YOLOv8 中这些参数可以直接追加到训练命令后面例如mosaic0.5 fliplr0.3 optimizerAdamW。如果你不了解每种增强对陨石坑检测的影响建议先做一组全默认和一组调整参数的对照实验观察验证集损失是否在后期反弹。4.3 从训练日志判断模型是否过拟合训练过程中终端会打印每个轮次的box_loss、cls_loss、dfl_loss和验证集指标。这里的box_loss控制预测框回归误差cls_loss控制分类误差dfl_loss是回归分布损失。如果你看到验证集损失先降后升而训练集损失还在下降就是过拟合的典型信号。在小数据集上我更依赖训练日志中的val_cls_loss而不是只盯 mAP。因为验证集只有几十张图单张图片的误检就会让 mAP 产生明显波动。把patience30设好剩下的交给早停机制不需要人为在几百轮里反复中断。5. 小样本模型的三步验证法用留出图检查泛化能力训练完成后不要只看验证集 mAP。很多初学者在 132 张图上得到 0.8 mAP就认为模型已经能用于火星或月球影像实际上可能只是记住了训练集。这里我分享一个三步验证法每一步都很简单但很有效。第一步用best.pt在训练集上跑一次评估确认模型没有欠拟合yolo detect val modelcrater_result/exp1/weights/best.pt datacrater_yolo/data.yaml splittrain如果训练集上的 mAP 都低于 0.5说明模型容量不够或训练未收敛需要先调整学习率和训练轮数。第二步在验证集上跑评估并保存预测结果到图片yolo detect predict modelcrater_result/exp1/weights/best.pt \ sourcecrater_yolo/val/images \ save_txtTrue \ save_confTrue \ conf0.25 \ projectval_predsave_txtTrue会把每张图的预测框写为 YOLO 格式文本save_confTrue在文本里追加置信度conf0.25过滤掉低置信度框。然后逐张看图重点检查两类错误漏检的陨石坑和误检的岩石阴影。第三步找 10 到 20 张不在这 132 张图内、但成像条件相近的火星或月球表面图像用同样的命令跑预测。这里不需要额外标注只需要用眼睛判断检测结果是否合理地标注在陨石坑上。如果大量框落在陡坡或暗区边缘说明模型学到的是亮度对比特征而不是陨石坑结构特征这时应该考虑补充更多光照变化明显的样本。这个三步验证法不用修改任何训练代码但能快速暴露出小样本模型最典型的记忆问题。把验证集预测结果保存下来逐张检查漏检和误检是这类小数据集里最容易发现问题的步骤。本文还有配套的精品资源点击获取
返回列表