視覺詞袋
視覺詞袋(bag of visual words)借用了文本檢索的一個技巧。為了比較文件,搜尋引擎可以忽略字詞順序,僅把每份文件表示成各詞彙出現頻率的直方圖(詞袋);兩份談論同一主題的文件共享許多詞,因此有相似的直方圖。視覺詞袋把同樣的構想套用到影像:把影像視為局部特徵的集合,並透過計算它含有多少個各種「視覺詞」來表示它,同時丟棄它們出現在影像中的位置。這把一個長度可變的局部描述子集合,化成一個易於比較、分類與索引的單一固定長度向量,這就是為什麼它在深度學習之前主宰了影像檢索與辨識。
問題在於影像沒有預先定義的詞彙;SIFT 描述子是連續高維空間中的點,而非離散的詞。所以詞彙要透過量化來學習。從一大批訓練影像中萃取局部描述子(通常是 SIFT),再用 k-means 把它們分群成比方說數千個群。每個群中心成為一個視覺詞,而整組中心就是視覺詞彙或碼書(codebook)。群的數目就是詞彙大小,這是一個關鍵參數:詞太少,相異的結構會被混為一談;詞太多,比對會變得嘈雜而稀疏。
要編碼一張新影像,先萃取它的局部描述子,再把每個描述子指派到它最近的視覺詞(其最近的群中心)。影像便由視覺詞計數的直方圖來表示:一個向量,其第 i 個項是落入詞 i 的描述子數目。如同文本檢索,原始計數通常以 TF-IDF 重新加權,這會提升那些在本影像中頻繁、但在資料庫中罕見(因而具鑑別力)的視覺詞,並降低那些到處都出現之詞的權重。對於大規模檢索,倒排索引(inverted index)把每個視覺詞映射到含有它的影像清單,於是一次查詢只觸及相關的影像而非整個資料庫,使在數百萬張影像上搜尋成為可能。
視覺詞袋驅動了地標辨識、近似重複偵測,以及 SLAM 中的迴路閉合(DBoW 函式庫是經典範例)。它內建的弱點,正是讓文本詞袋奏效的那一點:它丟棄了空間佈局,所以一張被打亂的影像與其原圖有相同的表示。延伸方法恢復了一些幾何:空間金字塔(spatial pyramid)把影像分割成區域並串接各區域的直方圖,而更豐富的編碼如 VLAD 與 Fisher 向量則儲存描述子相對於群中心的偏離,而非僅僅計數。深度卷積與 transformer 嵌入(以及 CLIP 式模型)在分類與檢索上大致取代了視覺詞袋,但它「詞彙加直方圖」的構想,仍存續於匯集層的設計以及高效檢索系統之中。
刻意捨棄空間資訊是雙面刃:它賦予對視角、變形與裁切的穩健性(一種有用的不變性),但也使該表示對佈局視而不見,所以兩個由相同零件構成、卻截然不同的場景會看起來一模一樣。當「有哪些零件存在」比「它們如何排列」更重要時,就選擇視覺詞袋。