機器視覺 十億規模的深度描述子如何有效索引

2021-08-19 12:47:58 字數 3650 閱讀 1252

作者簡介:袁勇,目前就職於美團。中度**潔癖/willard-yuan,喜歡mac, chrome。目前主要興趣集中在資料探勘、機器學習方向,關注和學習一些基於內容的影象檢索(碩士期間研究方向)、計算機視覺、資料探勘、python科學計算、linux、django開發等方面的知識。個人部落格:
人臉識別和人臉檢索應用**:seetafacelib,目前**還在不斷迭代中,已經完成的部分是人臉檢索。整個小應用的介面是下面這個樣子:

在qt專案剛上傳到github上傳不久後,遠在銳捷的羅兄說這個qt工程對他幫助很大,這個反饋讓小白菜深感欣慰。所謂開源,有人用或對人有幫助,這個**寫得就有它的價值了。

回到本篇部落格的主題,即我們如何為大規模的描述子建立高效的索引,使得在進行查詢的時候,檢索系統能夠快速地對我們的查詢做出響應。對這個問題的**,小白菜在之前的文章影象檢索:基於內容的影象檢索技術以及雜湊的文章中做過一些**與總結,而人臉檢索作為影象檢索大範疇的一類具體應用,除了在特徵表達上有其自身的特點外,其他過程基本一樣。所以在人臉檢索中,我們也會碰到影象檢索中的3座大山,即:

前兩座大山具有相互關聯性,涉及到的主題是特徵表達的問題,而後乙個表象涉及到的是資訊檢索領域的索引問題。任何有關影象檢索方面的問題,幾乎都是圍繞著這兩個核心問題而展開的。對於在這兩個方面而展開的工作,暫且不表。我們還是回到人臉檢索這個具體的應用中,來談談深度描述子的索引問題。

剛開始在建立這個人臉檢索qt工程的時候,小白菜並沒有做很多複雜的考慮,比如要考慮人臉影象規模,當時建立這個qt工程之初的動機非常簡單,就是opencv對於檢索結果的展示實在是太不方便了,而且小白菜也不需要很大規模的影象體量,另外最重要的一點是,小白菜急切地想看到檢索視覺化的結果,所以直接用brute-force search的方式應該還ok。但是在做完後,小白菜發現在搜尋階段,搜尋不夠實時,在小白菜的本機上,3000張的人臉,在查詢的時候,會出現卡頓的情況,具體表現可以見下圖:

在上面計算完查詢特徵到相簿各個特徵的余弦距離後,會再對計算的距離進行全域性排序:

std::sort(dists_idxs.begin(), dists_idxs.end());

std::reverse(dists_idxs.begin(), dists_idxs.end());

for (size_t i = 0

; i != dists_idxs.size() ; i++)

為了進一步確認,還可以對執行的時間進行測試確認。從上面的過程可以看到,這種brute-search的方式實在是太耗時了,那麼有沒有方式能夠緩解這種相應不夠實時的問題呢。答案是有的,我們可以通過以下手段對這種brute-force search低效的方式做一些緩解:

kd樹和pq量化方式用圖示意表述如下:

對於kd樹和pq量化方法的優缺點,可以參閱小白菜的博文影象檢索:基於內容的影象檢索技術。

更多關於雜湊方法的介紹和總結,可以參閱小白菜以前對雜湊方法寫的一些博文。另外,關於ann的benchmark,可以閱讀開源**ann-benchmarks,小白菜覺得這個非常棒,果斷star吖。

因而,針對上面的人臉檢索,為了構建乙個比較高效的索引,小白菜選用了雜湊方法。當然,除了雜湊方法,還可以選用pq方法,不推薦使用kd樹方法。說一下選用雜湊方法的理由:看到了篇文章practical and optimal lsh for angular distance,2023年nips的文章,對應的開源庫是falconn,cross-polytope lsh把lsh優化到了極致(個人讀完**的結論),此外,自己對雜湊方面很熟悉,用起來應該比較順手。其實剛開始的時候,並沒有打算用lsh的,是打算用efficient indexing of billion-scale datasets of deep descriptors的,正如你所看到的,連博文的標題都是為其而準備的,這篇**小白菜詳細的讀過,雖然現在用的是lsh,但後面還可以繼續把對應的**讀一遍。在當前這個人間檢索小應用中,lsh的呼叫**如下:

if(namesfeats.first.empty())

// cross polytope hashing

params_cp.dimension = dim;

params_cp.lsh_family = lshfamily::crosspolytope;

params_cp.distance_function = distance_function;

params_cp.storage_hash_table = storage_hash_table;

params_cp.k = 2; // 每個雜湊表的雜湊函式數目

params_cp.l = num_tables; // 雜湊表數目

params_cp.last_cp_dimension = 2;

params_cp.num_rotations = 2;

params_cp.num_setup_threads = num_setup_threads;

params_cp.seed = seed ^ 833840234;

}cptable = unique_ptrfloat>>>(std::move(construct_tablefloat>>(data, params_cp)));

cptable->set_num_probes(896);

qdebug() << "index build finished ...";

cptable->find_k_nearest_neighbors(q, 20, &idxcandidate);

上面**還有很大的速度方面的優化空間,anyway,我們先暫時拋開**的優化,來看一下改用lsh索引後的效果,下面是改用lsh後查詢響應的效果:

從展示的效果來看,對於查詢相應的速度,有了較大的改善,但是我們還是可以看到在查詢的時候,有一段空白的白板,這個問題小白菜的猜測是它應該不是由於索引慢而導致的,對於這個短時的空白白板的優化,小白菜把它放到下期進行,同時,也會對efficient indexing of billion-scale datasets of deep descriptors這篇文章做乙個理解總結。

學習筆記 深度學習和機器視覺

一直自稱研究方向是 機器視覺 機器學習和深度學習 然而除了做過幾個相關的專案以外,感覺自己對這個領域並沒有足夠深入的認識和理解。趁著這個假期我要好好補補課了。今天先來看一些high level的內容,看看深度學習近期的最近進展以及其在機器視覺問題中的應用。學習資料 於2015年cvpr的deep l...

機器視覺 基於立體視覺的變形測量

機器視覺 攝影測量 計算機視覺 立體視覺 變形測量 變形測量是機械 材料以及土木工程結構健康監測等研究工作中重要的內容,結構在負荷情況下力學行為的研究和 是在對結構變形精確測量的基礎上實現的。特別是近年來,結構動態效能已經成為土木工程領域的重要研究內容之一。結構動態效能的表現包括位移 速度 加速度,...

機器視覺及視覺感測器的應用

近幾十年來,機器視覺因其非接觸 速度快 精度高 現場抗干擾能力強等突出優點,使機器視覺技術在農業 工業 醫學等領域得到了廣泛應用。只要是需要對物體進行識別 特徵判斷和檢測,機器視覺就可以大展拳腳,將任務完成得又快又好。比如在農業生產中,有一部分工作是對農作物或農產品的外觀進行判斷,如水果品質檢測 果...