简介面向计算机视觉目标检测需求这份数据包适合需要训练蟑螂识别模型的开发者、算法学习者以及智能家居或卫生防治项目人员。资源包含三百七十四张真实环境蟑螂图片配套相同数量的XML标注文件与TXT标注文件XML遵循Pascal VOC格式TXT遵循YOLO格式标注类别仅cockroach一种累计标注九百四十三个矩形框。所有标注均由labelImg工具人工绘制并复核准确性有保障。压缩包共一千一百二十四个文件图片与标注文件合计约12.29MB文件类型以图片、XML标注和TXT标注为主可直接导入YOLO系列等主流目标检测训练流程。目前已有七十八人学习浏览适合作为目标检测入门练习数据集也可用于特定蟑螂识别项目的前期训练基础。1. 蟑螂检测数据集 370 张 VOCYOLO格式.zip小数据集也是完整质检链路蟑螂检测数据集 370 张 VOCYOLO格式.zip听起来没什么噱头370 张图、VOC 与 YOLO 两种标注、打包成一个压缩包。但做过害虫监测、厨房卫生巡检这类方向的人都知道找一份干净、边界框不抽风的虫害检测数据有多难。这份数据的价值正好在“小却全”它保留了原始图片和 PASCAL VOC 与 YOLO 双格式标注既满足老算法框架的读入需求也能直接喂给 YOLOv8 这类现代训练管线。适合的人群很清楚一是正在入门目标检测、想把 VOC/YOLO 格式和完整训练流程一次打通的新手二是做智慧虫害监测、想先拿一批高质量预训练数据跑通 demo 的工程师。拿到它之后真正要弄懂三件事两套格式怎么互转、标注质量如何快速验证、370 张的小数据量怎么训练不翻车。下文按这个顺序展开。2. VOC/YOLO 双格式解剖看懂 XML 与 txt才知道训练时在读什么2.1 VOC 的 XML 标注类名、bndbox 与 difficult 字段怎么读标准的 VOC 格式沿用 PASCAL VOC 的结构每张图对应一个同名 XML。先直接看一个例子内容按常见标注工具导出格式写成annotation foldertrain/folder filenameIMG_20231106_153201.jpg/filename size width1280/width height720/height depth3/depth /size object namecockroach/name truncated0/truncated difficult0/difficult bndbox xmin210/xmin ymin330/ymin xmax340/xmax ymax360/ymax /bndbox /object /annotation这个 XML 里有三个能直接决定训练质量的点。第一size和bndbox必须配套。如果有人把 1920×1080 的图上的标注框直接复制到 1280×720 的图上训练时按当前图片尺寸读取就会整体错位而且这种错位在图像上一眼看不出mAP 却会掉一截。第二truncated和difficult标记的是边缘截断目标和难例很多作者偷懒全写 0这不影响 YOLO 训练但如果你以后要跑 VOC 官方的评估脚本difficult 的统计口径会对 AP 有影响。第三name字段如果出现中文或数字开头转换成 YOLO 数字 id 时要格外小心编码建议第一步先统一成英文小写类名。那 VOC 这套格式到今天还有什么不可替代的价值我最看重的是“人读性”它把类名、图片尺寸、每个框的绝对坐标都摊在明面上后续做数据清洗、剔除小目标、按类重采样直接改 XML 比改 txt 靠谱得多。像 BDD100K、CCPD 这类专项数据集虽然各有自己的官方格式但底层注解逻辑和 VOC 同源能读 VOC 的人切到任何检测框架都顺着手。2.2 YOLO 的 txt 标注归一化坐标和 class id 的映射关系同样的标注转到 YOLO 格式后内容变成这样0 0.222656 0.440278 0.101562 0.041667 0 0.734375 0.537500 0.148437 0.083333第一列是类别 id后面四个数字分别是x_center、y_center、width、height全部以图片宽高做了归一化。对 1280×720 的图第二行坐标换算回来x_center0.734375×1280≈940y_center≈387width≈190height≈60。这里有个常见换算错误我必须单独拎出来讲有人会把 VOC 里的xmax-xmin当 width却拿它除以图片高度导致宽高比异常。正确换算公式是x_center (xmin xmax) / 2 / img_width y_center (ymin ymax) / 2 / img_height width (xmax - xmin) / img_width height (ymax - ymin) / img_height为什么说 YOLO 格式“看着简单但暗坑多”因为 txt 里完全没有类名和图像尺寸信息一旦 labels/train 里的 txt 和 images/train 里的照片配对错位训练不会报错只是框会画到无关场景上。所以当你看到某个训练 batch 的标签预览图里框明显不对别急着调超参先回头做集合差检查。YOLO 训练阶段用的损失函数主要是 box loss、cls loss 和 dfl loss 三项任何一个维度上标签噪声都会让损失曲线显得“收敛正常但效果很怪”。2.3 双格式都给不是让你选一边而是给你一张后悔药多数数据集只在 XML 和 txt 之间给一种VOCYOLO 双给的意义在于你可以在两条工具链之间来回切换。老框架读 VOC新框架读 YOLO这是数据包作者帮你省掉了最枯燥的一步转换。我的建议是默认把 YOLO 格式当主训练输入把 VOC 的 XML 当验证和修正的来源。后续发现标签错误就改 XML再走一次转换流程而不是在 txt 上人肉修数字。这样做还有个隐藏好处以后要换 MMDetection、Detectron2 这类框架它们大多能直接加载 VOC 数据集你不需要重新整理目录。一张表总结两种格式的差异特性VOC XMLYOLO txt标注文件名与图片同名 xmlxml 内还有 filename 字段与图片同名 txt类名表达字符串直观可读数字 id必须配 names 映射框坐标xmin,ymin,xmax,ymax 绝对像素x_center,y_center,width,height 归一化图像尺寸size 节点内写明无由 DataLoader 临时读图肉眼排错方便必须脚本辅助3. 解压后先别急着训练目录结构、标签映射与可视化校验3.1 目录结构VOC 目录与 YOLO 目录两套并存zip 解压后的目录通常在第一层就能看到两种布局一个叫 VOCdevkit 的目录里面是 JPEGImages、Annotations、ImageSets另一个是 images/labels 结构其中 images/train、images/val 和 labels/train、labels/val 一一对应。常见形态如下cockroach_dataset/ ├── VOCdevkit/ │ ├── VOC2007/ │ │ ├── JPEGImages/ │ │ ├── Annotations/ │ │ └── ImageSets/Main/ │ ├── train.txt │ └── val.txt ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yaml如果你遇到的打包方式只有 images/labels 而没有 VOCdevkit那代表作者只保留了 YOLO 格式产物。此时先把 images/train 里的图片数量和 labels/train 里的 txt 数量对齐再考虑训练。还要说一下划分370 张图如果没提供 train/val 划分文件我一般按验证集 20% 来切也就是约 74 张验证、296 张训练。验证集再小mAP 波动会非常大你可能刚怀疑一个改进有效果换个随机种子结论就反了。数据结构稳定是后续一切实验的前提。3.2 用脚本检查 XML 与 TXT 是否一一对应数据集最常见的翻车点是配对错位。我每次拿到新数据都会先跑一段小脚本from pathlib import Path voc_xml_dir Path(VOCdevkit/VOC2007/Annotations) voc_img_dir Path(VOCdevkit/VOC2007/JPEGImages) yolo_img_dir Path(images/train) yolo_lbl_dir Path(images/train).with_name(labels) # 上一级目录取 labels xmls {p.stem for p in voc_xml_dir.glob(*.xml)} voc_imgs {p.stem for p in voc_img_dir.glob(*.jpg)} txts {p.stem for p in yolo_lbl_dir.glob(*.txt)} print(XML 数量:, len(xmls)) print(VOC 图片数量:, len(voc_imgs)) print(YOLO txt 数量:, len(txts)) print(缺 XML 的图片:, voc_imgs - xmls) print(缺 txt 的图片:, voc_imgs - txts) print(孤立的 txt:, txts - voc_imgs)这段代码背后的逻辑是集合差集把三个目录下的文件名主键各取一个集合互相做差所有缺失和多余一目了然。跑完会看到两类重点结果一类是孤立的 txt非空说明 labels 里混进了不属于这 370 张图的旧标注另一类是缺 txt 的图片非空YOLO 训练时会当作无目标图参与训练模型学不到任何正样本如果这种图太多mAP 会异常低。注意 glob 的通配符。某些数据集里图片后缀混用 .jpg 和 .png只扫 .jpg 会导致误报“缺标签”。我一般会把 glob 改成*.jpg和*.png两种都统计或者干脆按.suffix in {.jpg, .jpeg, .png, .bmp}来过滤。3.3 把标注画回原图扫掉越界和错框配对检查只是第一步真正决定训练上限的是框的质量。对蟑螂这类长条形目标标注最容易出现两种典型错误把触须和脖子切在框外或者框比目标大一两倍把背景地板全包进来。这两种错都不会让训练直接报错只会让 mAP 一直卡住。检验的办法就是可视化回放二十张from PIL import Image, ImageDraw from pathlib import Path img_dir Path(images/train) label_dir Path(labels/train) out_dir Path(check_visual) out_dir.mkdir(exist_okTrue) for img_path in sorted(img_dir.glob(*.jpg))[:20]: img Image.open(img_path) draw ImageDraw.Draw(img) txt_path label_dir / (img_path.stem .txt) if not txt_path.exists(): continue for line in txt_path.read_text(encodingutf-8).strip().splitlines(): parts line.strip().split() if len(parts) ! 5: continue _, cx, cy, w, h parts cx, cy, w, h float(cx), float(cy), float(w), float(h) x1 (cx - w / 2) * img.width y1 (cy - h / 2) * img.height x2 (cx w / 2) * img.width y2 (cy h / 2) * img.height if x1 0 or y1 0 or x2 img.width or y2 img.height: draw.rectangle([x1, y1, x2, y2], outlinered, width3) else: draw.rectangle([x1, y1, x2, y2], outlinegreen, width2) out_path out_dir / f{img_path.stem}_bbox.jpg img.save(out_path) print(已导出:, out_path)画框其实分两步看。第一步看红框有没有大量存在红框意味着归一化坐标越界常见于 VOC 转 YOLO 脚本没有做边缘保护第二步看绿色框的紧致度框是刚好裹住蟑螂躯体而不是框掉半个墙面。我的经验标准是框线距离目标轮廓的边距小于 5 像素否则后期要花不少 epoch 把回归损失“拽回来”。这段脚本只导出前 20 张你可以把切片的起点改掉多跑几轮尽量覆盖白天/夜晚、近景/远景等不同样本段。4. 用 YOLOv8 跑通 370 张数据YAML、训练命令与指标监控4.1 数据集 YAML 的编写路径、类名和类别数一个都不能错如果压缩包里自带 data.yaml放到项目目录后先打开检查path、train、val、names四个字段。如果没带自己写最小可用版本是这样# cockroach.yaml path: /home/user/cockroach_dataset train: images/train val: images/val names: 0: cockroach有两个注意点。第一train 和 val 目录路径是相对 path 写的不要写成VOCdevkit/VOC2007/JPEGImages因为你喂给 YOLO 训练管线的标签是同名 txt不在 VOC 目录里。第二names 列表的顺序必须和 labels/train 里 txt 第一列的数字一致。数据包里如果只有一个 cockroach 类就只写0: cockroach如果有幼虫、成虫几个类就按 classes.txt 内容把列表写全漏一个类会在训练时触发索引越界。很多新手在这个 yaml 上踩坑是路径问题。Windows 下写C:/Users/xxx/cockroach_dataset没问题但不要用反斜杠Linux 下绝对路径必须真实存在否则yolo train会报Dataset not found。把这块处理好比调学习率还重要因为路径错误直接跑不起来。4.2 训练命令逐项拆解模型、imgsz、epoch、batch 怎么定正式训练的启动命令如下我默认你已经安装 ultralytics 包并且有一块 NVIDIA GPUyolo taskdetect modetrain \ modelyolov8n.pt \ data./cockroach.yaml \ imgsz640 \ epochs200 \ batch16 \ optimizerauto \ lr00.01 \ lrf0.01 \ warmup_epochs3 \ patience30 \ device0各项参数为什么这样设逐个说透modelyolov8n.ptnano 版参数量只有 3M专为资源受限场景准备。370 张图撑不起 yolov8x 这种大模型强行上 x 会过拟合到背景纹理。imgsz640默认分辨率。如果原图是 1280×720训练时 ultralytics 会自动 letterbox 到 640。若蟑螂在图中占比很小可以提到 960但对显存的要求几乎是 640 的三倍显存不够就优先降 batch。epochs200不是越多越好。小数据集训练 100~150 轮足以收敛200 轮配合patience30做早停避免后几十轮纯粹在验证集上抖。batch16取决于显存。6GB 显存跑 yolov8n640 勉强够8GB 可以试 32。batch 太小会让 BN 统计不稳定loss 曲线毛刺会很明显。lr00.01初始学习率。第一次训练不建议改动让 auto 的优化器自动决定下游策略如果你的验证集特别小可以降到 0.005 防止发散。lrf0.01学习率衰减终点配合余弦退火让训练后期步长变小。warmup_epochs3前 3 轮做学习率预热对大 batch 或者迁移学习模型尤其重要。初学最容易犯的错是不给数据划分 val 集。YOLO 在 val 为空时也能跑但它会偷偷从训练集抽 20% 当验证这样打印出来的 mAP 没有任何参考价值属于自己骗自己。4.3 训练完看哪些指标以及 ONNX 导出训练结束会在runs/detect/train下生成weights/best.pt和last.pt。看指标我固定看三个mAP50 代表放宽 IoU 下的定位能力mAP50-95 代表严格 IoU 下的综合精度P/R 曲线代表漏检和误报的平衡位置。对蟑螂检测这类任务mAP50 至少要高于 0.85 才算可用。要部署到其他平台导 ONNX 的命令是yolo export modelruns/detect/train/weights/best.pt formatonnx imgsz640导出的 ONNX 输入是[1,3,640,640]输出结构常见为[1,84,8400]其中 84 4 个坐标 80 个 COCO 类得分。如果你只有一类蟑螂导出前最好在 yaml 里把类别数设置正确否则输出张量维度里 80 个类别全是 COCO 的空洞推理时还得自己裁剪麻烦。5. 避坑记录370 张小样本最常见的五个翻车现场5.1 训练 loss 掉得漂亮验证集 mAP 却是 0现象训练 box loss 从 2 平稳降到 0.6看起来一切正常但 val 的 mAP50 从头到尾是 0。原因验证集和训练集的类别分布严重不一致。有些压缩包在划分 train/val 时按顺序切前 300 张是白天厨房光线后 70 张是夜间灯光模型在训练集上学的亮度特征完全不适应验证集。解决先统计 train 和 val 的类别数量分布。快速做法是扫描 labels 目录wc -l labels/train/*.txt | tail -1 wc -l labels/val/*.txt | tail -1如果 val 里目标数量少于总量的 15%就把部分训练图挪去验证集。注意不要只挪 txt图片也要同步过去否则又是配对错乱。5.2 标签坐标越界训练报 corrupt label 警告现象训练中途弹出corrupt label或WARNING某个 txt 的 x_center 是 1.02width 是 -0.03。原因VOC 转 YOLO 时标注框一旦贴着图片边缘脚本没有裁切直接让 xmax 除以图片宽度得到大于 1 的值。解决不要简单地删掉这些标注。把越界坐标裁剪回 [0,1] 区间再重新画框确认。这里有条分界线中心点还在图内只是 width 或 height 略微越界截断宽高即可中心点都跑出图了那是误标直接丢弃该行 YOLO 标签。5.3 小蟑螂目标太小漏检严重现象验证集 mAP50 有 0.9但实际用起来距离稍远的小蟑螂全部漏检。原因YOLO 的 P3 层负责小目标但如果蟑螂只有 12×20 像素它在特征图上的信号很弱很容易被大目标的梯度淹没。解决两个方向并行。第一imgsz 从 640 提到 960 或者 1280batch 相应减半第二给 370 张图开 mosaic 和 copy-paste 增强。真实场景里蟑螂经常三五成群出现在墙角copy-paste 正好模拟这种聚集分布对小目标提升非常直观。实际项目中我用 copy-paste 的感受是它比单纯调大 imgsz 更稳因为后者一旦推理时没匹配上分辨率性能会掉得很快。5.4 过拟合训练 loss 还在降验证 loss 已经反弹现象epoch 150 时训练 box loss 降到 0.02验证 loss 却从 0.1 反弹到 0.3mAP50-95 不再上升。原因模型容量超出 370 张图能提供的信息量开始把瓷砖反光、墙角阴影当成判别特征。解决先换更小的模型yolov8n 已经最小那就上正则。把颜色抖动参数hsv_h/hsv_s/hsv_v调大开degrees30的小角度旋转和flipud0.25的上下翻转。注意蟑螂的朝向是有意义的如果翻转后触须方向变化过大检测能力会打折扣所以我给的角度不超过 30 度。5.5 class id 映射错乱训练直接 RuntimeError现象训练刚启动就报IndexError: index 2 is out of bounds for axis 0 with size 2或者打印标签时报 group mismatch。原因txt 里出现了 data.yaml 中 names 没覆盖到的 id。比如数据包里同时有 cockroach 和 dead_cockroach但你只在 yaml 里写了一类。解决扫描标签里最大 idawk {print $1} labels/train/*.txt | sort -n | uniq -c看到输出后如果最大 id 是 1说明至少有两个类回 data.yaml 补上第二个类名。如果你确实不想用那个类把对应标签行删掉而不是留着让训练报错。6. 最后一跳用自己的真实照片做闭环验证才算落地训练收尾后先别急着看 runs/detect/val 里那些漂亮指标把你手机里拍的几张真实场景照片拿过来——厨房地板、冰箱底边、橱柜角落都可以光照条件尽量和目标部署环境一致。数据集的 370 张图如果集中在某个固定场所而你要落地在另一个仓库这一步就是最直接的“域差异”检验。推理命令yolo predict modelruns/detect/train/weights/best.pt \ source./my_real_photos \ imgsz640 \ conf0.25 \ save_txtTrue打开保存的 txt统计漏检图片的分布看是不是集中在低照度角落或者蟑螂被部分遮挡就没有框。根据结果微调两处第一处是 conf 阈值实拍误报多就往 0.35~0.4 拉漏检多就降到 0.15第二处是推理分辨率实拍图是 1000×750 的话imgsz 用 640 会把整张图缩得太狠小蟑螂直接糊掉换 960 通常能救回来。我自己还有一个习惯叫“黑匣子探测”把验证集结果按置信度排序挑出置信度最高和最低的几十个样本不看框直接看原图。如果置信度最高的全是背景简单、蟑螂居中的图说明模型没学会复杂场景的鲁棒性如果置信度最低的里面混着明显的蟑螂大目标那要回去查标注是不是漏了这类样本。这个动作比单纯盯 mAP 更能暴露数据集的真实性短板。曾经我在一个虫害监测项目里吃过亏太相信数据集的官方划分拿到 VOCYOLO 大礼包直接训练结果模型只能识别和训练图几乎一样的光照和角度。后来我养成的习惯是任何数据集落地前先做标签映射检查和统计验证再可视化二十张确认框质量最后留出 10% 的数据当对抗测试集。这个流程多花半小时但能省掉后期反复调模型的好几天。对 370 张这种中等偏小的数据集数据治理带来的提升比换更重的模型明显得多希望帮到你。本文还有配套的精品资源点击获取