在Pytorch实现语义分割的一些思考1
一些小的说明
在语义分割中输入的有原图(image),标签(label,也叫ground truth)。label就像是image的mask一样,所以在有的时候,我会吧label写成mask。
我写这篇文章的原因是,最近学习语义分割的时候遇到挺多的问题的,也看了很多他人的学习经验,就想把自己的学习心得也写一下,分享给同样在语义分割遇到困难的人们。
Dataset
首先,pytorch的dataset很自由,在有image和label(也是一张图片)的情况下,自主定义一个Mydataset是个很好的选择。
要注意,
1.image和相对应的label的图片预处理是一致的,即使用random crop这类的function,要保证都crop出同一块区域。
2. image和label必须一一对应,即在导入image和label时,假如图片i的label缺失,或label z没有相应的原图,我们要舍弃这个不成组的图片i和label z。
我用的是LIP的single person的数据库,所以底下的代码展示是更据single person的数据库path做例子的。
class MyDataset(data.Dataset):
def __init__(self, file_path=None, mask_path=None, transform=None,data="train"):
"""
初始化自定义Dataset类的参数
Attributes
file_path: 字符串,数据集的存储路径,例如‘./UCF101/train’ 或 './UCF101/eval'等
mask_path: 字符串,数据集的存储路径,例如‘./UCF101/train_annotation’等
transform: 传入一个从torchvision.transforms定义的数据预处理
"""
self.count=0
self.transform = transform
if data=='train':
self.name=open(os.path.join("../input/singleperson/TrainVal_images","train_id.