paint-brush
Би хэрхэн бие даан жолооддог машинд объект илрүүлэхийг илүү ухаалаг болгосон бэ?by@vineethvatti
Шинэ түүх

Би хэрхэн бие даан жолооддог машинд объект илрүүлэхийг илүү ухаалаг болгосон бэ?

by Vineeth Reddy Vatti11m2025/03/07
Read on Terminal Reader

Хэтэрхий урт; Унших

Atrous Spatial Pyramid Pooling (ASPP) болон Transfer Learning нь динамик хотын орчинд объект илрүүлэхийг оновчтой болгоход ашиглагддаг. Уламжлалт CNN-үүд олон хэмжээний объект илрүүлэхтэй тэмцэж, эхнээс нь сургах нь үүрд үргэлжлэх болно. ASPP нь янз бүрийн нягтрал, жижиг объект, том биет гэх мэт бүх зүйлд онцлог шинж чанаруудыг гаргаж авахын тулд өөр өөр тэлэлтийн хурдтай олон эргэлтийн шүүлтүүрийг ашигладаг.
featured image - Би хэрхэн бие даан жолооддог машинд объект илрүүлэхийг илүү ухаалаг болгосон бэ?
Vineeth Reddy Vatti HackerNoon profile picture
0-item

Өөрөө жолоодлоготой машинууд алдаа гаргаж чадахгүй. Гэрлэн дохио эсвэл явган зорчигчийг алгасах нь сүйрэлд хүргэж болзошгүй юм. Гэхдээ динамик хотын орчинд объект илрүүлэх үү? Энэ хэцүү.


Би Atrous Spatial Pyramid Pooling (ASPP) болон Transfer Learning ашиглан бие даасан тээврийн хэрэгслийн объект илрүүлэхийг оновчтой болгох талаар ажилласан. Үр дүн? Муу гэрэлтүүлэгтэй байсан ч олон хэмжүүрээр объектыг илрүүлж, бодит цаг хугацаанд үр дүнтэй ажилладаг загвар.


Би үүнийг хэрхэн хийснийг энд харуулав.


Асуудал: Зэрлэг байгальд объект илрүүлэх

Өөрийгөө жолооддог машинууд объектуудыг илрүүлэхийн тулд Convolutional Neural Networks (CNN) дээр тулгуурладаг боловч бодит нөхцөл байдал нь дараах сорилтуудыг үүсгэдэг.

  • Гэрлэн дохио нь өөр өөр масштабаар харагдана - хол үед жижиг, ойрхон үед том.
  • Эгнээний тэмдэглэгээ нь янз бүрийн өнцгөөс гаждаг .
  • Бөглөрөх тохиолдол гардаг - зогсоол дээр зогсож байсан машины ард явган зорчигч алга болж магадгүй.
  • Гэрэлтүүлгийн нөхцөл өөр өөр байдаг - сүүдэр, хурц гэрэл, эсвэл шөнийн жолоодлого.


Уламжлалт CNN нь олон төрлийн объект илрүүлэхтэй тэмцэж, эхнээс нь сургах нь үүрд үргэлжлэх болно. Эндээс ASPP болон Transfer Learning орж ирдэг.


ASPP: Өөр өөр масштабтай объектуудыг барих

CNN нь тогтмол хэмжээтэй объектуудад сайн ажилладаг боловч бодит ертөнцийн объектууд хэмжээ, зайгаараа ялгаатай байдаг. Atrous Spatial Pyramid Pooling (ASPP) нь олон хэмжүүрээр онцлогуудыг авахын тулд өргөссөн эргэлтийг ашиглан үүнийг шийддэг.

ASPP хэрхэн ажилладаг

ASPP нь янз бүрийн нягтрал, жижиг объект, том объект болон тэдгээрийн хоорондох бүх зүйлд онцлог шинж чанарыг задлахын тулд өөр өөр тэлэлтийн хурдтай олон эргэлтийн шүүлтүүрийг ашигладаг.


Би ASPP-ийг PyTorch-д бүлгийн хэвийн байдал, нарийн төвөгтэй орчинд бат бөх гүйцэтгэлд анхаарлаа хандуулахыг агуулсан хэрхэн хэрэгжүүлсэн бэ:

 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%-иар сайжирсан.
  • Битүүмжлэлийг илүү сайн зохицуулж , хэсэгчлэн нуугдсан объектуудыг илрүүлдэг.

Шилжүүлэх сургалт: Аварга хүмүүсийн мөрөн дээр зогсох

Урьдчилан бэлтгэгдсэн загварууд байгаа үед объект илрүүлэх загварыг эхнээс нь сургах нь тийм ч их ашиг тусаа өгөхгүй. Дамжуулах сургалт нь объектыг аль хэдийн ойлгосон загварыг нарийн тохируулах боломжийг олгодог.


Би Facebook AI-ийн трансформаторт суурилсан объект илрүүлэх загвар болох DETR (Detection Transformer)-ийг ашигласан. Энэ нь нөхцөл байдлын талаар суралцдаг—тиймээс энэ нь зогсох тэмдгийг олохоос гадна энэ нь замын үзэгдэл гэдгийг ойлгодог.


Би өөрөө жолоодлоготой өгөгдлийн багц дээр 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)

Үр дүн:

  • Гарын авлагын шошгогүйгээр өгөгдлийн багцын хэмжээг 5 дахин нэмэгдүүлсэн.
  • Сургалтанд хамрагдсан загварууд нь зах зээлд илүү бат бөх болсон.
  • Өгөгдлийн багц дахь хазайлтыг бууруулсан (илүү олон төрлийн сургалтын дээж).

Эцсийн үр дүн: Илүү ухаалаг, илүү хурдан объект илрүүлэх

ASPP, Transfer Learning болон Synthetic Data-г хослуулснаар би өөрөө жолооддог машинд илүү нарийвчлалтай, масштабтай объект илрүүлэх системийг бүтээсэн. Гол үр дүнгийн зарим нь:

  • Объект илрүүлэх хурд : 110 мс/фрэйм
  • Жижиг объект илрүүлэх (Гэрлэн дохио) : +14% mAP
  • Битүүмжлэлийг зохицуулах : Илүү бат бөх илрүүлэлт
  • Сургалтын хугацаа : 6 цаг хүртэл бууруулсан
  • Шаардлагатай сургалтын өгөгдөл : 50% синтетик (GANs)

Дараагийн алхамууд: Үүнийг илүү сайн болгох

  • Цаг хугацааны явцад илрүүлсэн объектыг дагахын тулд бодит цагийн хяналтыг нэмж байна .
  • Тэг цохилт илрүүлэхийн тулд илүү дэвшилтэт трансформаторуудыг (OWL-ViT гэх мэт) ашиглах.
  • Суулгасан техник хангамж дээр байрлуулахын тулд дүгнэлт гаргах хурдыг илүү оновчтой болгох.

Дүгнэлт

Бид ASPP, Transformers болон Synthetic Data-г бие даасан объект илрүүлэх гурвалсан аюул болгон нэгтгэж, нэг удаа удаашралтай, хар толботой загваруудыг нэг блокийн цаанаас гэрлэн дохио тусдаг хурдан, мэдрэгчтэй систем болгон хувиргасан. Өргөтгөсөн эргэлтийг олон хэмжээст нарийвчлалтайгаар, хурдан нарийн тааруулахын тулд сургалтыг шилжүүлж, цоорхой бүрийг нөхөх GAN-ээр үүсгэсэн өгөгдлийг ашигласнаар бид дүгнэлт хийх хугацааг бараг хоёр дахин багасгаж, сургалтын цагийг хэмнэсэн. Энэ бол дэлхийг бидэн шиг хурдан, илүү нарийвчлалтай хардаг машинууд руу чиглэсэн том үсрэлт бөгөөд бидний хамгийн эмх замбараагүй гудамжаар итгэлтэйгээр явж байна.


Зарим аргын талаар цааш нь унших


L O A D I N G
. . . comments & more!

About Author

Vineeth Reddy Vatti HackerNoon profile picture
Vineeth Reddy Vatti@vineethvatti
Machine Learning Engineer building Self driving vehicles

TAG ҮҮ

ЭНЭ ӨГҮҮЛЛИЙГ ТОЛГОЙЛУУЛСАН...