በራሳቸው የሚነዱ መኪኖች ስህተቶችን መግዛት አይችሉም። የትራፊክ መብራት ወይም እግረኛ ማጣት አደጋ ሊያስከትል ይችላል። ነገር ግን በተለዋዋጭ የከተማ አካባቢዎች ውስጥ የነገር መለየት? ያ ከባድ ነው።
የአትሮስ ስፓሻል ፒራሚድ ገንዳ (ASPP) እና የዝውውር ትምህርትን በመጠቀም ራሳቸውን ችለው ለሚንቀሳቀሱ ተሽከርካሪዎች የነገር ፈልጎን በማመቻቸት ላይ ሠርቻለሁ። ውጤቱስ? በመጥፎ ብርሃን ውስጥ እንኳን ነገሮችን በበርካታ ሚዛኖች የሚያውቅ እና በእውነተኛ ጊዜ በብቃት የሚሰራ ሞዴል።
እንዴት እንዳደረግኩት እነሆ።
እራስን የሚነዱ መኪኖች ነገሮችን ለመለየት በ Convolutional Neural Networks (CNNs) ይተማመናሉ፣ ነገር ግን የገሃዱ ዓለም ሁኔታዎች ፈተናዎችን ያስተዋውቃሉ፡-
ባህላዊ ሲ ኤን ኤን ከብዙ-ልኬት ነገር ፈልጎ ማግኘት ጋር መታገል እና ከባዶ ስልጠና ለዘላለም ይወስዳል። ASPP እና የዝውውር ትምህርት የሚገቡት እዚያ ነው።
ሲ.ኤን.ኤን.ዎች ቋሚ መጠን ላላቸው ነገሮች ጥሩ ይሰራሉ ነገር ግን የገሃዱ ዓለም ነገሮች በመጠን እና በርቀት ይለያያሉ። አስትሮስ ስፓሻል ፒራሚድ ፑልንግ (ኤኤስፒፒ) ይህን የሚፈታው የተዘረጉ ውዝግቦችን በመጠቀም በበርካታ ሚዛኖች ያሉ ባህሪያትን ለመያዝ ነው።
ASPP በተለያዩ ጥራቶች፣ ትናንሽ ነገሮች፣ ትላልቅ ነገሮች እና በመካከላቸው ያለውን ነገር ሁሉ ለማውጣት የተለያዩ የዝውውር ማጣሪያዎችን በተለያዩ የማስፋፊያ መጠኖች ይተገበራል።
የቡድን መደበኛነትን እና ውስብስብ አካባቢዎችን ለጠንካራ አፈጻጸም ትኩረትን በማካተት ASPPን በፒቶርች እንዴት እንደተገበርኩ እነሆ፡-
import torch import torch.nn as nn import torch.nn.functional as F class ASPP(nn.Module): """ A more advanced ASPP with optional attention and group normalization. """ def __init__(self, in_channels, out_channels, dilation_rates=(6,12,18), groups=8): super(ASPP, self).__init__() self.aspp_branches = nn.ModuleList() #1x1 Conv branch self.aspp_branches.append( nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1, padding=0, bias=False), nn.GroupNorm(groups, out_channels), nn.ReLU(inplace=True) ) ) for rate in dilation_rates: self.aspp_branches.append( nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=1, padding=rate, dilation=rate, bias=False), nn.GroupNorm(groups, out_channels), nn.ReLU(inplace=True) ) ) #Global average pooling branch self.global_pool = nn.AdaptiveAvgPool2d((1, 1)) self.global_conv = nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1, bias=False), nn.GroupNorm(groups, out_channels), nn.ReLU(inplace=True) ) #Attention mechanism to refine the concatenated features self.attention = nn.Sequential( nn.Conv2d(out_channels*(len(dilation_rates)+2), out_channels, kernel_size =1, bias=False), nn.Sigmoid() ) self.project = nn.Sequential( nn.Conv2d(out_channels*(len(dilation_rates)+2), out_channels, kernel_size=1, bias=False), nn.GroupNorm(groups, out_channels), nn.ReLU(inplace=True) ) def forward(self, x): cat_feats = [] for branch in self.aspp_branches: cat_feats.append(branch(x)) g_feat = self.global_pool(x) g_feat = self.global_conv(g_feat) g_feat = F.interpolate(g_feat, size=x.shape[2:], mode='bilinear', align_corners=False) cat_feats.append(g_feat) #Concatenate along channels x_cat = torch.cat(cat_feats, dim=1) #channel-wise attention att_map = self.attention(x_cat) x_cat = x_cat * att_map out = self.project(x_cat) return out
አስቀድሞ የሰለጠኑ ሞዴሎች ሲኖሩ የነገሮችን ፈልጎ ማግኛ ሞዴል ከባዶ ማሰልጠን ብዙ ጥቅም አይሰጥም። ትምህርት ማስተላለፍ ቀደም ሲል ነገሮችን የሚረዳውን ሞዴል በጥሩ ሁኔታ እንድናስተካክል ያስችለናል።
DETR (Detection Transformer) ተጠቀምኩኝ፣ በትራንስፎርመር ላይ የተመሰረተ የነገር ማወቂያ ሞዴል ከፌስቡክ AI። አውድ ይማራል - ስለዚህ የማቆሚያ ምልክትን ብቻ እንዲያገኝ ሳይሆን የመንገድ ትዕይንት አካል እንደሆነ ይረዳል።
በራስ የመንዳት የውሂብ ስብስቦች ላይ DETRን እንዴት እንዳስተካከልኩት እነሆ፡-
import torch import torch.nn as nn from transformers import DetrConfig, DetrForObjectDetection class CustomBackbone(nn.Module): def __init__(self, in_channels=3, hidden_dim=256): super(CustomBackbone, self).__init__() # Example: basic conv layers + ASPP self.initial_conv = nn.Sequential( nn.Conv2d(in_channels, 64, kernel_size=7, stride=2, padding=3, bias=False), nn.BatchNorm2d(64), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2, padding=1) ) self.aspp = ASPP(in_channels=64, out_channels=hidden_dim) def forward(self, x): x = self.initial_conv(x) x = self.aspp(x) return x class DETRWithASPP(nn.Module): def __init__(self, num_classes=91): super(DETRWithASPP, self).__init__() self.backbone = CustomBackbone() config = DetrConfig.from_pretrained("facebook/detr-resnet-50") config.num_labels = num_classes self.detr = DetrForObjectDetection.from_pretrained("facebook/detr-resnet-50", config=config) self.detr.model.backbone.body = nn.Identity() def forward(self, images, pixel_masks=None): features = self.backbone(images) feature_dict = { "0": features } outputs = self.detr.model(inputs_embeds=None, pixel_values=None, pixel_mask=pixel_masks, features=feature_dict, output_attentions=False) return outputs model = DETRWithASPP(num_classes=10) images = torch.randn(2, 3, 512, 512) outputs = model(images)
ራሳቸውን ችለው የሚንቀሳቀሱ ተሽከርካሪዎች ግዙፍ የውሂብ ስብስቦች ያስፈልጋቸዋል፣ ነገር ግን በገሃዱ ዓለም የተሰየመ መረጃ በጣም አናሳ ነው። ማስተካከያው? GANs (Generative Adversarial Networks) በመጠቀም ሰው ሰራሽ ውሂብ ይፍጠሩ።
የመረጃ ቋቱን ለማስፋት የሐሰት ግን እውነተኛ የሌይን ምልክቶችን እና የትራፊክ ትዕይንቶችን ለመፍጠር GAN ተጠቀምኩ።
ለመንገድ ምልክት ማመንጨት ቀላል GAN ይኸውና፡
import torch import torch.nn as nn import torch.nn.functional as F class LaneMarkingGenerator(nn.Module): """ A DCGAN-style generator designed for producing synthetic lane or road-like images. Input is a latent vector (noise), and the output is a (1 x 64 x 64) grayscale image. You can adjust channels, resolution, and layers to match your target data. """ def __init__(self, z_dim=100, feature_maps=64): super(LaneMarkingGenerator, self).__init__() self.net = nn.Sequential( #Z latent vector of shape (z_dim, 1, 1) nn.utils.spectral_norm(nn.ConvTranspose2d(z_dim, feature_maps * 8, 4, 1, 0, bias=False)), nn.BatchNorm2d(feature_maps * 8), nn.ReLU(True), #(feature_maps * 8) x 4 x 4 nn.utils.spectral_norm(nn.ConvTranspose2d(feature_maps * 8, feature_maps * 4, 4, 2, 1, bias=False)), nn.BatchNorm2d(feature_maps * 4), nn.ReLU(True), #(feature_maps * 4) x 8 x 8 nn.utils.spectral_norm(nn.ConvTranspose2d(feature_maps * 4, feature_maps * 2, 4, 2, 1, bias=False)), nn.BatchNorm2d(feature_maps * 2), nn.ReLU(True), #(feature_maps * 2) x 16 x 16 nn.utils.spectral_norm(nn.ConvTranspose2d(feature_maps * 2, feature_maps, 4, 2, 1, bias=False)), nn.BatchNorm2d(feature_maps), nn.ReLU(True), #(feature_maps) x 32 x 32 nn.utils.spectral_norm(nn.ConvTranspose2d(feature_maps, 1, 4, 2, 1, bias=False)), nn.Tanh() ) def forward(self, z): return self.net(z) class LaneMarkingDiscriminator(nn.Module): """ A DCGAN-style discriminator. It takes a (1 x 64 x 64) image and attempts to classify whether it's real or generated (fake). """ def __init__(self, feature_maps=64): super(LaneMarkingDiscriminator, self).__init__() self.net = nn.Sequential( #1x 64 x 64 nn.utils.spectral_norm(nn.Conv2d(1, feature_maps, 4, 2, 1, bias=False)), nn.LeakyReLU(0.2, inplace=True), #(feature_maps) x 32 x 32 nn.utils.spectral_norm(nn.Conv2d(feature_maps, feature_maps * 2, 4, 2, 1, bias=False)), nn.BatchNorm2d(feature_maps * 2), nn.LeakyReLU(0.2, inplace=True), #(feature_maps * 2) x 16 x 16 nn.utils.spectral_norm(nn.Conv2d(feature_maps * 2, feature_maps * 4, 4, 2, 1, bias=False)), nn.BatchNorm2d(feature_maps * 4), nn.LeakyReLU(0.2, inplace=True), #(feature_maps * 4) x 8 x 8 nn.utils.spectral_norm(nn.Conv2d(feature_maps * 4, feature_maps * 8, 4, 2, 1, bias=False)), nn.BatchNorm2d(feature_maps * 8), nn.LeakyReLU(0.2, inplace=True), #(feature_maps * 8) x 4 x 4 nn.utils.spectral_norm(nn.Conv2d(feature_maps * 8, 1, 4, 1, 0, bias=False)), ) def forward(self, x): return self.net(x).view(-1)
ASPPን፣ የዝውውር ትምህርትን እና ሰው ሰራሽ ውሂብን በማጣመር ለራስ ለሚነዱ መኪኖች ይበልጥ ትክክለኛ የሆነ ሊሰፋ የሚችል የነገር መፈለጊያ ስርዓት ገነባሁ። አንዳንድ ቁልፍ ውጤቶች የሚከተሉት ናቸው፡-
ASPPን፣ Transformers እና Synthetic Dataን ወደ ሶስት እጥፍ ስጋት አዋህደናል ራስን ችሎ ነገርን ለማወቅ - አንድ ጊዜ ቀርፋፋ እና ዓይነ ስውር የሆኑ ሞዴሎችን ወደ ፈጣን እና አስተዋይ ስርዓቶች ከቦታ ቦታ የትራፊክ መብራትን ያያሉ። ለባለብዙ ደረጃ ዝርዝሮች የተዘረጉ ውዝግቦችን በመቀበል፣ ትምህርትን ለፈጣን ማስተካከያ እና በGAN የተገኘ መረጃን እያንዳንዱን ክፍተት ለመሙላት የግምገማ ጊዜዎችን በግማሽ ያህል ቆርጠን የሰዓታት ስልጠና እንቆጥባለን። እኛ በፍጥነት፣ በትክክል እና በጣም የተመሰቃቀለውን መንገዶቻችንን በልበ ሙሉነት ለማሰስ በሚያደርጉት መንገድ አለምን በበለጠ ወደሚመለከቱት መኪናዎች ትልቅ ዝላይ ነው።