ARTICLE DETAIL

资讯详情

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

蟑螂目标检测数据集实战:YOLO/VOC标签解析与训练避坑指南

蟑螂目标检测数据集实战:YOLO/VOC标签解析与训练避坑指南 简介YOLO系列算法蟑螂检测数据集专为目标检测训练与验证场景设计适合需要快速获取高质量标注数据的开发者、学生及算法工程师使用。压缩包内共2000个文件核心是1786个XML与214个TXT标签文件分别对应VOC格式与YOLO格式标注TXT文件采用 x_center y_center 结构坐标归一化到0~1可直接被yolov5、yolov7、yolov8、yolov9、yolov10、yolo11等主流框架读取XML文件则便于在LabelImg等工具中二次核对。数据集已预先划分训练集与验证集并附有data.yaml配置文件下载后即可完成环境配置并进入训练流程。整体包大小仅47.59MB轻量易传输目前已吸引130人学习浏览。对想省去人工标注与格式转换步骤的开发者而言这份数据能有效降低数据集准备成本帮助把精力集中在模型调参与效果优化上。1. 蟑螂目标检测数据集2051张图能直接开训但先搞清标签格式YOLO算法做目标检测这几年从yolov5到yolov8、yolov9、yolov10再到yolo11迭代速度肉眼可见但真正让项目卡壳的往往不是模型结构而是带标注的数据。蟑螂这类目标公开数据集几乎找不到实拍图涉及场所和卫生隐私自己用labelImg标一张平均要两三分钟标到三百张就手酸想放弃。这份2051张的蟑螂数据集带yolo和voc两种格式标签train/val/test已经划分好还配了data.yaml解压后理论上一句话就能拉起训练。它适合做害虫检测验证、家庭环境识别、智慧卫生间场景预研也很适合刚入门目标检测的人跑通完整的训练-验证-推理流程。下文从标签格式讲起再给校验脚本和具体训练命令。2. 目录结构与双标签格式yolo和voc到底怎么对应解压后先别急着训练花十分钟看清目录结构能省掉后面一大半的排错时间。这套数据集把图像、yolo格式标签、voc格式标签分开存放在不同目录这是很多目标检测数据集的通用做法——图像目录只放jpg训练时由框架按文件名去匹配标签。先看整体结构. ├── images/ # 图像常见按 train/val/test 子目录划分 ├── labels_yolo/ # yolo 格式 txt 标签与 images 子集一一对应 ├── labels_voc/ # voc 格式 xml 标签文件名与图像同名 ├── data.yaml # 数据集配置文件训练入口 ├── train.txt # 部分版本用索引文件代替目录划分 ├── val.txt └── test.txt关于划分方式需要说明压缩包里data.yaml的写法会直接告诉你它是用子目录还是用索引文件。yolov5的train.txt和val.txt索引文件很常见ultralytics系列yolov8/yolov9/yolov10/yolo11更喜欢把train和val直接写成文件夹路径。如果你是第一次用先打开data.yaml看一眼path、train、val三个字段指向哪里后面训练命令里的data参数就填这个文件。2.1 两种标签分别长什么样打开labels_yolo里任意一个txt文件内容只有一行到几行每行五个数字对应摘要里写的yolo格式$ cat labels_yolo/train/img_0440_52.txt 1 0.512345 0.623456 0.154678 0.089234第一个数字是类别索引从0开始计接下来四个数依次是目标框中心点的x和y坐标、目标框宽度、目标框高度全部相对于图像尺寸做了归一化范围在0到1之间。所以看到0.51这个值意味着框的中心在图像水平方向约51%的位置。摘要里说文件名末尾是部分类别名称所以img_0440_52.txt里的52可能与类别名有关也可能只是原始采集编号程序不认文件名只认txt内容别在文件名上做任何假设。再看labels_voc里对应的xml文件同样是这张图结构完全不同annotation filenameimg_0440_52.jpg/filename size width1920/width height1080/height depth3/depth /size object namecockroach/name bndbox xmin512/xmin ymin400/ymin xmax809/xmax ymax496/ymax /bndbox /object /annotationxml里存的是像素级坐标xmin/ymin/xmax/ymax直接给出框左上角和右下角的位置还带着图像原始宽高。yolo格式用归一化比例voc格式用绝对像素这就是两种标签最本质的差别。下面这组换算关系建议直接收藏任何时候做voc转yolo都用得上voc字段含义转yolo公式xmin框左边界像素cx (xmin xmax) / 2 / Wymin框上边界像素cy (ymin ymax) / 2 / Hxmax框右边界像素w (xmax - xmin) / Wymax框下边界像素h (ymax - ymin) / HW和H是图像原始像素宽高。反过来yolo转voc就是把这四个公式逆运算得到像素值后通常要取整。这套换算看起来简单却是标注数据翻车率最高的地方后面避坑章节会展开说。2.2 为什么同时保留两种格式老牌标注工具labelImg默认导出voc格式xml而yolov5、yolov8这些框架训练时读的是txt。所以很多从标注平台流出的数据集会同时保留两种格式xml用来存档和二次修改txt用来直接训练。你实际训练时只需要labels_yolovoc格式是给你做校验或者转其他平台用的。另一个角度看数据集做了划分意味着train/val/test三个子集的图像互不重叠标签也同步被分到各自子集。这种划分的好处是训练时不会发生“验证集图像出现在训练集里”这种泄漏问题mAP数值才有参考意义。你可以用find命令快速确认三个子集的数量分布find images/train -name *.jpg | wc -l find images/val -name *.jpg | wc -l find images/test -name *.jpg | wc -l2051张图常见划分比例是8:1:1左右。如果你发现test只有几十张也不用慌小数据集上test更多是走一遍流程最终模型评估主要看val指标。若子集目录里文件数之和不到2051也要先停下来查是不是有图没有标签或标签没有图。2.3 data.yaml配置文件怎么读data.yaml是整个训练流程的枢纽yolov5和ultralytics系列都认这个文件名。内容一般是path: ./ train: images/train val: images/val test: images/test nc: 1 names: 0: cockroach说明一下字段path是数据集根目录可以写成相对路径也可以是绝对路径train和val分别指向训练和验证图像所在的文件夹nc是类别总数这份数据如果只有蟑螂一个类别就是1如果有两个类别就是2names是类别名列表顺序必须和txt标签里的类别索引严格对齐——索引0对应names里第一个名字索引1对应第二个以此类推。names里具体叫什么以你解压出来的文件为准上面示例里的cockroach只是常见写法。还要注意yolov5有自己的一套数据加载逻辑训练时它会在数据集根目录下自动找名为labels的文件夹来匹配images。所以如果你的labels_yolo文件夹不叫labels而是直接在data.yaml里指定train路径yolov5默认不会去读labels_voc而是按图像路径去找同目录下的labels文件夹。这个差异很坑很多人一上来train命令报错或者跑出全背景就是没搞清yolov5对标签目录名的约定。ultralytics系列在这个处理上更灵活但为了少踩坑我一般会把yolo格式的txt统一拷一份到images同级labels目录下再开始训练。3. 训练前三项校验用脚本查越界、缺图、类别失衡拿到标注数据直接就开train是新手最容易踩的坑。先说个血泪经验有一次我用别人给的数据集训练loss前30个epoch降得很漂亮但val的mAP一直是0查了两天才发现标签txt里有一半图像的宽高写反了检测框全是竖长条。从那以后我养成了习惯任何数据集训练前先跑一轮自动化校验几十秒的事省下的排错时间是按天算的。下面三个检查项覆盖了最常出问题的三类情况坐标越界、文件缺失、类别失衡。3.1 检查标签坐标是否越界、框是否合法先写一个python脚本把labels_yolo下所有txt读一遍检查五个字段的合法性import os label_dir labels_yolo/train bad 0 for name in os.listdir(label_dir): if not name.endswith(.txt): continue path os.path.join(label_dir, name) for line in open(path, encodingutf-8): parts line.strip().split() if len(parts) ! 5: print(f[字段数不对] {name}: {line.strip()}) bad 1 continue cls, cx, cy, w, h int(parts[0]), float(parts[1]), float(parts[2]), float(parts[3]), float(parts[4]) if cx 0 or cx 1 or cy 0 or cy 1: print(f[中心点越界] {name}: cx{cx} cy{cy}) bad 1 if w 0 or h 0 or w 1 or h 1: print(f[宽高异常] {name}: w{w} h{h}) bad 1 print(f检查完毕异常记录 {bad} 条)逻辑很简单按空格拆行校验必须5个字段中心点坐标在0到1之间宽高必须大于0且不大于1。宽高小于等于0说明标注时把框拖反了大于1说明归一化时用的除数不对。常见做法是把这段脚本放在数据集根目录下直接跑输出的异常文件名按行修掉即可。需要说明的是脚本里假定标签都是五字段规范格式如果数据集里存在难样本或者crowd标注字段数可能不同这种行要单独看而不是直接判坏。3.2 检查图像与标签文件是否一一对应标签文件和图像文件名一般是同名的img_0440_52.jpg对应img_0440_52.txt。训练时框架按文件名匹配如果某张图找不到标签yolov5会把它当成纯背景图参与训练这在目标检测里是致命的模型学到的是“这个场景里没有目标”而不是“这个目标没有被标注”。这种标签缺失不会报错只会让mAP悄悄下降。检查脚本如下import os img_dir images/train label_dir labels_yolo/train imgs {os.path.splitext(f)[0] for f in os.listdir(img_dir) if f.endswith(.jpg)} labels {os.path.splitext(f)[0] for f in os.listdir(label_dir) if f.endswith(.txt)} missing_label imgs - labels missing_img labels - imgs print(f有图无标签: {len(missing_label)} 个) print(f有标签无图: {len(missing_img)} 个) for name in list(missing_label)[:10]: print( , name)脚本假定train子目录下直接是图像文件没有嵌套目录。如果missing数量少但确实不想补标可以把这个文件名从训练索引里剔除。这里用集合取差集是最高效的写法2051个文件毫秒级跑完。注意图像可能不是jpg而是png或bmp脚本里后缀要按实际扩展名调整最稳妥的办法是os.path.splitext后只比对主文件名别写死后缀。3.3 统计类别分布提前发现不均衡蟑螂数据集虽然是单一目标但类别索引不一定只有0。用第一个字段做直方图import os from collections import Counter label_dir labels_yolo/train counter Counter() for name in os.listdir(label_dir): if not name.endswith(.txt): continue path os.path.join(label_dir, name) for line in open(path, encodingutf-8): cls line.strip().split()[0] counter[cls] 1 for cls, count in sorted(counter.items()): print(f类别 {cls}: {count} 个目标)跑完如果发现某个类别索引几乎没出现要么是这个类别在训练集里确实稀少要么是标签文件里类别索引写错了比如从1开始编号而不是从0。蟑螂这类单类问题最怕的其实不是类别不均衡而是某个索引的框尺寸全部异常——那通常是转换脚本的bug而不是数据本身的问题。把三种检查结果合起来看基本能确认一份数据集能不能直接进训练管线。4. 把数据集喂给yolov5和ultralytics系列命令与参数差异校验过了数据没问题接下来就是训练。这里要分清两套训练入口yolov5是独立的工程训练脚本是train.py而yolov8、yolov9、yolov10、yolo11统称ultralytics系列共用ultralytics库命令行入口是yolo。两者的data.yaml格式一致但命令参数略有差异下面分开写。4.1 yolov5训练命令与参数说明首先把yolov5工程clone到本地并装依赖常见做法是git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt如果你没有git环境直接到github页面下载zip压缩包解压也能跑。然后把这份数据集放到工程外的datasets目录重要的是把data.yaml里的path字段改成你的实际路径或者干脆用绝对路径。启动训练python train.py \ --data /path/to/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --project runs/train \ --name cockroach逐项说明参数--weights是预训练权重yolov5s.pt是轻量版s/m/l/x对应不同容量蟑螂检测这种单类任务s足够想提精度换m--img是训练图像尺寸yolov5会先把图缩放并letterbox到这个尺寸--batch受显存限制16G显存跑640和s模型一般能到16到32--epochs是迭代轮数100轮是起步单类小数据集一般50到150轮之间能看到收敛--name是本次运行的输出目录名训练完的权重在runs/train/cockroach/weights/best.pt和last.pt。这里有一个关键细节yolov5默认要求标签放在images同级目录的labels文件夹里。你的数据集标签在labels_yolo所以训练前要把txt拷过去或者做个软链接ln -s /path/to/labels_yolo/train /path/to/datasets/cockroach/labels/train软链接不占空间且不会污染原始数据我常用这个办法。val和test子集也按同样方式处理。4.2 ultralytics系列一条yolo命令通吃v8/v9/v10/yolo11yolov8之后框架统一训练入口变成了yolo命令。先装ultralyticspip install ultralytics然后训练命令非常简洁yolo train data/path/to/data.yaml modelyolov8s.pt imgsz640 batch16 epochs100 projectruns/train namecockroach如果换yolov9、yolov10或者yolo11只改model参数就行yolo train data/path/to/data.yaml modelyolov9t.pt imgsz640 batch16 epochs100 yolo train data/path/to/data.yaml modelyolov10n.pt imgsz640 batch16 epochs100 yolo train data/path/to/data.yaml modelyolo11n.pt imgsz640 batch16 epochs100注意model不是随便填的要按各个版本官方release里实际发布的权重文件名来填错了会直接下载失败。yolov8s.pt是最常用的起步权重n是nano更小更省显存t是tinyc是compact。参数写法上ultralytics不要求路径前带引号用等号传参和yolov5的--key value风格不一样这是两套入口最容易搞混的地方。另外yolov7是独立于ultralytics的另一套工程训练入口也是train.py参数风格更像yolov5data.yaml是通用的命令不能直接照搬yolo但数据集本身不用改。还有一个常见问题第一次训练都要下载预训练权重下载超时的时候进程会一直卡在Downloading...很久不动。yolov5和ultralytics都支持把pt文件手动放到工程目录下它检测到本地已有就不会再下载。如果你遇到卡住直接把权重文件放进当前目录重跑一般就能跳过下载这一步。4.3 超参怎么设batch、imgsz、epochs的取舍蟑螂目标有个特点在画面里通常偏小可能只占几十到一两百像素。对这种小目标imgsz用640时小目标在特征图上的像素很少容易漏检。有条件的话试试1280但显存占用会变成约4倍batch就要跟着减半甚至减到4。我的习惯是先640跑通流程验证没问题再上1280刷一轮精度。batch size的选择要先看显存。一个粗略估算imgsz640时yolov5s单张图约占2到3G显存所以12G显存下batch开16比较稳。batch太小会导致BN统计不稳定loss震荡明显太大容易OOM。epochs不要无脑调大建议开EarlyStoppingultralytics默认的patience是100个epoch没有提升就停。单类数据集如果100个epoch还没看到mAP超过0.8优先怀疑数据问题而不是加轮数。4.4 后台训练与日志观察训练时间通常以小时计建议用nohup放后台跑nohup yolo train data/path/to/data.yaml modelyolov8s.pt imgsz640 batch16 epochs100 train.log 21 然后随时用tail看进度tail -f train.log日志里每行会打印epoch号、box_loss、cls_loss、mAP50、mAP50-95这些指标。如果box_loss在前10个epoch里没有明显下降要先回去看数据校验那一步是不是漏了。训练完成后runs/train/cockroach/目录下有weights子目录best.pt就是最终要用的权重val测出来的mAP记录在results.csv里。5. 避坑五个最容易翻车的配置细节这一章写的都是实际训练场景里见过、并且在这类蟑螂或昆虫数据集上高概率复现的问题。每条按现象、原因、解决三个角度说方便你对应排查。5.1 训练正常跑完但loss不降val全背景现象训练能跑完loss下降缓慢val的mAP一直是0或者接近0推理结果全是背景框。原因最常见是标签没对齐图片。yolov5约定标签放在与images同级的labels目录且按子集对应而这份数据的标签单独放在labels_yolo下路径没配对时框架把图像全部当背景训练。解决先把labels_yolo下的txt按train/val/test分别软链接到labels/train、labels/val、labels/test再跑训练。做完后用第3.2节的脚本检查一次确保有图无标签的数量是0。5.2 voc转yolo换算时框全部偏移现象推理出的框位置明显不对整体向右下或左上偏移但宽高比例看着正常。原因voc的bndbox给的是像素左上角和右下角有人转换时直接用xmax除以图片宽当作w忘了先算(xmax-xmin)再除也没算中心点结果框变成从原点出发的长条。解决严格按第2.1节表格里的公式算。cx(xminxmax)/2再除以Ww(xmax-xmin)/W。转换后抽一张图用opencv把txt坐标画回图像上叠加对比肉眼确认框的位置和原标注一致再批量训练。5.3 类别索引和data.yaml的names对不上现象训练正常loss正常但算出来mAP很低且混淆矩阵里的类别和实际标的东西对不上。原因txt里的第一个数字是类别索引它对应names列表里的第几个名字。如果标注工具导出时类别ID从1开始而yaml里的names从第0项对齐整个模型从头到尾学的是错位标签。解决打印labels_yolo里所有出现的类别索引最大值和nc对比。如果索引最大值等于nc说明索引是从1开始的把yaml里nc加1或者批量把txt的第一列全部减1二选一关键是要让索引变成从0开始的连续整数。5.4 单类数据集mAP显示1.0或全0感觉不真实现象nc1时mAP50直接冲到0.99或者另一头一直是0中间没有渐变过程。原因单类数据集的mAP只统计一个类数据量少时波动本来就大。而且如果验证集里大部分是纯背景图没有蟑螂的图会直接拉低指标反之全是有目标的图mAP会虚高。解决看PR曲线和confusion matrix别只盯mAP。单类场景里precision和recall比mAP更有参考价值目标是把confidence阈值调到precision和recall的交点附近这个在推理阶段做第6章会说。5.5 图像尺寸杂乱导致检测框长宽比失真现象训练不报错但推理时蟑螂被框成细长条或压扁形尤其画面边缘的目标。原因数据集里图片如果来自手机拍摄宽高比不统一常见做法是letterbox填充灰边保持比例。如果哪个环节用了全图拉伸resize目标长宽比就变形了而训练和推理必须用同一种预处理方式。解决确认训练和predict都用imgsz参数且框架默认letterbox。不要自己在外部先把图resize成正方形再喂给模型那等于让模型看变形图。检查推理时输出的结果图如果蟑螂框明显变形优先查预处理而不是模型。6. 推理验证三件事让模型在测试集上真正认蟑螂训练完成只是第一步真正要交付的是一个能落地的检测模型。我一般会在测试集上完整跑一遍验证和推理重点看三件事框的位置准不准、置信度阈值挑得对不对、小目标漏检多不多。先跑一遍验证集指标这一步能看到模型在没见过的图上的真实水平yolo val modelruns/train/cockroach/weights/best.pt datadata.yaml imgsz640输出里最关键是mAP50和mAP50-95。前者是IoU阈值0.5时的平均精度适合快速判断模型有没有学到东西后者更严格小目标数据集上比前者低0.2以上是正常现象。接着对测试集里的典型图做单张推理yolo predict modelruns/train/cockroach/weights/best.pt sourceimages/test/img_0440_52.jpg conf0.25 iou0.5source可以指向单个文件也可以指向一个文件夹。conf是置信度阈值0.25是框架默认但默认不一定是最好的跑完打开runs/detect目录下的结果图如果一堆重叠框就把iou调高或者conf调高如果目标明明可见却没框出来就往下调conf再试。三件事里我最后看的是小目标。蟑螂数据里如果拍摄距离远目标可能只有几十个像素高。把这种图单独挑出来看推理结果如果频繁漏检回到训练阶段提高imgsz或者考虑把数据集里小目标较多的图像做切片。这一步没有玄学就是拿典型图反复看输出。确认没问题后把best.pt备份出来标注好对应的是哪个yaml、哪个imgsz不同超参训练出来的模型不能混着用这是我最常犯也是最后悔踩过的坑之一。从那以后我每次拿到新数据集都强制先跑第3章的校验脚本再按第4章的参数启动训练模型出来先跑一遍val再开推理。希望这份蟑螂数据集的拆解能帮你少走几个来回。本文还有配套的精品资源点击获取
返回列表