简介这是一份面向计算机视觉初学者与目标检测实践者的蜈蚣识别数据集适用于训练和验证单类别检测模型可服务于农业虫害监测、生物多样性调查等场景。资源包共713个文件包含237张jpg原图、237个VOC格式xml标注文件、237个yolo格式txt标注文件另有少量说明性txt压缩包约68.14MB两种标注格式可直接对接主流检测框架省去格式转换环节。所有图片均由labelImg手工画框标注类别为Centipede共255个标注框标注准确合理。目前已有96人学习下载适合需要快速验证模型或补充单类别样本的读者。数据集不保证训练精度但提供完整可用的标注结构便于直接投入实验与对比测试。1. 蜈蚣数据集实测237 张 VOCYOLO 双格式单类别检测到底够不够用手上有个做爬虫识别或者中药材分拣的项目需要定位蜈蚣目标但公开数据集里专门针对蜈蚣的标注资源少得可怜。这份firc_Centipede数据集就是冲着这个缺口来的237 张 jpg 原图每张都配了同名的 VOC 格式 xml 和 YOLO 格式 txt标注工具是 labelImg类别只有一个Centipede总框数 255。也就是说平均每张图 1.07 个目标框绝大多数图里只有一条蜈蚣少数图有两条。这个量级放在目标检测里属于「小样本」范畴指望它从零训出一个泛化能力强的模型不现实但用来做迁移学习后的微调、验证某个检测头在小目标上的表现、或者跑通 YOLO 训练全流程它是够用的。适合谁适合手头有预训练权重、想快速验证蜈蚣这一类目标检测可行性的工程师也适合刚入门 YOLO、需要一个干净单类别数据集练手的人。不适合谁不适合想直接拿它训生产级模型的人237 张的覆盖度撑不起复杂场景。数据集本身不承诺任何模型精度只保证标注准确合理。这句话不是免责套话是实话——小数据集的精度天花板由你的数据增强策略和预训练权重决定跟数据集本身关系不大。下面从格式解析、训练配置、避坑到进阶技巧把这份资源拆开讲透。2. VOC 与 YOLO 双格式拆解xml 和 txt 到底怎么对应2.1 VOC 格式的目录结构与字段含义拿到压缩包解压后常见做法是看到JPEGImages、Annotations两个目录或者所有文件平铺在一个文件夹里。这份数据集摘要里明确说了「不包含分割路径的 txt 文件仅仅包含 jpg 图片以及对应的 VOC 格式 xml 文件和 yolo 格式 txt 文件」所以大概率是平铺结构文件名一一对应firc_Centipede_44.jpg firc_Centipede_44.xml firc_Centipede_44.txtVOC 格式的 xml 是 labelImg 默认输出核心字段如下annotation folderimages/folder filenamefirc_Centipede_44.jpg/filename size width640/width height480/height depth3/depth /size object nameCentipede/name poseUnspecified/pose truncated0/truncated difficult0/difficult bndbox xmin112/xmin ymin85/ymin xmax430/xmax ymax390/ymax /bndbox /object /annotationsize里的宽高是原图尺寸bndbox是左上角和右下角绝对像素坐标。name字段就是类别名这里统一是Centipede。truncated和difficult在单类别小数据集里通常都是 0训练时一般忽略。2.2 YOLO 格式的归一化坐标与类别索引YOLO 格式的 txt 每行代表一个目标格式是class_id x_center y_center width height五个值都是归一化到 0~1 的浮点数。以同一张图为例假设 xml 里 bndbox 是(112, 85, 430, 390)图片尺寸640x480转换逻辑是# VOC bndbox 转 YOLO 归一化坐标 xmin, ymin, xmax, ymax 112, 85, 430, 390 img_w, img_h 640, 480 x_center (xmin xmax) / 2.0 / img_w # (112430)/2/640 0.4234 y_center (ymin ymax) / 2.0 / img_h # (85390)/2/480 0.4948 w (xmax - xmin) / img_w # (430-112)/640 0.4969 h (ymax - ymin) / img_h # (390-85)/480 0.6354 # 输出: 0 0.4234 0.4948 0.4969 0.6354class_id从 0 开始这份数据集只有一个类别Centipede所以所有 txt 里第一列都是 0。如果你后续要合并其他数据集训练类别索引必须重新映射否则会出现「蜈蚣被识别成其他类」的翻车现场。2.3 双格式并存的实际用途与选型建议为什么同一份数据要同时给 xml 和 txt因为不同框架吃不同格式。VOC 的 xml 适合torchvision.datasets.VOCDetection、MMDetection 这类框架直接读取YOLO 的 txt 适合 Ultralytics 系列的YOLODataset加载。你不需要自己写转换脚本但需要知道两者之间的对应关系方便校验标注是否一致。常见做法是先用 xml 在 labelImg 里可视化检查一遍标注框有没有明显偏移再用 txt 直接喂给 YOLO 训练。如果发现某个 txt 的坐标超出 0~1 范围说明转换时图片尺寸读错了这种样本要单独拎出来看。提示解压后先统计 jpg、xml、txt 三种文件数量是否都是 237缺一个都会导致训练时找不到标签而报错。3. 用这份数据集跑通 YOLO 训练从 data.yaml 到第一轮收敛3.1 目录重组与 data.yaml 配置Ultralytics YOLO 对目录结构有固定要求不能直接拿平铺文件训练。我一般会按下面的结构重组centipede_dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yaml237 张按 8:2 划分训练集 190 张验证集 47 张。划分脚本import os, random, shutil src_dir firc_Centipede_flat # 解压后的平铺目录 dst_dir centipede_dataset random.seed(42) files [f for f in os.listdir(src_dir) if f.endswith(.jpg)] random.shuffle(files) split int(len(files) * 0.8) train_files, val_files files[:split], files[split:] for phase, file_list in [(train, train_files), (val, val_files)]: img_out os.path.join(dst_dir, images, phase) lbl_out os.path.join(dst_dir, labels, phase) os.makedirs(img_out, exist_okTrue) os.makedirs(lbl_out, exist_okTrue) for f in file_list: base os.path.splitext(f)[0] shutil.copy(os.path.join(src_dir, f), os.path.join(img_out, f)) shutil.copy(os.path.join(src_dir, base .txt), os.path.join(lbl_out, base .txt))random.seed(42)保证每次划分结果一致方便复现。split取 0.8 是经验值小数据集验证集别低于 15%否则评估指标波动太大。data.yaml内容path: ./centipede_dataset train: images/train val: images/val nc: 1 names: [Centipede]nc是类别数必须和 txt 里最大 class_id 1 一致。这里只有 0 类所以nc: 1。3.2 训练命令与关键参数设置用 Ultralytics YOLOv8n 做迁移学习命令如下yolo detect train \ datacentipede_dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.001 \ patience20 \ augmentTrue \ projectruns/centipede \ nameexp1参数逐个说modelyolov8n.pt用 COCO 预训练权重小数据集必须迁移学习从零训基本不收敛。epochs100配合patience2020 轮验证指标不提升就早停防止过拟合。lr00.001比默认的 0.01 小一个量级小数据集用大学习率容易震荡。batch16在 8G 显存上跑 640 分辨率够用显存不够就降到 8。augmentTrue开启默认增强包括 mosaic、HSV 抖动、随机翻转对 237 张的扩充很关键。训练启动后看第一轮输出重点看box_loss和cls_loss是否在下降。如果cls_loss一直是 0 或者 NaN说明标签路径没配对YOLO 没读到 txt。3.3 验证集评估与指标解读训练结束后跑验证yolo detect val \ modelruns/centipede/exp1/weights/best.pt \ datacentipede_dataset/data.yaml \ imgsz640输出里关注mAP50和mAP50-95。单类别小数据集mAP50能到 0.85 以上算正常低于 0.6 就要查标注质量或者增强策略。mAP50-95通常比mAP50低 0.2 左右因为高 IoU 阈值下小数据集更难命中。如果验证集指标远低于训练集说明过拟合常见做法是加大增强、减少 epochs、或者加 dropout。如果两者都低先检查标注框有没有系统性偏移比如所有框都偏右下角那可能是 xml 转 txt 时坐标算错了。注意这份数据集只有 255 个框验证集里可能只有 50 个左右目标指标波动会比较大建议跑 3 次不同随机种子取平均。4. 小样本单类别检测的避坑清单从标签错位到过拟合4.1 标签文件缺失或命名不匹配现象训练启动后cls_loss为 0验证时mAP全为 0但box_loss正常下降。原因YOLO 按图片文件名去labels目录找同名 txt如果 txt 缺失或者扩展名不对比如.TXT大写就当成无标签样本处理只算背景损失。解决训练前跑一遍校验脚本统计 images 和 labels 目录下同名文件数量是否一致import os img_dir, lbl_dir centipede_dataset/images/train, centipede_dataset/labels/train imgs {os.path.splitext(f)[0] for f in os.listdir(img_dir)} lbls {os.path.splitext(f)[0] for f in os.listdir(lbl_dir)} print(缺失标签:, imgs - lbls) print(多余标签:, lbls - imgs)4.2 归一化坐标越界导致训练崩溃现象训练中途报AssertionError或 loss 突然变 NaN。原因YOLO 要求 txt 里坐标在 0~1 之间如果某张图的 xml 里 bndbox 超出图片尺寸标注时拖拽越界转换后坐标会大于 1 或小于 0。解决批量检查所有 txt把越界行打印出来人工修正import os lbl_dir centipede_dataset/labels/train for f in os.listdir(lbl_dir): with open(os.path.join(lbl_dir, f)) as fp: for i, line in enumerate(fp): vals list(map(float, line.strip().split()[1:])) if any(v 0 or v 1 for v in vals): print(f{f} 第{i}行越界: {vals})4.3 类别索引不一致导致识别错位现象模型能检测到目标但类别置信度很低或者和别的类别混淆。原因如果后续合并了其他数据集不同数据集的 class_id 映射不同比如这份数据Centipede是 0另一个数据集里 0 是Spider合并后标签就乱了。解决合并前统一重映射 class_id用脚本把所有 txt 第一列按新映射表替换并同步更新data.yaml的names列表。4.4 验证集划分不合理导致指标虚高现象验证集mAP50很高但实际推理新图片效果差。原因237 张如果按顺序取前 190 张训练、后 47 张验证而数据是按拍摄场景排序的验证集和训练集分布差异大指标不可信。解决划分前先 shuffle并且检查验证集里是否包含所有场景类型。如果数据有连续帧要按帧分组划分避免同一场景的相邻帧同时出现在训练和验证集里。4.5 数据增强过度导致小目标丢失现象训练 loss 正常下降但验证时小目标漏检严重。原因mosaic 增强会把四张图拼成一张蜈蚣目标被缩小到原来的四分之一如果原图里蜈蚣本来就小增强后可能只剩几个像素模型学不到有效特征。解决小数据集且目标偏小时关掉 mosaic 或者降低其概率改用 HSV 抖动、随机翻转、随机裁剪这类不改变目标尺度的增强。Ultralytics 里可以通过mosaic0.0关闭。5. 进阶技巧用 237 张数据把蜈蚣检测推到可用水平小样本单类别检测的瓶颈不在模型结构在数据利用效率。237 张、255 个框想推到可用水平核心思路是「让每一张图被模型看到更多次但每次看到的形态不同」。第一个技巧是分阶段训练。先用mosaic1.0跑 50 轮让模型快速学到蜈蚣的全局特征然后关掉 mosaic用mosaic0.0再跑 50 轮让模型适应真实尺度的目标。这个策略在 YOLOv5/v8 上都验证过比全程开 mosaic 的mAP50能高 3~5 个点。命令上就是分两次yolo detect train第二次用--weights runs/centipede/exp1/weights/best.pt加载第一次的权重继续训。第二个技巧是用验证集做困难样本挖掘。跑完验证后把漏检和误检的图单独拎出来人工检查标注是否有问题。常见情况是蜈蚣身体被遮挡只标了可见部分但模型学到了「整条蜈蚣」的模式导致遮挡样本漏检。这时候要么补标遮挡部分要么在训练时把这类样本复制多份加权。第三个技巧是测试时增强TTA。推理时对同一张图做水平翻转、多尺度缩放把多次预测结果做 NMS 融合。Ultralytics 里加augmentTrue参数即可yolo detect predict \ modelruns/centipede/exp1/weights/best.pt \ sourcetest_images/ \ imgsz640 \ augmentTrue \ conf0.25conf0.25是置信度阈值蜈蚣检测建议从 0.25 起步太高会漏检太低会误检。TTA 能提升 1~2 个点mAP代价是推理速度慢 2~3 倍看你的场景能不能接受。最后说一个验证方法拿 10 张训练集里没有的蜈蚣图片手动标注后跑yolo detect val看mAP50是否和验证集接近。如果差距超过 10 个点说明验证集划分有问题或者模型过拟合了训练场景。从那以后我每次拿到小数据集都强制先跑一遍「训练集外测试」确认指标没有虚高再往下做。希望帮到你。本文还有配套的精品资源点击获取