UAVid数据集实战:从数据准备到PyTorch数据加载器构建

张开发
2026/4/18 0:57:34 15 分钟阅读

分享文章

UAVid数据集实战:从数据准备到PyTorch数据加载器构建
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 数据增强策略实现我们实现了三种数据增强方式随机翻转50%概率水平翻转随机缩放在0.7-2.0倍之间随机缩放随机裁剪最终裁剪为768×768的patch# 随机翻转实现 flip np.random.randint(low0, high2) if flip 1: img cv2.flip(img, 1) label_img cv2.flip(label_img, 1) # 随机缩放实现 scale np.random.uniform(low0.7, high2.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), interpolationcv2.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是最常用的既能保证精度又不会占用过多内存。

更多文章