火星月球陨石坑小样本检测:YOLO数据集训练实战指南
发布时间:2026/10/2 18:16:19来源:尧图网络
简介面向火星、月球陨石坑检测任务的高质量图像数据集适合计算机视觉学习者、算法工程师以及开展行星表面目标识别研究的科研人员使用。数据经过统一标注整理可直接接入主流目标检测训练流程节省人工采集与标注时间。压缩包内共398个文件以jpg图像、VOC格式xml标注和YOLO格式txt标注三类组成其中标注文件132个、图片132张对应单类别“keng”累计矩形框标注1044个标注工具为labelImg坐标信息完整且合理。包体仅10.27MB目录结构简洁便于快速解压后用于模型训练、验证或算法对比。当前已有244人学习下载。数据集虽不承诺模型精度但能提供准确规范的标注基础尤其适合需要快速验证陨石坑检测思路、开展小样本目标检测实验或进行数据格式转换练习的读者。1. 火星月球陨石坑检测数据集VCOYOLO格式132张1类别小样本检测的完整落地样本火星月球陨石坑检测数据集VCOYOLO格式132张1类别.7z单看名字就知道这是一个典型的小样本目标检测包132张行星表面影像、YOLO格式的txt标注、类别只留了一个“陨石坑”。很多人拆开这种包后的第一反应是数据太少没法训练真实情况恰好相反这类小数据集一旦配上预训练权重和正确的增强策略完全可以训练出一个能用的陨石坑初筛模型甚至比盲目堆数据更考验工程细节。这篇笔记就按我实际处理这类地外天体影像数据集的路子从解压校验一路写到训练、避坑和可信度验证给想拿YOLO做行星遥感检测的人一条能直接复现的路径。2. 解开7z包并检查VCO标注流程、命令与最小校验脚本拿到手第一件事不是急着训练而是把7z包完整解开确认里面的影像和txt标注是干净成对的。行星表面影像数据集经常从公开测绘图源里截出来人工标注毛病恰恰出在标注这一层txt文件名和jpg对不上、坐标越界、空标注文件每一样都能让后续训练静默翻车。这章把解压、格式解读和校验脚本一次讲完。2.1 7z解压与完整性校验标题里带7z后缀说明作者压缩时选了压缩率更高的7-Zip格式而不是zip。Linux下面解压要先装p7zip工具包装完用三行命令完成“测试完整性→解压→确认目录结构”sudo apt install -y p7zip-full 7z t MarsMoon_Craters_VCO_YOLO_132.7z 7z x MarsMoon_Craters_VCO_YOLO_132.7z -o/data/datasets/第一条命令装工具第二条命令做完整性测试。常被忽略的是7z t这一步它会把压缩包里每个文件解压到内存做CRC校验能提前暴露坏块。行星影像图片通常有好几MB一张如果下载过程中断过解压到一半才报错的情况不少见。第三条命令里的-o参数指定解压目标目录注意-o后面直接跟路径不能加空格。解压完成后确认一下目录结构常见做法是images/目录放jpg或pnglabels/目录放同名txt。如果压缩包里还带了一层目录比如MarsMoon_Crater/train/这种嵌套结构我一般会手动理平再继续后面会讲为什么目录层级越简单越少出错。Windows环境下解压同理用7-Zip图形界面右键解压路径里别带中文VCO这类数据集里偶尔会有从国外图源保留下来的长文件名中文路径加长文件名组合在一起后续Python脚本读文件时容易出编码问题。2.2 VCO类别不是废话YOLO标注的归一化坐标这个数据集的类别名叫VCO很容易和射频领域里那个压控振荡器Voltage Controlled Oscillator搞混同行看到缩写的反应大多是先愣一下。在行星遥感这个语境下VCO更像是作者自定义的类别标签有的解释把它收进火山口观测Volcanic Crater Observation的缩写实际训练时你完全可以把它改成crater。真正要紧的不是VCO这个字符串本身而是YOLO格式背后那套归一化坐标规则。YOLO的txt标注是纯文本一行一个目标每行由5个字段组成字段之间用空格分隔字段含义取值范围第1字段类别编号VCO在1类别数据集中固定为00第2字段目标中心点的x坐标除以图片宽度后归一化0~1第3字段目标中心点的y坐标除以图片高度后归一化0~1第4字段目标框宽度除以图片宽度后归一化一般小于1第5字段目标框高度除以图片高度后归一化一般小于1比如一行内容为0 0.521 0.438 0.124 0.086意思是图片中心点偏右上一点的位置有一个陨石坑框宽占整张图片宽度的12.4%高占8.6%。数据集的作者通常已经把像素坐标除以图片宽高转换好了我们拿到手要做的第一件事反而是反向校验把归一化坐标重新乘回图片宽高看框是不是真的落在陨石坑边缘上。2.3 用Python脚本画框检查越界、空标注和对应关系一次筛干净校验标注最直接的办法是把框画回原图上。我写过一个检查脚本基本逻辑是遍历labels目录下每个txt检查行数、字段数、坐标范围再把可疑样本画框导出import cv2 from pathlib import Path img_dir Path(images) label_dir Path(labels) for txt in label_dir.glob(*.txt): lines txt.read_text().strip().splitlines() if not lines: print(f[空标注] {txt.name}) continue img_path img_dir / (txt.stem .jpg) if not img_path.exists(): print(f[缺图片] {txt.name}) continue img cv2.imread(str(img_path)) h, w img.shape[:2] for idx, line in enumerate(lines): parts line.split() if len(parts) ! 5: print(f[字段数错误] {txt.name} 第{idx 1}行{line}) continue cls, cx, cy, bw, bh parts cx, cy, bw, bh map(float, (cx, cy, bw, bh)) if cx 0 or cx 1 or cy 0 or cy 1: print(f[中心越界] {txt.name} 第{idx 1}行中心点不在图内) continue x1 int((cx - bw / 2) * w) y1 int((cy - bh / 2) * h) x2 int((cx bw / 2) * w) y2 int((cy bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 2) cv2.imwrite(fcheck_{txt.stem}.jpg, img)这个脚本里两个细节值得注意。第一判越界只看中心点不看框的宽高。陨石坑如果出现在图片边缘框有一半探出画面是正常的YOLO训练时会自动截断但中心点越界一定意味着标注坐标坏了这种样本必须删掉或修正否则训练时的匹配逻辑会错乱。第二图片名用txt.stem去对应也就是把txt文件名去掉后缀去images目录里找同名jpg这样能立刻暴露文件名不一致的问题。有的数据集混用了png和jpg脚本里硬编码jpg会把png图片全部判定为缺图实际操作时改成img_path img_dir / (txt.stem (.png if (img_dir / (txt.stem .png)).exists() else .jpg))更稳妥。提示如果你发现某个包的标注里面用的是逗号而不是空格把脚本里的line.split()改成line.split(,)即可。YOLO官方读取标注时默认按空白字符拆分纯空格是标准。校验完这一轮基本能确认数据集干不干净。接下来才进入目录划分和训练配置这是让132张图真正发挥作用的第一步。3. 把132张图按YOLO格式喂给YOLOv8目录划分、配置文件与训练命令数据集干净了下一步是把132张图拆成训练集和验证集。这步看似简单却是新手翻车率最高的地方。行星表面影像不像通用物体检测数据集那样每张图都有密集目标132张里可能还掺着几张只带一个框、甚至完全没有框的负样本划分策略会直接影响后面mAP曲线的真实性。3.1 数据集目录设计与8:2划分Ultralytics YOLO读取数据时要求固定的目录结构我通常按下面的方式组织mkdir -p /data/datasets/craters/{images/{train,val},labels/{train,val}}最终结构是images/train放训练图images/val放验证图labels目录跟images同级且保持相同的train/val层级。YOLO查找标签的规则是找到图片路径后把images替换成labels把图片扩展名替换成.txt。所以目录骨架必须对齐images/train对应labels/train漏建任何一个子目录都会导致训练时“图能找到、标签全丢”。划分本身用脚本做不要手动拖文件。手动拖容易把图片和标签拖乱而脚本能把对应关系锁死import random import shutil from pathlib import Path img_src Path(images) lb_src Path(labels) img_train Path(/data/datasets/craters/images/train) img_val Path(/data/datasets/craters/images/val) lb_train Path(/data/datasets/craters/labels/train) lb_val Path(/data/datasets/craters/labels/val) imgs sorted(img_src.glob(*.jpg)) random.seed(42) random.shuffle(imgs) val_count max(1, int(len(imgs) * 0.2)) val_imgs imgs[:val_count] for img in val_imgs: shutil.move(str(img), img_val / img.name) txt lb_src / (img.stem .txt) if txt.exists(): shutil.move(str(txt), lb_val / txt.name)这段代码做了三件事固定随机种子、按比例切分、同步迁移同名标签。random.seed(42)保证每次运行划分结果一致这点在复现实验结果时很重要种子不同导致验证集不同同一个模型跑出两个差很多的mAP会让人误判模型好坏。shuffle把图片顺序打乱避免原本连续拍摄的影像聚在同一个子集里。只对验证集图片显式move标签而训练集标签留在原地逻辑上更省事验证集挑出来之后剩下的自然都是训练集。有个容易忽略的点如果数据集里的图片既有jpg又有pngglob(*.jpg)会把png全部漏掉。保守做法是先读目录里所有图片扩展名再统一收集。另外132张按8:2分出来是106张训练、26张验证这个量级的验证集mAP抖动会非常大后面章节会专门讲patience参数该怎么配合这种抖动。3.2 写data.yamlnc1与类别名必须和标注一致Ultralytics YOLO用yaml文件描述数据集路径和类别信息。常见写法如下path: /data/datasets/craters train: images/train val: images/val nc: 1 names: 0: VCOpath字段是数据集的绝对根路径train和val是相对根路径的子目录。这里有个坑path如果写相对路径YOLO是拿当前工作目录去拼的训练命令换个终端执行位置就找不到数据。我一般固定用绝对路径一劳永逸。nc是类别数量这个数据集只有陨石坑一类所以是1。names里把编号0命名为VCO与标注文件里的类别编号对齐这里编号必须从0开始顺序不能乱。有人在names里写成crater训练照样能跑因为YOLO训练阶段只看标注编号、不看名字名字只在可视化时显示在混淆矩阵和输出图上。但从规范角度我建议跟数据集标注保持一致用VCO这样验证阶段画出来的混淆矩阵标签不会让人困惑。注意data.yaml的编码必须是UTF-8且无BOM头。Windows下用记事本编辑保存成带BOM的格式YOLO读取时会在类别名开头多出一个不可见字符报错信息长得很像配置文件路径写错。3.3 训练命令的三组关键参数epochs、imgsz、batch配置就绪后训练命令比大多数人想象中短yolo detect train \ data/data/datasets/craters/data.yaml \ modelyolov8n.pt \ epochs300 \ imgsz640 \ batch8 \ device0 \ patience50 \ project/data/runs \ namecraters_exp1这组参数里最需要动脑的是epochs、imgsz和batch。先说epochs。YOLOv8的默认值只有100对小样本数据集来说100轮通常不够把预训练特征迁移到陨石坑上很多模型跑到第80轮时val曲线还在涨。我一般起步就是300跑完看损失曲线再决定要不要二次训练。imgsz用640还是960取决于目标在图片里占据的像素尺寸。如果标注的框普遍小于图片宽度的5%也就是只有三四十个像素640的输入尺寸在多次下采样后陨石坑只剩个位数像素检测头几乎学不到细节这种情况把imgsz提到960会明显改善。但imgsz不是越大越好132张小数据集配960输入过拟合风险也会同步上升。先看数据再定输入尺寸不要无脑拉满。batch受显存限制8G显存跑yolov8n用batch8比较稳batch太小BN层的统计量会跳得厉害这个问题在避坑章专门展开。如果你手上有V100或A100这种大显存卡batch可以拉到32甚至更大但学习率也要跟着调高显存只有6G的卡就老老实实batch4。patience50的含义是连续50轮验证集指标不提升就早停小样本验证集波动大patience设太小会把训练提前掐死。3.4 训练曲线怎么看loss落不下去先查数据而不是调参训练跑起来之后终端会滚动输出box_loss、cls_loss、dfl_loss三项损失。很多新人看到loss不降就急着调学习率其实在小样本数据集上最先该看的是这三条曲线的相对走势。box_loss用的是CIoU损失管预测框和真实框的重合度cls_loss是分类损失管“有没有把陨石坑认成陨石坑”dfl_loss是分布焦点损失管框边缘的精细程度。对1类别数据集来说cls_loss比另外两项更容易出问题只有正反两类模型很容易快速饱和之后进入对背景纹理的死记硬背。判断训练是否健康的经验是前30个epochtrain和val的loss一起下降说明模型在学通用特征50轮以后如果train loss继续降、val loss开始反弹就是过拟合信号这时候回去改数据增强比改网络结构更有效。如果train和val从一开始就都不降先回去检查标注格式多半是前一章校验脚本能查出来的问题。训练结束后runs/craters_exp1/目录里会生成weights/best.pt和last.pt。best.pt是验证集指标最高时的权重小样本训练里best的选取受验证集噪声影响很大后面避坑章会讲怎么应对。接下来要做的是把增强和超参再往小样本方向压一压。4. 小样本检测不翻车预训练权重、增强策略与超参调法132张图直接从头训练一个检测器是必死路径但借力预训练权重之后这条路立刻变成可行的。这一章集中讲小样本检测的几个关键杠杆选什么预训练权重、开哪些增强、调哪几个超参以及什么时候应该冻结主干。4.1 预训练权重选择为什么用nano模型而不是largeYOLOv8的预训练权重分n、s、m、l、x几个档次小样本场景里我几乎只推yolov8n.pt。理由分两层。第一层是参数量nano模型大约只有3百万参数large模型超过4000万参数在132张图上大模型有足够容量把训练集的每个坑位都背下来表现出的症状就是训练集loss降到极低、验证集却一塌糊涂。第二层是BN的稳定性模型越小每层的通道数越少批归一化统计量在小batch下更容易保持稳定。预训练权重的获取不用自己折腾。第一次执行训练命令时Ultralytics会自动下载对应权重文件到当前目录如果机器在内网访问不了外网就去官方发布页手动下载yolov8n.pt放进项目根目录然后训练命令里的modelyolov8n.pt会优先读取本地文件。下载时要认准文件名末尾的nyolov8s.pt虽然也能跑但在这个数据规模下属于给自己找麻烦。预训练权重解决的是“起步”问题模型从一开始就懂得怎么提取边缘、纹理、明暗分界这些低层特征陨石坑和这些通用视觉特征高度相关所以只需要在预训练基础上做轻量微调。这也是小样本检测唯一可靠的范式。4.2 数据增强mosaic、mixup和最后10个epoch的自动关闭数据增强是小样本训练的第二个命脉。Ultralytics默认会开mosaic和mixup但对行星影像要谨慎。mosaic把四张图拼成一张强迫模型在更复杂的背景下定位目标好处是变相增大了样本量坏处是行星表面有大面积相似纹理mosaic拼接缝会制造出大量伪边界。我见过不止一次模型把拼接缝当陨石坑检测出来。Ultralytics YOLO有一个容易被忽略的机制训练的最后10个epoch会自动把mosaic和mixup关掉。这是个保底策略防止增强太强导致模型在收敛阶段还在看拼接图。日志里如果看到最后10个epoch的mosaic值变成0那不是bug是官方设计。如果想从头到尾都关掉mosaic在训练命令里加mosaic0.0即可但代价是样本多样性减少132张的训练集会更容易过拟合。对陨石坑这种近似圆形的小目标我的增强配置倾向保守mosaic: 0.5 mixup: 0.2 fliplr: 0.5 scale: 0.5 hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4 degrees: 0.0fliplr0.5是水平翻转行星影像没有“左和右”的语义差异翻转后目标仍然是合法的陨石坑这是性价比最高的增强。degrees0.0值得解释一下陨石坑形态上各向同性按理旋转也合法但实际上标注框是轴对齐矩形旋转45度后“框住圆形”这件事的语义没变难的是让模型同时学会旋转后的定位小样本很难支撑这个学习量所以干脆不转。scale0.5控制缩放增强幅度太大容易让标注框和缩放后的目标错位0.5是一个不过分的范围。4.3 小样本必调参数从lr0到patience的推荐表比起翻默认参数表小样本场景真正决定成败的超参其实就这几个参数推荐值说明lr00.005默认0.01对132张图偏高起步减半更稳lrf0.01余弦退火末端学习率保持默认即可patience50~80验证集抖动大太小的值会早停epochs300默认100不够小样本要多轮微调warmup_epochs3.0小batch时warmup可以拉到5让BN预热weight_decay0.0005保持默认必要时加到0.001增强正则label_smoothing0.05单类别模型容易过度自信轻度平滑更稳freeze0标注质量差时再开后面小节展开lr0从0.01降到0.005是小样本最便宜的一次改动。预训练权重已经处于一个较好的局部最优附近学习率太大容易一步跨出好区域。label_smoothing0.05容易被忽视单类别数据集中模型对“这是陨石坑”的置信度会快速冲到0.9以上平滑一下让输出概率不要那么绝对在验证集上往往能换来几个点的召回率。batch和lr是联动的batch从8涨到32lr0也应该相应上调否则模型更新步长相对变小收敛变慢。这条经验在大显存卡上尤其要注意。4.4 迁移学习的另一种变体冻结主干微调如果训练损失一路降、验证损失却抖得厉害除了增强不足还可以考虑冻结主干。Ultralytics的freeze参数接受一个整数或列表比如freeze10表示冻结模型前10层。这几层在预训练模型里负责提取边缘、角点、简单纹理这些特征在ImageNet和行星影像之间是通用的没必要让小样本训练去动它们。实际操作方式是在训练命令里追加yolo detect train \ data/data/datasets/craters/data.yaml \ modelyolov8n.pt \ epochs300 \ imgsz640 \ batch8 \ freeze10 \ project/data/runs \ namecraters_exp2冻结主干的代价是模型对陨石坑特有的纹理特征适应变慢收益是训练更稳定、过拟合更晚出现。我一般在标注量低于200张、或者校验阶段发现框的边界和真实陨石坑边缘对不齐时使用这招。如果冻结主干之后发现训练loss迟迟降不下去说明陨石坑特征和预训练通用特征差异比预期大把freeze从10减到5再试。增强、超参、冻结三者组合完毕接下来要面对的是训练过程中真正让人头皮发麻的报错和玄学现象。5. 避坑7z解压、YOLO格式与训练中的5个高频问题小样本数据集训练十个坑里有八个跟数据格式和超参抖动有关。以下是这几类数据集上反复出现的五个问题每条都按现象、原因、解决三段写照着排查能省下大半天。5.1 7z解压报“密码正确但一直报错”现象压缩包解压到一半7-Zip弹窗提示CRC错误或“数据错误”换成命令行解压也是在同一个文件位置失败有人确认过密码没错但仍然解不出来。原因7z在默认固实模式下任意一个分卷或中间数据块损坏都会导致后续所有文件无法正常解出。另一个常见原因是压缩包被放在U盘或网络共享盘上解压读取过程中io错误被当成数据损坏报出来。解决先对压缩包做一次7z t完整性测试确认坏块位置如果是分卷包确认所有分卷都下载完整分卷名必须是xxx.7z.001、xxx.7z.002这种连续编号。然后把整个压缩包复制到本地SSD用7z x重新解压路径保持纯英文。如果7z t本身就报错不要犹豫重新下载或找发送方要校验哈希。自己压包时同样长个教训重要数据集别加密密码忘掉的后悔药只有爆破132张图重建标注的代价远大于压缩省下的空间。5.2 训练日志里提示“found no labels”现象训练刚开始日志中出现类似found no labels in xxx.jpg的警告或者训练跑完了模型对所有图片都输出空检测框。原因YOLO找标签的规则是“把images替换成labels、把扩展名替换成txt”。常见三道坎一是目录层级不对images/train和labels/train没有对齐二是txt文件名跟图片名不一致图片叫crater_01.jpg标注却叫crater-01.txt三是txt文件确实是空文件一行都没有。解决回到第2章那个校验脚本先统计空txt数量再逐条对比文件名。一个高效做法是写一行shell命令找出“两侧不配对”的文件for f in images/train/*.jpg; do [ -f labels/train/${f##*/%.jpg}.txt ] || echo 缺失: $f done这个命令遍历所有训练图片把jpg后缀换成txt后检查同名文件是否存在不存在就打印出来。行星影像数据集的标注文件有时会从另一个系统导出文件名里藏着空格或全角符号肉眼很难发现脚本一跑就现形。5.3 训练能跑但mAP50一直是0验证集一个框都预测不出来现象loss曲线看起来正常下降val mAP50却始终是0打开验证输出图模型一张图都没检测出陨石坑。原因最常见的原因是标注里的框太小被Ultralytics的默认过滤规则清掉了。YOLO训练前有个预处理步骤会把宽或高小于2像素的标注框移除日志里通常有一行removed N labels。132张图如果拍摄分辨率不高陨石坑标注的像素宽高可能只有十几像素缩放到640输入尺寸后再经过模型的下采样连2像素都不到直接全军覆没。解决把训练命令的imgsz从640提到960同时回看数据里标注框的像素分布。如果陨石坑在原图中就只有十几个像素考虑先用简单插值放大图片两倍再重新标注或者接受检测下限模型只能检出中等以上尺寸的坑极小的坑本身就不是这个分辨率下能稳检的目标。还有一个隐蔽因素值得排查——验证集里如果全是没有标注的负样本mAP永远算不出正样本的得分这种情况属于数据划分问题回第3章把划分脚本重新跑一遍确保验证集包含正样本。5.4 BN崩溃loss突然变成nan或训练前期冲高不降现象训练到十几轮loss突然冲上十几甚至变成nan继续跑下去整个模型输出全乱。日志里还能看到BN层的running_mean出现异常值。原因小batch加高学习率是BN崩溃的标准配方。batch2时BN统计量由两张图计算行星影像纹理又高度相似统计量方差大此时如果lr0还保持默认的0.01模型参数一步更新过大BN的滑动平均直接失稳。解决先把batch提到8显存不允许就换yolov8n这种最小模型然后把lr0降到0.005必要时warmup_epochs从3提到5。如果做过这两步仍然nan检查数据集里是不是有全黑的图片纯色图会让BN计算出的方差接近零触发除零。全黑样本直接删掉或做归一化处理。这套组合拳能解决九成以上的BN崩溃。5.5 混淆矩阵里的格子总合不唯一现象训练完打开confusion_matrix_normalized.png发现每一行的百分比加起来不是100%怀疑是不是bug。原因YOLOv8的混淆矩阵以IoU大于0.5作为匹配依据但同一个真实框可能同时满足多个预测框的匹配条件一个真实目标也可能被重复计入多个格里背景列又把所有未匹配的预测都收了进去。矩阵的数值是逐格归一化的不是按行归一化所以行和不为1是正常显示结果不是计算错误。解决这不是需要修的bug但可以用它做诊断。要确认的地方只有右下角背景列的比例背景列占比高说明模型把大量背景误认成陨石坑对应的应对手段是提升conf阈值或补充负样本图片。如果你想拿到精确的单类指标直接看验证阶段的P、R、mAP50数值更靠谱别在混淆矩阵的行和上钻牛角尖。6. 让132张数据集的检测结果可信混淆矩阵、ONNX导出与阈值筛选模型训练完最后一步是验证它到底学会了陨石坑还是在背训练集。小样本训练最大的风险就是过拟合被mAP数字掩盖这一章讲两个具体验证手段和一个输出技巧。6.1 混淆矩阵判断模型是在“学坑”还是在“背题”训练完成后打开验证输出目录里的confusion_matrix.png。对单类别模型最关键的格子有两个对角线上的“VCO预测为VCO”的召回命中率以及背景列中“真实是背景但被预测为VCO”的误检率。如果背景列的数值超过30%说明模型把行星表面的亮斑、山脊阴影都当成了陨石坑光看mAP可能还觉得不错实际应用时会把大量非目标框进来。一个小样本特有的判断技巧如果训练集loss已经降到接近0而验证集混淆矩阵里的背景误检明显偏高极大概率是过拟合。回看第4章把增强开关重新调一调再训一次。对132张这种体量mAP50比mAP50-95更有参考意义陨石坑框的精细程度本来就不是这类数据的核心诉求粗定位之后做二次分割是更合理的后续路线。6.2 导出ONNX并用阈值筛选小目标信任模型之后把它导出成部署格式yolo export model/data/runs/craters_exp1/weights/best.pt formatonnx imgsz640导出后对没有标注的新影像做推理时我对单类别小样本模型有一个固定习惯把conf阈值从默认的0.25提高到0.35到0.45之间因为小样本模型的背景误检往往集中在0.25到0.35这个低置信度区间宁可用更高阈值丢掉几个边缘不清的坑也别让后续分析被大量假阳性干扰。yolo detect predict \ model/data/runs/craters_exp1/weights/best.pt \ source/data/venus_test_imgs \ conf0.4 iou0.45iou0.45控制NMS的去除力度对小目标来说两个相邻陨石坑的预测框如果IoU超过0.45保留置信度高的那个是合理取舍。行星表面陨石坑通常不会密集到分不开这个值不用动。我现在处理任何小样本数据集都保留一个习惯训练完不先看mAP而是直接打开混淆矩阵和十张验证图的推理结果肉眼扫一遍就大概知道模型行不行。模型可以重训但数据集的清洗和验证集划分方式要像存档一样备份下来压箱底的数据集包解压密码和目录结构最好跟着项目文档一起写进README。这个坑我踩过不止一次希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网