යූ-නෙට්

මෙයකඩදාසි වලින් U-Net ආකෘතිය ක්රියාත්මක කිරීම, U-Net: ජෛව වෛද්ය රූප ඛණ්ඩනය සඳහා සංයුක්ත ජාල.

යූ-නෙට්ගිවිසුම්ගත මාර්ගයක් සහ පුළුල් මාර්ගයකින් සමන්විත වේ. හැකිලීමේ මාර්ගය යනු සංවහන ස්ථර සහ තටාක ස්ථර මාලාවක් වන අතර එහිදී විශේෂාංග සිතියමේ විභේදනය ක්රමයෙන් අඩු වේ. පුළුල් මාර්ගය ලක්ෂණය සිතියම යෝජනාව ක්රමයෙන් වැඩි ලක්වෙයි එහිදී දක්වා-නියැදීම් ස්ථර සහ සංවලිත ස්ථර මාලාවක් වේ.

පුළුල්කරන ලද මාවතේ සෑම පියවරකදීම වර්තමාන විශේෂාංග සිතියමට අනුකූල ගිවිසුම්ගත මාර්ගයෙන් අනුරූප විශේෂාංග සිතියම.

U-Net diagram from paper

Carvana දත්ත කට්ටලය මත U-Net පුහුණු කරන අත්හදා බැලීමක් සඳහා පුහුණු කේතය මෙන්න.

27import torch
28import torchvision.transforms.functional
29from torch import nn

සංවලිත ස්ථර දෙකක්

සංකෝචනමාර්ගය හා පුළුල් මාර්ගය එක් එක් පියවර RelU සක්රිය විසින් අනුගමනය convolutional ස්ථර දෙකක් ඇත.

යූ-නෙට්කඩදාසි වලදී ඔවුන් පෑඩින් භාවිතා කළ නමුත් අවසාන විශේෂාංග සිතියම කැපූ නොවන පරිදි අපි පෑඩින් භාවිතා කරමු.

32class DoubleConvolution(nn.Module):
  • in_channels ආදාන නාලිකා ගණන
  • out_channels ප්රතිදාන නාලිකා ගණන වේ
43    def __init__(self, in_channels: int, out_channels: int):
48        super().__init__()

පළමු සංවිච්ඡුා ස්ථරය

51        self.first = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1)
52        self.act1 = nn.ReLU()

දෙවන කැටි ගැසුණු ස්ථරය

54        self.second = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)
55        self.act2 = nn.ReLU()
57    def forward(self, x: torch.Tensor):

කැටිගැසුණු ස්ථර දෙක සහ සක්රිය කිරීම් යොදන්න

59        x = self.first(x)
60        x = self.act1(x)
61        x = self.second(x)
62        return self.act2(x)

පහළ-නියැදිය

කොන්ත්රාත්මාර්ගයේ සෑම පියවරක්ම උපරිම තටාක තට්ටුවක් සහිත විශේෂාංග සිතියම පහළට සාම්පල කරයි.

65class DownSample(nn.Module):
73    def __init__(self):
74        super().__init__()

උපරිමතටාක ස්ථරය

76        self.pool = nn.MaxPool2d(2)
78    def forward(self, x: torch.Tensor):
79        return self.pool(x)

ඉහළනියැදිය

පුළුල්කිරීමේ මාවතේ සෑම පියවරක්ම සාම්පල මඟින් විශේෂාංග සිතියම දක්වා-කැටි ගැසුමකින් යුක්ත වේ.

82class UpSample(nn.Module):
89    def __init__(self, in_channels: int, out_channels: int):
90        super().__init__()

දක්වා-සංවහන

93        self.up = nn.ConvTranspose2d(in_channels, out_channels, kernel_size=2, stride=2)
95    def forward(self, x: torch.Tensor):
96        return self.up(x)

විශේෂාංගසිතියම බෝග කිරීම සහ සංයුක්ත කිරීම

පුළුල්කරන ලද මාවතේ සෑම පියවරකදීම වර්තමාන විශේෂාංග සිතියමට අනුකූල ගිවිසුම්ගත මාර්ගයෙන් අනුරූප විශේෂාංග සිතියම.

99class CropAndConcat(nn.Module):
  • x පුළුල් කිරීමේ මාවතේ වත්මන් විශේෂාංග සිතියම
  • contracting_x ගිවිසුම්ගත මාර්ගයෙන් අනුරූප විශේෂාංග සිතියම
106    def forward(self, x: torch.Tensor, contracting_x: torch.Tensor):

කොන්ත්රාත්මාර්ගයේ සිට වර්තමාන විශේෂාංග සිතියමේ ප්රමාණය දක්වා විශේෂාංග සිතියම වගා කරන්න

113        contracting_x = torchvision.transforms.functional.center_crop(contracting_x, [x.shape[2], x.shape[3]])

විශේෂාංගසිතියම් සංයුක්ත කරන්න

115        x = torch.cat([x, contracting_x], dim=1)

117        return x

යූ-නෙට්

120class UNet(nn.Module):
  • in_channels ආදාන රූපයේ නාලිකා ගණන
  • out_channels ප්රති result ල විශේෂාංග සිතියමේ නාලිකා ගණන
124    def __init__(self, in_channels: int, out_channels: int):
129        super().__init__()

කොන්ත්රාත්මාර්ගය සඳහා ද්විත්ව කැටි ගැසීමේ ස්ථර. සිට ආරම්භ වන සෑම පියවරකදීම විශේෂාංග ගණන දෙගුණ වේ.

133        self.down_conv = nn.ModuleList([DoubleConvolution(i, o) for i, o in
134                                        [(in_channels, 64), (64, 128), (128, 256), (256, 512)]])

කොන්ත්රාත්මාර්ගය සඳහා නියැදි ස්ථර පහළට

136        self.down_sample = nn.ModuleList([DownSample() for _ in range(4)])

අවමවිභේදනයේ (U පතුලේ) කැටි ගැස්වීමේ ස්ථර දෙක.

139        self.middle_conv = DoubleConvolution(512, 1024)

පුළුල්මාර්ගය සඳහා නියැදි ස්ථර දක්වා. විශේෂාංග ගණන ඉහළට නියැදීමෙන් අඩකින් අඩු වේ.

143        self.up_sample = nn.ModuleList([UpSample(i, o) for i, o in
144                                        [(1024, 512), (512, 256), (256, 128), (128, 64)]])

පුළුල්මාර්ගය සඳහා ද්විත්ව කැටි ගැසුණු ස්ථර. ඔවුන්ගේ ආදානය වන්නේ වර්තමාන විශේෂාංග සිතියම සහ කොන්ත්රාත් මාර්ගයෙන් විශේෂාංග සිතියම සංයුක්ත කිරීමයි. එබැවින් ආදාන විශේෂාංග ගණන ඉහළ නියැදීම් වලින් විශේෂාංග ගණන දෙගුණයක් වේ.

149        self.up_conv = nn.ModuleList([DoubleConvolution(i, o) for i, o in
150                                      [(1024, 512), (512, 256), (256, 128), (128, 64)]])

පුළුල්මාර්ගය සඳහා බෝග හා concatenate ස්ථර.

152        self.concat = nn.ModuleList([CropAndConcat() for _ in range(4)])

ප්රතිදානයනිෂ්පාදනය කිරීම සඳහා අවසාන කැටි ගැසුණු ස්ථරය

154        self.final_conv = nn.Conv2d(64, out_channels, kernel_size=1)
  • x ආදාන රූපය
156    def forward(self, x: torch.Tensor):

පුළුල්කරන ලද මාර්ගය සමඟ පසුකාලීන සංකෝචනය සඳහා සංකෝචන මාර්ගයේ ප්රතිදානයන් එකතු කිරීම.

161        pass_through = []

කොන්ත්රාත්මාර්ගය

163        for i in range(len(self.down_conv)):

සංකීර්ණ ස්ථර දෙකක්

165            x = self.down_conv[i](x)

ප්රතිදානයඑකතු කරන්න

167            pass_through.append(x)

පහළ-නියැදිය

169            x = self.down_sample[i](x)

යූ-නෙට්පතුලේ සංයුක්ත ස්ථර දෙකක්

172        x = self.middle_conv(x)

පුළුල්මාර්ගය

175        for i in range(len(self.up_conv)):

ඉහළනියැදිය

177            x = self.up_sample[i](x)

කොන්ත්රාත්මාර්ගයේ ප්රතිදානය සංයුක්ත කරන්න

179            x = self.concat[i](x, pass_through.pop())

සංකීර්ණ ස්ථර දෙකක්

181            x = self.up_conv[i](x)

අවසාන කැටි ගැසුණු ස්ථරය

184        x = self.final_conv(x)

187        return x