我自己的语义分割pipeline,训练一个非常简单的数据集(10k张图片),一个epoch,acc就可以到96,miou可以到90左右。
我换了一个同任务的数据集(较难,2k张图片),训练50几个epoch,acc只能到94,miou只能到67左右。
两个数据集唯一的不同就是第二个数据集的groundtruth是三通道,数值是[0,255];而第一个数据集的groundtruth是只有一个通道,数值是[0,1]。
第一个数据集没有任何数据增强,第二个数据集有数据增强和标准化。
关于第二个数据集结果:
不加标准化训练出来的模型预测结果可视化正确,只是准确度低
加了标准化的话可视化结果非常不正确,所有预测几乎都在图片的底部。
我使用了imagenet预训练权重,其他所有的参数都和训练第一个模型时一样。真的不知道到底是哪里出现问题了啊阿啊 请求大家赐教。。
(我训练cityscapes也出现了这个问题。我模型全部使用的pytorch lib:segmentation model pytorch)
如果是要用来实时分类的话,我觉得可以把image分成3个通道的图片分别训练,到时候识别单通道图片应该会好一点吧,传入模型也只用传入单通道图片,提前处理一下就可以了
一般来说如果数据集比较难,需要更多的训练次数,50epoch对于有些数据集来说及时用了预训练模型也并不算大,你需要先判断下是否已经拟合之后这么低还是欠拟合这么低。
另外,就是你说的mask的问题,我不知道你对于mask的处理是怎么处理的,一般来说mask的类别从1开始的(0为背景,0开始就是255为背景,看具体情况),如果你是两类的话就像你说的标签只有0,1,而不是0,255,这样会被认为是254类。你可以试试将mask//255转成0和1看下效果,如果没处理的话这个也会有点影响,但是影响不会很大(应为你的数据集就两个类,及时你的网络认为你又254类,但是由于数据偏差的原因,网络会更倾向预测0和255这两个类)
你换个数据集试试