Kaggle第一人 | 詳細解讀2021Google地標識別第一名解決方案(建議全文背誦)


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

基于ResNet50的DOLG模型的Pytorch實現(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òu)建模塊是Multi-Atrous卷積層和Self-Attention模塊。前者是模擬特征金字塔,可以處理不同圖像實例之間的比例變化,后者是利用注意力機制進行建模。這個分支的詳細網(wǎng)絡(luò)配置如圖2所示。
Multi-Atrous卷積模塊包含3個空洞卷積,以獲取具有不同空間感受野的特征映射和一個全局平均池化分支。 將Multi-Atrous卷積輸出特征cat起來,然后經(jīng)過1x1卷積層處理。 將輸出的特征傳遞給Self-Att模塊建模每個局部特征點的重要性。 首先使用CNN(1x1)-BN模塊對其輸入進行處理 然后通過1x1卷積層生成的注意力映射 再通過SoftPlus操作以及L2-Norm對后續(xù)特征進行歸一化

Local Branch的配置?!癉s, c, k”表示空洞率為s,輸出通道數(shù)為c,kernel-size為k的空洞卷積?!癱, c, k”表示輸入通道為c,輸出通道為c,kernel-size為1的普通卷積?!癛”、“B”和“S”分別代表ReLU、BN和Softplus。
Local Branch的Pytorch實現(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

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

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


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

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

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

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

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

4參考
[1].Efficient large-scale image retrieval with deep feature orthogonality and Hybrid-Swin-Transformers
5推薦閱讀
蘋果公司提出Mobile-ViT | 更小、更輕、精度更高,MobileNets或成為歷史?。?!
長按掃描下方二維碼添加小助手。
可以一起討論遇到的問題
聲明:轉(zhuǎn)載請說明出處
掃描下方二維碼關(guān)注【集智書童】公眾號,獲取更多實踐項目源碼和論文解讀,非常期待你我的相遇,讓我們以夢為馬,砥礪前行!

