图像分割中数据集处理resize的大坑!!!

最近在做语义分割,处理完数据集后训练时总是报“label out of bound”,当把Mean_IOU这个指标去掉之后能正常训练但是训练损失一直为nan,在经过一系列的检查后确定自己的代码没有问题,把目光聚焦到数据集上,终于在经过一天的搜索后,偶然看到一篇博客有类似的问题,作者指出关注一下数据集resize的时候使用的插值方式。我在处理数据集的时候只用了pillow这个处理库(这里多提一句,我们在处理图像的时候尽可能的从头至尾采用一种图像处理模块,要么全部OpenCv,要么就是Pillow或者matplotlib,最好不要打开图像用OpenCv,crop图像又用Pillow之类的操作,会出现一些意想不到的错误。)。继续接着上面讲,我在resize图像的时候简单看了一下Pillow包里面的resize函数的参数,插值方式有以下四种

PIL.Image.NEAREST
PIL.Image.BILINEAR
PIL.Image.BICUBIC
PIL.Image.ANTIALIAS

 

其中Image.ANTIALIAS这个重采样方法的介绍是得到的图像质量是最高的,最近邻居插值质量最低,所以我没多想就用了前一种,悲剧就出现在这里,当我将插值方法改为默认,即最近邻居插值,这时候训练完全正常,至于为什么不同的插值方法会结果不一样,跟插值算法实现的细节有关,例如最近邻插值就是把变换后的图像中的原像素点最近像素的灰度值赋给原像素点的方法,因此不管是缩小还是放大图像都不会产生新的像素值,而双线性插值等有一个像素相加再相除的操作,这有可能导致不属于label中的像素值出现,例如标签中本来只有0和5两种像素,使用了双线性插值后得到了新的像素2,但是分割类别设定的是2,这显然会导致训练时报错。

 

  • 12
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
使用 PaddleX 进行图像分类任务,可以通过以下步骤加载数据集并进行数据处理: 1. 安装 PaddleX ```python !pip install paddlex ``` 2. 导入 PaddleX 和必要的模块 ```python import paddlex as pdx from paddlex import transforms as T ``` 3. 加载数据集 ```python train_dataset = pdx.datasets.ImageNet( data_dir='image_net', file_list='image_net/train_list.txt', label_list='image_net/labels.txt', transforms=train_transforms) val_dataset = pdx.datasets.ImageNet( data_dir='image_net', file_list='image_net/val_list.txt', label_list='image_net/labels.txt', transforms=val_transforms) ``` 上述代码,`data_dir` 参数指定了数据集所在的目录,`file_list` 参数指定了数据集的索引文件,`label_list` 参数指定了数据集的标签文件,`transforms` 参数指定了数据增强方法。 4. 数据增强 在训练过程,可以使用数据增强方法来扩充数据集,提高模型的泛化能力。PaddleX 提供了丰富的数据增强方法,包括随机裁剪、随机旋转、随机翻转等。 ```python train_transforms = T.Compose([ T.RandomCrop(crop_size=224), T.RandomHorizontalFlip(), T.Normalize() ]) val_transforms = T.Compose([ T.Resize(target_size=256), T.CenterCrop(crop_size=224), T.Normalize() ]) ``` 上述代码,`RandomCrop` 方法对图像进行随机裁剪,`RandomHorizontalFlip` 方法对图像进行随机翻转,`Normalize` 方法对图像进行归一化处理。 5. 创建数据迭代器 创建数据迭代器时,可以指定批次大小、数据集和是否随机打乱数据。 ```python train_loader = pdx.datasets.DataLoader( train_dataset, batch_size=32, shuffle=True, drop_last=True, num_workers=4) val_loader = pdx.datasets.DataLoader( val_dataset, batch_size=32, shuffle=False, drop_last=False, num_workers=4) ``` 上述代码,`DataLoader` 方法创建了数据迭代器,其 `num_workers` 参数指定了使用多少个进程来处理数据。 6. 使用数据迭代器训练模型 ```python model = pdx.cls.ResNet50(num_classes=train_dataset.num_classes) optimizer = pdx.optimizer.Adam(learning_rate=0.001, parameters=model.parameters()) trainer = pdx.Trainer( model=model, optimizer=optimizer, train_loader=train_loader, val_loader=val_loader, save_interval_epochs=1, log_interval_steps=10) trainer.train(num_epochs=10) ``` 上述代码,`ResNet50` 方法创建了 ResNet50 模型,`Adam` 方法创建了优化器,`Trainer` 方法创建了训练器,并指定了训练参数,最后调用 `train` 方法开始训练。 以上就是 PaddleX 加载数据集并进行数据处理的方法,如果需要更详细的介绍和使用方法,可以参考 PaddleX 官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值