微信登录

语义分割 - 模型架构 - U Net、Mask R CNN 等

语义分割 - 模型架构 - U Net、Mask R CNN 等

一、引言

语义分割作为计算机视觉领域的关键任务之一,旨在将图像中的每个像素分配到特定的类别中,从而实现对图像的细致理解。在众多语义分割模型中,U Net 和 Mask R CNN 等表现卓越,它们各自有着独特的架构和应用场景。本文将深入介绍这些经典的语义分割模型。

二、U Net 模型

(一)模型背景

U Net 最初是为生物医学图像分割而设计的,由于其在小数据集上表现出色且架构相对简单,迅速在语义分割领域得到广泛应用。

(二)模型架构

U Net 采用了编码器 - 解码器结构,形似英文字母“U”,因此得名。

  • 编码器部分:由多个卷积层和下采样层组成,用于提取图像的高级特征。每一次下采样操作(通常使用最大池化)都会使特征图的空间尺寸减半,同时通道数增加,从而不断捕捉图像的抽象信息。
  • 解码器部分:通过上采样操作(通常使用反卷积)逐渐恢复特征图的空间尺寸,同时结合编码器中对应层的特征信息。这种跳跃连接(skip connection)的设计使得解码器能够利用编码器中不同尺度的特征,有助于恢复图像的细节信息。
  • 输出层:最后通过一个卷积层将特征图映射到与输入图像相同尺寸的类别概率图,每个像素位置对应各个类别的概率。

(三)代码示例

  1. import torch
  2. import torch.nn as nn
  3. class DoubleConv(nn.Module):
  4. def __init__(self, in_channels, out_channels):
  5. super().__init__()
  6. self.conv = nn.Sequential(
  7. nn.Conv2d(in_channels, out_channels, 3, 1, 1, bias=False),
  8. nn.BatchNorm2d(out_channels),
  9. nn.ReLU(inplace=True),
  10. nn.Conv2d(out_channels, out_channels, 3, 1, 1, bias=False),
  11. nn.BatchNorm2d(out_channels),
  12. nn.ReLU(inplace=True)
  13. )
  14. def forward(self, x):
  15. return self.conv(x)
  16. class UNET(nn.Module):
  17. def __init__(
  18. self, in_channels=3, out_channels=1, features=[64, 128, 256, 512]
  19. ):
  20. super().__init__()
  21. self.ups = nn.ModuleList()
  22. self.downs = nn.ModuleList()
  23. self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
  24. # 编码器部分
  25. for feature in features:
  26. self.downs.append(DoubleConv(in_channels, feature))
  27. in_channels = feature
  28. # 中间层
  29. self.bottleneck = DoubleConv(features[-1], features[-1]*2)
  30. # 解码器部分
  31. for feature in reversed(features):
  32. self.ups.append(
  33. nn.ConvTranspose2d(
  34. feature*2, feature, kernel_size=2, stride=2,
  35. )
  36. )
  37. self.ups.append(DoubleConv(feature*2, feature))
  38. self.final_conv = nn.Conv2d(features[0], out_channels, kernel_size=1)
  39. def forward(self, x):
  40. skip_connections = []
  41. for down in self.downs:
  42. x = down(x)
  43. skip_connections.append(x)
  44. x = self.pool(x)
  45. x = self.bottleneck(x)
  46. skip_connections = skip_connections[::-1]
  47. for idx in range(0, len(self.ups), 2):
  48. x = self.ups[idx](x)
  49. skip_connection = skip_connections[idx//2]
  50. if x.shape!= skip_connection.shape:
  51. x = nn.functional.interpolate(
  52. x, size=skip_connection.shape[2:], mode='bilinear', align_corners=True
  53. )
  54. concat_skip = torch.cat((skip_connection, x), dim=1)
  55. x = self.ups[idx+1](concat_skip)
  56. return self.final_conv(x)

(四)应用场景

U Net 在生物医学图像分割中表现优异,例如细胞分割、器官分割等。由于其对小数据集的适应性,在一些特定领域的数据量有限时也能取得较好的效果。

三、Mask R CNN 模型

(一)模型背景

Mask R CNN 是在 Faster R CNN 的基础上发展而来的,主要用于实例分割任务,同时也能很好地应用于语义分割。它在目标检测的基础上增加了一个掩码分支,能够为每个检测到的目标生成像素级的分割掩码。

(二)模型架构

  • 骨干网络:通常使用预训练的卷积神经网络(如 ResNet)作为特征提取器,用于提取图像的特征图。
  • 区域建议网络(RPN):在特征图上生成候选区域(RoIs),这些候选区域是可能包含目标的区域。
  • RoI Align:对候选区域进行精确的特征提取,避免了 RoI Pooling 中的量化误差,提高了掩码预测的精度。
  • 分类、回归和掩码分支:对每个候选区域进行分类和边界框回归,同时生成对应的像素级分割掩码。

(三)代码示例(使用 torchvision)

  1. import torch
  2. import torchvision
  3. from torchvision.models.detection import maskrcnn_resnet50_fpn
  4. from torchvision.transforms import functional as F
  5. # 加载预训练模型
  6. model = maskrcnn_resnet50_fpn(pretrained=True)
  7. model.eval()
  8. # 示例输入
  9. image = torch.randn(3, 224, 224)
  10. image = F.to_tensor(image)
  11. images = [image]
  12. # 前向传播
  13. with torch.no_grad():
  14. predictions = model(images)
  15. # 输出结果
  16. boxes = predictions[0]['boxes']
  17. labels = predictions[0]['labels']
  18. masks = predictions[0]['masks']

(四)应用场景

Mask R CNN 在目标检测和实例分割任务中应用广泛,例如自动驾驶中的车辆、行人检测与分割,安防监控中的目标识别与分割等。

四、U Net 与 Mask R CNN 的对比

模型 架构特点 数据需求 计算复杂度 应用场景
U Net 编码器 - 解码器结构,跳跃连接恢复细节 相对小数据集 较低 生物医学图像分割等小数据场景
Mask R CNN 基于 Faster R CNN,增加掩码分支 大数据集 较高 目标检测与实例分割等复杂场景

五、总结

U Net 和 Mask R CNN 是语义分割领域的经典模型,它们各自有着独特的优势和适用场景。U Net 以其简单有效的架构在小数据集上表现出色,而 Mask R CNN 则在复杂的目标检测和实例分割任务中展现出强大的能力。在实际应用中,需要根据具体的任务需求、数据量和计算资源等因素选择合适的模型。随着技术的不断发展,语义分割模型也在不断演进,未来有望在更多领域取得更好的应用效果。

语义分割 - 模型架构 - U Net、Mask R CNN 等