
语义分割作为计算机视觉领域的关键任务之一,旨在将图像中的每个像素分配到特定的类别中,从而实现对图像的细致理解。在众多语义分割模型中,U Net 和 Mask R CNN 等表现卓越,它们各自有着独特的架构和应用场景。本文将深入介绍这些经典的语义分割模型。
U Net 最初是为生物医学图像分割而设计的,由于其在小数据集上表现出色且架构相对简单,迅速在语义分割领域得到广泛应用。
U Net 采用了编码器 - 解码器结构,形似英文字母“U”,因此得名。
import torchimport torch.nn as nnclass 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 torchimport torchvisionfrom torchvision.models.detection import maskrcnn_resnet50_fpnfrom 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 则在复杂的目标检测和实例分割任务中展现出强大的能力。在实际应用中,需要根据具体的任务需求、数据量和计算资源等因素选择合适的模型。随着技术的不断发展,语义分割模型也在不断演进,未来有望在更多领域取得更好的应用效果。