paint-brush
Transfer Learning және ASPP көмегімен өздігінен жүретін көліктер үшін нысанды анықтауды қалай ақылды еттімбойынша@vineethvatti
Жаңа тарих

Transfer Learning және ASPP көмегімен өздігінен жүретін көліктер үшін нысанды анықтауды қалай ақылды еттім

бойынша Vineeth Reddy Vatti11m2025/03/07
Read on Terminal Reader

Тым ұзақ; Оқу

Atrous Spatial Pyramid Pooling (ASPP) және Transfer Learning динамикалық қалалық орталарда нысанды анықтауды оңтайландыру үшін қолданылады. Дәстүрлі CNN көп масштабты объектілерді анықтаумен күреседі және нөлден бастап оқыту мәңгілікке созылады. ASPP әртүрлі ажыратымдылықтағы мүмкіндіктерді, кішігірім нысандарды, үлкен нысандарды, олардың арасындағы барлық нәрсені алу үшін әртүрлі кеңейту жылдамдығымен бірнеше конвульсия сүзгілерін қолданады.
featured image - Transfer Learning және ASPP көмегімен өздігінен жүретін көліктер үшін нысанды анықтауды қалай ақылды еттім
Vineeth Reddy Vatti HackerNoon profile picture
0-item

Өздігінен жүретін көліктер қателіктер жібере алмайды. Бағдаршамды немесе жаяу жүргіншіні жоғалту апатты білдіруі мүмкін. Бірақ динамикалық қалалық ортада нысанды анықтау? Бұл қиын.


Мен Atrous Spatial Pyramid Pooling (ASPP) және Transfer Learning көмегімен автономды көліктер үшін нысанды анықтауды оңтайландыру бойынша жұмыс жасадым. Нәтиже? Нысандарды бірнеше масштабта, тіпті нашар жарықта да анықтайтын және нақты уақытта тиімді жұмыс істейтін модель.


Міне, мен мұны қалай жасадым.


Мәселе: жабайы табиғатта нысанды анықтау

Өзін-өзі басқаратын көліктер объектілерді анықтау үшін конволюционды нейрондық желілерге (CNN) сүйенеді, бірақ нақты дүние жағдайлары қиындықтар туғызады:

  • Бағдаршамдар әртүрлі масштабта пайда болады - алыс кезінде кішкентай, жақын кезде үлкен.
  • Жол белгілері әртүрлі бұрыштарда бұрмаланады .
  • Тоқтаулар орын алады - тұрақтағы көліктің артындағы жаяу жүргінші жіберіп алуы мүмкін.
  • Жарықтандыру жағдайлары әртүрлі - көлеңкелер, жарқырау немесе түнгі көлік жүргізу.


Дәстүрлі CNN көп масштабты объектілерді анықтаумен күреседі және нөлден бастап оқыту мәңгілікке созылады. Міне, ASPP және Transfer Learning .


ASPP: әртүрлі масштабтағы нысандарды түсіру

CNN тұрақты өлшемді нысандар үшін жақсы жұмыс істейді, бірақ нақты әлемдегі нысандар өлшемі мен қашықтығы бойынша әр түрлі болады. Atrous Spatial Pyramid Pooling (ASPP) мұны бірнеше масштабтағы мүмкіндіктерді түсіру үшін кеңейтілген конвульсияларды пайдалану арқылы шешеді.

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

Неліктен жұмыс істейді

  • Әртүрлі қабылдағыш өрістер модельге шағын нысандарды (алыстағы бағдаршам сияқты) және үлкен нысандарды (автобус сияқты) бір өтуде алуға мүмкіндік береді.
  • Жаһандық орташа біріктіру тармағындағы жаһандық контекст нысандарды ажыратуға көмектеседі.
  • Жеңіл көңіл бөлу ең ақпарат беретін арналарға баса назар аударады, бұл ретсіз көріністердегі анықтау дәлдігін арттырады.

Нәтижелер:

  • Әр түрлі масштабта анықталған объектілер (кішкентай бағдаршамдар жоғалмайды).
  • Орташа дәлдік (mAP) 14%-ға жақсарды.
  • Ішінара жасырылған нысандарды анықтай отырып, окклюзияларды жақсы өңдейді .

Трансферттік оқыту: Алыптардың иығында тұру

Нөлден бастап нысанды анықтау үлгісін үйрету алдын ала дайындалған үлгілер болған кезде көп пайда бермейді. Трансферттік оқыту нысандарды түсінетін үлгіні дәл реттеуге мүмкіндік береді.


Мен 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)

Нәтижелер:

  • Жаттығу уақыты 80%-ға қысқарды.
  • Түнгі және тұманды жағдайларда нақты жұмыс өнімділігі жақсарды.
  • Жаттығу үшін таңбаланған деректер азырақ қажет.

Деректерді синтетикалық кескіндер арқылы арттыру

Автономды көліктер үлкен деректер жиынтығын қажет етеді, бірақ нақты әлемде белгіленген деректер аз. Түзету? 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)

Нәтижелер:

  • Қолмен таңбалаусыз деректер жиынының өлшемі 5 есе ұлғайтылды.
  • Үйретілген модельдер шеткі істерге берік болды.
  • Деректер жиынындағы қиғаштықты азайту (әртүрлі оқыту үлгілері).

Қорытынды нәтижелер: Ақылдырақ, объектіні жылдамырақ анықтау

ASPP, Transfer Learning және Synthetic Data біріктіру арқылы мен өздігінен жүретін көліктер үшін дәлірек, масштабталатын нысанды анықтау жүйесін жасадым. Негізгі нәтижелердің кейбірі:

  • Объектіні анықтау жылдамдығы : 110 мс/кадр
  • Шағын нысандарды анықтау (бағдаршамдар) : +14% mAP
  • Окклюзияны өңдеу : неғұрлым сенімді анықтау
  • Жаттығу уақыты : 6 сағатқа дейін қысқартылды
  • Қажетті оқу деректері : 50% синтетикалық (GANs)

Келесі қадамдар: Оны одан да жақсырақ ету

  • Уақыт өте келе анықталған нысандарды қадағалау үшін нақты уақыттағы бақылауды қосу .
  • Нөлдік атуды анықтау үшін жетілдірілген трансформаторларды (мысалы, OWL-ViT) пайдалану.
  • Ендірілген аппараттық құралда орналастыру үшін шығару жылдамдығын одан әрі оңтайландыру.

Қорытынды

Біз ASPP, Трансформаторлар және синтетикалық деректерді автономды объектілерді анықтауға арналған үш қауіпке біріктірдік - бір рет баяу, соқыр нүктелерге бейім модельдерді бір блоктан бағдаршамды анықтайтын жылдам, қабылдаушы жүйелерге айналдырдық. Көп масштабты бөлшектер үшін кеңейтілген конвульсияларды, жылдам дәл келтіру үшін оқытуды тасымалдауды және әрбір олқылықты толтыру үшін 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

ТЕГТЕРДІ АЛУ

БҰЛ МАҚАЛА БАСҚАРҒАН...