UAVid数据集实战:从数据准备到PyTorch数据加载器构建
2026/4/18 0:57:30 网站建设 项目流程

1. UAVid数据集详解与下载指南

UAVid是目前无人机遥感图像领域最常用的语义分割数据集之一,专门针对城市场景设计。这个数据集包含了4K分辨率的无人机航拍视频帧,覆盖了8种常见的城市物体类别,比如建筑物、道路、车辆等。我在实际项目中多次使用这个数据集,发现它的标注质量相当不错,特别适合训练高精度的语义分割模型。

数据集的文件结构设计很有讲究,下载后你会看到一个名为"UAVidDataset"的根目录,里面包含train、valid等子目录。每个序列文件夹下都有Images和Labels两个子文件夹,这种结构对后续的数据加载非常友好。官方下载地址是https://uavid.nl/,实测下载速度还不错,建议使用IDM等多线程下载工具来加速。

下载完成后,我建议先快速浏览一下数据集内容。你会发现图像都是3840×2160的分辨率,这个尺寸直接用于训练会非常吃显存,所以后续我们会进行下采样。标签图像采用了特殊的颜色编码,每个颜色对应一个语义类别,这也是为什么我们需要进行标签转换的原因。

2. 数据集预处理与标签转换实战

2.1 文件结构规范化

第一步要确保文件结构完全正确。我遇到过不少同学因为目录结构不对导致后续步骤报错的情况。正确的结构应该是:

UAVidDataset/ ├── train/ │ ├── seq1/ │ │ ├── Images/ │ │ └── Labels/ │ └── ...其他序列 └── valid/ ├── seq16/ │ ├── Images/ │ └── Labels/ └── ...其他序列

如果下载的文件名不是这样,需要手动重命名。这里有个小技巧:可以用Python的os.rename()批量修改,比手动操作效率高很多。

2.2 标签转换工具使用

官方提供的UAVidToolKit是处理标签的关键工具。安装步骤很简单:

git clone https://github.com/YeLyuUT/UAVidToolKit.git cd UAVidToolKit python setup.py build_ext --inplace

转换标签时要注意输出目录的权限问题。我建议在UAVidDataset目录下新建一个labelimg文件夹来存放转换后的标签:

python UAVidToolKit/prepareTrainIdFiles.py -s train/ -t labelimg/train/ python UAVidToolKit/prepareTrainIdFiles.py -s valid/ -t labelimg/valid/

转换完成后,建议用OpenCV快速检查一下标签图像是否正常。有时候会因为颜色映射问题导致标签错误,这时候就需要重新转换。

3. PyTorch数据加载器深度解析

3.1 自定义Dataset类设计

PyTorch的数据加载核心是继承torch.utils.data.Dataset类。我们的DatasetTrain需要实现三个关键方法:

  • init:初始化路径和参数
  • getitem:返回单条数据
  • len:返回数据集大小

这里有个重要细节:原始图像尺寸太大,我们需要统一缩放到1536×1536。这个尺寸在保持足够细节的同时,也能在大多数显卡上运行。

class DatasetTrain(torch.utils.data.Dataset): def __init__(self, uavid_data_path, uavid_meta_path): self.img_dir = uavid_data_path + "/train/" self.label_dir = uavid_meta_path + "/labelimg/train/" self.img_h = 2160 self.img_w = 3840 self.new_img_h = 1536 self.new_img_w = 1536 self.examples = [] # 省略部分初始化代码...

3.2 数据增强策略实现

我们实现了三种数据增强方式:

  1. 随机翻转:50%概率水平翻转
  2. 随机缩放:在0.7-2.0倍之间随机缩放
  3. 随机裁剪:最终裁剪为768×768的patch
# 随机翻转实现 flip = np.random.randint(low=0, high=2) if flip == 1: img = cv2.flip(img, 1) label_img = cv2.flip(label_img, 1) # 随机缩放实现 scale = np.random.uniform(low=0.7, high=2.0) new_img_h = int(scale*self.new_img_h) new_img_w = int(scale*self.new_img_w) img = cv2.resize(img, (new_img_w, new_img_h), interpolation=cv2.INTER_NEAREST)

特别注意:标签图像必须使用INTER_NEAREST插值,否则会引入无效的类别值。

4. 验证集处理与调试技巧

验证集的处理略有不同,我们不应用任何数据增强,但要保持与训练集相同的预处理流程。验证集的输出尺寸我建议设为768×768,这样在评估时速度更快。

class DatasetVal(torch.utils.data.Dataset): def __init__(self, uavid_data_path, uavid_meta_path): self.img_dir = uavid_data_path + "/valid/" self.label_dir = uavid_meta_path + "/labelimg/valid/" self.img_h = 2160 self.img_w = 3840 self.new_img_h = 768 self.new_img_w = 768 # 省略部分初始化代码...

调试时建议使用cv2.imshow()可视化增强后的图像和标签,确保它们保持对齐。我在初期就发现过因为插值方法不对导致标签错位的问题,所以特别强调这一点。

数据归一化使用ImageNet的均值和标准差,这是使用预训练模型的常见做法:

img = img/255.0 img = img - np.array([0.485, 0.456, 0.406]) img = img/np.array([0.229, 0.224, 0.225])

最后,将numpy数组转换为torch张量时要注意数据类型。float32是最常用的,既能保证精度又不会占用过多内存。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询