paint-brush
ራስን ለመንዳት መኪናዎች በዝውውር ትምህርት እና ASPP የነገር ፈልጎን እንዴት ይበልጥ ብልጥ እንዳደረግሁ@vineethvatti
አዲስ ታሪክ

ራስን ለመንዳት መኪናዎች በዝውውር ትምህርት እና ASPP የነገር ፈልጎን እንዴት ይበልጥ ብልጥ እንዳደረግሁ

Vineeth Reddy Vatti11m2025/03/07
Read on Terminal Reader

በጣም ረጅም፤ ማንበብ

አስትሮስ ስፓሻል ፒራሚድ ፑልንግ (ኤኤስፒፒ) እና የዝውውር ትምህርት በተለዋዋጭ የከተማ አካባቢዎች የነገሮችን መለየት ለማመቻቸት ይጠቅማሉ። ባህላዊ ሲ.ኤን.ኤን ከብዙ-ልኬት ነገር ፈልጎ ማግኘት ጋር መታገል እና ከባዶ ስልጠና ለዘላለም ይወስዳል። ASPP በተለያዩ ጥራቶች፣ ትናንሽ ነገሮች፣ ትላልቅ ነገሮች፣ በመካከላቸው ያለውን ነገር ሁሉ ለማውጣት በርካታ የኮንቮሉሽን ማጣሪያዎችን በተለያዩ የማስፋት መጠኖች ይተገበራል።
featured image - ራስን ለመንዳት መኪናዎች በዝውውር ትምህርት እና ASPP የነገር ፈልጎን እንዴት ይበልጥ ብልጥ እንዳደረግሁ
Vineeth Reddy Vatti HackerNoon profile picture
0-item

በራሳቸው የሚነዱ መኪኖች ስህተቶችን መግዛት አይችሉም። የትራፊክ መብራት ወይም እግረኛ ማጣት አደጋ ሊያስከትል ይችላል። ነገር ግን በተለዋዋጭ የከተማ አካባቢዎች ውስጥ የነገር መለየት? ያ ከባድ ነው።


የአትሮስ ስፓሻል ፒራሚድ ገንዳ (ASPP) እና የዝውውር ትምህርትን በመጠቀም ራሳቸውን ችለው ለሚንቀሳቀሱ ተሽከርካሪዎች የነገር ፈልጎን በማመቻቸት ላይ ሠርቻለሁ። ውጤቱስ? በመጥፎ ብርሃን ውስጥ እንኳን ነገሮችን በበርካታ ሚዛኖች የሚያውቅ እና በእውነተኛ ጊዜ በብቃት የሚሰራ ሞዴል።


እንዴት እንዳደረግኩት እነሆ።


ችግሩ፡ በዱር ውስጥ የነገር ማወቂያ

እራስን የሚነዱ መኪኖች ነገሮችን ለመለየት በ Convolutional Neural Networks (CNNs) ይተማመናሉ፣ ነገር ግን የገሃዱ ዓለም ሁኔታዎች ፈተናዎችን ያስተዋውቃሉ፡-

  • የትራፊክ መብራቶች በተለያየ ሚዛን ይታያሉ - ትንሽ ሲርቅ፣ ሲጠጋ ትልቅ።
  • የሌይን ምልክቶች በተለያዩ ማዕዘኖች ይዛባሉ
  • መዘጋቶች ይከሰታሉ - ከቆመ መኪና ጀርባ ያለ እግረኛ ሊያመልጥ ይችላል።
  • የመብራት ሁኔታዎች ይለያያሉ - ጥላዎች፣ ነጸብራቅ ወይም የማታ መንዳት።


ባህላዊ ሲ ኤን ኤን ከብዙ-ልኬት ነገር ፈልጎ ማግኘት ጋር መታገል እና ከባዶ ስልጠና ለዘላለም ይወስዳል። ASPP እና የዝውውር ትምህርት የሚገቡት እዚያ ነው።


ASPP፡ ዕቃዎችን በተለያየ ሚዛን መያዝ

ሲ.ኤን.ኤን.ዎች ቋሚ መጠን ላላቸው ነገሮች ጥሩ ይሰራሉ ነገር ግን የገሃዱ ዓለም ነገሮች በመጠን እና በርቀት ይለያያሉ። አስትሮስ ስፓሻል ፒራሚድ ፑልንግ (ኤኤስፒፒ) ይህን የሚፈታው የተዘረጉ ውዝግቦችን በመጠቀም በበርካታ ሚዛኖች ያሉ ባህሪያትን ለመያዝ ነው።

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

ለምን እንደሚሰራ

  • የተለያዩ መቀበያ መስኮች ሞዴሉ ትናንሽ ነገሮችን (እንደ ሩቅ የትራፊክ መብራት) እና ትላልቅ እቃዎችን (እንደ አውቶቡስ) በአንድ ማለፊያ ውስጥ እንዲወስድ ያስችለዋል።
  • ከዓለም አቀፉ አማካይ የመዋኛ ቅርንጫፍ የመጣ ዓለም አቀፋዊ አውድ ዕቃዎችን ግልጽ ለማድረግ ይረዳል።
  • ቀላል ክብደት ያለው ትኩረት በተዘበራረቁ ትዕይንቶች ውስጥ የማወቅ ትክክለኛነትን በመጨመር በጣም መረጃ ሰጭ ሰርጦችን ያጎላል።

ውጤቶች፡-

  • በተለያዩ ሚዛኖች ላይ የተገኙ ነገሮች (ከእንግዲህ በኋላ ትናንሽ የትራፊክ መብራቶች አይጠፉም)።
  • የተሻሻለ አማካይ ትክክለኛነት (mAP) በ14 በመቶ
  • ከፊል የተደበቁ ነገሮችን በመለየት መዘጋቶችን በተሻለ ሁኔታ ይይዛሉ

ትምህርትን አስተላልፍ፡ በጀግኖች ትከሻ ላይ መቆም

አስቀድሞ የሰለጠኑ ሞዴሎች ሲኖሩ የነገሮችን ፈልጎ ማግኛ ሞዴል ከባዶ ማሰልጠን ብዙ ጥቅም አይሰጥም። ትምህርት ማስተላለፍ ቀደም ሲል ነገሮችን የሚረዳውን ሞዴል በጥሩ ሁኔታ እንድናስተካክል ያስችለናል።


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)

ውጤቶች፡-

  • የስልጠና ጊዜ በ 80% ቀንሷል.
  • በምሽት ጊዜ እና ጭጋጋማ ሁኔታዎች ውስጥ የተሻሻለ የእውነተኛ ዓለም አፈፃፀም።
  • ለሥልጠና ያነሰ ምልክት የተደረገበት መረጃ ያስፈልጋል።

ከተዋሃዱ ምስሎች ጋር ውሂብን ማሳደግ

ራሳቸውን ችለው የሚንቀሳቀሱ ተሽከርካሪዎች ግዙፍ የውሂብ ስብስቦች ያስፈልጋቸዋል፣ ነገር ግን በገሃዱ ዓለም የተሰየመ መረጃ በጣም አናሳ ነው። ማስተካከያው? 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)

ውጤቶች፡-

  • በእጅ ሳይሰየም የውሂብ ስብስብ መጠን በ5x ጨምሯል።
  • የሰለጠኑ ሞዴሎች ከዳር እስከ ዳር የበለጠ ጠንካራ ሆኑ።
  • በመረጃ ስብስቦች ውስጥ አድልዎ ቀንሷል (የበለጠ የተለያዩ የሥልጠና ናሙናዎች)።

የመጨረሻ ውጤቶች፡ ይበልጥ ብልህ፣ ፈጣን የነገር ፍለጋ

ASPPን፣ የዝውውር ትምህርትን እና ሰው ሰራሽ ውሂብን በማጣመር ለራስ ለሚነዱ መኪኖች ይበልጥ ትክክለኛ የሆነ ሊሰፋ የሚችል የነገር መፈለጊያ ስርዓት ገነባሁ። አንዳንድ ቁልፍ ውጤቶች የሚከተሉት ናቸው፡-

  • የነገር ማወቂያ ፍጥነት : 110 ms/ፍሬም
  • አነስተኛ-ነገር ማወቂያ (የትራፊክ መብራቶች) : + 14% mAP
  • የመዘጋት አያያዝ ፡ የበለጠ ጠንካራ ማወቂያ
  • የስልጠና ጊዜ : ወደ 6 ሰአታት ቀንሷል
  • የሚያስፈልግ የሥልጠና መረጃ ፡ 50% ሠራሽ (GANs)

ቀጣይ እርምጃዎች፡ የበለጠ የተሻለ ማድረግ

  • በጊዜ ሂደት የተገኙ ነገሮችን ለመከተል ቅጽበታዊ ክትትልን ማከል
  • ዜሮ-ሾት ለማግኘት የበለጠ የላቁ ትራንስፎርመሮችን (እንደ OWL-ViT) መጠቀም።
  • በተከተተ ሃርድዌር ላይ ለመሰማራት ተጨማሪ የማጣቀሻ ፍጥነትን ማመቻቸት።

ማጠቃለያ

ASPPን፣ Transformers እና Synthetic Dataን ወደ ሶስት እጥፍ ስጋት አዋህደናል ራስን ችሎ ነገርን ለማወቅ - አንድ ጊዜ ቀርፋፋ እና ዓይነ ስውር የሆኑ ሞዴሎችን ወደ ፈጣን እና አስተዋይ ስርዓቶች ከቦታ ቦታ የትራፊክ መብራትን ያያሉ። ለባለብዙ ደረጃ ዝርዝሮች የተዘረጉ ውዝግቦችን በመቀበል፣ ትምህርትን ለፈጣን ማስተካከያ እና በGAN የተገኘ መረጃን እያንዳንዱን ክፍተት ለመሙላት የግምገማ ጊዜዎችን በግማሽ ያህል ቆርጠን የሰዓታት ስልጠና እንቆጥባለን። እኛ በፍጥነት፣ በትክክል እና በጣም የተመሰቃቀለውን መንገዶቻችንን በልበ ሙሉነት ለማሰስ በሚያደርጉት መንገድ አለምን በበለጠ ወደሚመለከቱት መኪናዎች ትልቅ ዝላይ ነው።


ስለ አንዳንድ ቴክኒኮች ተጨማሪ ንባብ