Өөрөө жолоодлоготой машинууд алдаа гаргаж чадахгүй. Гэрлэн дохио эсвэл явган зорчигчийг алгасах нь сүйрэлд хүргэж болзошгүй юм. Гэхдээ динамик хотын орчинд объект илрүүлэх үү? Энэ хэцүү.
Би Atrous Spatial Pyramid Pooling (ASPP) болон Transfer Learning ашиглан бие даасан тээврийн хэрэгслийн объект илрүүлэхийг оновчтой болгох талаар ажилласан. Үр дүн? Муу гэрэлтүүлэгтэй байсан ч олон хэмжүүрээр объектыг илрүүлж, бодит цаг хугацаанд үр дүнтэй ажилладаг загвар.
Би үүнийг хэрхэн хийснийг энд харуулав.
Өөрийгөө жолооддог машинууд объектуудыг илрүүлэхийн тулд Convolutional Neural Networks (CNN) дээр тулгуурладаг боловч бодит нөхцөл байдал нь дараах сорилтуудыг үүсгэдэг.
Уламжлалт CNN нь олон төрлийн объект илрүүлэхтэй тэмцэж, эхнээс нь сургах нь үүрд үргэлжлэх болно. Эндээс ASPP болон Transfer Learning орж ирдэг.
CNN нь тогтмол хэмжээтэй объектуудад сайн ажилладаг боловч бодит ертөнцийн объектууд хэмжээ, зайгаараа ялгаатай байдаг. Atrous Spatial Pyramid Pooling (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
Урьдчилан бэлтгэгдсэн загварууд байгаа үед объект илрүүлэх загварыг эхнээс нь сургах нь тийм ч их ашиг тусаа өгөхгүй. Дамжуулах сургалт нь объектыг аль хэдийн ойлгосон загварыг нарийн тохируулах боломжийг олгодог.
Би 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)
Автономит тээврийн хэрэгсэлд асар их өгөгдлийн багц шаардлагатай боловч бодит хаяглагдсан өгөгдөл ховор байдаг. Засвар? 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, Transfer Learning болон Synthetic Data-г хослуулснаар би өөрөө жолооддог машинд илүү нарийвчлалтай, масштабтай объект илрүүлэх системийг бүтээсэн. Гол үр дүнгийн зарим нь:
Бид ASPP, Transformers болон Synthetic Data-г бие даасан объект илрүүлэх гурвалсан аюул болгон нэгтгэж, нэг удаа удаашралтай, хар толботой загваруудыг нэг блокийн цаанаас гэрлэн дохио тусдаг хурдан, мэдрэгчтэй систем болгон хувиргасан. Өргөтгөсөн эргэлтийг олон хэмжээст нарийвчлалтайгаар, хурдан нарийн тааруулахын тулд сургалтыг шилжүүлж, цоорхой бүрийг нөхөх GAN-ээр үүсгэсэн өгөгдлийг ашигласнаар бид дүгнэлт хийх хугацааг бараг хоёр дахин багасгаж, сургалтын цагийг хэмнэсэн. Энэ бол дэлхийг бидэн шиг хурдан, илүү нарийвчлалтай хардаг машинууд руу чиглэсэн том үсрэлт бөгөөд бидний хамгийн эмх замбараагүй гудамжаар итгэлтэйгээр явж байна.