Deepラーニングのメモです
79 views
セマンティックセグメンテーションを学ぶ上で、まず最初に理解しておきたい代表的なネットワークが U-Net です。この記事では、U-Netの基本構造から始まり、スキップ接続の有無や層を深くする意味についても掘り下げていきます。さらに、簡単なPyTorchによるサンプルコードも紹介します。
U-Netは2015年に医用画像解析向けに提案されたCNNベースのセマンティックセグメンテーションモデルです。名前の通り、ネットワーク構造が「U字型」をしており、エンコーダ(下り)とデコーダ(上り)の2つのパートから構成されています。
このスキップ接続によって、深い層で失われがちな空間的な情報("どこにあるか")を補完し、精度の高いセグメンテーションが可能になります。
スキップ接続は、U-Netの性能に大きく貢献する重要な要素です。これを取り除くと、以下のような問題が発生します:
理由は、エンコーダの深い層になるほど、抽象的な情報は得られても、空間的な位置情報が失われるためです。スキップ接続はこの情報を補い、デコーダでの復元に活用されます。
「スキップ接続で浅い層の情報を使うなら、深くする意味はあるのか?」という疑問を持つ人も多いかもしれません。
答えは YES です。層を深くすることで得られるメリットは以下の通り:
つまり、U-Netは浅い層の空間情報と深い層の意味的情報の両方を活用する構造になっており、どちらが欠けても性能が落ちるのです。
import torch
import torch.nn as nn
class UNetBlock(nn.Module):
def __init__(self, in_channels, out_channels):
super().__init__()
self.conv = nn.Sequential(
nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1),
nn.ReLU(),
nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1),
nn.ReLU(),
)
def forward(self, x):
return self.conv(x)
class UNet(nn.Module):
def __init__(self):
super().__init__()
self.enc1 = UNetBlock(1, 64)
self.pool1 = nn.MaxPool2d(2)
self.enc2 = UNetBlock(64, 128)
self.pool2 = nn.MaxPool2d(2)
self.bottleneck = UNetBlock(128, 256)
self.up2 = nn.ConvTranspose2d(256, 128, kernel_size=2, stride=2)
self.dec2 = UNetBlock(256, 128)
self.up1 = nn.ConvTranspose2d(128, 64, kernel_size=2, stride=2)
self.dec1 = UNetBlock(128, 64)
self.final = nn.Conv2d(64, 2, kernel_size=1) # 2クラス分類
def forward(self, x):
e1 = self.enc1(x)
e2 = self.enc2(self.pool1(e1))
b = self.bottleneck(self.pool2(e2))
d2 = self.up2(b)
d2 = self.dec2(torch.cat([d2, e2], dim=1)) # skip connection
d1 = self.up1(d2)
d1 = self.dec1(torch.cat([d1, e1], dim=1)) # skip connection
return self.final(d1)
このコードでは、2層のU-Netを定義しています。特徴マップをスキップ接続でデコーダに渡す構造が反映されています。
セマンティックセグメンテーションを学ぶなら、U-Netの構造とその意味をしっかり理解することが大切です。今後はU-Net++やAttention U-Netといった派生モデルも視野に入れていくと、より深い理解につながるでしょう。
Page 31 of 33.
すぺぺぺ
本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。
https://www.osumoi-stdio.com/novel/