Прапусціць святлафор або пешахода можа азначаць катастрофу. Але выяўленне аб'ектаў у дынамічным гарадскім асяроддзі? Гэта Самастойныя аўтамабілі не могуць дазволіць сабе памылак. цяжка. Я працаваў над аптымізацыяй выяўлення аб'ектаў для аўтаномных транспартных сродкаў з дапамогай Вынік? Atrous Spatial Pyramid Pooling (ASPP) і Transfer Learning. Мадэль, якая выяўляе аб'екты ў розных маштабах, нават пры дрэнным асвятленні, і эфектыўна працуе ў рэжыме рэальнага часу. Вось як я гэта зрабіў. Праблема: выяўленне аб'ектаў у дзікай прыродзе Для выяўлення аб'ектаў беспілотныя аўтамабілі выкарыстоўваюць , але ў рэальных умовах узнікаюць згорткавыя нейронавыя сеткі (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%. Палепшаная рэальная прадукцыйнасць у начны час і ў тумане. Для навучання патрабуецца менш маркіраваных даных. Павышэнне даных з дапамогай сінтэтычных малюнкаў Аўтаномным транспартным сродкам патрэбны вялізныя наборы даных, але пазначаных дадзеных у рэальным свеце мала. Выпраўленне? Стварайце сінтэтычныя даныя з дапамогай GAN (генератыўных канкурэнтных сетак). Я выкарыстаў 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, навучанне перадачы і сінтэтычныя даныя : 110 мс/кадр Хуткасць выяўлення аб'ектаў : +14% mAP Выяўленне дробных аб'ектаў (святлафоры) : больш надзейнае выяўленне Апрацоўка аклюзіі : скарочаны да 6 гадзін Час навучання : 50% сінтэтыка (GAN) Неабходныя даныя для навучання Наступныя крокі: зрабіць гэта яшчэ лепш для адсочвання выяўленых аб'ектаў з цягам часу. Даданне адсочвання ў рэжыме рэальнага часу Выкарыстанне больш дасканалых трансфарматараў (напрыклад, OWL-ViT) для выяўлення нулявога стрэлу. Далейшая аптымізацыя хуткасці вываду для разгортвання на ўбудаваным абсталяванні. Заключэнне Мы аб'ядналі ASPP, Transformers і Synthetic Data у патройную пагрозу для аўтаномнага выяўлення аб'ектаў - ператварыўшы некалі млявыя мадэлі, схільныя да сляпых зон, у хуткія, праніклівыя сістэмы, якія заўважаюць святлафор з квартала. Прымяняючы пашыраныя згорткі для шматмаштабнай дэталізацыі, пераноснае навучанне для хуткай тонкай налады і дадзеныя, згенераваныя GAN, каб запоўніць кожны прабел, мы скарацілі час вываду амаль удвая і зэканомілі гадзіны навучання. Гэта вялікі крок у напрамку аўтамабіляў, якія бачаць свет больш, як мы, толькі хутчэй, больш дакладна і ўпэўнена перамяшчаюцца па самых хаатычных вуліцах. Дадатковая інфармацыя аб некаторых метадах DETR: скразное выяўленне аб'ектаў Atrous Convolutions для семантычнай сегментацыі GAN для сінтэтычных даных