简介:这是一份面向建筑工地安全监控、智能巡检与PPE合规检测的YOLO格式目标检测数据集,检测安全帽(helmet)、反光背心(vest)和施工人员(person)三类目标。压缩包共1236个文件,内含617张jpg现场图像、617个对应txt标注文件,以及yaml配置文件和docx说明文档,整体大小39.27MB;其中txt采用标准YOLO边界框坐标与类别标注,yaml用于设置模型类别,docx为数据集说明,数据按训练集493张、验证集60张、测试集64张划分,可直接适配YOLO系列、Faster R-CNN等主流检测框架。已有323人学习下载。图像全部来自真实工地监控视频帧和施工现场实拍,覆盖不同光照、人员姿态与复杂背景,标注严格遵循个人防护装备标准并经三重质检,边界框定位精准。适用于智能工地安全预警、安全生产管理平台、自动化巡检机器人、岗前安全培训等系统,可帮助开发者快速构建高鲁棒性的工地安全装备检测模型,满足安全监管与合规统计需求。
1. 工地安全装备检测数据集:不是“解压就能训”那么简单
真正的落地场景是:你拿到一个名为“工地安全装备检测数据集2.zip”的压缩包,里面有成百上千张施工现场照片,标注着安全帽、反光衣、安全带等目标,打算用来训练YOLO或者跑一次验证。但你会发现,直接解压、丢进训练脚本,大概率会翻车:标注格式不对、类别ID错位、图片和标签文件名对不上、甚至zip伪加密导致解压失败。这篇文章就把这个数据集从“压缩包”变成“能产出mAP指标的模型”的完整路径讲清楚,包括怎么检查数据、怎么配训练、哪些坑必须绕开。适合要用现成数据集做安全帽检测的算法工程师,也适合刚上手YOLO的实习生。
2. 拆开“2.zip”之前:先看懂数据集的结构和标注格式
我拿到任何一个标注数据集,第一件事不是解压,而是先用unzip -l列一下压缩包里的目录树。这样能在解压前就判断出这个数据集是谁整理的、按什么格式组织的。很多翻车事故其实在解压前就能用这个命令看出来。
常见的工地安全装备检测数据集,内部通常是这么个骨架:
$ unzip -l 工地安全装备检测数据集2.zip Archive: 工地安全装备检测数据集2.zip Length Date Time Name --------- ---------- ----- ---- 0 2024-01-05 10:30 dataset2/ 0 2024-01-05 10:31 dataset2/images/ 123456 2024-01-05 10:31 dataset2/images/0001.jpg ... 0 2024-01-05 10:32 dataset2/labels/ 789 2024-01-05 10:32 dataset2/labels/0001.txt ... 512 2024-01-05 10:33 dataset2/data.yaml看到dataset2/images、dataset2/labels、dataset2/data.yaml这个三级结构,基本能判断这是按YOLO格式整理的数据集:images装原图,labels装同名的txt标注,data.yaml是训练入口配置文件。如果只看到一堆.xml文件,那就是VOC Pascal格式;如果只有一个巨大的.json,很可能是COCO格式。格式不同,后续处理脚本完全不同,所以这一步不能跳过。
2.1 常见目录结构:images、labels、data.yaml 从哪来
在YOLO生态里,目录结构就是数据集的“契约”。images和labels两个目录必须平级,且里面的文件名一一对应:0001.jpg对应0001.txt。有的数据集会把训练、验证、测试直接拆成train/val/test三个子目录,每个子目录里再分images和labels。还有的是把所有图片放在一个目录,靠一个train.txt文本文件记录哪些图片属于训练集,这种做法在早期检测项目里经常见,但放到YOLOv8上就得多写一层划分逻辑。
我一般会先确认命名规则。安全帽检测数据集的图片名常见是000001.jpg这种纯数字编号,也可能是site1_20240101_001.jpg这种带现场信息的。无论哪种,只要labels里的文件名和images里一致,就问题不大。不一致的话,后面用脚本检查会暴露出来。
另外,data.yaml里通常写着names类别列表、train/val路径。有的数据集给的是绝对路径,比如/home/user/dataset2,你本地没有这个路径就会报错;有的给的是相对路径./images,这种在项目根目录下运行训练就不会错。拿到压缩包后,建议先解压到你的工作目录,再自己改写data.yaml中的路径,不要直接用包里的配置。原因很简单:别人电脑上的路径几乎肯定和你不一样。
2.2 标注格式:YOLO txt、VOC XML、COCO JSON 怎么选
工地安全装备检测的标注格式主要有三种,选型依据取决于你后续用哪个检测框架。
| 格式 | 文件组织 | 坐标表示 | 适合场景 |
|---|---|---|---|
| YOLO txt | 每张图一个txt,每行一个目标 | 归一化的中心点x,y和宽高w,h | YOLOv5/v8 直接训练,最简单 |
| VOC XML | 每张图一个xml,标签树结构 | 左上角和右下角绝对像素坐标 | 老项目、标注工具默认导出 |
| COCO JSON | 全部标注在一个json里 | 多边形/矩形像素坐标 | 需要用到COCO评估脚本、实例分割等 |
我见过不少第一次用数据集的人,拿到的是VOC XML,却直接用YOLO训练脚本跑,结果自然是读不到标签。其实转换不复杂,最简单的方式是用ultralytics框架自带的格式转换思路:把XML的标注读出来,按类别映射成数字ID,再除以图片宽高得到归一化坐标,写入txt。COCO转YOLO同理,只是坐标计算从bbox的[x,y,w,h]变换成[x_center,y_center,w,h],注意COCO的坐标是绝对像素,且宽高可能是浮点数,需要单独处理。
下面给一个我常用的最小转换脚本(假设VOC XML和jpg在同一批次目录):
import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_path, out_dir, class_map): tree = ET.parse(xml_path) root = tree.getroot() img_w = int(root.find('size/width').text) img_h = int(root.find('size/height').text) lines = [] for obj in root.findall('object'): cls = obj.find('name').text if cls not in class_map: continue box = obj.find('bndbox') x1 = float(box.find('xmin').text) y1 = float(box.find('ymin').text) x2 = float(box.find('xmax').text) y2 = float(box.find('ymax').text) # 需要防止越界和宽高为负 x_center = ((x1 + x2) / 2) / img_w y_center = ((y1 + y2) / 2) / img_h w = (x2 - x1) / img_w h = (y2 - y1) / img_h lines.append(f"{class_map[cls]} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}") with open(os.path.join(out_dir, os.path.splitext(os.path.basename(xml_path))[0] + '.txt'), 'w') as f: f.write('\n'.join(lines)) # class_map = {'helmet': 0, 'vest': 1, 'safety_belt': 2}这段脚本的重点是:类的编号必须和data.yaml里names的顺序一致,否则训练时模型会把安全帽学成反光衣。把绝对坐标除以图片宽高得到归一化值,这是YOLO的硬性要求。注意xmin/ymin读到的是字符串,先转float再做计算,不然字符串拼接会让你怀疑人生。
2.3 数据集2和数据集1的区别:增量、补标、版本管理
标题里的“2”通常不是随便写的。常见的情况是做数据集的人先整理了第一版,后来发现现场照片里天气变化大、角度刁钻,或者漏标了某些目标,于是补拍了新图片、修正了错误标注,重新打包成“2”。也有的是在第一个数据集基础上扩展了类别,比如第一版只标安全帽,第二版加上了反光衣和安全带。
对于使用者,这个“2”的意义在于:你拿到的很可能是修正版或增量版,不代表它一定比“1”更干净。下载后建议立即计算校验值,比如SHA-256,和发布页给出的值对比,确认包没损坏。我吃过这个亏,曾盲目相信文件名带“2”就是最新版,结果训练到一半发现部分标签坐标全是0,原因就是打包时图片更新了但标签没同步。
版本管理的教训是:拿到数据后,不要直接覆盖旧数据集。把“2”解压成独立目录,用脚本对比新旧两版的类别分布、图像数量,再决定是用它继续训练还是做测试。这样万一发现新版本有退步,还能随时切回旧版。
另外,有些“2”是针对上一个数据集暴露的样本不均衡问题做的增量补充。比如原本安全帽样本很多、反光衣很少,新版补了一批反光衣照片。这种情况下,直接用整个新版训练没问题,但如果你已经用旧版训练过一个模型,那么更好的做法是把增量部分提出来,用旧模型做一轮微调,而不是全部重训。因为重训会带来遗忘风险,也浪费算力。
3. 把zip变成可训练数据:解压、校验与目录落地
下载得到一个.zip文件,最容易的冲动是双击解压,然后直接扔给训练脚本。我建议先做两步:测试压缩包完整性,再解压到干净目录。顺序不能反,因为如果包本身损坏,解压出来的图片和标签可能缺文件,后续训练时文件名匹配会炸一片。
3.1 解压命令与文件完整性校验
在Linux终端里,先用unzip -t测试压缩包的完整性。这个命令会遍历每个文件,计算CRC校验值,给出“OK”或错误提示。如果输出里出现bad CRC或者file #...: missing,说明包有问题,要么重新下载,要么找发布者要校验值。这一步比解压后再去检查文件个数可靠得多。
# 测试压缩包完整性,不实际解压 unzip -t 工地安全装备检测数据集2.zip # 解压到指定目录,保留原始目录结构 unzip 工地安全装备检测数据集2.zip -d ./datasets/ # 如果压缩包内文件名是GBK编码(Windows上常见),用 -O 指定编码 unzip -O GBK 工地安全装备检测数据集2.zip -d ./datasets/-d ./datasets/指定解压目标目录,避免把所有文件散到当前目录。-O GBK的作用是解决文件名乱码问题,很多标注工具在Windows下打包,中文文件名或目录名直接用GBK编码,Linux下不带这个参数解压出来就是乱码,后续代码引用路径时怎么都找不到。
还有一类情况是压缩包“伪加密”。常见表现是解压时要求输入密码,但你明明知道这个包没有加密。或者解压后文件能出来但内容是损坏的。这种多半是zip头部的加密标志位被改过,部分老解压工具会误判。解决办法是用7-Zip或新版本的unzip(6.0以上)就能绕过,或者用Python的zipfile模块直接读,通常也能解开。伪加密不影响正常解压,只是拦一下小白,这是当年“文件加密外传”的恶心手法,现在用来折腾数据包也时有发生。
3.2 目录规划与数据划分:train/val/test 比例
解压完成后,先看目录结构。如果解压出来是dataset2/images和dataset2/labels,但没有按train/val分好,那么需要自己划分。安全装备检测的数据量通常不大,几百到几千张,划分比例按7:2:1或8:1:1都可以。关键是验证集必须来自和你实际部署场景一致的数据,不要全是晴天,不然模型在阴雨天就翻车。
下面这个脚本按8:1:1划分,并把划分后的文件路径写到一个split.txt里,方便后续用ImageFolder方式读取:
import os import random from collections import defaultdict images_dir = 'datasets/dataset2/images' labels_dir = 'datasets/dataset2/labels' train_ratio = 0.8 val_ratio = 0.1 # 测试集取剩余0.1 # 只保留既有jpg又有txt的样本 files = [] for f in os.listdir(images_dir): stem, ext = os.path.splitext(f) if ext.lower() in {'.jpg', '.jpeg', '.png'} and os.path.exists(os.path.join(labels_dir, stem + '.txt')): files.append(f) random.shuffle(files) train_n = int(len(files) * train_ratio) val_n = int(len(files) * val_ratio) groups = { 'train': files[:train_n], 'val': files[train_n:train_n + val_n], 'test': files[train_n + val_n:] } for split, flist in groups.items(): with open(f'{split}.txt', 'w') as f: for name in flist: stem = os.path.splitext(name)[0] f.write(f'{stem}\n')这个脚本把图片文件列表随机打乱后按比例切分,写出的train.txt/val.txt/test.txt只有文件名前缀。实际训练时,YOLO需要的是图片路径,所以这里还要再加工,把前缀拼接成完整的images/{stem}.jpg路径。写文本文件的目的是从源头上保证训练、验证、测试三个集合的样本互不重叠。随机种子没固定,复现时需要设random.seed(42),否则每次划分结果不一样,模型横向对比就不公平了。
3.3 用Python脚本检查图像与标签是否一一对应
划分完目录,下一步是做数据一致性检查。这是整个流程里最能避免“想当然”的一步。需要检查三件事:每个图片是否有同名标签文件;标签文件内容是否为空;坐标是否越界。
import os images_dir = 'datasets/dataset2/images' labels_dir = 'datasets/dataset2/labels' missing = [] empty = [] out_of_bounds = [] for f in os.listdir(images_dir): stem, ext = os.path.splitext(f) if ext.lower() not in {'.jpg', '.jpeg', '.png'}: continue txt = os.path.join(labels_dir, stem + '.txt') if not os.path.exists(txt): missing.append(stem) continue with open(txt) as fp: lines = [line.strip() for line in fp if line.strip()] if not lines: empty.append(stem) continue for line in lines: parts = line.split() if len(parts) != 5: out_of_bounds.append(stem) break cls, x, y, w, h = parts[0], float(parts[1]), float(parts[2]), float(parts[3]), float(parts[4]) if not (0 <= x <= 1 and 0 <= y <= 1 and 0 < w <= 1 and 0 < h <= 1): out_of_bounds.append(stem) break print('缺标签:', missing[:10]) print('空标签:', empty[:10]) print('越界/格式错误:', out_of_bounds[:10])这段脚本很直白,但能一次性揪出三类问题。缺标签的图片在训练时会被当成无目标图像,如果多的话会拉低正样本比例;空标签文件说明标注工具没正确写入;坐标越界通常出现在缩放图片后又重新标注的场景,会导致loss震荡。发现越界样本,不要去手改,直接删掉该样本,或者用代码将坐标clip到0~1之间,这是最省事的处理方式。
跑完脚本后,如果missing或empty不为空,建议单独建一个cleaned/目录,把这些坏样本隔离出来。不要直接删原图,因为你可能需要回头和原始标注核对原因。隔离之后,再以cleaned/作为训练数据源。这个习惯帮我少走了很多弯路。
4. 用YOLOv8训练自己的数据集:从配置到第一次出图
数据检查通过后,就可以进入训练环节。这里我以YOLOv8为例,因为它是目前从数据到权重最顺的一条路。但也别指望“一键训练”真的能出好模型,参数设置错了,模型一样会欠拟合。
4.1 修改data.yaml中的路径和类别
YOLOv8用yaml文件描述数据集的布局,核心是告诉训练器图片在哪里、标注怎么读。写好的data.yaml长这样:
# dataset2/data.yaml path: /home/user/datasets/dataset2 # 数据集根目录 train: images/train # 相对path的训练集图片目录 val: images/val # 相对path的验证集图片目录 test: images/test # 可选,测试集 nc: 3 names: 0: helmet 1: safety_vest 2: safety_belt这里最容易被诟病的是path。如果写成相对路径,比如path: ./datasets/dataset2,就必须保证当前终端的工作目录在datasets的上一级。如果写成绝对路径,换机器就要改。我的习惯是在项目根目录先建一个data_configs/文件夹,把每个数据集的yaml单独放,路径统一改成动态获取,用Python的yaml.safe_load读取后拼上根路径,而不是写死。
names的顺序和数量必须和标注文件的类别ID一一对应。比如标注txt里第一行是0 0.5 0.5 0.2 0.3,那0就对应helmet。如果标注里出现了3但你nc还是3,训练时直接报错“invalid class index”。这点在5.4条避坑里会详说。
4.2 训练命令与关键参数:imgsz、batch、epochs
YOLOv8训练命令很简洁,但参数多。我踩过最惨的坑是batch和显存不匹配,程序跑到一半OOM被杀,前面进度全白费。所以我会先用小batch验证一下。
# 用YOLOv8n做快速验证,batch先设小一点 yolo train model=yolov8n.pt data=dataset2.yaml imgsz=640 batch=8 epochs=50 # 如果显存够,再调大batch yolo train model=yolov8n.pt data=dataset2.yaml imgsz=640 batch=32 epochs=100第一个命令是快速验证。imgsz=640是输入分辨率,工地照片通常宽高不一,模型会统一缩放;batch=8适合6GB显存的小卡;epochs=50对几百张的数据集足够看到loss有没有下降趋势。第二个命令是正式训练,batch=32需要至少16GB显存。如果你的显卡只有8GB,batch=16是安全值——不是不能调更大,而是OOM后又要重新热身,浪费时间。
另外,model=yolov8n.pt是Nano版本,参数少、跑得快。如果追求精度可以换yolov8s.pt或yolov8m.pt。工地安全装备检测的目标不算小,Nano模型能跑到0.7以上的mAP已经很不错,速度还快,适合现场边缘设备部署。这一点在选取型时要想清楚:你要的是每秒跑几十帧的实时报警,而不是追求SOTA的离线分析。
如果你是在已有模型基础上微调,可以用freeze=10参数冻结前10层,只训练头部。对于安全装备检测这种任务,底层特征(边缘、纹理)已经够用,冻结前层能加快训练速度,防过拟合。但如果你用的是全新的数据分布,比如刚从鱼眼摄像头采集的畸变图像,冻结反而限制模型学习,不如全量微调。
4.3 验证模型:mAP、混淆矩阵、预测可视化
训练结束后,在runs/detect/train目录下会得到best.pt、last.pt、results.png和多张混淆矩阵图表。我一般只看三个指标:验证集的 mAP50、mAP50-95、每类的各类平均精度(AP)。
# 用训练时保留的验证集做评估 yolo val model=runs/detect/train/weights/best.pt data=dataset2.yaml # 对测试集或未标注的新图做预测并保存结果 yolo predict model=best.pt source=/home/user/test_imgs/ imgsz=640 save=Trueyolo val会输出每个类别的AP以及整体的mAP。如果某一类的AP明显低,比如反光衣只有0.3,其他类别0.8,说明标注样本不足或标注质量差。yolo predict输出可视化图片,框出检测结果。这一步不要只看指标,一定要抽出几十张预测图肉眼看:安全帽小目标是否漏检?反光衣和背景混淆是否严重?有时候mAP看起来不错,但现场照片里光线一暗就全崩。
我习惯在验证集里专门混入一些阴天、逆光、工人蹲着(遮挡严重)的图片,因为工地安全装备检测的真实难点从来不是标准姿势,而是角度和遮挡。
模型效果不佳时,不要盲目堆epochs。先看每类的AP曲线,如果验证集loss不降,说明模型欠拟合,可以加大epochs或换更大的模型;如果训练loss降但验证loss升,说明过拟合,就要减少epochs、增加数据增强或加dropout。安全装备检测的常见失败模式是“小目标漏检”和“遮挡误检”,前者优先提高输入分辨率,后者靠多角度数据扩充。
5. 避坑指南:解压失败、标签错位、类别遗漏的5个典型病例
以下这些坑我几乎每年都会遇到,有些是数据集本身的问题,有些是环境问题。每条先给现象,再给原因和解决路径,方便你照着排查。
5.1 zip“伪加密”导致Windows解压失败
现象:双击压缩包,弹出要输入密码,但你从未设置过密码;或者换一个解压工具能打开,但解压出来的jpg打不开。
原因:这是典型的“伪加密”手法。zip文件头里有一个“加密标志位”,有些工具打包时会把标志位置1,但实际上并没有真正加密文件内容。Windows自带压缩功能对这类文件会误判为真加密,强制要求密码。很多网上流传的数据集为了防白嫖,会用这种方式给zip加一层“软锁”,其实并不会加密数据,只是给解压制造障碍。
解决:用7-Zip直接打开,通常能忽略标志位正常解压。命令行里也可以用Python的zipfile模块,它读取时不做严格标志检查。如果还不行,就把zip头两个字节之后第6个字节的值从0x01改为0x00,这个操作一般用16进制编辑器改完就能解压。不过我不推荐改文件头,因为可能破坏校验。最简单的还是换7-Zip,也是我在Windows上的固定解法。
5.2 标签文件为空或只有一行“0”
现象:训练日志中出现“WARNING: No labels found in ...”,或者训练到一半loss变成NaN;检查labels目录,发现有些txt是0字节,有些只有一行“0”或“0 0 0 0 0”。
原因:标注工具在批量导出时如果遇到软件崩溃,会写出不完整的文件。只有一行“0”的属于没有坐标的坏标注。空文件则可能因为图片本身就是模糊的负样本,标注员没有标任何目标。
解决:先用第3.3节的检查脚本把所有空文件和格式错误的文件列出来。空标签本身不是错误——如果你的模型要识别“有无佩戴”,负样本(没有人或人未戴装备)需要空标签,但需要确保图片中确实没有标注目标,而不是漏标。对于只有一行“0”的,直接删除该样本,因为它会给训练造成负梯度。注意删除时要同步删除对应的jpg,不然训练集里会出现图片没有标签的警告。
5.3 图像尺寸不一致导致训练OOM或崩溃
现象:训练启动后不久,报“CUDA out of memory”,明明batch调小后还是崩;或者报“image size out of range”。
原因:工地现场照片来自不同设备,有的分辨率是1920x1080,有的是4032x3024,甚至还有全景拼接图。YOLO训练时会统一缩放到imgsz,但如果某些图片原始分辨率过大,预处理阶段占用的临时内存可能超过显存,尤其是在batch并行处理时。
解决:训练前用脚本把所有图片压缩到统一尺寸。我一般这样处理:使用OpenCV读取,将最长边缩到1280或1600,短边保持比例,然后覆盖写入新目录。这样既保留目标细节,又避免内存尖峰。另外,给训练命令加上rect=True参数,让YOLO按宽高比分组batch,也能缓解。但最根本的还是先统一数据。
5.4 安全帽类别被合并成“安全装备”的教训
现象:模型能检测到“头上有东西”,但常常把普通帽子识别成安全帽,或者把安全帽和反光衣互相混淆。查看混淆矩阵,helmet和vest的交叉污染严重。
原因:很多数据集在标注时,把安全帽标成“helmet”、把建筑头盔标成“hard_hat”,还有的只标一类“安全装备”。当不同标注员使用了不同类别名,生成的txt里类别ID五花八门,而data.yaml只有3类。YOLO训练时第3类“safety_belt”的ID被复用或错位,模型自然学混乱。
解决:先用脚本统计所有txt里的类别ID分布,例如:
cat labels/*.txt | awk '{print $1}' | sort | uniq -c如果有0、1、2以外的数字,就说明类别ID不统一。正确的做法是建立映射表,把所有同义词归一到一个ID。比如hard_hat和helmet都映射到0,safety_vest和reflective_vest映射到1。此时需要改的是txt文件第一列的值,而不是data.yaml里的类别名顺序。改完后再跑一遍标注格式检查,确保ID连续且从0开始。
5.5 数据集路径含中文或空格导致读取错误
现象:使用yolo train时一切正常,但一进去就报“Could not find image ...”,手动查看目录文件都在。或者预测时输出的图片路径变成乱码。
原因:ultralytics 的某些版本依赖Python路径库,对中文路径支持不够;OpenCV读取含中文文件名也会失败。还有的朋友把数据集放在D:\我的文档\工地安全目录下,空格和中文混在一起,底层库解析路径时把空格当作分隔符。
解决:养成好习惯,把数据集放到纯英文、无空格、无特殊符号的路径下。比如C:\workspace\dataset2或~/datasets/dataset2。如果数据集压缩包内部目录本身就是中文名,解压后重命名。代码里的路径参数用正斜杠/,Windows下也能认。另外,data.yaml里的path字段不要写相对路径带./太多层,直接写绝对路径最省心。
6. 把数据集用出价值:数据增强与二次标注的取舍
不要拿到数据集就立刻训,也不要一遇到效果差就疯狂加数据。我的做法是先用小模型跑一版,把所有预测结果可视化成一张大图,人工扫一遍。工地场景的检测难点在于光照和遮挡,数据增强应该绕这两个点转。
6.1 哪些增强适合安全装备检测
YOLOv8自带增强参数,hsv_h、hsv_s、translate、scale、fliplr。对安全装备检测,我最看重两个:亮度对比度(hsv_v)和随机平移(translate)。因为工地照片往往会遇到逆光、暗角,把训练集中的亮度扰动调大一点,比如hsv_v=0.6,能提高模型对阴天和背光的鲁棒性。平移增强让目标出现在画面边缘的概率变大,避免模型只关注中心区域。
不建议过度使用旋转增强。安全帽、反光衣有固定的朝向,旋转超过30度会生成不真实的角度,反而增加误检。Mosaic合并增强对提升小目标有帮助,但若数据集本身已经是大目标,开mosaic可能让目标缩得太小。所以我的默认配置是mosaic=0.8,验证集数据增强关掉。
6.2 二次标注:抽样检查与坏样本清洗
训练一轮后,用yolo predict对着验证集生成带框图片,按“每类抽20张”的规则挑出检测错误的样本。常见坏样本有三类:安全帽被杂物遮挡、反光衣和背景墙颜色相近、人蹲着时下半身看不见。这些问题不是简单加epochs能解决的。
我的落地技巧是:将这些“难例”单独存到一个文件夹,用LabelImg或X-AnyLabeling补标一遍,把漏标的目标补上,然后把类别分布中样本量最少的那个类做简单的水平翻转扩充,再加到训练集里微调。一个500张的小数据集,经过两次难例清洗和补充标注,mAP50能提升3到5个点,比单纯调参有效得多。
最后想说的是,下载的数据集永远是别人的标注口径,自己所在的现场未必和它完全一样。我习惯在部署前统计自己现场照片的颜色直方图、目标尺寸分布,再决定是直接用这个数据集还是抽取部分数据做域适应。这个习惯帮我躲过了不少“测试集单点满分、实际现场全挂”的翻车事故。希望帮到你。
本文还有配套的精品资源,点击获取