paddleseg训练segnet报错:ValueError: Shape of pred
and `label should be equal, but there are [1, 420, 520] and [1, 421, 520].
实验说明
在百度飞浆的图像分割相关套件paddleseg中训练segnet时的报错。
设备硬件以及相关配置:
GPU:GeForce RTX 3050 Laptop GPU
CUDA:11.7
cuDNN:8.8.0
paddlepaddle-gpu==2.4.2
项目文件夹版本:paddleseg-2.7
调用的配置文件:segnet_cityscapes_1024x512_80k.yml
修改之后的内容见下:
_base_: '../_base_/cityscapes.yml'
batch_size: 4
iters: 160000
train_dataset: #训练数据设置
type: Dataset #指定加载数据集的类。数据集类的代码在`PaddleSeg/paddleseg/datasets`目录下。
dataset_root: data/150images_dataset #数据集路径
train_path: data/150images_dataset/train.txt #数据集中用于训练的标识文件
num_classes: 2 #指定类别个数(背景也算为一类)
mode: train #表示用于训练
transforms: #模型训练的数据预处理方式。
- type: ResizeStepScaling #将原始图像和标注图像随机缩放为0.5~2.0倍
min_scale_factor: 0.5
max_scale_factor: 2.0
scale_step_size: 0.25
- type: RandomPaddingCrop #从原始图像和标注图像中随机裁剪512x512大小
crop_size: [256, 128]
- type: RandomHorizontalFlip #对原始图像和标注图像随机进行水平反转
- type: RandomDistort #对原始图像进行亮度、对比度、饱和度随机变动,标注图像不变
brightness_range: 0.5
contrast_range: 0.5
saturation_range: 0.5
- type: Normalize #对原始图像进行归一化,标注图像保持不变
val_dataset: #验证数据设置
type: Dataset #指定加载数据集的类。数据集类的代码在`PaddleSeg/paddleseg/datasets`目录下。
dataset_root: data/150images_dataset #数据集路径
val_path: data/150images_datasetal.txt #数据集中用于验证的标识文件
num_classes: 2 #指定类别个数(背景也算为一类)
mode: val #表示用于验证
transforms: #模型验证的数据预处理的方式
- type: Normalize #对原始图像进行归一化,标注图像保持不变
loss: #设定损失函数的类型
types:
- type: BinaryCrossEntropyLoss
model:
type: SegNet
pretrained: Null
num_classes: 2
报错内容和自己的一些探索
在训练fcn时,训练到第一批验证集的时候报错:ValueError: Shape of pred
and `label should be equal, but there are [1, 420, 520] and [1, 421, 520].并停止运行
报错如上图,报错含义大概是“标签和数据组存在尺寸不匹配的问题”,可是检查了我的数据集划分之后的val.txt文档中的图片,在“images”和“labels”文件夹中找到对应图片进行检查之后并没有发现尺寸问题,如下图所示,原图和标签的尺寸是一样的。
我还查看了离报错最近的metrics.py文件,里面报错的地方大致就是说pred图片和label的尺寸不一样而报错,但是我思来想去并不知道为什么会这样,pred图片的高度莫名其妙的比原图少了一个像素点。然后在各大平台各种找也没有找到解决方案。
希望有有经验的人士能给一些建议