Kaggle第一人!詳細(xì)解讀2021 Google地標(biāo)識(shí)別第一名解決方案

本文提出了一個(gè)有效的端到端大規(guī)模地標(biāo)識(shí)別和檢索的網(wǎng)絡(luò)架構(gòu)。作者展示了如何結(jié)合和改進(jìn)最近在圖像檢索研究中的概念,并介紹了一種基于EfficientNet和新型Hybrid-Swin-Transformer的局部和全局特征深度正交融合(DOLG)模型,然后詳細(xì)介紹了如何使用 ?Step-wise 方法和Sub-Center Arcface with dynamic margin Loss有效地訓(xùn)練這2種架構(gòu)。此外,作者闡述了一種新的圖像識(shí)別重排序方法檢索。
1簡(jiǎn)介
谷歌Landmark Dataset v2 (GLDv2)已經(jīng)成為一個(gè)流行的數(shù)據(jù)集,用于評(píng)估用于解決大規(guī)模實(shí)例級(jí)識(shí)別任務(wù)的架構(gòu)和方法的性能。原始數(shù)據(jù)集由超過(guò)500萬(wàn)張圖片和超過(guò)20萬(wàn)個(gè)類(lèi)組成。數(shù)據(jù)集還提出了一些有趣的挑戰(zhàn),如類(lèi)的長(zhǎng)尾分布、類(lèi)內(nèi)變動(dòng)性和噪聲標(biāo)簽。
2019年的獲獎(jiǎng)方案帶來(lái)了GLDv2的清潔版本,這是一個(gè)子集,包含150萬(wàn)張圖像,包含81313個(gè)類(lèi),將在下面用GLDv2c表示。此外,GLDv2x將用于表示GLDv2的子集,該子集被限制為GLDv2c中存在但未被清除的81313個(gè)類(lèi)。
對(duì)于識(shí)別,是關(guān)于對(duì)一組測(cè)試圖像中的地標(biāo)進(jìn)行正確分類(lèi),其中有大量的非地標(biāo)被用作噪聲數(shù)據(jù)。采用全局平均精度(GAP)作為度量指標(biāo)進(jìn)行評(píng)價(jià)。
對(duì)于檢索,任務(wù)是在數(shù)據(jù)庫(kù)中找到與給定查詢(xún)圖像相關(guān)的類(lèi)似圖像,并使用mean Average Precision@100 (mAP)進(jìn)行評(píng)估。
2本文方法
2.1 DOLG模型
DOLG是一種用于端到端圖像檢索的信息融合框架(正交Local and Global, DOLG)。該算法首先利用多尺度卷積和自注意力方法集中提取具有代表性的局部信息。然后從局部信息中提取與全局圖像表示正交的分量。最后,將正交分量與全局表示法進(jìn)行互補(bǔ)連接,然后進(jìn)行聚合生成最終的表征。

基于ResNet50的DOLG模型的Pytorch實(shí)現(xiàn)如下:
class?DolgNet(LightningModule):
????def?__init__(self,?input_dim,?hidden_dim,?output_dim,?num_of_classes):
????????super().__init__()
????????self.cnn?=?timm.create_model(
????????????'resnet101',
????????????pretrained=True,
????????????features_only=True,
????????????in_chans=input_dim,
????????????out_indices=(2,?3)
????????)
????????self.orthogonal_fusion?=?OrthogonalFusion()
????????self.local_branch?=?DolgLocalBranch(512,?hidden_dim)
????????self.gap?=?nn.AdaptiveAvgPool2d(1)
????????self.gem_pool?=?GeM()
????????self.fc_1?=?nn.Linear(1024,?hidden_dim)
????????self.fc_2?=?nn.Linear(int(2*hidden_dim),?output_dim)
????????self.criterion?=?ArcFace(
????????????in_features=output_dim,
????????????out_features=num_of_classes,
????????????scale_factor=30,
????????????margin=0.15,
????????????criterion=nn.CrossEntropyLoss()
????????)
????def?forward(self,?x):
????????output?=?self.cnn(x)
????????local_feat?=?self.local_branch(output[0])??#?,hidden_channel,16,16
????????global_feat?=?self.fc_1(self.gem_pool(output[1]).squeeze())??#?,1024
????????feat?=?self.orthogonal_fusion(local_feat,?global_feat)
????????feat?=?self.gap(feat).squeeze()
????????feat?=?self.fc_2(feat)
????????return?feat
1、Local Branch
Local Branch的2個(gè)主要構(gòu)建模塊是Multi-Atrous卷積層和Self-Attention模塊。前者是模擬特征金字塔,可以處理不同圖像實(shí)例之間的比例變化,后者是利用注意力機(jī)制進(jìn)行建模。這個(gè)分支的詳細(xì)網(wǎng)絡(luò)配置如圖2所示。
Multi-Atrous卷積模塊包含3個(gè)空洞卷積,以獲取具有不同空間感受野的特征映射和一個(gè)全局平均池化分支。 將Multi-Atrous卷積輸出特征cat起來(lái),然后經(jīng)過(guò)1x1卷積層處理。 將輸出的特征傳遞給Self-Att模塊建模每個(gè)局部特征點(diǎn)的重要性。 首先使用CNN(1x1)-BN模塊對(duì)其輸入進(jìn)行處理 然后通過(guò)1x1卷積層生成的注意力映射 再通過(guò)SoftPlus操作以及L2-Norm對(duì)后續(xù)特征進(jìn)行歸一化

Local Branch的配置。“Ds, c, k”表示空洞率為s,輸出通道數(shù)為c,kernel-size為k的空洞卷積。“c, c, k”表示輸入通道為c,輸出通道為c,kernel-size為1的普通卷積。“R”、“B”和“S”分別代表ReLU、BN和Softplus。
Local Branch的Pytorch實(shí)現(xiàn)
class?MultiAtrous(nn.Module):
????def?__init__(self,?in_channel,?out_channel,?size,?dilation_rates=[3,?6,?9]):
????????super().__init__()
????????self.dilated_convs?=?[
????????????nn.Conv2d(in_channel,?int(out_channel/4),
??????????????????????kernel_size=3,?dilation=rate,?padding=rate)
????????????for?rate?in?dilation_rates
????????]
????????self.gap_branch?=?nn.Sequential(
????????????nn.AdaptiveAvgPool2d(1),
????????????nn.Conv2d(in_channel,?int(out_channel/4),?kernel_size=1),
????????????nn.ReLU(),
????????????nn.Upsample(size=(size,?size),?mode='bilinear')
????????)
????????self.dilated_convs.append(self.gap_branch)
????????self.dilated_convs?=?nn.ModuleList(self.dilated_convs)
????def?forward(self,?x):
????????local_feat?=?[]
????????for?dilated_conv?in?self.dilated_convs:
????????????local_feat.append(dilated_conv(x))
????????local_feat?=?torch.cat(local_feat,?dim=1)
????????return?local_feat
class?DolgLocalBranch(nn.Module):
????def?__init__(self,?in_channel,?out_channel,?hidden_channel=2048):
????????super().__init__()
????????self.multi_atrous?=?MultiAtrous(in_channel,?hidden_channel,?size=int(Config.image_size/8))
????????self.conv1x1_1?=?nn.Conv2d(hidden_channel,?out_channel,?kernel_size=1)
????????self.conv1x1_2?=?nn.Conv2d(out_channel,?out_channel,?kernel_size=1,?bias=False)
????????self.conv1x1_3?=?nn.Conv2d(out_channel,?out_channel,?kernel_size=1)
????????self.relu?=?nn.ReLU()
????????self.bn?=?nn.BatchNorm2d(out_channel)
????????self.softplus?=?nn.Softplus()
????def?forward(self,?x):
????????local_feat?=?self.multi_atrous(x)
????????local_feat?=?self.conv1x1_1(local_feat)
????????local_feat?=?self.relu(local_feat)
????????local_feat?=?self.conv1x1_2(local_feat)
????????local_feat?=?self.bn(local_feat)
????????attention_map?=?self.relu(local_feat)
????????attention_map?=?self.conv1x1_3(attention_map)
????????attention_map?=?self.softplus(attention_map)
????????local_feat?=?F.normalize(local_feat,?p=2,?dim=1)
????????local_feat?=?local_feat?*?attention_map
????????return?local_feat
2、Orthogonal Fusion Module

以和為輸入,計(jì)算每個(gè)局部特征點(diǎn)在全局特征上的投影。在數(shù)學(xué)上,投影可以表示為:

其中,是點(diǎn)積運(yùn)算,是的L2范數(shù):


如圖3所示,正交分量是局部特征與其投影向量的差值,因此可以通過(guò)以下方法得到正交于的分量:

這樣,可以提取出一個(gè)C×H×W張量,其中每個(gè)點(diǎn)都與正交。然后,在這個(gè)張量的每個(gè)點(diǎn)上加上C×1向量,然后這個(gè)新的張量被聚合成的向量。最后,使用一個(gè)FC層來(lái)生成512×1的特征向量。
這里,利用池化操作來(lái)聚合cat的張量,也就是說(shuō),圖4a中的“A”是當(dāng)前實(shí)現(xiàn)中的池化操作。實(shí)際上,它可以被設(shè)計(jì)成其他可學(xué)習(xí)的模塊來(lái)聚合張量。
Orthogonal Fusion Module的Pytorch實(shí)現(xiàn)
class?OrthogonalFusion(nn.Module):
????def?__init__(self):
????????super().__init__()
????def?forward(self,?local_feat,?global_feat):
????????global_feat_norm?=?torch.norm(global_feat,?p=2,?dim=1)
????????projection?=?torch.bmm(global_feat.unsqueeze(1),?torch.flatten(
????????????local_feat,?start_dim=2))
????????projection?=?torch.bmm(global_feat.unsqueeze(
????????????2),?projection).view(local_feat.size())
????????projection?=?projection?/?\
????????????(global_feat_norm?*?global_feat_norm).view(-1,?1,?1,?1)
????????orthogonal_comp?=?local_feat?-?projection
????????global_feat?=?global_feat.unsqueeze(-1).unsqueeze(-1)
????????return?torch.cat([global_feat.expand(orthogonal_comp.size()),?orthogonal_comp],?dim=1)
2.2 架構(gòu)之一:純CNN架構(gòu)
對(duì)于這2個(gè)任務(wù)方向,作者開(kāi)發(fā)了基于深度學(xué)習(xí)的網(wǎng)絡(luò)架構(gòu)來(lái)學(xué)習(xí)圖像描述符,一個(gè)是學(xué)習(xí)高維特征向量以區(qū)分更多的類(lèi),同時(shí)允許類(lèi)內(nèi)的可變性。盡管在之前的工作中,全局和局部地標(biāo)描述符都是分別訓(xùn)練的,并且預(yù)測(cè)也是以?xún)呻A段的方式組合進(jìn)行的。但也有學(xué)者嘗試在單一階段模型中融合全局和局部描述符。
當(dāng)給定推理?xiàng)l件受限時(shí),作者將重點(diǎn)放在單個(gè)圖像描述符的單階段模型上。然而,建模工作將局部特性作為重點(diǎn),因?yàn)樗鼈儗?duì)地標(biāo)識(shí)別特別重要。
在下文中,提出了2種特別適用于具有噪聲數(shù)據(jù)和高類(lèi)內(nèi)變化率的大規(guī)模圖像識(shí)別/檢索的體系結(jié)構(gòu)。從概念上講,兩者都使用了基于EfficientNet的卷積神經(jīng)網(wǎng)絡(luò)(CNN)和Sub-Center Arcface with dynamic margin(優(yōu)于經(jīng)典ArcFace)。
在進(jìn)行訓(xùn)練時(shí):
1、作者將所有圖像調(diào)整為正方形大小,并應(yīng)用shift、scale、rotate和cutout。
2、使用Adam優(yōu)化+權(quán)值衰減+學(xué)習(xí)率(每個(gè)模型學(xué)習(xí)率不同)
3、遵循在一個(gè)warm-up epoch內(nèi)使用余弦退火學(xué)習(xí)率機(jī)制。

作者基于EfficientNet B5實(shí)現(xiàn)了前部分討論的DOLG模型,但是也做了一些改進(jìn)來(lái)提高性能。
使用在ImageNet上預(yù)訓(xùn)練的EfficientNet編碼器;
在第3個(gè)EfficientNet塊之后添加了局部分支,并使用3個(gè)不同的空洞卷積提取1024維局部特征(其中每個(gè)模型的空洞率不同),Cat輸出的3個(gè)空洞卷積局部特征,并利用Spatial Attention進(jìn)行處理得到最終的1024維的局部特征;
然后,將局部特征與全局特征進(jìn)行正交融合(全局特征是由第4個(gè)EfficientNet塊輸出并GeM池化得到的1024維特征);
使用平均池化操作聚合融合后的特征,然后被輸入一個(gè)由FC-BN-PReLU組成的Neck輸出一個(gè)512維的單一描述符。
為了訓(xùn)練,這個(gè)單一的描述符被輸入到一個(gè)Sub-Center(k=3)的ArcFace Head,具有預(yù)測(cè)81313類(lèi)的Dynamic Margin。
DOLG-EfficientNet模型是按照3個(gè)步驟訓(xùn)練的:
首先,在GLDv2c上使用小圖像對(duì)模型進(jìn)行10個(gè)epoch的訓(xùn)練;
然后,使用中等大小的圖像在噪聲更大的GLDv2x上繼續(xù)訓(xùn)練30-40個(gè)Epoch;
最后,使用GLDv2x對(duì)大尺寸圖像對(duì)模型進(jìn)行微調(diào)。
2.3 架構(gòu)之二:Hybrid-Swin-Transformer with Sub-Center Arcface
第2種架構(gòu)利用了最近在使用Transformer解決計(jì)算機(jī)視覺(jué)問(wèn)題方面的進(jìn)展。在CNN上附加了一個(gè)Vision Transformer形成了Hybrid-CNN-Transformer模型。
這里,CNN部分可以解釋為一個(gè)局部特征提取器,而Transformer部分可以看作一個(gè)圖神經(jīng)網(wǎng)絡(luò)將局部特征聚合到一個(gè)單一的向量。
具體步驟:
1、使用EfficientNet提取特征; 2、將第一步輸出的特征進(jìn)行Flatten操作,以適應(yīng)Transformer的輸入; 3、生成一個(gè)與Flatten Feature相同shape的Position Embedding與Flatten Feature進(jìn)行add操作; 4、將Virtual Token與add后的特征進(jìn)行Cat操作; 5、將cat后的特征作為輸入送入Swin-Transformer Block; 6、取出Virtual Token對(duì)應(yīng)位置的描述符送入Neck(Conv-BN-PReLU); 7、將512維的描述符送入Sub-Center ArcFace With Dynamic Head(81313類(lèi))進(jìn)行分類(lèi)和loss回傳。

當(dāng)將在ImageNet上預(yù)訓(xùn)練的EfficientNet模型和Swin-Transformer Block組合在一起時(shí),一個(gè)詳細(xì)的訓(xùn)練方法是很重要的,以避免溢出和nan,特別是在使用混合精度時(shí)。
作者使用以下4步方法:
第1步:初始化Transformer-Neck-Head部分,使用GLDv2c的小圖像進(jìn)行10個(gè)Epoch的訓(xùn)練;
第2步:將Transformer原有的Patch Embedding換成2個(gè)EfficientNet Block,凍結(jié)之前的Transformer-Neck-Head部分,并在中等大小的圖像上對(duì)新添加的CNN部分進(jìn)行一個(gè)Epoch的訓(xùn)練;
第3步:使用GLDv2x對(duì)整個(gè)模型進(jìn)行30-40個(gè)Epoch的訓(xùn)練;
第4步:在CNN和Swin-Transformer之間進(jìn)一步插入一個(gè)預(yù)訓(xùn)練的EfficientNet Block,并使用大圖像和GLDv2x對(duì)整個(gè)模型進(jìn)行微調(diào)。
2.4 Ensemble
獲獎(jiǎng)的模型是8個(gè)模型的集合,包括3個(gè)DOLG和3個(gè)Hybrid-Swin-Transformer模型,它們具有不同的EfficientNet主干和輸入圖像大小。此外,作者還按照谷歌2020地標(biāo)性識(shí)別比賽第3名團(tuán)隊(duì)提供的代碼和說(shuō)明對(duì)2個(gè)EfficientNet模型進(jìn)行了訓(xùn)練。
表1給出了主干、圖像大小、使用的數(shù)據(jù)和結(jié)果得分的概述。對(duì)于一些模型,作者沒(méi)有在最后的訓(xùn)練步驟中增加圖像的大小,而是將第1卷積層的stride從(2,2)減小到(1,1),這對(duì)于較小的原始圖像尤其有利。

2.5 推理預(yù)測(cè)
對(duì)于這2個(gè)任務(wù),作者使用了一種預(yù)測(cè)的檢索方法,其中對(duì)于每個(gè)查詢(xún)圖像,使用L2歸一化圖像描述符之間的余弦相似度,然后在索引圖像數(shù)據(jù)庫(kù)中搜索最相似的圖像。
在識(shí)別任務(wù)中,將訓(xùn)練集作為索引圖像數(shù)據(jù)庫(kù),并使用最相似列車(chē)圖像的地標(biāo)標(biāo)簽作為對(duì)給定測(cè)試圖像的預(yù)測(cè)。相比之下,為了檢索最相似的圖像,預(yù)定義了一個(gè)索引圖像數(shù)據(jù)庫(kù)。為了增加更多的類(lèi)內(nèi)多樣性,作者使用完整的GLDv2和來(lái)自WIT的地標(biāo)圖像擴(kuò)展了訓(xùn)練集。
在檢索任務(wù)中,作者進(jìn)一步擴(kuò)展了2019年檢索競(jìng)賽的索引集。
2.6 檢索的后處理
為了在給定的查詢(xún)圖像中檢索出最相似的索引圖像,作者使用每個(gè)模型的512維描述符的余弦相似度對(duì)所有索引圖像進(jìn)行排序,從而得到查詢(xún)索引對(duì)分?jǐn)?shù)。
在第一步標(biāo)簽查詢(xún)和索引圖像使用余弦相似度給定的訓(xùn)練集。然而,與Hard Rerank不同的是,作者使用了一種 soft up-rank 過(guò)程,即如果查詢(xún)和索引圖像的標(biāo)簽匹配,則將top3索引序列余弦相似度添加到查詢(xún)索引得分中。
當(dāng)額外執(zhí)行一個(gè) soft down-ranking 的過(guò)程。如果查詢(xún)圖像和索引圖像的標(biāo)簽不匹配,通過(guò)減去0.1倍的前3個(gè)索引序列余弦相似度來(lái)實(shí)現(xiàn)向下排序。對(duì)于集成中的每個(gè)模型,使用上述方法提取每個(gè)查詢(xún)圖像的top750索引圖像id和相關(guān)分?jǐn)?shù),并將top100作為最終預(yù)測(cè)之前,對(duì)每個(gè)圖像id進(jìn)行求和,從而得到6000個(gè)分?jǐn)?shù)。
2.7 識(shí)別的后處理
使用集成為每個(gè)訓(xùn)練和測(cè)試圖像提取8個(gè)512維向量。然后對(duì)每個(gè)模型類(lèi)型(DOLG-EfficientNet、Hybrid-Swin-Transformer、pure EfficientNet)的向量進(jìn)行平均,得到3個(gè)512維的向量,然后將它們Cat起來(lái)形成一個(gè)1536維的圖像描述符。利用余弦相似度為每幅測(cè)試圖像找到最接近的訓(xùn)練圖像,并進(jìn)行后處理重新排序和非地標(biāo)識(shí)別,從而得到最終的預(yù)測(cè)結(jié)果。
3可視化檢索結(jié)果

4參考
[1].Efficient large-scale image retrieval with deep feature orthogonality and Hybrid-Swin-Transformers
