语义分割作为计算机视觉领域的关键任务之一,旨在将图像中的每个像素分配到特定的类别中,从而实现对图像的细致理解。在众多语义分割模型中,U Net 和 Mask R CNN 等表现卓越,它们各自有着独特的架构和应用场景。本文将深入介绍这些经典的语义分割模型。
U Net 最初是为生物医学图像分割而设计的,由于其在小数据集上表现出色且架构相对简单,迅速在语义分割领域得到广泛应用。
U Net 采用了编码器 - 解码器结构,形似英文字母“U”,因此得名。
import torch
import torch.nn as nn
class DoubleConv(nn.Module):
def __init__(self, in_channels, out_channels):
super().__init__()
self.conv = nn.Sequential(
nn.Conv2d(in_channels, out_channels, 3, 1, 1, bias=False),
nn.BatchNorm2d(out_channels),
nn.ReLU(inplace=True),
nn.Conv2d(out_channels, out_channels, 3, 1, 1, bias=False),
nn.BatchNorm2d(out_channels),
nn.ReLU(inplace=True)
)
def forward(self, x):
return self.conv(x)
class UNET(nn.Module):
def __init__(
self, in_channels=3, out_channels=1, features=[64, 128, 256, 512]
):
super().__init__()
self.ups = nn.ModuleList()
self.downs = nn.ModuleList()
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
# 编码器部分
for feature in features:
self.downs.append(DoubleConv(in_channels, feature))
in_channels = feature
# 中间层
self.bottleneck = DoubleConv(features[-1], features[-1]*2)
# 解码器部分
for feature in reversed(features):
self.ups.append(
nn.ConvTranspose2d(
feature*2, feature, kernel_size=2, stride=2,
)
)
self.ups.append(DoubleConv(feature*2, feature))
self.final_conv = nn.Conv2d(features[0], out_channels, kernel_size=1)
def forward(self, x):
skip_connections = []
for down in self.downs:
x = down(x)
skip_connections.append(x)
x = self.pool(x)
x = self.bottleneck(x)
skip_connections = skip_connections[::-1]
for idx in range(0, len(self.ups), 2):
x = self.ups[idx](x)
skip_connection = skip_connections[idx//2]
if x.shape!= skip_connection.shape:
x = nn.functional.interpolate(
x, size=skip_connection.shape[2:], mode='bilinear', align_corners=True
)
concat_skip = torch.cat((skip_connection, x), dim=1)
x = self.ups[idx+1](concat_skip)
return self.final_conv(x)
U Net 在生物医学图像分割中表现优异,例如细胞分割、器官分割等。由于其对小数据集的适应性,在一些特定领域的数据量有限时也能取得较好的效果。
Mask R CNN 是在 Faster R CNN 的基础上发展而来的,主要用于实例分割任务,同时也能很好地应用于语义分割。它在目标检测的基础上增加了一个掩码分支,能够为每个检测到的目标生成像素级的分割掩码。
import torch
import torchvision
from torchvision.models.detection import maskrcnn_resnet50_fpn
from torchvision.transforms import functional as F
# 加载预训练模型
model = maskrcnn_resnet50_fpn(pretrained=True)
model.eval()
# 示例输入
image = torch.randn(3, 224, 224)
image = F.to_tensor(image)
images = [image]
# 前向传播
with torch.no_grad():
predictions = model(images)
# 输出结果
boxes = predictions[0]['boxes']
labels = predictions[0]['labels']
masks = predictions[0]['masks']
Mask R CNN 在目标检测和实例分割任务中应用广泛,例如自动驾驶中的车辆、行人检测与分割,安防监控中的目标识别与分割等。
模型 | 架构特点 | 数据需求 | 计算复杂度 | 应用场景 |
---|---|---|---|---|
U Net | 编码器 - 解码器结构,跳跃连接恢复细节 | 相对小数据集 | 较低 | 生物医学图像分割等小数据场景 |
Mask R CNN | 基于 Faster R CNN,增加掩码分支 | 大数据集 | 较高 | 目标检测与实例分割等复杂场景 |
U Net 和 Mask R CNN 是语义分割领域的经典模型,它们各自有着独特的优势和适用场景。U Net 以其简单有效的架构在小数据集上表现出色,而 Mask R CNN 则在复杂的目标检测和实例分割任务中展现出强大的能力。在实际应用中,需要根据具体的任务需求、数据量和计算资源等因素选择合适的模型。随着技术的不断发展,语义分割模型也在不断演进,未来有望在更多领域取得更好的应用效果。