譯者 | 朱先忠
審校 | 梁策 孫淑娟
項(xiàng)目簡(jiǎn)介
相似圖像檢索是任何圖像相關(guān)的搜索,即“基于內(nèi)容的圖像檢索系統(tǒng)”,簡(jiǎn)稱 “CBIR”系統(tǒng)。
上述圖像來自文章《基于內(nèi)容的圖像檢索:前沿文獻(xiàn)調(diào)查(2017年)》(https://arxiv.org/abs/1706.06064)
如今,圖片搜索的應(yīng)用日益廣泛,尤其在電子商務(wù)服務(wù)(如AliExpress、Wildberries等)領(lǐng)域?!瓣P(guān)鍵詞搜索”(包括圖像內(nèi)容理解)早已在谷歌、Yandex等搜索引擎中站穩(wěn)腳跟,但在市場(chǎng)和其他私人搜索引擎應(yīng)用還較為有限。計(jì)算機(jī)視覺領(lǐng)域中連接文本與圖像的對(duì)比語(yǔ)言圖像預(yù)訓(xùn)練CLIP(https://openai.com/blog/clip/)問世后便引發(fā)轟動(dòng),因而也將加速其全球化進(jìn)程。
我們的團(tuán)隊(duì)專門研究計(jì)算機(jī)視覺中的神經(jīng)網(wǎng)絡(luò),因此在本文中我將專注介紹通過圖像搜索的方法。
1、基本服務(wù)組件
第一步:訓(xùn)練模型。模型部分可以基于經(jīng)典計(jì)算機(jī)視覺或神經(jīng)網(wǎng)絡(luò)基礎(chǔ)來建立。模型輸入部分是一幅圖像,輸出部分則是一個(gè)D維描述符/嵌入層。在經(jīng)典的實(shí)現(xiàn)方案中,可以采用SIFT(Scale-invariant feature transform, 尺度不變特征變換)描述符和BoW (bag-of-visual-words,視覺詞袋)算法相組合的策略。但是在神經(jīng)網(wǎng)絡(luò)方案中,可以采用標(biāo)準(zhǔn)算法模型(如ResNet、EfficientNet等)結(jié)合復(fù)雜的池化層,再進(jìn)一步結(jié)合出色的學(xué)習(xí)技術(shù)。如果數(shù)據(jù)夠多或者經(jīng)過良好訓(xùn)練,選擇神經(jīng)網(wǎng)絡(luò)方案幾乎總會(huì)得到比較滿意的結(jié)果(有親測(cè)實(shí)例),所以本文中我們將重點(diǎn)關(guān)注這一方案。
第二步:索引圖像。這一步就是在所有圖像上運(yùn)行訓(xùn)練好的模型,并將嵌入內(nèi)容寫入一個(gè)特殊的索引,以便快速搜索。
第三步:搜索。使用用戶上傳的圖像,運(yùn)行模型,獲得嵌入層,并將嵌入層與數(shù)據(jù)庫(kù)中的其他嵌入層數(shù)據(jù)進(jìn)行比較。最后的搜索結(jié)果按相關(guān)性排序。
2、神經(jīng)網(wǎng)絡(luò)與度量學(xué)習(xí)
在尋找相似性的任務(wù)中,我們使用神經(jīng)網(wǎng)絡(luò)作為特征提取器(主干網(wǎng)絡(luò))。當(dāng)然,主干網(wǎng)絡(luò)的選擇取決于數(shù)據(jù)的容量和復(fù)雜性——你可以根據(jù)自己的開發(fā)需求選擇從ReNET18殘差網(wǎng)絡(luò)模型到Visual Transformer模型的所有可選方案。
圖像檢索模型的第一個(gè)特征當(dāng)屬神經(jīng)網(wǎng)絡(luò)輸出部分的實(shí)現(xiàn)技術(shù)。在圖像檢索排行榜(https://kobiso.github.io/Computer-Vision-Leaderboard/cars.html)上,不同的圖像檢索算法都是為了構(gòu)建出最理想的描述符——例如有使用并行池化層的組合全局描述符(Combined Global Descriptors)算法,還有為了在輸出功能上實(shí)現(xiàn)更均勻激活分布的批處理刪除塊算法。
第二個(gè)主要特征是損失函數(shù)。目前人工智能領(lǐng)域已經(jīng)有不少損失函數(shù),比如僅在《深度圖像檢索調(diào)查》(https://arxiv.org/abs/2101.11282)一文中就提到了十幾種推薦的損失函數(shù)算法。同時(shí),也存在數(shù)量相當(dāng)?shù)姆诸惡瘮?shù)。所有這些損失函數(shù)的主要目標(biāo)都是為了訓(xùn)練神經(jīng)網(wǎng)絡(luò)以便將圖像轉(zhuǎn)換為線性可分離的空間向量,從而進(jìn)一步通過余弦或歐幾里德距離比較這些向量:相似的圖像會(huì)擁有相近的嵌入層,不相似的圖像則會(huì)擁有極為不同的嵌入層。接下來,讓我們對(duì)這些內(nèi)容作進(jìn)一步介紹。
損失函數(shù)
1、對(duì)比損失函數(shù)(Contrastive Loss)
這種算法中存在一種雙重?fù)p失的情況,往往發(fā)生在比較彼此之間的距離的對(duì)象身上。
如果圖像p和q實(shí)際上是很相似的,那么神經(jīng)網(wǎng)絡(luò)會(huì)因圖像p和q的嵌入層之間的距離而受到懲罰。類似地,因應(yīng)用了嵌入層的接近性也會(huì)存在神經(jīng)網(wǎng)絡(luò)懲罰的情況,因?yàn)槭聦?shí)上嵌入層的圖像實(shí)際上彼此是不同的。在后面這種情況下,我們可以設(shè)置一個(gè)邊界值m(例如賦值為0.5),目的是為了克服我們想當(dāng)然地認(rèn)為神經(jīng)網(wǎng)絡(luò)已經(jīng)處理了“分離”不相似圖像任務(wù)的想法。
2、三元組損失函數(shù)(Triplet Loss)
在這里,我們的目標(biāo)是最小化錨點(diǎn)到正例的距離,而最大化錨點(diǎn)到負(fù)例的距離。三元組損失函數(shù)最早見于谷歌FaceNet模型關(guān)于人臉識(shí)別的文章中,長(zhǎng)期以來一直是最先進(jìn)的解決方案。
3、N元組損失函數(shù)(N-tupled)
N元組損失函數(shù)是基于三元組損失函數(shù)進(jìn)一步的研究成果,此函數(shù)也采用了錨點(diǎn)和正例概念,但使用的是多個(gè)而非單個(gè)負(fù)例技術(shù)。
4、加性角度間隔損失函數(shù)(Angular Additive Margin,也稱ArcFace)
配對(duì)損失函數(shù)的問題在于選擇正例、負(fù)例和錨點(diǎn)的組合方面——如果只是從數(shù)據(jù)集中均勻隨機(jī)選取它們,那么就會(huì)出現(xiàn)“輕配對(duì)”的問題。出現(xiàn)這種簡(jiǎn)單的圖像配對(duì)時(shí),損失為0。事實(shí)證明,此情況下網(wǎng)絡(luò)會(huì)很快收斂到一種狀態(tài),在這種狀態(tài)下,批次中的大多數(shù)元素都極易處理,其損失將變成零——此時(shí)神經(jīng)網(wǎng)絡(luò)將停止學(xué)習(xí)。為了避免這個(gè)問題,此算法的開發(fā)人員開始提出復(fù)雜的配對(duì)挖掘技術(shù)——硬負(fù)例挖掘和硬正例挖掘。有關(guān)問題可參見(https://gombru.github.io/2019/04/03/ranking_loss/),該文章比較了多種損失函數(shù)。此外PML庫(kù)(https://github.com/KevinMusgrave/pytorch-metric-learning)也實(shí)現(xiàn)了許多挖掘方法。值得注意的是,這個(gè)庫(kù)中包含了許多在PyTorch框架上度量學(xué)習(xí)任務(wù)的有用信息。
解決上述問題的另一種方案是使用分類損失函數(shù)。我們不妨回想三年前推出的面部識(shí)別算法ArcFace,它是當(dāng)時(shí)最先進(jìn)的,也導(dǎo)致了當(dāng)時(shí)眾所周知的“缺陷”特征的存在。
該算法的主要思想是在通常的交叉熵的基礎(chǔ)上增加一個(gè)縮進(jìn)m,該交叉熵將一類圖像的嵌入層分布在該類圖像的質(zhì)心區(qū)域,以便它們都與其他類的嵌入層簇至少相隔一個(gè)角度m。
這看起來似乎是一個(gè)完美的損失函數(shù)解決方案,尤其是當(dāng)針對(duì)MegaFace基準(zhǔn)(https://paperswithcode.com/sota/face-verification-on-megaface)規(guī)模開發(fā)人工智能系統(tǒng)時(shí)。但需要記住,只有在存在分類標(biāo)記的情況下,此算法才會(huì)起作用;否則,你將不得不面臨配對(duì)損失函數(shù)問題。
上圖中直觀地展示了使用單類標(biāo)記和多類標(biāo)記時(shí),哪些損失函數(shù)最適合(可通過計(jì)算多標(biāo)簽向量樣本之間的交集百分比,從多類標(biāo)記中導(dǎo)出配對(duì)標(biāo)記)。
池化
現(xiàn)在,讓我們回顧一下神經(jīng)網(wǎng)絡(luò)體系結(jié)構(gòu),不妨考慮在執(zhí)行圖像檢索任務(wù)中使用一對(duì)池化層的情形。
1、R-MAC池化
R-MAC(區(qū)域最大卷積激活)是一個(gè)池化層,它接受神經(jīng)網(wǎng)絡(luò)的輸出映射(在全局池化層或分類層之前),并返回一個(gè)描述符向量,此向量為輸出圖中各個(gè)窗戶中的激活量之和。在這里,窗戶的激活量取為每個(gè)通道單獨(dú)獲取該窗戶的最大值。
這個(gè)結(jié)果描述符的計(jì)算過程中考慮了圖像在不同尺度下的局部特征,從而創(chuàng)建了一個(gè)內(nèi)容豐富的特征描述。這個(gè)描述符本身可以是一個(gè)嵌入層,因此可以直接發(fā)送到損失函數(shù)。
2、GeM池化
GeM(廣義平均池化)是一種簡(jiǎn)單的池化算法,可以提高輸出描述符的質(zhì)量。底線是,經(jīng)典的平均池化可以推廣到lambda范數(shù)。通過增加lambda層,我們使神經(jīng)網(wǎng)絡(luò)關(guān)注圖像的重要部分,這在某些任務(wù)中可能很重要。
測(cè)距
1、索引
高質(zhì)量搜索相似圖像的關(guān)鍵是排名,即顯示給定查詢的最相關(guān)樣本。此過程的基本特征包括:建立描述符索引的速度、搜索的速度和占用的內(nèi)存。
最簡(jiǎn)單的方法是保持嵌入層“對(duì)著正面”并對(duì)其進(jìn)行強(qiáng)力搜索,例如使用余弦距離實(shí)現(xiàn)。但是,這種方法在有大量嵌入層時(shí)會(huì)出現(xiàn)問題——數(shù)量可能是數(shù)百萬、數(shù)千萬甚至更多。而且,搜索速度顯著降低,占用的堆空間也會(huì)進(jìn)一步增加。不過,還是存在積極的方面——使用現(xiàn)有的嵌入層即可實(shí)現(xiàn)完美的搜索質(zhì)量。
這幾個(gè)問題可以以犧牲質(zhì)量為代價(jià)來解決——以壓縮(量化)而不是以原始形式存儲(chǔ)嵌入層。而且還要改變搜索策略——不是使用暴力搜索,而是嘗試進(jìn)行最小比較次數(shù)以找到與給定查詢最接近的所需比較次數(shù)。目前已經(jīng)存在大量有效的搜索框架可以近似搜索最接近的內(nèi)容。為實(shí)現(xiàn)這一目的,一個(gè)特殊的基準(zhǔn)測(cè)試已經(jīng)創(chuàng)建——根據(jù)這個(gè)基準(zhǔn)你可以觀測(cè)到每一種庫(kù)在不同數(shù)據(jù)集上的表現(xiàn)。
其中,最受歡迎的庫(kù)有:NMSLIB(非度量空間庫(kù))、Spotify的Have庫(kù)、Facebook的Faiss庫(kù)以及Google的Scann庫(kù)等。此外,如果您想用REST API進(jìn)行索引的話,可以考慮使用Jina應(yīng)用程序(https://github.com/jina-ai/jina)。
2、重新排名
信息檢索領(lǐng)域的研究人員早就了解到,在收到原始搜索結(jié)果后,可以通過某種方式對(duì)項(xiàng)目重新排序來改進(jìn)有序的搜索結(jié)果。
一種著名的算法是拓展查詢(Query Expansion)。該算法的核心思想是使用最接近元素集合中的前top-K個(gè)元素生成新的嵌入層。在最簡(jiǎn)單的情況下,可以如上圖所示取平均向量。其實(shí),你還可以根據(jù)問題中的距離或與請(qǐng)求的余弦距離對(duì)嵌入層進(jìn)行加權(quán)操作。在《基于注意力的查詢擴(kuò)展學(xué)習(xí)》(https://arxiv.org/abs/2007.08019)一文中有詳細(xì)提到了一個(gè)框架,或者你也可以通過遞歸方式來使用拓展查詢算法。
3、k近鄰算法
上圖是一個(gè)人物最近物體識(shí)別的應(yīng)用程序截圖。其中,圖上部給出了查詢及其10個(gè)最近鄰數(shù)據(jù),其中P1-P4為正例,NI-N6為負(fù)例。圖底部中的每?jī)闪酗@示樣本人物的10個(gè)最近鄰居。藍(lán)色和綠色框分別對(duì)應(yīng)于樣本人物和正例。我們可以觀察到,樣本人物和正例相互之間有10個(gè)最近的鄰居。
k近鄰算法主要圍繞前top-k個(gè)元素展開,其中包括最接近請(qǐng)求本身的k個(gè)元素。
在這個(gè)集合的基礎(chǔ)上,建立了對(duì)結(jié)果重新排序的過程,其中有一個(gè)過程在文章《基于k近鄰算法的人物再識(shí)別信息重排序研究》 (https://arxiv.org/abs/1701.08398)中給出了描述。根據(jù)定義,k近鄰算法(k-reciprocal)比k最近鄰算法(k-nearest neighbors)更接近查詢結(jié)果。因此,人們可以粗略地認(rèn)為K近鄰算法集合中的元素是正例,并且可以進(jìn)一步改變加權(quán)規(guī)則用于類似于拓展查詢這樣的算法。
在該文中,一種機(jī)制已開發(fā)出來,它可以使用top-k中元素本身的k-近鄰集合來重新計(jì)算距離。該文包含大量計(jì)算信息,暫時(shí)不在本文的討論范圍內(nèi),建議有興趣的讀者可以找來自行閱讀。
相似圖像搜索算法效果分析
接下來,我們來分析一下本文提出的相似圖像搜索算法的質(zhì)量問題。值得注意的是,實(shí)現(xiàn)這項(xiàng)搜索任務(wù)過程中存在許多細(xì)節(jié),而初學(xué)者在第一次開發(fā)圖像檢索項(xiàng)目時(shí)很可能不會(huì)注意到這些問題。
1、度量
本文將探討在圖像檢索領(lǐng)域普遍使用的一些流行度量算法,比如precision@k、recall@k、R- precision、mAP和nDCG等。
【譯者補(bǔ)充】一般來說,下述有關(guān)算法中的precision代表檢索出來的條目有多少是準(zhǔn)確的,recall則代表所有準(zhǔn)確的條目有多少被檢索出來。
(1)precision@R算法
上述公式中,
參數(shù)RELk表示:top-k個(gè)結(jié)果中相關(guān)樣本的數(shù)目;
參數(shù)k表示:需要考慮的頂部位置的固定樣本數(shù)目。
優(yōu)點(diǎn):可以顯示top-k中相關(guān)樣本所占的百分比值。
缺點(diǎn):
- 對(duì)給定查詢的相關(guān)樣本數(shù)量非常敏感,這就導(dǎo)致無法對(duì)搜索質(zhì)量進(jìn)行客觀評(píng)估,因?yàn)椴煌樵兊南嚓P(guān)樣本數(shù)量不同。
- 只有當(dāng)所有查詢中的相關(guān)樣本數(shù)量大于或者等于k時(shí),才能達(dá)到值1。
(2)R-precision(精確率)算法
上述公式中,參數(shù)RELR表示:top-R個(gè)結(jié)果中相關(guān)樣本的數(shù)目;
參數(shù)R表示:給定查詢中所有相關(guān)樣本項(xiàng)的數(shù)目。
與算法precision@k相同,參數(shù)k也被設(shè)置為相關(guān)查詢樣本的數(shù)目。
優(yōu)點(diǎn):不像precision@k中數(shù)字k的那樣敏感,度量變得穩(wěn)定。
缺點(diǎn):必須事先知道與請(qǐng)求相關(guān)的樣本的總數(shù)目(如果不把所有相關(guān)的數(shù)字都先標(biāo)記出來,可能導(dǎo)致問題)。
(3)Recall@k(召回率)算法
上述公式中,參數(shù)RELk表示:top-k個(gè)結(jié)果中相關(guān)樣本的數(shù)目;
參數(shù)k表示:需要考慮的頂部位置中樣本的固定數(shù)目;
參數(shù)REL表示:給定查詢中所有相關(guān)樣本項(xiàng)的數(shù)目。
這個(gè)算法能夠顯示top-k中發(fā)現(xiàn)的相關(guān)樣本項(xiàng)的比例。
優(yōu)點(diǎn):
- 回答了在top-k中原則上是否相關(guān)的問題
- 穩(wěn)定且平均超過請(qǐng)求
(4)mAP (均值平均精確率)算法
本算法能夠顯示出搜索結(jié)果頂部相關(guān)樣本的密度。你可以將其視為搜索引擎用戶收到的信息量,此時(shí)搜索引擎讀取的頁(yè)面數(shù)最少。因此,信息量與讀取的頁(yè)數(shù)之比越大,度量就越高。
優(yōu)點(diǎn):
- 對(duì)搜索質(zhì)量進(jìn)行客觀穩(wěn)定的評(píng)估
- 精確召回曲線的一位數(shù)表示,其本身攜帶有豐富的分析信息
缺點(diǎn):
- 必須知道與請(qǐng)求相關(guān)的總樣本數(shù)量(如果不先把所有相關(guān)的樣本都標(biāo)記出來可能有問題)
【提示】可從https://nlp.stanford.edu/IR-book/html/htmledition/evaluation-of-ranked-retrieval-results-1.html一文了解到更多關(guān)于mAP算法輸出的信息。
(4)nDCG(歸一化累積增益)算法
上述公式中,
參數(shù)RELk表示:位置k之前的相關(guān)樣本項(xiàng)列表(按相關(guān)性排序);參數(shù)ri表示:
檢索結(jié)果中第i項(xiàng)的四舍五入真值相關(guān)性得分。
這個(gè)度量算法顯示了top-k中的元素在它們之間排序的正確程度。由于這是上面這些方法中唯一考慮元素順序的度量算法,我們就不詳述它的優(yōu)缺點(diǎn)了。不過,有研究表明,當(dāng)需要考慮順序時(shí),該度量算法相當(dāng)穩(wěn)定并且在大多數(shù)情況下適用。
2、算法整體估計(jì)
(1)宏觀方面:為每個(gè)請(qǐng)求計(jì)算一個(gè)度量,并且對(duì)所有請(qǐng)求計(jì)算平均值。
- 優(yōu)點(diǎn):與此查詢相關(guān)的不同數(shù)量的數(shù)據(jù)沒有顯著波動(dòng)。
- 缺點(diǎn):所有查詢都被認(rèn)為等同,盡管有些查詢比其他查詢相關(guān)性更強(qiáng)。
(2)微觀方面:在所有查詢中,標(biāo)記相關(guān)和單獨(dú)成功找到相關(guān)的數(shù)量進(jìn)行求和,然后都參與到相應(yīng)度量的計(jì)算中。
- 優(yōu)點(diǎn):對(duì)查詢進(jìn)行評(píng)估時(shí),會(huì)考慮與每個(gè)查詢相關(guān)的標(biāo)記數(shù)量。
- 缺點(diǎn):如果某個(gè)請(qǐng)求中有很多標(biāo)記的相關(guān)度量,并且系統(tǒng)沒有成功或者成功地將它們帶到頂部,那么度量的計(jì)算結(jié)果可能變得非常低或者非常高。
3、系統(tǒng)驗(yàn)證
建議讀者對(duì)本文算法采取以下兩種驗(yàn)證方案:
(1)基于一組查詢和選定的相關(guān)查詢進(jìn)行驗(yàn)證
輸入:圖像請(qǐng)求和與之相關(guān)的圖像,并且存在與此查詢相關(guān)的列表形式的標(biāo)記。為了計(jì)算度量,可以計(jì)算每個(gè)元素的相關(guān)性矩陣,并根據(jù)元素相關(guān)性的二進(jìn)制信息來進(jìn)行計(jì)算。
(2)全基驗(yàn)證
此算法的輸入部分包括:圖像請(qǐng)求以及與之相關(guān)的圖像,還應(yīng)有一個(gè)圖像驗(yàn)證數(shù)據(jù)庫(kù)——理想情況下,所有相關(guān)的查詢都會(huì)在其中進(jìn)行標(biāo)記。此外,該數(shù)據(jù)庫(kù)中不應(yīng)該包含查詢圖像;否則,將不得不在搜索階段清理該類圖像,以便它們不會(huì)阻塞于top-1層上。此外還提供了一組負(fù)例作為驗(yàn)證基——我們的任務(wù)是找出與之相關(guān)的東西。
為了計(jì)算度量,你可以遍歷所有請(qǐng)求,計(jì)算到所有元素(包括相關(guān)元素)的距離,然后將它們發(fā)送到度量計(jì)算函數(shù)。
已完成項(xiàng)目示例
在某家公司應(yīng)不應(yīng)該使用另一家品牌圖案元素的問題上,公司間經(jīng)常出現(xiàn)糾紛。在這種情況下,實(shí)力較弱的制造商試圖寄生于一家成功的大品牌,用類似符號(hào)展示自家產(chǎn)品和服務(wù)。但是,消費(fèi)者也會(huì)因此受到影響——你可能想從你信任的制造商那里購(gòu)買奶酪,但卻沒有仔細(xì)閱讀標(biāo)簽,于是錯(cuò)誤地從假冒的制造商那里購(gòu)買了偽劣產(chǎn)品。最近有個(gè)案例是蘋果公司試圖阻止Prepear公司的標(biāo)志商標(biāo)使用(https://www.pcmag.com/news/apple-is-attempting-to-block-a-pear-logo-trademark)。
于是,有一些專業(yè)政府組織或私人公司來打擊非法移植。他們持有注冊(cè)商標(biāo)的登記簿,通過該登記簿可以對(duì)即將引入的商標(biāo)進(jìn)行比對(duì),最終決定批準(zhǔn)還是拒絕商標(biāo)注冊(cè)申請(qǐng)。以上是使用WIPO(https://www3.wipo.int/branddb/en/)系統(tǒng)接口的一個(gè)典型示例,在這樣的系統(tǒng)中,搜索相似的圖像功能將為其提供極大便利,幫助有關(guān)專家更快地搜索到類似圖像。
1、系統(tǒng)應(yīng)用舉例
在我們開發(fā)的系統(tǒng)中,經(jīng)索引的圖像數(shù)據(jù)庫(kù)中擁有數(shù)百萬個(gè)商標(biāo)。下面給出的第一張圖片是一個(gè)查詢結(jié)果展示,下一行(第二張圖片)給出一個(gè)預(yù)期的相關(guān)圖片列表,后面其余幾行中的圖片則是搜索引擎按照相關(guān)性降低的順序給出的搜索結(jié)果。
譯者介紹
朱先忠,51CTO社區(qū)編輯,51CTO專家博客、講師,濰坊一所高校計(jì)算機(jī)教師,自由編程界老兵一枚。早期專注各種微軟技術(shù)(編著成ASP.NET AJX、Cocos 2d-X相關(guān)三本技術(shù)圖書),近十多年投身于開源世界(熟悉流行全棧Web開發(fā)技術(shù)),了解基于OneNet/AliOS+Arduino/ESP32/樹莓派等物聯(lián)網(wǎng)開發(fā)技術(shù)與 Scala+Hadoop+Spark+Flink等大數(shù)據(jù)開發(fā)技術(shù)。
原文標(biāo)題:??How to Build an Image Search Engine to Find Similar Images??,作者:EORA?