首页 炼丹房 帖子详情
语义分割deeplabv3+训练完后,预测全是背景怎么处理?
收藏
快速回复
炼丹房 问答新手上路学习资料 5652 19
语义分割deeplabv3+训练完后,预测全是背景怎么处理?
收藏
快速回复
炼丹房 问答新手上路学习资料 5652 19

如题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

0
收藏
回复
全部评论(19)
时间顺序
十进制到二进制
#2 回复于2022-01

预测全是背景?一般建议查看训练的label是否正确,或者输出数据的范围是[0,1]吗?可以乘以255试一下。最好还是建议贴一下代码和全是背景的图。

0
回复
l
lz拉卡拉
#3 回复于2022-01
预测全是背景?一般建议查看训练的label是否正确,或者输出数据的范围是[0,1]吗?可以乘以255试一下。最好还是建议贴一下代码和全是背景的图。

他就是预测背景的iou是100,我做的是两个类,另一个类iou是0.换其他数据集能分,只有做buliding的数据集这样.

0
回复
十进制到二进制
#4 回复于2022-01

额,你要不把你项目公开放一下链接。

0
回复
l
lz拉卡拉
#5 回复于2022-01
额,你要不把你项目公开放一下链接。

我不是用飞浆写的,能加个好友帮忙吗

 

0
回复
l
lz拉卡拉
#6 回复于2022-01
额,你要不把你项目公开放一下链接。

输出是在[0,1],标签只有1

0
回复
十进制到二进制
#7 回复于2022-01
我不是用飞浆写的,能加个好友帮忙吗  

你要不直接用PaddleSeg里面内置好的deeplabv3,直接调用就行。这种问题大概率是你的数据读取或者模型的输出处理有问题。

0
回复
l
lz拉卡拉
#8 回复于2022-01
你要不直接用PaddleSeg里面内置好的deeplabv3,直接调用就行。这种问题大概率是你的数据读取或者模型的输出处理有问题。

好,我用的是torch。所以可能有些误差把

0
回复
l
lz拉卡拉
#9 回复于2022-01

import os

import cv2
import numpy as np
from PIL import Image
from torch.utils.data.dataset import Dataset

from utils.utils import cvtColor, preprocess_input


class UnetDataset(Dataset):
def __init__(self, annotation_lines, input_shape, num_classes, train, dataset_path):
super(UnetDataset, self).__init__()
self.annotation_lines = annotation_lines
self.length = len(annotation_lines)
self.input_shape = input_shape
self.num_classes = num_classes
self.train = train
self.dataset_path = dataset_path

def __len__(self):
return self.length

def __getitem__(self, index):
annotation_line = self.annotation_lines[index]
name = annotation_line.split()[0]

#-------------------------------#
# 从文件中读取图像
#-------------------------------#
jpg = Image.open(os.path.join(os.path.join(self.dataset_path, "VOC2007/JPEGImages"), name + ".jpg"))
png = Image.open(os.path.join(os.path.join(self.dataset_path, "VOC2007/SegmentationClass"), name + ".png"))
#-------------------------------#
# 数据增强
#-------------------------------#
jpg, png = self.get_random_data(jpg, png, self.input_shape, random = self.train)

jpg = np.transpose(preprocess_input(np.array(jpg, np.float64)), [2,0,1])
png = np.array(png)
png[png >= self.num_classes] = self.num_classes
#-------------------------------------------------------#
# 转化成one_hot的形式
# 在这里需要+1是因为voc数据集有些标签具有白边部分
# 我们需要将白边部分进行忽略,+1的目的是方便忽略。
#-------------------------------------------------------#
seg_labels = np.eye(self.num_classes + 1)[png.reshape([-1])]
seg_labels = seg_labels.reshape((int(self.input_shape[0]), int(self.input_shape[1]), self.num_classes + 1))

return jpg, png, seg_labels

def rand(self, a=0, b=1):
return np.random.rand() * (b - a) + a

def get_random_data(self, image, label, input_shape, jitter=.3, hue=.1, sat=1.5, val=1.5, random=True):
image = cvtColor(image)
label = Image.fromarray(np.array(label))
h, w = input_shape

if not random:
iw, ih = image.size
scale = min(w/iw, h/ih)
nw = int(iw*scale)
nh = int(ih*scale)

image = image.resize((nw,nh), Image.BICUBIC)
new_image = Image.new('RGB', [w, h], (128,128,128))
new_image.paste(image, ((w-nw)//2, (h-nh)//2))

label = label.resize((nw,nh), Image.NEAREST)
new_label = Image.new('L', [w, h], (0))
new_label.paste(label, ((w-nw)//2, (h-nh)//2))
return new_image, new_label

# resize image
rand_jit1 = self.rand(1-jitter,1+jitter)
rand_jit2 = self.rand(1-jitter,1+jitter)
new_ar = w/h * rand_jit1/rand_jit2

scale = self.rand(0.25, 2)
if new_ar < 1:
nh = int(scale*h)
nw = int(nh*new_ar)
else:
nw = int(scale*w)
nh = int(nw/new_ar)

image = image.resize((nw,nh), Image.BICUBIC)
label = label.resize((nw,nh), Image.NEAREST)

flip = self.rand()<.5
if flip:
image = image.transpose(Image.FLIP_LEFT_RIGHT)
label = label.transpose(Image.FLIP_LEFT_RIGHT)

# place image
dx = int(self.rand(0, w-nw))
dy = int(self.rand(0, h-nh))
new_image = Image.new('RGB', (w,h), (128,128,128))
new_label = Image.new('L', (w,h), (0))
new_image.paste(image, (dx, dy))
new_label.paste(label, (dx, dy))
image = new_image
label = new_label

# distort image
hue = self.rand(-hue, hue)
sat = self.rand(1, sat) if self.rand()<.5 else 1/self.rand(1, sat)
val = self.rand(1, val) if self.rand()<.5 else 1/self.rand(1, val)
x = cv2.cvtColor(np.array(image,np.float32)/255, cv2.COLOR_RGB2HSV)
x[..., 0] += hue*360
x[..., 0][x[..., 0]>1] -= 1
x[..., 0][x[..., 0]<0] += 1
x[..., 1] *= sat
x[..., 2] *= val
x[x[:,:, 0]>360, 0] = 360
x[:, :, 1:][x[:, :, 1:]>1] = 1
x[x<0] = 0
image_data = cv2.cvtColor(x, cv2.COLOR_HSV2RGB)*255
return image_data,label


# DataLoader中collate_fn使用
def unet_dataset_collate(batch):
images = []
pngs = []
seg_labels = []
for img, png, labels in batch:
images.append(img)
pngs.append(png)
seg_labels.append(labels)
images = np.array(images)
pngs = np.array(pngs)
seg_labels = np.array(seg_labels)
return images, pngs, seg_labels

 

0
回复
l
lz拉卡拉
#10 回复于2022-01
你要不直接用PaddleSeg里面内置好的deeplabv3,直接调用就行。这种问题大概率是你的数据读取或者模型的输出处理有问题。

哥,我的数据处理和上面一样的https://blog.csdn.net/smallworldxyl/article/details/121411986

0
回复
深渊上的坑
#11 回复于2022-01

没训练好吧?过拟合?

0
回复
嘟嘟
#12 回复于2022-01

label的值是只有0和1吗,没有255吧

0
回复
JavaRoom
#13 回复于2022-01

是不是背景是0?

0
回复
l
lz拉卡拉
#14 回复于2022-01
JavaRoom #13
是不是背景是0?

对对对,怎么解决

 

0
回复
奔向未来的样子
#15 回复于2022-01

建议你检查数据集

输入到模型的标签是0-1还是0-255

255的需要归一化

有的模型会把255当作忽略的标签,不参与训练

0
回复
lidanzzr
#16 回复于2022-02

哈哈,我也碰到你这个问题了,就是那个building数据集吧

0
回复
lidanzzr
#17 回复于2022-02

其实我已经找到原因了

0
回复
m
major39
#19 回复于2023-01

我也全是背景(背景类为0)了。其他类别为1-13,请问你解决了吗?

0
回复
B
BIGLUNG
#20 回复于2023-04

您好,请问您解决了吗,我用的pytorch,也出现了这个问题

0
回复
超级lllll132
#21 回复于2024-06
lidanzzr #17
其实我已经找到原因了

请问原始是什么,不知您能否解答一下

0
回复
在@后输入用户全名并按空格结束,可艾特全站任一用户