1.采用的数据集是VOC2007
其中SegmentationClass是label图片,JPEGImages是原图
label:
image:
2. 定义一个utils.py文件,在这个文件中写一个keep_image_size_open函数:
from PIL import Image
def keep_image_size_open(path,size=(256,256)):
#把图片大小固定为256*256,这个你可以自己改
#把图片读进来
img=Image.open(path)
#图片有长边和短边,把长边的长度读出来
temp=max(img.size)
#整一个掩码出来,这个掩码size大小是图片的最长边*最长边
#(0,0,0)表示掩码这张rgb图像是全黑的
mask=Image.new("RGB",(temp,temp),(0,0,0))
#将原图粘上来:(0,0)表示粘到左上角
mask.paste(img,(0,0))
#现在原图已经粘到mask上面了,此时对它进行resize,缩放到你想要的,传入的那个size
mask=mask.resize(size)
return mask
3.标签图片和原图中什么大小都有,把它们都调整成统一格式大小的图片,这里是统一调整为256*256(你也可以自己改成(258*258))
transform=transforms.Compose([transforms.ToTensor()])
#我们自己定义的类MyDataset继承了Dataset
class MyDataset(Dataset):
def __init__(self,path):
#path是一直到Voc2007的,这个目录下有三个文件夹:ImageSets,JPEGImages,SegmentationClass
self.path=path
# self.name是一个列表,里面存放的是path/SegmentationClass这个目录下所有标签图片的名字
#比如2007_000032.png,2007_000033.png
self.name=os.listdir(os.path.join(path,'SegmentationClass'))
#self.name是一个列表,里面存放的是标签图片的名字,返回有多少张标签图片
def __len__(self):
return len(self.name)
def __getitem__(self,index):
#这个函数会随机生成一个索引index(但不会重复)
#label(调整为我们需要size大小的标签图片),label_name(标签图片的名字,比如1.jpg),label_path(标签图片的完整,比如D:\1.jpg)
#image,image_name,image_path
#label_name比如说等于:2007_000032.png
label_name=self.name[index]
#刚才只是拿到了标签图片的名字,现在拼接成完整的标签图片的路径
label_path=os.path.join(self.path,'SegmentationClass',label_name)
#有了标签图片的路径,那么原图的路径就很简单(因为原图和标签图片一样,都叫2007_000032,只不过一个叫png,一个叫jpg
image_path=os.path.join(self.path,"JPEGImages",label_name.replace("png","jpg"))
#这些图片大小其实是不一样大的,然而我们网络其实是需要固定大小的图片
#将原图和标签都送进keep_image_size_open函数里面进行resize
label= keep_image_size_open(label_path)
image= keep_image_size_open(image_path)
#image图片和label图片做归一化
return transform(image),transform(label)
if __name__=="__main__":
data=MyDataset("E:\桌面\VOCdevkit\VOC2007")
print(data[0][0].shape)
#输出得到:torch.Size([3, 256, 256])
#这说明我们确实将图片大小调整到我们所需要的大小了
文章出处登录后可见!
已经登录?立即刷新