简介高质量的标注数据是目标检测模型训练的基础。面向遥感目标检测与YOLO系列模型训练需求这份资源提供真实场景下的油罐检测图像数据样本场景丰富使用LabelImg人工标注标注框质量较高同时按训练规范将图像与XML、TXT标签存放在不同文件夹便于直接接入YOLO流程。压缩包共2000个文件以1000个XML和990个TXT标注文件为主体另有HTML环境配置与训练说明、Python数据划分脚本及YAML模型配置整体224.22MB。目前已有247人学习浏览。除数据本身资源附带完整配套包括YOLO环境搭建与训练教程覆盖Linux和Windows基于案例修改训练自定义数据集的方法以及多个划分脚本可一键完成训练集、验证集、测试集的划分并生成ImageSets索引文件图片和标签同步移动到对应目录。这些内容能帮助使用者从零搭建环境快速完成数据准备与模型训练特别适合需要标准遥感目标检测数据集的高校学生、科研人员和入门开发者。1. 第一晚跑通 YOLO 遥感油罐检测其实就差这份现成数据集第一次用 YOLO 做遥感目标检测的人大概率会在油罐这种小目标上被现实教育一顿一张遥感图里二三十个圆形罐体每个只有十几个像素模型训了十几个 epoch 看起来收敛了一推理却发现把圆形冷却塔、厂房穹顶全框了进来。这份 YOLO 遥感油罐检测数据集(含1000张图片) 把最磨人的一步提前做完了——它直接提供 VOC、COCO、YOLO 三套格式的标签外加划分脚本和训练教程。你不需要从零标注不需要自己写转换工具也不用到处问“标注完 yolo 格式后怎么训练”。1000 张图的规模刚好踩在“够用来微调、又不至于下载到崩溃”的位置。适合刚接触 YOLO 训练、手头有遥感业务数据但还没跑通全流程的人先拿它把环境、格式、训练、评估这条链路走通再换成自己的数据。2. 认识这份数据资产1000 张遥感图与三套标签格式的分工这类压缩包解压之后目录名可能叫images、Annotations、labels、coco也可能混着scripts、classes.txt、train.txt一类文件。我拿到手的第一件事不是急着跑训练而是先弄明白包里三套标签分别是给谁用的以及它们之间怎么互相印证。2.1 为什么要同时给 VOC、COCO、YOLO 三种格式标注生态的底层逻辑Pascal VOC 格式每个图像对应一个 XML 文件里面用object记录物体名称和bndbox框坐标。COCO 格式把整份数据集收进一个 JSON图像信息、标注信息、类别表分三个数组存放。YOLO 格式则是一个图像一个 txt 文件每行class_id x_center y_center width height四个数值全部归一化到 0 到 1。我以前用过 labelimg 打标保存过一次 yolo 格式的标注后来又因为换训练框架不得不去写转换脚本来回折腾一整天。这就是为什么同时给三套格式的交付方式特别省心VOC 适合在标注工具里继续改框COCO 适合用 Detectron 或 mmdetection 这类依赖 JSON 的框架YOLO 格式则可以直接喂给 YOLO 系列做训练。你不需要改标注只需要在训练前把所有图统一放进一个目录、所有标签统一放进另一个目录。三套格式的坐标约定必须记牢格式典型后缀框坐标含义坐标是否归一化常用阶段VOC.xmlxmin, ymin, xmax, ymax否像素坐标标注、二次编辑COCO.jsonx, y, width, height否像素坐标多框架训练、评估YOLO.txtx_center, y_center, width, height是0~1 相对值YOLO 系列训练这份数据集的油罐类名可能叫oil_tank也可能叫tank或中文名别假设它一定叫什么。开始训练之前第一步是确认类别名和类别 ID别让一个名字差异毁掉后面所有步骤。2.2 先检查再训练用 20 行 Python 快速验证标签与图像能否对上很多翻车案例不是模型问题而是标签文件本身有问题有图没标注、txt 里坐标越界、COCO JSON 里的 image_id 对不上文件名。我一般会在训练前先跑一段快检脚本把三种格式都扫一遍。# inspect_formats.py import json, glob, os import xml.etree.ElementTree as ET def scan_yolo(txt_path): boxes [] with open(txt_path, encodingutf-8) as f: for line in f: parts line.strip().split() if len(parts) ! 5: return None, 字段数不是5 cls, x, y, w, h int(parts[0]), *map(float, parts[1:]) if not (0 x 1 and 0 y 1 and w 0 and h 0): return None, 坐标越界 boxes.append((cls, x, y, w, h)) return boxes, None def scan_voc(xml_path): tree ET.parse(xml_path) boxes [] for obj in tree.findall(object): name obj.findtext(name) bb obj.find(bndbox) boxes.append((name, *[float(bb.find(k).text) for k in (xmin, ymin, xmax, ymax)])) return boxes, None def scan_coco(json_path): with open(json_path, encodingutf-8) as f: data json.load(f) return (len(data[images]), len(data[annotations]), len(data[categories])), None这段脚本的用途是快速摸清三类格式的健康状态。YOLO 格式最容易出问题因为坐标经过手动转换后可能出现负值或大于 1 的值必须靠数值检查拦下来。VOC 格式容易出问题是name字段混入空格或不一致大小写比如Oil_Tank和oil_tank并存这种不一致到后面会直接导致类别 ID 错位。COCO 的 JSON 则要重点确认images、annotations、categories三个数组的长度以及 annotation 里引用的image_id是否真的在 images 里。2.3 类别与文件名约定直接影响后续训练教程能否跑通的两个细节类别名字和文件名是这套流程里最容易忽略的两个细节。先看类别训练前必须有一份确定的类别清单不管是classes.txt还是 YAML 里的names字段它必须和标签里的类别 ID 一一对应。油罐这类数据往往只有一个类别但当包里有多个类别时顺序一旦排错模型学到的东西就全错了。文件名也要检查。遥感数据集常见文件名像scene_001_0001.jpg当包内既有大图又有切割后的瓦片时不同目录里的同名文件特别多不能只看文件名就确认图像和标签匹配。我习惯给图像文件计算一遍 stem再和标签 stem 做差集# check_match.py from pathlib import Path image_dir Path(images) label_dir Path(labels) image_stems {p.stem for p in image_dir.iterdir() if p.suffix.lower() in (.jpg, .jpeg, .png, .tif)} label_stems {p.stem for p in label_dir.iterdir() if p.suffix.lower() .txt} print(缺标签的图像:, len(image_stems - label_stems)) print(缺图像的标签:, len(label_stems - image_stems))运行结果里只要有一个非零值就别继续训练了。先回去修标签命名否则训练过程会非常诡异损失似乎正常但验证集 mAP 一直为零那多半是标签张冠李戴。3. 划分脚本的价值与改造别让随机打散毁掉你的 mAP 评估拿到 1000 张遥感图后很多人直接把全部图片丢进训练脚本让 YOLO 自己留验证集。这是我能想到的最危险做法。遥感数据通常来自连续航带同一个区域的多张瓦片内容高度相似随机分出来的训练集和验证集会互相“泄露”导致评估结果虚高。真正落地后换个场景准确率立刻掉下来。3.1 固定随机种子与按目录划分保证可复现的两种方式划分脚本解决的不只是“留多少做验证”的问题更重要的是“怎么保证每次划分一致”。常见做法是固定随机种子random.seed(42)之后洗牌每次跑结果都一样训练结果可以复现论文或汇报里也能交代清楚数据分配。另一种更严格的做法是按场景目录划分。如果包内图像是按文件名前缀区分场景的比如port_*、refinery_*我建议先按前缀分组再把整个组放进同一侧。这样训练集和验证集不包含来自同一区域的图像评估结果才贴近你的真实业务。1000 张图不算多按场景分组后集合会变小但换来的泛化评估更可信。3.2 一个可直接用的划分脚本与参数说明下面这个脚本是我常用的划分方式把images和labels两个平铺目录按比例切成train/val/test三个子集并保持图像和标签一一对应。# split_data.py import random, shutil from pathlib import Path random.seed(20240617) # 固定随机种子保证每次划分结果一致 image_dir Path(images) label_dir Path(labels) train_ratio 0.8 val_ratio 0.1 # 剩余 0.1 自动进入 test out_dirs [train, val, test] for split in out_dirs: (Path(split) / images).mkdir(parentsTrue, exist_okTrue) (Path(split) / labels).mkdir(parentsTrue, exist_okTrue) images sorted([p for p in image_dir.iterdir() if p.suffix.lower() in (.jpg, .jpeg, .png, .tif)]) random.shuffle(images) n_train int(len(images) * train_ratio) n_val int(len(images) * val_ratio) split_map { train: images[:n_train], val: images[n_train:n_train n_val], test: images[n_train n_val:], } for split, items in split_map.items(): out_img_dir Path(split) / images out_label_dir Path(split) / labels for img in items: label label_dir / (img.stem .txt) if not label.exists(): print(警告缺少标签, img) continue shutil.copy2(img, out_img_dir / img.name) shutil.copy2(label, out_label_dir / label.name) print(f{split}: {len(items)} 张)代码里有三个地方值得你按需调第一个是random.seed的种子值改成别的数字可以得到新划分第二个是train_ratio和val_ratio遥感小数据集用 8:1:1 或 7:2:1 都常见object 数量少时建议把验证集放宽到 20%第三个是shutil.copy2是否要改成shutil.move如果你不打算保留原始完整目录用 move 能省一半磁盘空间但我会先复制一份避免后面想重新划分时发现原图已被拆散。3.3 划分后必做的一致性检查图像、标签、类别三表对齐划分脚本跑完训练前的最后一关是再检查一次三个子集。我遇到过脚本跑完才发现 train 的标签目录里混进了来自其他数据集的 txtYOLO 训练时标签的行数与类别数不匹配直接报错。一个简单的检查逻辑是对每个子集统计图像数量、标签数量、每个类别的实例数打印成一张对照表。用split_map生成之后你可以把每个子集的items再循环一次统计每张图标签里出现的类别 ID 和框数量。如果某个类别在验证集中出现次数为 0说明这次划分不合理大概率影响评估结果。这一步不需要额外轮子用上一小节脚本内的循环结构复制一段统计逻辑就能完成。别图省事跳过这一步能拦下大多数莫名其妙的训练失败。4. 训练教程怎么落地从环境配置到损失曲线判读这份压缩包一个重要的存在理由是配套的训练教程而不是仅仅喂给你数据。YOLO 系列的环境配置对新手不算友好尤其是 Python 版本、CUDA 版本和依赖库三者不匹配时报错能连续追一晚上。4.1 环境配置与数据增强在小数据集上的重要性用 YOLO 训练自己的数据集先要有一个干净的环境。以最常见的 ultralytics 派系为例Anaconda 环境配置要求大致是 Python 3.10 或 3.11显存满足的情况下装最新版依赖即可。我常用下面的方式起环境conda create -n yolo python3.10 -y conda activate yolo pip install ultralytics如果你用 YOLOv5 仓库则是装完基础依赖后从仓库根目录启动训练。核心思路一致环境里别装太多和 torch 冲突的包最好用干净的 conda 环境避免和系统 Python 打架。遇到AttributeError或ImportError时优先检查torch和torchvision版本是否会匹配 CUDA不要只问“yolo 环境配置”先查自己的 CUDA 版本再装对应 PyTorch这条路最不容易翻车。数据增强在这类小数据集上是决定生死的一环。1000 张图不算少但油罐形态高度重复场景变化有限。YOLO 内置的 mosaic、翻转、缩放、色彩抖动让模型见过更多组合。训练时我喜欢把hsv_h、hsv_s这类增强参数保持默认但会针对遥感图把degrees提高到 30 度甚至 90 度因为油罐从俯视角度看方向完全随机。4.2 用 YOLO 训练自己的数据集yaml 和训练命令的完整闭环要让 YOLO 训练起来第一步是给数据写一个 YAML。无论压缩包里的教程怎么写最终都要落到这个文件。假设你已经把数据集划分成train/image、val/images这样的目录结构yaml 大致长这样# oil_tank.yaml path: /你的绝对路径/oil_tank train: images/train val: images/val test: images/test nc: 1 names: 0: oil_tankpath最好写绝对路径写相对路径时权重保存位置和训练脚本所在目录不一致经常出问题。nc是类别数包内如果只有一个油罐类就是 1有多个类就改大并在names里按顺序写全。这里最容易踩的坑是names顺序和 txt 里第一位class_id没对上一旦错位模型训练不会报错但推理时会输出错误类别。训练命令按你采用的具体版本略有差别思路是下面这样yolo train dataoil_tank.yaml modelyolov8s.pt epochs120 imgsz640 batch16 workers4epochs在小数据集上我一般从 100 起步早停机制会在验证损失不再下降时自动停。imgsz很关键遥感油罐是典型小目标如果原图分辨率在 1024 以上直接缩到 640 会把罐体边缘细节抹掉我建议条件允许时用imgsz960或1280代价是显存占用和训练时间明显上升。batch按显存调从 16 往下减到不爆显存即可别一上来就追求大 batch。4.3 损失函数与过拟合判断如何判断要不要提前停训练打印的损失曲线不是黑匣子它是你看得见的下一次早停信号。YOLO 的损失函数通常包含边界框回归损失、分类损失以及边框分布的 DFL 损失日志里会看到box_loss、cls_loss、dfl_loss分别下降。重点不是看训练集上的 loss 有多低而是看验证集上的val_loss是否还在下降。我在第 50 个 epoch 左右会特别盯两条曲线训练集损失和验证集 mAP。如果训练集损失继续降验证集 mAP 却横盘甚至下跌说明模型已经过拟合了。油罐特征单一1000 张图训练到 150 epoch 很容易记住训练集里的地表纹理而不是罐体本身。此时不要死等 epochs 跑完直接手动 CtrlC然后从最近一次验证损失最低的权重继续微调或者把增强强度再拉高。学会提前停比多跑几十个 epoch 更实用。5. 遥感油罐训练避坑指南5 个让我反复翻车的细节训练流程跑通是一回事把精度调到能交付是另一回事。以下五条都是我在类似遥感目标检测任务里真实踩过的坑按“现象、原因、解决”写清楚希望能帮你少走弯路。5.1 大小写命名导致的类别错乱现象VOC 的name里既有Oil_Tank又有oil_tank转成 YOLO 格式后同一张图里出现了类别 0 和类别 1训练完的模型把油罐分成了两类。原因类别名是手工标注的多人参与或工具切换时很容易混入不同写法。YOLO 格式里的类别 ID 并不关心文本长什么样只按出现顺序排 ID。解决训练前把所有标签里的类名统一成小写并清洗空格再重新生成classes.txt。可以用sed批量替换也可以在检查脚本里直接用字符串归一化处理总之要在转格式之前做掉。5.2 三套格式坐标体系互换时的 bbox 越界现象COCO JSON 里的 bbox 是x, y, width, height有人按 VOC 的xmin, ymin, xmax, ymax去解析得到的宽高变成负数模型训练时 loss 疯狂跳甚至出现 NaN。原因坐标约定搞混了。VOC 是左上右下两个点COCO 是左上点加宽高YOLO 又是归一化中心点加宽高。三套格式互转时任何一个地方少了除以图像宽高的步骤坐标就会越界。解决写转换时统一用图像宽高做分母转换完立刻打印若干条样本看数值是否落在 0 到 1 之间。上一章给的scan_yolo检查脚本就能拦下这个问题别跳过检查直接开训。5.3 小目标与切图漏检现象在 640x640 的瓦片上训练推理小图时检测效果不错换到大范围遥感影像后把大图切成瓦片再推理一个油罐都找不到。原因油罐在原始大图里可能只占 10 个像素切瓦片后相当于被放大了但如果切出来的瓦片没有和训练集瓦片尺度保持一致模型看到的尺度分布就变了。另一个原因是切图时罐体被边框切断完整目标不存。解决切图让尺寸与训练分辨率保持一致同时保留切图重叠区域推理时用 NMS 合并重叠框。最省事的做法是把训练imgsz提高到 960 或 1280让模型在原分辨率下看到更多小目标细节。5.4 置信度门限和误检失控现象验证集 mAP 有 0.9视频推理时却出现大量圆形误检框把冷凝塔、圆形屋顶都标成油罐。原因验证集 mAP 高并不代表实际场景误检少。遥感场景里和油罐形状相似的目标很多默认的置信度门限往往低于 0.25模型把“有点圆的物体”全给了低置信度输出。解决推理时把conf从默认值调高到 0.4 或 0.5再观察漏检率。YOLO 推理命令加conf0.45即可同时可以把iou适当调高来抑制重叠框。这个参数没有万能值拿验证集里那些最难样本来回试先保准再保全。5.5 DataLoader workers 卡死现象训练刚开始就卡住或者前几个 epoch 速度正常突然像死机一样不动了CPU 占用率却接近百分之百。原因workers数量设太大Windows 遇到多进程数据加载容易握手失败远程训练场景下更明显。另一个原因是数据集路径里有权限问题worker 读取文件被锁住。解决把workers降到 4 或 2训练前确认图像目录和标签目录可读。如果 dataset 放在移动硬盘或远程挂载盘上先把数据拷贝到本地磁盘否则读写延迟会直接拖垮训练。6. 进阶验证技巧置信度门限、瓦片推理与习惯收尾当你把基础训练跑通之后真正需要花时间的不是再多训几十个 epoch而是把模型推到业务场景里做验证。这里有一个我常用的进阶技巧用验证集调置信度门限而不只是看 mAP。先跑一遍带标注的验证集打印出所有预测框到 CSV再按置信度从低到高排列人工看那些低分误检长什么样。油罐检测的典型情况是低分段全部是圆形建筑高分段油罐占比很高那我就会把推理conf固定到 0.45 以上误检一下少一半。瓦片推理是另一个值得提前练的动作。训练好的模型直接放进大图检测建议把大图切成和训练分辨率一致的瓦片并在瓦片间保留 10% 重叠yolo predict modelruns/train/exp/weights/best.pt sourcebig_map.png imgsz640 conf0.45大图推理输出的是整图缩放后的结果小油罐在这种数据增强下容易被压成模糊的圆点把瓦片喂进去模型反而能稳定输出。切图后检测完再把框映射回原图坐标并做一次加权 NMS这套流程比单纯调大imgsz对显存更友好也适合后续部署到 RK3588 这类边缘设备时的分块处理思路。我的个人习惯是每次训练前固定一个run_id把所有训练命令、数据集版本、随机种子写进同一个配置目录模型权重也按 run_id 存。这个习惯无数次救了我——某个权重表现异常时回退到前一个 run 比猜命令快得多。调试遥感小目标本就投入大别让不可复现的随机性消耗你的耐心希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
MinioUtil工具类设计实战:Java对象存储封装与踩坑指南 做后端开发这几年,文件存储始终是个绕不开的话题。早期我接触过FastDFS,也折腾过自建FTP,后来云厂商的对象存储也用了一阵子,但版权费用和灵活性总让人不太舒服。直到在一个内部管理系统里遇到Minio,我才发现这个S3兼容… · 2026/9/24 18:26:09
前端加密并非安全边界:渗透测试中的绕过思路与实战技巧 这标题确实是个“民工级”痛点。我见过不少人拿到一个目标站点,看到登录请求加密、参数全是密文,直接就懵了,觉得“这玩意没法测了”。其实前端加密这层窗户纸捅破之后,你会发现后面的逻辑漏洞比想象中多得多。先说清楚一个核心事… · 2026/9/24 18:26:09
双目立体视觉测距全解析:图像匹配、SGBM与OpenCV实践 简介:这套基于Python与OpenCV的双目立体视觉图像匹配与测距项目,面向人工智能、通信工程、自动化、电子信息、物联网等专业的在校学生、老师及企业员工,覆盖毕业设计、课程设计、项目初期演示等场景,系统功能完善、界面美观、操作… · 2026/9/24 18:26:09
手机存储空间不足别只清缓存:从原理到实操的完整清理指南 我手机里最常出现的"劝退"信号,从来不是卡顿,而是那条怎么躲都躲不掉的"存储空间不足"。64G的老机型,连哄带骗用了三年,最后连在朋友圈发张照片都得先腾地方。真正开始琢磨这个问题,是我发现系统自… · 2026/9/24 19:07:14
ARIMA+SVM混合模型:股票价格预测的残差建模与Python实战 简介:这份资源面向具备一定MATLAB基础、希望入门时间序列与机器学习组合建模的金融数据分析学习者,核心是用支持向量机改进ARIMA股票价格预测。包内共3个文件,以2个m脚本和1个xlsx数据表为主,压缩包约13KB,脚本承担ARI… · 2026/9/24 19:07:14
shadcn-vue Navigation Menu 组件实战:基于 reka-ui 构建可访问的网站导航栏 shadcn-vue Navigation Menu 组件实战:基于 reka-ui 构建可访问的网站导航栏 【免费下载链接】shadcn-vue Vue port of shadcn-ui 项目地址: https://gitcode.com/gh_mirrors/sh/shadcn-vue
Navigation Menu 是 shadcn-vue 提供的用于网站导航的组件集合&… · 2026/9/24 19:07:14
Node.js服务端开发实战:从事件循环到异步I/O与部署 先说清楚一件事:Node.js 不是一门语言,也不是一个框架,它是一个“服务端运行时环境”。很多人刚接触的时候,下载安装完 Node.js,打开一个黑乎乎的终端敲了两行代码,然后问我:“所以这东西到底解… · 2026/9/24 19:07:08
kpartx命令详解:轻松挂载多分区磁盘镜像 1. kpartx 到底解决什么问题:从一次“挂不上镜像”说起 做嵌入式Linux开发、玩树莓派镜像、或者帮朋友恢复一张整盘备份的人,几乎都遇到过同一个尴尬:手里拿到一个 xxx.img 文件,明明里面有好几个分区,用 mount -o … · 2026/9/24 19:07:08
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44