【PyTorch】图像分割

图像分割是什么

Image Segmentation
将图像每一个像素分类
在这里插入图片描述

图像分割分类

  1. 超像素分割:少量超像素代替大量像素,常用于图像预处理
  2. 语义分割:逐像素分类,无法区分个体
  3. 实例分割:对个体目标进行分割
  4. 全景分割:语义分割结合实例分割
    在这里插入图片描述

本文讨论的是语义分割

模型如何完成图像分割

计算机:3-d张量 → 计算机:3-d张量
图像分割由模型与人类配合完成
模型:将数据映射到特征
人类:定义特征的物理意义,解决实际问题

PyTorch-Hub

PyTorch模型库,有大量模型供开发者调用 Link

1.torch.hub.load(‘pytorch/vision’, ‘deeplabv3_resnet101’,pretrained=True)

model=torch.hub.load(github, model, *args, **kwargs)
功能:加载模型
主要参数:
- github:str, 项目名,eg:pytorch/vision,<repo_owner/repo_name[:tag_name]>
- model: str, 模型名

2.torch.hub.list(github, force_reload=False)
3.torch.hub.help(github, model, force_reload=False)

深度学习中的图像分割模型

FCN

Fully Convolutional Networks for Semantic Segmentation
在这里插入图片描述

最主要贡献:
利用全卷积完成pixelwise prediction

U-Net

U-Net: Convolutional Networks for Biomedical Image Segmentation
在这里插入图片描述

DeepLab系列

V1

Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs
在这里插入图片描述
主要特点:

  1. 孔洞卷积:借助孔洞卷积,增大感受野
  2. CRF:采用CRF进行mask后处理

V2

DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs
在这里插入图片描述
主要特点:

  1. ASPP(Atrous Spatial Pyramid Pooling):解决多尺度问题

V3

Rethinking Atrous Convolution for Semantic Image Segmentation
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

主要特点:

  1. 孔洞卷积的串行
  2. ASPP的并行

V3+

Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation
在这里插入图片描述
在这里插入图片描述
主要特点:
deeplabv3基础上机上Encoder-Decoder思想

综述

Deep Semantic Segmentation of Natural and Medical Images: A Review
在这里插入图片描述
图像分割资源:
https://github.com/shawnbit/unet-family
https://github.com/yassouali/pytorch-segmentation

Unet实现人像抠图 (Portrait Matting)

数据来源:https://github.com/PetroWu/AutoPortraitMatting

未完待续……

PyTorch是一个流行的深度学习框架,可以用于图像分割任务。下面是一个简单的PyTorch图像分割的例子: 1. 导入必要的库和数据集 ```python import torch import torch.nn.functional as F from torch.utils.data import DataLoader from torchvision import transforms, datasets # 加载数据集 train_data = datasets.Cityscapes('./data', split='train', mode='fine', target_type='semantic', transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ])) test_data = datasets.Cityscapes('./data', split='test', mode='fine', target_type='semantic', transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ])) # 加载数据集的dataloader train_loader = DataLoader(train_data, batch_size=4, shuffle=True) test_loader = DataLoader(test_data, batch_size=4, shuffle=False) ``` 2. 定义模型 ```python class Net(torch.nn.Module): def __init__(self, num_classes=19): super(Net, self).__init__() self.conv1 = torch.nn.Conv2d(3, 64, kernel_size=3, padding=1) self.conv2 = torch.nn.Conv2d(64, 128, kernel_size=3, padding=1) self.conv3 = torch.nn.Conv2d(128, 256, kernel_size=3, padding=1) self.conv4 = torch.nn.Conv2d(256, 512, kernel_size=3, padding=1) self.conv5 = torch.nn.Conv2d(512, 512, kernel_size=3, padding=1) self.pool = torch.nn.MaxPool2d(kernel_size=2, stride=2) self.conv6 = torch.nn.Conv2d(512, 512, kernel_size=3, padding=1) self.conv7 = torch.nn.Conv2d(512, 512, kernel_size=3, padding=1) self.conv8 = torch.nn.Conv2d(512, num_classes, kernel_size=1) def forward(self, x): x = F.relu(self.conv1(x)) x = self.pool(F.relu(self.conv2(x))) x = self.pool(F.relu(self.conv3(x))) x = self.pool(F.relu(self.conv4(x))) x = self.pool(F.relu(self.conv5(x))) x = self.pool(F.relu(self.conv6(x))) x = self.pool(F.relu(self.conv7(x))) x = self.conv8(x) return x ``` 3. 训练模型 ```python # 定义模型和优化器 model = Net() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 定义损失函数 criterion = torch.nn.CrossEntropyLoss() # 训练模型 for epoch in range(10): for i, (inputs, targets) in enumerate(train_loader): optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, targets.squeeze(1).long()) loss.backward() optimizer.step() if i % 100 == 0: print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, 10, i+1, len(train_loader), loss.item())) ``` 4. 测试模型 ```python # 测试模型 model.eval() with torch.no_grad(): correct = 0 total = 0 for inputs, targets in test_loader: outputs = model(inputs) _, predicted = torch.max(outputs.data, 1) total += targets.size(0) correct += (predicted == targets.squeeze(1)).sum().item() print('Accuracy of the network on the test images: {:.2f} %'.format(100 * correct / total)) ``` 这是一个简单的图像分割的例子,你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bosenya12

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值