【深度学习】图像分割概述

图像分割

与目标检测不同,语义分割可以识别并理解图像中每一个像素的内容:其语义区域的标注和预测是像素级的。与目标检测相比,语义分割中图像有关狗、猫和背景的标签,语义分割标注的像素级的边框显然更加精细。

本文主要梳理基于深度学习的图像分割方法。按照任务不同,可以将图像分割分为三类:语义分割、实例分割、全景分割。

语义分割: 语义分割是指将图像中的像素分类为语义类。属于特定类别的像素仅被分类到该类别,而不考虑其他信息或上下文。

实例分割: 实例分割模型根据“实例”而不是类别将像素分类。

全景分割: 全景分割是最新开发的分割任务,可以表示为语义分割和实例分割的组合,其中图像中对象的每个实例都被分离,并预测对象的身份。和实例分割的区别在于,将整个图像都进行分割。

seg

1. 语义分割

1.1 U-Net原理与实现

可以按照以下思路进行理解:数据读取器DataLoader,网络Network,损失函数Loss Function,训练方法及优化器Train Setting。上述代码中,标签是RGB像素值,因此会出现预测的图像有不同的颜色出现。还有一种标签就是将像素值映射成类别值。

在这里插入图片描述
结合这张图可以理解怎么构造UNet网络。可以看出来,经过c1, c2, c3, c4, c5。图像的尺寸逐渐变小,尺寸变为16×16,这个过程成为Encode过程。为了进行像素级别的分类,采取的思路是,将编码的矩阵进行上采样,尺寸变大,并且和之前编码的尺寸相同的矩阵在通道方向进行叠加,如灰色箭头所示。进行若干次叠加,最后将其映射成概率值,进行像素级别上的分类。

1.1.1 DataLoader
transform=transforms.Compose([
    transforms.ToTensor()
])
class MyDataset(Dataset):
    def __init__(self,path):
        self.path=path
        self.name=os.listdir(os.path.join(path,'SegmentationClass'))

    def __len__(self):
        return len(self.name)      # 数据集的数量

    def __getitem__(self, index):
        segment_name=self.name[index]  #xx.png
        segment_path=os.path.join(self.path,'SegmentationClass',segment_name)
        print(segment_path)
        image_path=os.path.join(self.path,'JPEGImages',segment_name.replace('png','jpg'))
        segment_image=keep_image_size_open(segment_path)
        image=keep_image_size_open(image_path)
        return transform(image),transform(segment_image)

注意以下几点:图片的尺寸需要统一并将像素一一对应;图片和标签的数据类型与尺寸image shape = (n, c, h, w), label shape = (n, c, h, w)

1.1.2 Network
class UNet(nn.Module):
    def __init__(self):
        super(UNet, self).__init__()
        self.c1=Conv_Block(3,64)  # 卷积Block
        self.d1=DownSample(64)   
        self.c2=Conv_Block(64,128)
        self.d2=DownSample(128)
        self.c3=Conv_Block(128,256)
        self.d3=DownSample(256)
        self.c4=Conv_Block(256,512)
        self.d4=DownSample(512)
        self.c5=Conv_Block(512,1024)
        self.u1=UpSample(1024)
        self.c6=Conv_Block(1024,512)
        self.u2 = UpSample(512)
        self.c7 = Conv_Block(512, 256)
        self.u3 = UpSample(256)
        self.c8 = Conv_Block(256, 128)
        self.u4 = UpSample(128)
        self.c9 = Conv_Block(128, 64)
        self.out=nn.Conv2d(64,3,
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值