卡车倾倒建筑垃圾检测数据集:从视频流到行为识别的落地拆解
简介这是一份面向计算机视觉与深度学习方向的目标检测数据集聚焦卡车倾倒建筑垃圾这一特定行为识别任务适合训练和评估YOLOv7等实时检测模型可服务于城市监控、建筑工地管理与环保监测等场景。压缩包共1023个文件约115.49MB其中569张jpg与39张jpeg为原始图像106张png补充样本309个xml文件提供边界框与类别标注覆盖不同角度、光照与倾倒阶段便于直接投入训练与验证。据描述模型在该数据集上训练后mAP可达0.85说明标注质量与场景多样性具备较高实用价值。目前已有240人学习下载。读者可据此完成从图像预处理、标注解析到模型训练与评估的完整流程并借助验证集与测试集监控过拟合为非法倾倒行为的自动化检测提供可复用的数据基础。1. 卡车倾倒建筑垃圾检测数据集从“看见”到“举证”的落地拆解工地出入口、消纳场通道、城乡结合部空地渣土车停三秒、斗一抬、哗啦一倒人还没跑到跟前车已经挂挡走了。环保督查、城管执法、智慧工地项目里这类“卡车倾倒建筑垃圾”行为的取证一直是个老大难靠人盯监控一个屏幕几十路漏检是常态靠地磅和审批数据只能管住正规消纳场管不住半路乱倒。卡车倾倒建筑垃圾检测数据集要解决的就是让算法从视频流里自动认出“这辆车正在倒建筑垃圾”这个动作而不是只认出“这里有一辆车”。它适合三类人做智慧城管/环保 AI 落地的算法工程师、需要给现有监控加行为识别能力的集成商、以及想用开源数据先跑通 demo 再决定要不要自采数据的团队。这一章先把“检测什么、为什么难、数据长什么样”讲清楚后面几章再动手。2. 拆解“倾倒”这个动作目标框、时序与场景定义2.1 为什么普通车辆检测模型在这里会翻车常规 YOLO 检测“卡车”输出的是一个把整辆车框住的矩形。但“倾倒建筑垃圾”的关键信息不在车本身而在车厢举升状态 车尾抛洒物 车辆静止/低速这三者的组合。一辆正常行驶的渣土车和一辆正在倾倒的渣土车在单帧图像里可能只差一个举升角。如果数据集只标“卡车”模型学到的就是“有卡车有事件”误报率会高到没法用。所以这个数据集的核心标注对象通常分两层一层是车辆目标框卡车/渣土车另一层是行为状态标签是否处于倾倒姿态。有些方案还会加第三层抛洒物区域车尾扬尘、落料堆。这三层决定了你后面是走“单帧分类”还是“时序动作识别”。我一般会先明确一件事你的业务是要实时告警还是事后取证。实时告警对延迟敏感倾向单帧轻量模型事后取证可以拉 3~5 秒片段做时序判断准确率更高但算力翻倍。这个选择直接决定数据集怎么切、标签怎么打。2.2 数据集应该包含哪些场景维度一个能落地的卡车倾倒建筑垃圾检测数据集不能只拍晴天正午的干净画面。按我的经验至少要覆盖下面这些维度否则模型上线后遇到真实监控就“玄学”失灵维度建议覆盖原因光照白天、黄昏、夜间补光、逆光夜间车灯和扬尘会让车尾特征糊掉天气晴、阴、雨、扬尘扬尘本身既是线索也是干扰拍摄角度正对车尾、侧后方 45°、高位俯视举升角在不同视角下差异大车辆类型后八轮、前四后八、小型自卸车厢结构不同举升特征不同背景工地口、空地、路边、消纳场背景决定误报来源行为行驶、静止未举升、举升中、倾倒中、倾倒后负样本和过渡态必须要有这里有个血泪经验“举升中”和“倾倒中”一定要分开标。很多团队图省事只标“倾倒”结果模型把刚抬斗还没倒的也算进去告警提前几秒执法时被质疑“人家还没倒”。过渡态样本是这类行为数据集的灵魂。2.3 标注规范框怎么画、标签怎么定标注规范不统一后面训练全是坑。我一般会写一份内部规范核心几条车辆框框住车身可见部分车厢举升时框要包含举升后的车厢不要只框底盘。抛洒物只标从车尾落下的料堆或明显扬尘区域路面已有的旧垃圾不标。状态标签按帧打dumping表示正在落料lifting表示斗已抬但未见落料normal表示正常行驶或静止未举升。遮挡处理车厢被遮挡超过 50% 的帧直接丢弃不硬标。标注工具用 LabelImg、CVAT 或 Label Studio 都行关键是导出格式统一。我倾向 COCO 格式因为后面转 YOLO 或做时序切片都方便。3. 从原始视频到可训练数据集切片、清洗与格式转换3.1 视频抽帧与片段切分的最小脚本拿到原始监控视频后第一步不是急着标而是抽帧和切片。全帧标注太浪费行为识别只需要关键片段。下面这个脚本按“每 N 帧抽一帧 按时间切 3 秒片段”处理import cv2 import os def extract_clips(video_path, out_dir, fps_sample5, clip_sec3): 从视频中按间隔抽帧并按 clip_sec 秒切分片段 fps_sample: 每秒抽几帧监控一般 25fps抽 5 帧足够 clip_sec: 每个片段时长倾倒动作通常 2-5 秒 cap cv2.VideoCapture(video_path) fps cap.get(cv2.CAP_PROP_FPS) if fps 0: fps 25 # 兜底部分监控流读不到 fps step max(1, int(fps / fps_sample)) frame_idx 0 clip_idx 0 buffer [] frames_per_clip int(fps * clip_sec) while True: ret, frame cap.read() if not ret: break if frame_idx % step 0: buffer.append(frame) if len(buffer) frames_per_clip // step: clip_dir os.path.join(out_dir, fclip_{clip_idx:05d}) os.makedirs(clip_dir, exist_okTrue) for i, f in enumerate(buffer): cv2.imwrite(os.path.join(clip_dir, f{i:03d}.jpg), f) buffer [] clip_idx 1 frame_idx 1 cap.release() print(fdone, {clip_idx} clips saved) extract_clips(site_gate.mp4, ./clips, fps_sample5, clip_sec3)逻辑说明fps_sample控制抽帧密度监控场景 5 帧/秒足够捕捉举升过程太高会让标注量爆炸。clip_sec是片段长度倾倒动作从抬斗到落完一般 2~5 秒取 3 秒是折中。step是抽帧间隔用fps/fps_sample算出来避免不同摄像头帧率不一致导致切片错位。参数怎么改如果目标是实时告警fps_sample可以降到 2~3减少数据量如果要做精细时序提到 10。clip_sec遇到慢速倾倒的大车可以放到 5 秒。3.2 清洗三类必须删掉的脏数据抽完帧别直接标先过一遍清洗。我踩过的坑里下面三类数据不删后面训练 loss 会莫名其妙震荡纯背景帧片段里车已经开走只剩空场地。这类帧如果混进正样本模型会学“空场地倾倒”。重复帧监控卡顿导致连续多帧完全一样标注时容易漏标或重复标。极端模糊帧夜间噪点、雨滴糊住镜头人眼都看不清举升角标了也是噪声。清洗可以用简单的帧差法筛掉静止片段再用拉普拉斯方差筛模糊帧import cv2 import numpy as np def is_blurry(img_path, threshold80): 拉普拉斯方差低于阈值判为模糊阈值按分辨率调 img cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) if img is None: return True return cv2.Laplacian(img, cv2.CV_64F).var() threshold def frame_diff_ratio(f1, f2): 两帧差异比例用于筛重复帧 g1 cv2.cvtColor(f1, cv2.COLOR_BGR2GRAY) g2 cv2.cvtColor(f2, cv2.COLOR_BGR2GRAY) diff cv2.absdiff(g1, g2) return np.count_nonzero(diff 20) / diff.sizethreshold这个参数没有万能值1080P 监控我一般从 80 起调模糊就往上加。frame_diff_ratio低于 0.01 基本可判为重复帧。清洗这一步偷懒后面标注和训练要加倍还回来。3.3 转成 YOLO 格式转换脚本与四个边界坑标注导出 COCO 后训练常用 YOLO需要转格式。转换本身不难坑在边界import json import os def coco_to_yolo(coco_json, img_dir, out_label_dir, class_map): class_map: {truck:0, dumping:1, lifting:2} 注意行为标签如果按帧打需要单独处理这里只转目标框 with open(coco_json, r, encodingutf-8) as f: data json.load(f) img_info {img[id]: img for img in data[images]} os.makedirs(out_label_dir, exist_okTrue) for ann in data[annotations]: img img_info[ann[image_id]] w, h img[width], img[height] x, y, bw, bh ann[bbox] # COCO 是左上角宽高YOLO 是中心点宽高且要归一化 cx (x bw / 2) / w cy (y bh / 2) / h nw bw / w nh bh / h # 边界裁剪防止浮点误差越界 cx min(max(cx, 0), 1) cy min(max(cy, 0), 1) nw min(max(nw, 0), 1) nh min(max(nh, 0), 1) cls class_map[ann[category_id]] label_path os.path.join(out_label_dir, img[file_name].replace(.jpg, .txt)) with open(label_path, a) as lf: lf.write(f{cls} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}\n)四个边界坑一是bbox 越界标注时手抖框出图像外不裁剪训练会报错二是宽高为 0极小目标归一化后接近 0YOLO 会忽略需要设最小阈值三是类别 id 不连续COCO 的 category_id 可能从 1 开始YOLO 要求从 0 连续必须用class_map映射四是文件名对不上图片和标签必须同名同目录结构否则训练时找不到标签loss 直接是 nan。4. 训练与验证让模型真的认出“正在倒”4.1 单帧检测 时序投票的混合方案纯单帧检测对“举升中”和“倾倒中”区分弱纯时序模型又重。我常用的是单帧检测出车辆和状态再用滑动窗口投票连续 5 帧里如果有 3 帧以上判为dumping才触发告警。这样既压误报又不用上 3D 卷积。训练单帧模型时把dumping、lifting、normal当成三个类别和车辆框一起训或者分两个头一个头出车辆框一个头出状态分类。数据量小于 5000 张时我倾向用 YOLOv8n 这种轻量模型先跑通别一上来就上大模型。# 常见做法是用 ultralytics 训练配置文件写好路径和类别 yolo detect train datadataset.yaml modelyolov8n.pt epochs100 imgsz640 batch16imgsz设 640 是速度和精度的折中监控画面里车尾细节小可以提到 960但显存和推理时间会涨。epochs100 起步看验证集 mAP 曲线早停 patience 设 20。4.2 验证指标别只看 mAP行为检测的验证不能只看 mAP。mAP 高不代表告警准。我一般会额外看三个指标事件级召回一段真实倾倒视频模型是否至少触发一次告警。这个比帧级召回更贴近业务。误报/小时每路摄像头每小时误报几次。超过 2 次值班人员就会关掉告警。提前/延迟帧数告警发生在倾倒开始后第几帧。太晚车都走了太早可能只是抬斗。验证集要按摄像头划分不能按帧随机分。同一摄像头相邻帧高度相似随机分会导致验证集“作弊”指标虚高。按摄像头分才能看出模型换场景后的真实泛化。4.3 数据增强哪些能用哪些会帮倒忙增强不是越多越好。对卡车倾倒场景马赛克增强要慎用它会把两辆车的车厢拼在一起举升角变得不真实。我一般开这几类亮度/对比度扰动模拟昼夜和逆光。随机裁剪模拟不同安装角度。轻微旋转 ±5°监控支架会有小倾斜。扬尘模拟叠加半透明噪声层增强抗扬尘能力。翻转要小心水平翻转后某些车型的举升方向反了如果业务里方向重要就别开。5. 避坑与排查五条上线前必须过的坎5.1 现象训练 loss 正常但验证集 mAP 一直 0.2 上不去原因大概率是标签格式或路径错了。YOLO 找不到标签时不会报错只会把背景当负样本学。解决先跑一遍yolo detect val看labels数量是否为 0再抽查几个.txt确认类别 id 从 0 开始、坐标归一化在 0~1。5.2 现象白天准夜间全是误报原因夜间车灯高光让车尾特征过曝模型把“亮斑”当成了倾倒线索。解决训练集里补夜间负样本正常行驶的夜间车并在预处理里加 CLAHE 或 gamma 校正。别指望模型自己学会它没见过就是不会。5.3 现象模型把“举升中”误判成“倾倒中”原因过渡态样本太少或者标注时把两者混为一类。解决单独统计lifting帧数如果不到dumping的 30%就要补采或重标。也可以在时序投票里加状态机先lifting再dumping才算完整事件。5.4 现象同一段视频换台机器推理结果不一样原因预处理不一致。训练时用了归一化、resize 方式推理时没对齐。解决把预处理写成一个函数训练和推理共用别一边用 OpenCV 一边用 PIL插值方式不同结果就会飘。5.5 现象告警太频繁值班员直接关掉原因阈值定太松或者没做事件去重。解决加滑动窗口投票 冷却时间同一辆车 30 秒内只报一次。阈值用验证集上的误报/小时曲线来定别拍脑袋。6. 进阶技巧用半自动标注把数据量翻三倍数据量是这类行为检测的天花板。纯手工标 1 万帧一个人要标一周。我的习惯是先用小样本训一版粗模型再用它预标注人工只做修正。具体做法先标 500~1000 帧训一个 YOLOv8n置信度阈值调低到 0.25让它把剩余视频全跑一遍输出预标注框人工在 CVAT 里只改错的、补漏的。实测能把标注速度提 2~3 倍。预标注有个注意点别用预标注结果直接训练一定要人工过一遍。模型自己的错误会被当成真值越训越偏这就是典型的“模型自嗨”。我一般要求预标注修正率低于 10% 才允许进入下一轮。另一个技巧是难例挖掘把验证集里误报和漏报的片段单独存一个文件夹每轮训练后把新难例加进去迭代 3~4 轮事件级召回通常能从 70% 提到 85% 以上。这个循环比换更大模型划算得多。最后说个我自己的教训早期我总想一步到位搞个“全能模型”结果数据没标够、场景没覆盖上线后天天救火。后来改成“先跑通一个摄像头、一个场景再横向复制”反而稳。卡车倾倒建筑垃圾检测数据集这件事数据质量比模型结构重要十倍标注规范比标注数量重要。希望帮到你。本文还有配套的精品资源点击获取