
简介这份吊车图像标注数据集面向计算机视觉方向的学习者与算法工程师尤其适合正在做目标检测训练、需要特定垂类样本的开发者。数据集聚焦建筑工地、港口等场景中的吊车目标可用于模型训练、验证与泛化能力评估。压缩包共6693个文件包含2231张jpg图像、2231个txt标注与2231个xml标注整体约375.1MB同时提供YOLO与PASCAL VOC两种标注格式前者便于实时检测训练后者保留边界框与类别等精细信息方便按需转换使用。目前已有1626人学习下载样本量较为充足有助于降低过拟合风险。图像命名带有场景与时间信息便于按批次划分训练集与验证集读者可直接接入主流检测框架快速完成数据加载、格式转换与基线训练省去自行采集与标注的成本。1. 吊车图像标注数据集_2231从一堆工地照片到能跑的训练集你手头可能有一批工地或厂区拍回来的吊车照片几百到几千张不等想拿来做目标检测却卡在第一步——标注。吊车图像标注数据集_2231 这个标题说的就是这类已经标好的吊车图像集合编号 2231 通常代表一个批次或版本。它解决的核心问题是让你跳过从零画框的苦力活直接进入模型训练和调参。适合两类人一是做工地安全监控、设备清点、吊装姿态识别的算法工程师二是想拿真实工业场景练手的学生或转行者。但别急着下载就开跑标注质量、类别定义、框的粒度决定了你后面是省心还是返工。这一章先把「这是什么、能干什么、坑在哪」讲清楚后面几章带你从数据检查一路走到训练和验证。2. 拆开吊车数据集类别、框和那些看不见的脏数据拿到一个吊车图像标注数据集第一件事不是写训练脚本而是搞清楚它到底标了什么。很多翻车现场都源于「以为标的是整车结果标的是吊钩」。这一章讲清楚数据集的构成逻辑以及怎么在动手前把脏数据筛出来。2.1 吊车标注的三种常见粒度工业场景里吊车标注通常分三个层级不同层级对应完全不同的任务整车级一个框把整个吊车车身含底盘、驾驶室、吊臂框住。适合做设备清点、区域入侵检测。框通常很大长宽比接近 2:1 到 3:1。部件级分别标吊臂、吊钩、支腿、驾驶室。适合做姿态分析、吊装合规检查。这类标注对框的贴合度要求高吊臂往往是细长框。关键点级不画框标吊钩位置、吊臂铰点等。适合做动作识别但标注成本最高。吊车图像标注数据集_2231 如果没在文档里写明粒度你就得自己抽样看。常见做法是随机抽 20 张用标注查看工具打开看框是包住整车还是只包吊钩。如果混着标这个数据集就得先做类别合并或拆分否则模型学出来的是四不像。2.2 用脚本做标注质量体检在训练之前我一般会跑一个体检脚本把框的尺寸分布、长宽比、类别平衡度算出来。下面这段 Python 用pandas和Pillow读 YOLO 格式的标注输出统计信息import os import pandas as pd from PIL import Image from collections import Counter # 假设数据集结构images/ 和 labels/ 同级标注为 YOLO txt 格式 IMG_DIR dataset/images LBL_DIR dataset/labels records [] for img_name in os.listdir(IMG_DIR): if not img_name.lower().endswith((.jpg, .png, .jpeg)): continue img_path os.path.join(IMG_DIR, img_name) lbl_path os.path.join(LBL_DIR, os.path.splitext(img_name)[0] .txt) if not os.path.exists(lbl_path): records.append({img: img_name, cls: -1, w: 0, h: 0, ar: 0}) continue with Image.open(img_path) as im: W, H im.size with open(lbl_path) as f: for line in f: parts line.strip().split() if len(parts) ! 5: continue cls, xc, yc, bw, bh map(float, parts) # 转成像素宽高 pw, ph bw * W, bh * H ar pw / ph if ph 0 else 0 records.append({img: img_name, cls: int(cls), w: pw, h: ph, ar: ar}) df pd.DataFrame(records) print(总框数:, len(df)) print(类别分布:\n, df[cls].value_counts()) print(宽高统计:\n, df[[w, h, ar]].describe()) # 找出异常宽或高小于 8 像素的框 tiny df[(df[w] 8) | (df[h] 8)] print(过小框数量:, len(tiny))这段脚本的逻辑很直接遍历图片和对应标注文件把归一化坐标还原成像素宽高然后看分布。参数上IMG_DIR和LBL_DIR按你实际目录改YOLO 格式每行是类别 x_center y_center width height都是 0 到 1 的归一化值。跑完重点看三个数类别分布是否严重偏斜比如某一类占 90%、宽高均值是否符合吊车形态、有没有小于 8 像素的框。过小框往往是误标训练时会被模型忽略但会拉低召回。发现异常后要么剔除要么重新标。2.3 类别不平衡和背景图怎么处理吊车数据集常见问题是「吊车多、吊钩少」或者大量背景图没有标注。如果直接训练模型会偏向多数类。我一般会做两件事一是统计每类实例数对少于总数 10% 的类做过采样或加权重二是检查无标注图片如果背景图占比超过 30%要单独放一个background目录训练时按比例混入否则模型会把背景也当成吊车。YOLO 系列可以在数据配置里设fl_gamma或直接用copy_paste增强但前提是类别定义清晰。3. 从原始标注到 YOLO 训练集转换、划分与配置文件数据体检过关后下一步是把标注转成训练框架认识的格式并划分训练验证集。这一章以 YOLO 格式为主线因为吊车检测落地时 YOLOv8/v11 用得最多转换脚本和配置文件写清楚你换其他框架也能照搬思路。3.1 标注格式转换COCO、VOC 到 YOLO吊车图像标注数据集_2231 如果给的是 COCO json 或 VOC xml需要转成 YOLO txt。下面这个脚本处理 COCO 格式输出每张图一个 txtimport json import os from PIL import Image COCO_JSON annotations/instances.json IMG_DIR dataset/images OUT_DIR dataset/labels os.makedirs(OUT_DIR, exist_okTrue) with open(COCO_JSON) as f: data json.load(f) # 建立 image_id 到文件名的映射 img_map {img[id]: img[file_name] for img in data[images]} # 建立 category_id 到连续索引的映射YOLO 要求从 0 开始 cat_ids sorted({ann[category_id] for ann in data[annotations]}) cat2idx {c: i for i, c in enumerate(cat_ids)} print(类别映射:, cat2idx) # 按 image_id 分组标注 from collections import defaultdict anns defaultdict(list) for ann in data[annotations]: anns[ann[image_id]].append(ann) for img_id, ann_list in anns.items(): file_name img_map[img_id] img_path os.path.join(IMG_DIR, file_name) with Image.open(img_path) as im: W, H im.size lines [] for ann in ann_list: x, y, w, h ann[bbox] # COCO 是左上角 x,y 加宽高 xc (x w / 2) / W yc (y h / 2) / H bw w / W bh h / H cls cat2idx[ann[category_id]] lines.append(f{cls} {xc:.6f} {yc:.6f} {bw:.6f} {bh:.6f}) out_path os.path.join(OUT_DIR, os.path.splitext(file_name)[0] .txt) with open(out_path, w) as f: f.write(\n.join(lines)) print(转换完成共处理, len(anns), 张图)逻辑说明COCO 的bbox是[x_min, y_min, width, height]YOLO 要的是归一化中心点和宽高所以先算中心点再除以图像宽高。cat2idx把原始类别 id 映射成 0 开始的连续整数这一步不能省否则训练时类别索引对不上。参数上COCO_JSON指向你的标注文件IMG_DIR是图片目录OUT_DIR是输出标注目录。跑完抽查几张用cat看 txt 内容确认坐标在 0 到 1 之间。3.2 训练验证集划分的两种策略划分不是随机切一刀就完事。吊车场景里如果同一台吊车在不同光照、不同角度下都有图随机划分会导致训练集和验证集高度相似验证指标虚高。我一般用两种策略按场景划分如果数据来自多个工地按工地划分验证集用没见过的工地。这样能真实反映泛化能力。按时间划分如果数据是连续拍摄的按时间段切验证集用后一段。适合做时序相关的任务。具体操作可以写一个脚本按文件名前缀或目录分组再按 8:2 切分。划分完生成两个 txt 文件每行一个图片路径供 YOLO 的train.txt和val.txt使用。3.3 写对 data.yaml路径、类别数和增强参数YOLO 训练依赖一个data.yaml里面几个字段最容易写错path: /abs/path/to/dataset # 数据集根目录建议绝对路径 train: train.txt # 训练图片列表相对 path val: val.txt # 验证图片列表 nc: 3 # 类别数必须和标注里的最大类别索引1一致 names: [crane, hook, outrigger] # 类别名顺序和索引对应nc写错是最常见的翻车点如果标注里最大类别索引是 2nc必须写 3写 2 会直接报索引越界。names的顺序要和转换时的cat2idx一致否则模型学出来的类别名全乱。路径建议用绝对路径相对路径在不同工作目录下容易找不到文件。增强参数不在这个文件里而是在训练命令里传比如yolo train datadata.yaml modelyolov8n.pt epochs100 imgsz640。4. 吊车检测训练避坑从显存爆掉到指标虚高训练吊车检测模型时报错和指标异常是常态。这一章按「现象 → 原因 → 解决」列几条我踩过的坑每条都对应具体操作。4.1 显存不够batch 和 imgsz 的取舍现象训练一开始就报CUDA out of memory或者跑几个 epoch 后崩掉。原因吊车图片分辨率通常较高工地监控截图常见 1920×1080默认imgsz640加上batch16可能超出显存。另外如果标注框特别多损失计算也会占显存。解决先把batch降到 8 或 4再把imgsz降到 512 试。如果还不行用yolo train ... batch4 imgsz512跑通后再逐步加。另一个办法是开混合精度ampTrueYOLOv8 默认开能省约 30% 显存。注意降imgsz会损失小目标比如远处的吊钩的检测能力所以优先降batch。4.2 验证指标高但实际漏检划分和增强的锅现象验证集 mAP 到 0.9但拿新工地照片一测漏检严重。原因训练验证集随机划分导致同场景图片同时出现在两边模型只是记住了场景不是学会了吊车特征。另外如果开了mosaic增强但验证集也做了增强指标会虚高。解决按 3.2 的场景划分重做数据集确保验证集来自不同工地或不同时间段。验证时关掉增强YOLO 默认在val时不加 mosaic但如果你自己写了 dataloader 要检查。重划后 mAP 可能会掉到 0.6 左右这才是真实水平。4.3 类别名对不上names 顺序写反现象推理时框的位置对但类别标签全错吊车被标成吊钩。原因data.yaml里names的顺序和标注转换时的类别索引不一致。比如转换时cat2idx是{hook:0, crane:1}但 yaml 里写成了[crane, hook]。解决回头核对转换脚本打印的cat2idx把names按索引顺序重写。最稳妥的办法是转换时就把类别名和索引一起存成 json训练前用脚本读 json 生成 yaml避免手写。4.4 小目标漏检锚框和 imgsz 不匹配现象整车检测正常但吊钩、支腿这些小部件几乎检不到。原因默认锚框尺寸偏向中等目标小目标在特征图上响应弱。加上imgsz降到了 512小目标像素更少。解决把imgsz提到 768 或 896同时用yolo train ... rectTrue保持长宽比减少 padding。如果还不行换更大的模型比如 yolov8m 或 yolov8l小目标检测能力更强。另外检查标注里小框是否被过滤掉了回到 2.2 的体检脚本看w和h分布。4.5 训练 loss 不降学习率和预训练权重现象loss 从第一轮就震荡或者一直不降。原因学习率设太大或者没用预训练权重从头训。吊车数据集通常几千张从头训很难收敛。解决用 COCO 预训练权重yolov8n.pt起步学习率用默认的lr00.01如果震荡就降到0.001。另外确认标注没有大量错误框错误框会让 loss 下不去。可以先用 100 张图过拟合一下如果 loss 能降到接近 0说明标注没问题再上全量数据。5. 验证与迭代用混淆矩阵和 PR 曲线定位问题训练完不是看个 mAP 就结束。这一章讲怎么用验证工具定位具体问题以及一个提升小目标召回的具体技巧。5.1 读懂混淆矩阵谁被误判成谁YOLO 训练完会在runs/detect/val下生成confusion_matrix.png。重点看两处对角线是正确分类非对角线是误判。如果crane被大量判成background说明漏检可能是标注框太小或模型容量不够如果hook被判成crane说明两类特征区分度不够需要检查标注粒度是否一致。混淆矩阵配合PR_curve.png看PR 曲线下的面积就是每类的 AP哪类曲线低就重点补哪类的数据。5.2 用切片推理提升小目标召回吊车吊钩在整图里可能只占几十像素直接推理容易漏。一个实用技巧是切片推理把大图切成重叠的小块分别检测再合并。下面是一个简化实现import cv2 import numpy as np from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) img cv2.imread(test_crane.jpg) H, W img.shape[:2] TILE 640 STRIDE 480 # 重叠 160 像素 boxes [] for y in range(0, H, STRIDE): for x in range(0, W, STRIDE): tile img[y:yTILE, x:xTILE] if tile.shape[0] 32 or tile.shape[1] 32: continue results model(tile, conf0.25, verboseFalse) for r in results: for box in r.boxes: x1, y1, x2, y2 box.xyxy[0].tolist() # 还原到原图坐标 boxes.append([x1x, y1y, x2x, y2y, box.conf.item(), int(box.cls.item())]) # 用 NMS 合并重叠框 def nms(boxes, iou_thr0.5): if not boxes: return [] boxes sorted(boxes, keylambda b: b[4], reverseTrue) keep [] while boxes: best boxes.pop(0) keep.append(best) boxes [b for b in boxes if iou(best, b) iou_thr] return keep def iou(a, b): xx1, yy1 max(a[0], b[0]), max(a[1], b[1]) xx2, yy2 min(a[2], b[2]), min(a[3], b[3]) inter max(0, xx2-xx1) * max(0, yy2-yy1) area_a (a[2]-a[0]) * (a[3]-a[1]) area_b (b[2]-b[0]) * (b[3]-b[1]) return inter / (area_a area_b - inter 1e-6) final nms(boxes) print(切片推理后框数:, len(final))逻辑说明把原图按TILE大小、STRIDE步长切块每块单独推理再把框坐标加回原图偏移。STRIDE小于TILE是为了让相邻块有重叠避免目标被切断。最后用 NMS 去掉重复框。参数上TILE一般设成模型训练时的imgszSTRIDE设成TILE的 0.7 倍左右。这个方法的代价是推理变慢但小目标召回能提升 10 到 20 个百分点。我一般只在验证阶段用切片推理确认漏检原因如果确实是小目标问题再考虑重新训练更高分辨率的模型。5.3 迭代节奏先修数据再调模型最后说一个习惯每次指标不达标先回去看数据别急着换模型。我自己的顺序是——查混淆矩阵定位类别 → 抽样看误检漏检图的标注 → 补数据或修标注 → 再训练。模型结构带来的提升通常只有几个点而标注质量带来的提升可能是几十个点。吊车图像标注数据集_2231 这类工业数据场景重复度高把验证集划分做扎实比调参有用得多。希望帮到你。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。