尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

塔吊下视数据集构建与YOLOv8小目标检测实战

塔吊下视数据集构建与YOLOv8小目标检测实战 简介这份资源包聚焦塔吊高空作业场景下的向下视角作业图像包含1055张真实拍摄的JPG照片以及一一对应的1055个XML标注文件共2110个文件压缩包大小218.88MB。数据集面向计算机视觉、智慧工地领域的研究者与算法工程师适用于目标检测、实例分割等模型的训练与评估也可用于高空作业安全监测、人员行为识别等场景的算法验证。目前已有298人学习下载。XML标注文件提供了规范化的边界框信息便于直接接入主流深度学习框架使用图像覆盖不同光线、角度和作业姿态能够提升模型在真实塔吊工地环境中的泛化能力。整体目录结构清晰文件名按时间戳命名方便按需筛选与快速开展实验。1. 塔吊下视图像数据集为什么难做又必须做在塔吊驾驶室或吊臂传感器位往下看下方是交叉作业的钢筋工、低头看手机的安全员还有被吊物遮挡的视线盲区。安监平台要识别“吊物下方有人闯入”靠的就是一类特别的数据从塔吊高处向下拍摄、覆盖吊装与卸料全过程的作业图像。1000多张听起来不大放到下视视角里它对应的是几十个作业循环、不同塔吊高度和吊物类型信息密度其实不低。这个图像数据集解决的是高空俯视下的目标检测与作业状态识别核心难点不是“认不认得人”而是“在几十像素的尺度上分清一顶安全帽和一块混凝土碎渣”。适合正在做工地视觉安全、边缘端部署检测模型的工程师也适合准备自建安监数据集、又拿不准标注和训练比例的团队。后面按标注、训练、增强、验证的顺序展开。2. 塔吊高空作业图像数据集的标注类别体系与下视视角陷阱2.1 先用脚本盘点图像数据集的原生质量这批下视作业图像记录的主要是吊物向下排放、卸料及回钩阶段的连续画面通常来自驾驶室固定机位或吊臂末端云台相机。画面上除了作业面还有玻璃反光、吊臂结构遮挡和雨水痕迹标框之前先做质量盘点把真正参与训练的帧选出来比直接开标更省时间。我一般用帧差法去掉近重复帧下视画面里人员移动缓慢相邻两帧内容几乎一致全量标注会让同源样本膨胀。下面这个脚本顺带统计分辨率和亮度分布判断这批图像是不是多个塔吊、多个时段混采的。import cv2 from pathlib import Path imgs sorted(Path(dataset).glob(*.jpg)) n len(imgs) widths, means set(), [] for p in imgs: im cv2.imread(str(p)) h, w im.shape[:2] widths.add((w, h)) gray cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) means.append(gray.mean()) print(图像数量:, n) print(分辨率集合:, widths) print(平均亮度范围: %.0f ~ %.0f % (min(means), max(means)))如果分辨率集合超过两种说明是不同机位或不同塔吊高度采集的切分时要按来源分组如果亮度跨度超过 60说明逆光、阴影场景占比不低后面增强阶段要专门处理不能只做翻转平移。这个盘点结果会直接决定训练集组成也决定要不要额外补拍中午顶光时段的图像。2.2 类别体系怎么定吊物、吊钩与人员分层下视视角的类别设计要按“物的状态”和“人的状态”分层。参考安监平台的常见做法我会把类别定为 person、hard_hat、hook、load、sling 五个检测类再加一个可选的 exclusion_zone 语义区域类。person 与 hard_hat 分开标是因为俯视时头顶占主体安全帽是否佩戴可以直接从头部矩形判断这也正好对应急救场景里“戴没戴帽”的判定。下表是常用类别与下视标注的难度对照类别标注框定位下视难度备注person整个身体外接框中被吊物遮挡概率高hard_hat头顶椭圆外接框低俯视下收益最高的类别hook吊钩金属结构外接框高逆光时与吊索粘连load吊物整体轮廓高形状随物料类型变化大sling吊索可见段极高细长目标容易漏标有个容易踩的坑下视画面里地面的堆料、工具车有时比人还显眼标不标它们会影响模型注意力。我的原则是第一版只标与吊装安全直接相关的对象堆料和车辆全部视为背景等基础类别稳定后再决定是否单列“地面障碍物”类避免类别太多导致每类样本都不够。2.3 标注数据结构与校验脚本标注格式统一转成 YOLO 的 txt 格式每张图一个文件每行是 class_id cx cy w h坐标都是相对图像的归一化值这样接 YOLOv8 训练不用做中转。转换完成后必须跑校验脚本重点查两类问题目标太小、类别不均衡。from pathlib import Path for lbl in Path(dataset/yolo).glob(*.txt): with open(lbl) as f: lines f.read().strip().splitlines() for ln in lines: cid, cx, cy, w, h map(float, ln.split()) pw, ph w * 1280, h * 720 # 按原图分辨率换算像素 if pw 20 or ph 20: print(f{lbl.name}: 小目标 {cid} 仅 {pw:.0f}x{ph:.0f} px)这段脚本按 1280x720 的参考分辨率换算 bbox 的像素宽度。下视场景里 person 目标普遍在 24x40 像素以下如果小目标占比超过一半后面的 imgsz 和增强策略都要按小目标检测来调不能用常规的 640 输入。提示下视视角最典型的标注错误是“只标亮处不标暗处”。阴影里蹲着的人亮度与地面接近肉眼容易漏建议结合视频帧差法生成候选框再人工复核阴影区域。3. 用 YOLOv8 训练塔吊下视作业图像的参数怎么调3.1 按作业循环切分数据集训练前最容易被忽略的是数据切分方式。下视图像往往来自连续视频抽帧帧间相似度极高随机切分会把同一段吊装过程的相邻帧分进训练集和验证集mAP 虚高十几个点部署到新塔吊上立刻现原形。我一般按“作业循环”做单元切分一段从起吊到卸料完成的视频序列作为一个整体要么全进训练集要么全进验证集按 8:1:1 划分训练、验证、测试。操作上用文件名里的时间戳和机位 ID 做分组键先用脚本统计每个循环的帧数再按组切分而不是直接随机打乱图片路径。1000 多张图像按循环切分后验证集可能只剩几十个循环数量偏紧所以测试集只用来做最终验收不参与调参。3.2 关键超参数imgsz、mosaic 与 close_mosaic下视小目标多imgsz 是第一个要动的参数其次是增强相关的参数。下面是塔吊下视场景下我常用的训练命令# 下视场景训练提高输入分辨率、最后阶段关闭 mosaic yolo detect train \ datadataset/tower_crane.yaml \ modelyolov8m.pt \ imgsz1280 \ batch8 \ epochs120 \ mosaic1.0 \ close_mosaic15 \ lr00.005 \ cacheTrue \ projectruns/ \ nametower_detect各参数在下视场景里的含义imgsz1280原始图缩放到 1280 再训练20~40 像素的小目标在特征图上保留更多响应显存不够就降到 960不要直接落回 640。close_mosaic15最后 15 个 epoch 关闭 mosaic让模型在接近真实的单图分布上收敛避免验证集 mAP 虚高。lr00.005小数据集上初始学习率降低一半防止前几个 epoch 权重震荡。batch81280 输入下显存占用约是 640 的四倍按显存余量调整下视图像纹理相对简单batch 太小时收敛不稳。cacheTrue图像源在机械硬盘时建议开启把数据缓存到内存能明显加快迭代。3.3 训练日志怎么判断欠拟合与过拟合这类数据的训练日志有个典型现象mAP50 涨得快mAP50-95 涨得慢。原因是小目标对 IoU 阈值很敏感框偏 5 个像素就从正样本变负样本。看到这个现象不用慌先确认验证集 loss 曲线在 close_mosaic 生效后是否继续下降如果验证 loss 反弹优先降低 lr0 而不是盲目加增强。判断是否欠拟合可以同时跑一轮从零训练不加预训练权重做对照。如果预训练权重版本收敛明显更快而最终指标接近说明 1000 多张图像对当前任务够用如果两个版本指标差距很大说明场景分布与预训练数据差异大需要回去补标注而不是调参。3.4 导出成 ONNX 供边缘端应用训练完成后边缘盒子和摄像头通常跑 TensorRT 或 ONNX Runtime。导出时 imgsz 必须与训练一致否则小目标精度会退化# 导出半精度 ONNX保持与训练一致的图像尺寸 yolo export modelruns/tower_detect/weights/best.pt \ formatonnx imgsz1280 halfTrue dynamicTruehalfTrue 让权重转半精度在 Jetson 系列设备上推理速度能提升 30% 以上dynamicTrue 保留动态 batch 能力方便平台做批量回放检测。导出后要在测试集上对比导出前后的 mAP差值超过 0.5 个点就检查 NMS 配置或输入归一化设置。4. 塔吊向下视角的小目标增强与挖错迭代4.1 针对下视视角的有效增强组合通用增强水平翻转、HSV 扰动对下视图像帮助有限真正有效的是模拟俯视遮挡和光照条件的场景级增强。常用组合如下Copy-paste把标注好的 person、hard_hat 目标随机粘贴到吊物阴影区域模拟人员被吊物遮挡后又露出的过程。下视画面背景以地面为主粘贴后在视觉上是自洽的。逆光模拟用 gamma 变换把暗部压到接近纯黑模拟夏季逆光时段。90 度倍数旋转塔吊吊臂转向后画面旋转 90/180/270 度是真实存在的分布不属于人为增强。import albumentations as A train_aug A.Compose([ A.RandomRotate90(p0.5), A.CLAHE(clip_limit2.0, p0.3), A.RandomGamma(gamma_limit(50, 120), p0.4), A.RandomSizedBBoxSafeCrop(height960, width960, p0.3), ], bbox_paramsA.BboxParams(formatyolo, min_visibility0.3))RandomSizedBBoxSafeCrop 对下视场景很关键裁剪后目标在画面中的相对尺寸变大等效于把远处地面人员“拉近”再训练比单纯提高 imgsz 更省显存。min_visibility0.3 表示裁剪后 bbox 剩余可见面积不足 30% 的目标被丢弃防止增强样本里一半是半个身子。下表是塔吊下视场景常用的增强参数建议增强方式概率关键参数解决的子场景RandomRotate900.590 度倍数吊臂朝向变化CLAHE0.3clip_limit2.0阴影、暗部细节RandomGamma0.4gamma 50~120逆光、顶光过曝SafeCrop0.3960x960远处小目标放大Copy-paste0.2目标数量 1~3吊物遮挡下的部分可见4.2 用挖错逻辑补齐下视长尾1000 多张图像覆盖不了全部长尾尤其是吊索在不同光照下的形态。常见做法是“挖错”用当前最优权重去推理全部原始视频帧挑出误检和漏检再决定补标还是加负样本。# 放低置信度阈值做全量推理收集没把握的预测 yolo predict modelruns/tower_detect/weights/best.pt \ sourceall_frames/ imgsz1280 conf0.15 \ save_txtTrue save_confTrueconf0.15 是刻意放低阈值专门收集“模型其实没把握但还是输出了框”的图像。我一般把筛出的图像按类别分目录每类挑 50~80 张回补标注三轮迭代后吊钩、吊索这类细长目标的 recall 提升最明显。如果某类补标后指标没有变化往往不是样本量问题而是类别定义本身有歧义比如吊钩和吊索的边界始终标不一致。4.3 用数据量估算判断 1000 多张够不够一个很现实的问题这个量级的数据集够不够训练六类检测器我的经验是使用 COCO 预训练权重时单类样本不低于 200 个实例就能训出可部署的基础模型低于 80 个实例的类别建议合并相邻类别或加大复制增强。所以拿到数据集后先按 2.3 的脚本统计每个类别的实例总数再决定是直接训练还是先补标。5. 1000 张图像数据集的验证集切分与置信度校准5.1 按施工场景分组的验证策略最后一步是验证最实用的技巧是“场景分组 时间隔离”双重切分先按塔吊编号或工地分组再保证同组图像不跨训练集和验证集。这样模型在验证时看到的是“另一台塔吊下没见过的地面”而不是同一段吊装循环里高度相似的帧。如果验证集误差集中在某几台塔吊的图像上多半是这些图像在标注阶段用了不一致的标准需要回到 2.3 的校验脚本重新检查。5.2 用 F1 阈值扫描校准告警置信度安监告警场景里误报比漏报更伤因为过度告警会让值班员习惯性忽略所有提示。在小样本上定阈值我会遍历 conf ∈ [0.05, 0.5] 计算 F1选 precision 不再明显增长的拐点作为默认阈值import numpy as np def pick_threshold(scores, labels, total_tp, step0.05): best (0.0, 0.0) for t in np.arange(0.05, 0.5, step): tp int(((scores t) labels).sum()) fp int(((scores t) ~labels).sum()) fn total_tp - tp p tp / max(tp fp, 1) r tp / max(tp fn, 1) f1 2 * p * r / max(p r, 1e-9) # 取 P 与 R 的调和平均 if f1 best[1]: best (round(t, 2), round(f1, 3)) return best这个扫描在 1000 张图像级别的验证集上几十秒就能跑完。塔吊下视场景里阈值通常落在 0.25~0.35具体要看 hard_hat 与 person 之间互误报的比例俯视时一顶安全帽和一簇头发在外观上接近如果混淆矩阵里这两类的误报集中就单独提高该类的置信度阈值而不是全局调低。5.3 把标注结果矢量化成可检索的场景库最后分享一个迭代提效的小技巧训练完后把每张图像的标注区域通过骨干网络输出层之前的 embedding 矢量化得到 512 维特征按塔吊编号、天气时段、作业类型存成向量库。新项目拿到另一批下视图像时先用向量检索找历史相似场景直接继承其类别模板和标注边界能省下首版标注约三成时间。具体做法是把验证集图像输入最佳权重取倒数第二层特征做 L2 归一化存库检索时按余弦相似度排序返回 Top-20 历史标注作为参考。对告警平台来说点开任何一张告警图都能立刻拿到历史同场景的处置记录新工地接入时也能直接复用这套标注模板数据集的复用价值就从训练集延伸到了运营侧。本文还有配套的精品资源点击获取
返回列表