简介:面向遥感油罐检测场景的YOLO训练数据包,适合正在开展目标检测实验或课程设计的开发者,内部包含1000张真实场景图片,覆盖不同光照、角度和背景,可用于油罐目标的识别与定位训练。数据集基于LabelImg完成标注,提供VOC、COCO、YOLO三种主流格式标签,训练时无需再做格式转换,可直接衔接YOLO系列模型;压缩包内共2000个文件,整体大小约224MB,其中标签文件以XML与TXT为主体,另含少量HTML说明文档、Python脚本和YAML配置,分别用于教程阅读、数据集划分和模型配置。随包附赠Linux与Windows两套环境搭建教程和训练案例,帮助用户在本地快速跑通检测流程;同时提供训练集、验证集、测试集划分脚本及生成ImageSets目录的脚本,可按需灵活重组数据。当前已有247人学习,若你正为遥感油罐检测的数据处理与格式适配花费时间,这份资料能显著缩短准备周期并降低入门门槛。
1. YOLO遥感油罐检测:这份1000张图的资源包里到底有什么
做遥感目标检测的同行应该都有体会:算法模型现在不缺,缺的是能直接喂给模型的干净数据。油罐这种典型目标,尺寸变化大、光照和阴影干扰多、背景杂波强,自己爬图标注一搞就是半个月,标完还得写脚本转格式、划分数据集,还没开始训练就已经耗掉大半精力。这份YOLO遥感油罐检测数据集,正好把数据到训练的中间环节全部补齐了。资源包含1000张真实场景的高质量遥感油罐图片,标注使用LabelImg完成,框质量高,并且同时提供VOC(xml)、COCO(json)和YOLO(txt)三种格式标签,分文件夹存放,下载解压后不用写转换脚本,选好格式直接开训。适合正在做遥感目标检测、想用YOLO系列模型训练油罐识别任务的开发者,尤其适合那些不想在数据预处理上浪费时间的实操型选手。
2. 三种标注格式与目录结构:先搞懂资源内部的组织逻辑
2.1 VOC、COCO、YOLO三种格式的核心区别
拿到压缩包后,第一步不是急着跑训练,而是先看清三种格式各自的组织方式。VOC格式本质是一个xml文件对应一张图片,标注信息写在annotation标签里,包含目标类别、边界框坐标(xmin、ymin、xmax、ymax)以及图片尺寸等元数据。COCO格式则是把整个数据集的标注信息汇总到一个json文件里,内部有images、annotations、categories三个核心字段,坐标系用的是左上角xy加宽高的形式。YOLO格式最直接,每个txt文件对应一张图片,每行内容依次是类别id、归一化后的中心点x、中心点y、宽度w、高度h。
这三种格式并不是简单的坐标换算关系,VOC的坐标是绝对像素值,COCO的坐标是绝对像素值但组织形式不同,而YOLO要求归一化到0到1之间,且中心点坐标用的是相对图片宽高的比例。如果自己写转换脚本,最容易出问题的就是坐标系的映射关系漏了归一化这一步。这个资源直接给你分好文件夹存放,省去了自己转换的麻烦。
2.2 解压后的目录结构与文件用途
解压后,你会看到几个html教程文件和两个划分脚本文件夹。数据集目录大致按以下结构组织:
dataset/ ├── VOC/ # 存放xml格式标注文件 ├── COCO/ # 存放json格式标注文件 ├── YOLO/ # 存放txt格式标注文件 ├── images/ # 遥感油罐图片 ├── train_list.txt ├── val_list.txt └── test_list.txt三个划分脚本分别对应两种不同的划分需求:一种是训练集、验证集、测试集三划分脚本(图片标签划分写入新文件夹),另一种是训练集、验证集两划分脚本,还有split_train_val生成ImageSets下txt文件划分脚本。train_list.txt文件是已经划分好的图片路径清单,方便直接喂给YOLO训练脚本。
这里需要提醒一个关键点:VOC格式目录下,图片和xml文件通常需要在同级目录或者通过相对路径关联。如果你后续要转成自己的数据加载方式,建议先检查xml里引用的图片路径是否正确。
2.3 标注质量检查:训练前必须做的一步
即使是现成的数据集,训练前也建议做一次简单的标注质量抽查。用Python脚本快速查看标注框是否越界:
import cv2 import xml.etree.ElementTree as ET xml_path = "VOC/000001.xml" img_path = "images/000001.jpg" img = cv2.imread(img_path) h, w = img.shape[:2] tree = ET.parse(xml_path) for obj in tree.findall("object"): bndbox = obj.find("bndbox") xmin = int(bndbox.find("xmin").text) ymin = int(bndbox.find("ymin").text) xmax = int(bndbox.find("xmax").text) ymax = int(bndbox.find("ymax").text) # 检查是否越界 if xmin < 0 or ymin < 0 or xmax > w or ymax > h: print(f"越界标注: {xml_path}, box: {xmin},{ymin},{xmax},{ymax}") # 检查宽高是否合理 if xmax - xmin < 5 or ymax - ymin < 5: print(f"过小标注框: {xml_path}, box: {xmin},{ymin},{xmax},{ymax}")这段代码的逻辑是:读取图片尺寸,解析xml中的每个标注框,检查是否超出图片边界以及是否过小。正常遥感油罐的标注框不会出现边界越界的情况,如果出现则需要检查导入脚本时路径是否正确。油罐目标在遥感影像中的尺寸一般不会特别小,出现大量过小标注框的情况需要留意是否标注遗漏。
3. 环境搭建与数据划分:从零到能跑训练的前置工作
3.1 YOLO环境搭建的Windows与Linux两条路线
资源包附赠了两套环境搭建教程,分别对应Windows和Linux。实际项目中我一般推荐在Linux环境下训练,因为NVIDIA驱动和CUDA版本兼容问题在Linux下处理起来更直接,显存管理也更稳定。Windows环境适合个人本机调参测试,但生产训练还是Linux更省心。
环境搭建的核心是CUDA、cuDNN和PyTorch的版本匹配问题:
# Linux下安装YOLOv5依赖的示例 conda create -n yolov5 python=3.8 conda activate yolov5 pip install torch==1.10.0 torchvision==0.11.0 --index-url https://download.pytorch.org/whl/cu113 pip install -r requirements.txt参数说明:PyTorch 1.10.0对应CUDA 11.3,这是YOLOv5官方测试过的组合之一。如果你的显卡驱动版本较新,可以适当选择更高版本的CUDA,但建议优先参考官方文档中的版本对照表。requirements.txt里包含opencv-python、numpy、matplotlib等基础依赖,实际训练时还需要额外确认pillow版本,否则可能报错。
Windows版本的环境搭建大同小异,核心差异在于conda环境的激活方式和路径配置。资源里的教程做了详细说明,按步骤操作即可。遇到pip下载慢的问题,配置国内镜像源是常见做法:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple3.2 数据集划分脚本的核心逻辑
资源附赠的划分脚本,本质是读取图片和标注文件,按比例随机分配到训练集、验证集和测试集文件夹。我看了脚本逻辑,它做了一件事很关键:划分图片的同时,把对应的标注文件一并复制到新文件夹,保证图片和标注始终一一对应。
划分脚本的核心逻辑可以简化为:
import os import random import shutil def split_dataset(img_dir, label_dir, train_ratio=0.7, val_ratio=0.2, test_ratio=0.1): # 读取所有图片文件 imgs = [f for f in os.listdir(img_dir) if f.endswith('.jpg')] random.shuffle(imgs) train_cnt = int(len(imgs) * train_ratio) val_cnt = int(len(imgs) * val_ratio) train_imgs = imgs[:train_cnt] val_imgs = imgs[train_cnt:train_cnt+val_cnt] test_imgs = imgs[train_cnt+val_cnt:] # 划分时同步复制label文件 for split, split_imgs in [("train", train_imgs), ("val", val_imgs), ("test", test_imgs)]: os.makedirs(f"{split}/images", exist_ok=True) os.makedirs(f"{split}/labels", exist_ok=True) for img in split_imgs: shutil.copy(os.path.join(img_dir, img), f"{split}/images/{img}") label_name = img.replace('.jpg', '.txt') shutil.copy(os.path.join(label_dir, label_name), f"{split}/labels/{label_name}")这里最需要注意的参数是划分比例。常见的划分比例是训练集70%、验证集20%、测试集10%,如果数据集只有1000张,测试集占比10%意味着只有100张测试图片,评估指标的置信区间会偏大。数据量小的情况下,可以考虑把划分比例调整为80%训练、10%验证、10%测试,或者直接使用5折交叉验证的方式。资源里的脚本支持自定义比例,建议根据实际效果灵活调整。
3.3 ImageSets txt文件的生成
split_train_val生成ImageSets下txt文件划分脚本,这个脚本的作用是为VOC格式训练生成标准的文件清单。VOCdevkit的目录结构要求ImageSets/Main下存放train.txt、val.txt、test.txt文件,内容是图片文件名列表(不含扩展名)。
这个脚本的输入是VOC目录结构,输出是三个txt文件。生成的txt文件会被YOLO系列的VOC格式加载脚本读取,用于确定哪些图片参与训练、哪些参与验证。如果跳过这一步,直接沿用别人的数据加载逻辑,可能训练时读不到正确的图片路径。
4. 训练配置与参数调优:让YOLO真正学会检测油罐
4.1 修改训练脚本指向自己的数据集
资源里的训练教程PDF,重点讲解了如何根据案例修改训练自己的数据集。核心改动点在YOLO的配置文件中,主要包括数据配置文件和模型配置文件两部分。
以YOLOv5为例,需要在data目录下新建一个油罐数据集配置文件:
train: dataset/train/images val: dataset/val/images test: dataset/test/images nc: 1 # 油罐是单类别 names: ["oil_tank"]参数说明:train、val、test路径指向划分好的图片文件夹;nc表示类别数量,这里油罐只有一类所以是1;names列表按顺序对应类别名称,必须与标注文件中的类别id一致。如果你是标注了油罐和其他目标的多类别场景,这里就需要对应修改nc和names列表。
模型配置文件选择yolov5s.yaml还是yolov5m.yaml取决于你的显存大小和精度要求。遥感油罐目标相对较小,建议优先考虑yolov5s.yaml或yolov5m.yaml,模型参数量小,训练速度快,且对密集小目标有较好的适应能力。yolov5x.yaml精度更高但显存占用大,1000张图片的数据量不一定能发挥大模型的优势,容易过拟合。
4.2 训练命令与关键超参
启动训练的命令:
python train.py --data oil_tank.yaml --cfg yolov5s.yaml --weights yolov5s.pt --batch-size 16 --epochs 100 --img-size 640参数说明:--data指向刚才新建的油罐数据配置文件;--cfg指定模型结构;--weights指定预训练权重。YOLOv5s.pt是COCO预训练权重,下载后放在项目根目录即可。遥感油罐与COCO数据集中的目标差异较大,但使用预训练权重仍然能显著加速收敛。--batch-size根据显存调整,8GB显存建议设为8到16,24GB显存可以直接上32。--img-size是训练图片的输入尺寸,遥感图像原图通常很大,这里会先缩放到640x640再训练,这是YOLO系列的默认做法。
关于epochs的选择,1000张图片的数据量不算大,100个epoch通常足够收敛。训练过程中观察loss曲线,如果val loss在后期持续上升而train loss还在下降,说明过拟合,可以提前停止,或者通过early stopping机制自动处理。
4.3 数据增强参数对遥感目标的影响
YOLOv5的增强参数定义在hyp.scratch.yaml中。遥感油罐场景中,有几个增强参数值得重点关注:hsv_h、hsv_s、hsv_v控制颜色抖动,遥感影像的色彩相对固定,颜色增强不宜过大;fliplr镜像翻转对油罐这种圆形目标不影响语义,可以保持默认值0.5;mosaic马赛克增强把四张图拼接成一张,对小目标检测有帮助。
实际经验是,遥感场景下flipud上下翻转需要谨慎开启,因为油罐的阴影方向往往与太阳位置有关,上下翻转会导致阴影方向不一致,训练时模型会学到错误的阴影特征。如果没有特殊需求,建议保持默认的关闭状态。
5. 训练过程避坑:五个影响成品的典型问题
5.1 显存不足导致训练中断
现象:运行训练脚本后,不到几个epoch就报CUDA out of memory错误。
原因:batch-size设置过大,或者同时开启了过多的数据加载worker进程。部分情况下是单卡显存物理限制。
解决:先关掉数据加载的worker数量,将train.py中的workers参数从默认8改为4或2。然后逐步减小batch-size,从16降到8,再降到4。遥感图片的缩放计算通常在GPU上完成,显存占用与输入图片尺寸也相关,可以把--img-size从640降到512。如果仍然不够,只能更换更大显存的显卡或者使用梯度累积参数。
5.2 标注文件的归一化坐标越界
现象:训练开始阶段loss正常,但到后期出现NaN,或者精度始终上不去。
原因:txt格式的标注文件要求归一化坐标在0到1之间,但如果原VOC坐标转换时除以的图片尺寸与训练时的实际尺寸不一致,会导致中心点坐标或宽高超出合理范围。
解决:训练前跑一个检查脚本,读取所有txt文件,检查每行坐标是否在合理范围内:
python check_labels.py --dir dataset/train/labels如果发现异常标注,需要回到VOC标注文件重新检查原始框坐标,再走一遍转换流程。血泪经验:这一步千万别省,油腻数据集标注问题最多。
5.3 训练集和验证集图片有重叠
现象:训练时loss下降正常,验证集mAP很高,但拿到新图片上检测效果一塌糊涂。
原因:数据划分脚本运行了多次,每次都是随机划分,导致部分图片在不同版本的数据集划分中既出现在训练集又出现在验证集。
解决:使用资源中提供的划分脚本时,确保每次都在同一个目录结构上运行,并且只运行一次足够比例的划分。更稳妥的方式是使用split_train_val脚本生成txt文件,基于txt文件做训练验证分离,不要反复重新划分。这属于典型的脏数据集问题,靠肉眼很难发现,建议用脚本检查两个列表的文件交集。
5.4 类别id错位导致训练报错
现象:训练过程中报错AssertionError,提示class数不匹配,或者loss在第一个epoch就异常大。
原因:标注文件中写入的类别id与配置文件names列表顺序不一致。比如标注文件中类别id为0代表油罐,但配置文件中names的第一个元素不是oil_tank。
解决:打开任意一个txt标注文件查看类别id取值,再对照nc和names配置。YOLO系列严格要求类别id从0开始连续编号,中间不能跳号。
5.5 Ubuntu环境安装卡在显卡驱动步骤
现象:按教程安装完CUDA后,运行nvidia-smi提示驱动版本不兼容,或者pip安装torch后无法调用GPU。
原因:Ubuntu系统的显卡驱动和CUDA版本存在耦合关系,新版本驱动通常只能兼容特定CUDA版本区间。部分情况下是驱动程序安装时未关闭nouveau开源驱动。
解决:安装显卡驱动前,先在BIOS中关闭Secure Boot,然后在终端禁用nouveau驱动。之后安装Ubuntu推荐的驱动版本,再安装对应兼容的CUDA版本。这个顺序错了,环境搭建会翻车翻到怀疑人生,建议严格按教程顺序来。
6. 模型验证与效果评估:对自己训练的模型做一个快速体检
6.1 用验证集计算mAP指标
训练完成后,验证集上跑一遍检测是基本操作。YOLOv5的val.py会直接输出各类指标:
python val.py --weights runs/train/exp/weights/best.pt --data oil_tank.yaml --img-size 640关注三个指标:mAP@0.5、mAP@0.5:0.95和Precision。油罐目标形状规则,mAP@0.5达到0.85以上算是基本可用;如果要求更高,需要看mAP@0.5:0.95。遥感目标检测中,mAP@0.5:0.95的值通常会比普通自然图像低一些,因为遥感目标小、密集,IoU约束更严格。
6.2 可视化检测结果与误差分析
val.py运行后会生成检测结果的标注图,保存在runs/val/exp目录下。建议重点看两类图:一类是漏检的样本,检查是目标太小、遮挡严重还是背景干扰;另一类是误检样本,看模型把什么误认为油罐。遥感场景下常见误检来源是圆形建筑屋顶、大型储罐顶盖等。
6.3 新图片推理测试
用训练好的模型跑几张完全没有参与训练和验证的新图片,这是检验模型泛化能力最直接的方式:
python detect.py --weights runs/train/exp/weights/best.pt --source test_images/ --img-size 640这里有个我自己的习惯:推理时加上--save-txt参数保存检测结果的坐标信息,这样可以在图上框出检测结果后,用脚本统计检测框的分布规律。油罐目标通常是成组出现的,如果检测结果是稀疏零散的单个目标,且置信度不高,大概率是模型学到了某些背景特征而非油罐本身的特征。
从那以后,我每次做完遥感目标检测训练,都会强制走一遍新图片推理测试,并且用至少10张完全不在数据集里的遥感影像来验证泛化效果。这一步虽然简单,但比只看验证集指标的参考价值大得多。希望这个资源包能帮你把油罐检测项目快速跑起来,少踩一些我当年踩过的坑。
本文还有配套的精品资源,点击获取