Өздігінен жүретін көліктер қателіктер жібере алмайды. Бағдаршамды немесе жаяу жүргіншіні жоғалту апатты білдіруі мүмкін. Бірақ динамикалық қалалық ортада нысанды анықтау? Бұл қиын.
Мен Atrous Spatial Pyramid Pooling (ASPP) және Transfer Learning көмегімен автономды көліктер үшін нысанды анықтауды оңтайландыру бойынша жұмыс жасадым. Нәтиже? Нысандарды бірнеше масштабта, тіпті нашар жарықта да анықтайтын және нақты уақытта тиімді жұмыс істейтін модель.
Міне, мен мұны қалай жасадым.
Өзін-өзі басқаратын көліктер объектілерді анықтау үшін конволюционды нейрондық желілерге (CNN) сүйенеді, бірақ нақты дүние жағдайлары қиындықтар туғызады:
Дәстүрлі CNN көп масштабты объектілерді анықтаумен күреседі және нөлден бастап оқыту мәңгілікке созылады. Міне, ASPP және Transfer Learning .
CNN тұрақты өлшемді нысандар үшін жақсы жұмыс істейді, бірақ нақты әлемдегі нысандар өлшемі мен қашықтығы бойынша әр түрлі болады. Atrous Spatial Pyramid Pooling (ASPP) мұны бірнеше масштабтағы мүмкіндіктерді түсіру үшін кеңейтілген конвульсияларды пайдалану арқылы шешеді.
ASPP әртүрлі ажыратымдылықтағы мүмкіндіктерді, кішігірім нысандарды, үлкен нысандарды және олардың арасындағы барлық нәрсені алу үшін әртүрлі кеңейту жылдамдығымен бірнеше конвульсия сүзгілерін қолданады.
Күрделі орталарда сенімді өнімділік үшін топтық қалыпқа келтіруді және назар аударуды қамтитын PyTorch жүйесінде 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
Нөлден бастап нысанды анықтау үлгісін үйрету алдын ала дайындалған үлгілер болған кезде көп пайда бермейді. Трансферттік оқыту нысандарды түсінетін үлгіні дәл реттеуге мүмкіндік береді.
Мен Facebook AI жүйесінен трансформаторға негізделген нысанды анықтау үлгісін DETR (Анықтау трансформаторы) қолдандым. Ол контекстті үйренеді, сондықтан ол жай ғана тоқтау белгісін тауып қоймайды, ол жол көрінісінің бір бөлігі екенін түсінеді.
Міне, мен 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)
Автономды көліктер үлкен деректер жиынтығын қажет етеді, бірақ нақты әлемде белгіленген деректер аз. Түзету? GAN (General 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, Трансформаторлар және синтетикалық деректерді автономды объектілерді анықтауға арналған үш қауіпке біріктірдік - бір рет баяу, соқыр нүктелерге бейім модельдерді бір блоктан бағдаршамды анықтайтын жылдам, қабылдаушы жүйелерге айналдырдық. Көп масштабты бөлшектер үшін кеңейтілген конвульсияларды, жылдам дәл келтіру үшін оқытуды тасымалдауды және әрбір олқылықты толтыру үшін GAN арқылы жасалған деректерді қолдану арқылы біз қорытынды жасау уақытын екі есеге қысқарттық және жаттығу сағаттарын үнемдедік. Бұл әлемді біз сияқты жылдамырақ, дәлірек айтқанда және біздің ең хаотикалық көшелерімізбен сенімді түрде шарлау жолында көретін көліктерге үлкен секіріс.