视觉检索:视频多帧排序
背景與問題
每一個視頻抽取n幀,n是變化的,有的視頻長抽的幀數多,有的視頻短抽的幀數相應的也少一些。在索引的時候,將所有視頻的幀都索引在一起。對于查詢的視頻,同樣抽取視頻幀,假設抽取到了m幀,那么問題來了,對這m幀的查詢結果,其排序邏輯該如何設計?
多幀相似性度量
對于文章開頭提出的問題,可以先對其進行簡化,先思考這樣一個問題:兩個視頻,如何度量兩個視頻的相似性(引申問題:如果校驗兩個圖片或兩個視頻是重復的)?
如果兩個視頻,其提取的特征是視頻維度的全局特征,即每個視頻最終表示成了一個全局向量表示(比如iDT、C3D等特征),那么度量兩個視頻間的相似性時,可以直接計算它們之間的余弦相似性或者歐式距離等。這樣固然最省事,但在實際應用中,當視頻存量上億,并且還有源源不斷的視頻添加進來時,顯然基于視頻維度提特征的方式因為耗費資源太大而無法得以在具備實時性要求的場景中加以應用。因而實際中在對視頻內容做相關理解與分析的時候,往往是基于抽幀的方式(如何抽幀以及是否做關鍵幀檢測在此不表)。在獲取到視頻的幀后,可以在此基礎上提取視頻維度的特征,或者提取幀級別的特征。
小白菜簡單地總結視頻維度特征與幀級別特征(類似全局特征和局部特征)的優劣:
- 視頻維度特征:考慮了時空維度信息,有利于表述整個視頻發生的事件等全局信息,表達的特征更緊湊;
- 幀級別特征:最大的缺陷在于未考慮視頻時間維的信息,將幀與幀之間孤立起來了。當然幀級別的特征,其對視頻空間信息的特征描述的力度更細一些,在某些場景中,比如校驗兩個視頻是否是重復視頻,基于幀級別的特征反而更適用;
一般而言,抽取視頻維度的特征通常是非常耗時的。因而,實際面向視頻的應用,除非場景應用非常有價值且規模不大可能會使用視頻維度的特征,大部分的視頻內容理解往往是基于幀級別的特征。現在回到本節開頭的問題:兩個視頻,如何度量兩個視頻的相似性?這個問題小白菜曾在機器視覺:Asymmetry Problem in Computer Vision中介紹累積最小(最大)距離非對稱問題時有涉及過,可以看出,累積最小(最大)距離極其符合該應用場景。因而,對于兩個視頻,要度量兩個視頻的相似性,可以采用累積最小(最大)距離,即:
?
S(X,Y)=∑i=1i=n∑j=1j=mdmin(xi,yj)S(X,Y)=∑i=1i=n∑j=1j=mdmin(xi,yj)
累積最小(最大)距離在應用的時候,可能會出現A視頻中的多個幀匹配到B視頻中的一幀或交叉匹配的情況(視頻序列是時序的)。對于這種情況,在算幀匹配的時候,可以使用動態規劃(DP)方法避免出現多幀和一幀匹配或交叉匹配,并確保得到的S(X,Y)S(X,Y)又是最小的。當然,直接計算累積最小(最大)距離也依然是很好的。實際應用中,這種基于累積最小(最大)距離的多幀相似度度量經受住了應用的考驗,而且計算效率比采用DP避免交叉匹配方式更高,并且效果很理想。
有了兩個視頻間多幀相似性的度量,將其拓展到一個query視頻跟N個視頻的相似性排序,就相比比較直觀了。下面分別對暴力搜索多幀排序和OPQ多幀排序予以介紹,OPQ多幀排序是暴力搜索多幀排序的繼承,只不過在對每幀查詢的時候,使用的是OPQ索引,而暴力搜索則是直接query。
暴力搜索多幀排序
在不需要實時處理、對召回要求很高并且不是很頻繁查詢的場景,比如回溯任務中,暴力搜索仍然是一種值得推薦的搜索方法。原因有二:
- 一是特征性能發揮到最大,從而保證最好的召回率;
- 二是在特征維度不是很高的情況下(幾百維,如果是CNN特征且維度較高,比如上千維,可以降到128d或者512d,損失精度通常很小),通過SSE加速,距離的計算也可以算得很快。
對于多幀排序,其排序邏輯建立在兩個視頻多幀相似性度量上,即對于一個query視頻,庫中的每個視頻在與query視頻做相似性度量的時候,均應采用上一節指出的累積最小(最大)距離分別計算相似度。在實際計算的時候,這種逐個視頻計算的方式可以優化為query視頻與N個視頻進行內積運算(特征在提取的時候進行了L2L2歸一化)的方式,然后對相似性矩陣做排序處理,假設query視頻幀數是mm幀,庫中共NN個視頻,每一個視頻取nn幀,則相似性矩陣大小為m×(N?n)m×(N?n),即每一行對應query視頻某一幀查詢后排序的結果,如下圖所示:
上圖中,qF1表示查詢視頻的第1幀,AF1表示視頻A的第1幀,后面以此類推。對該排完序后的相似性矩陣,我們需要對每i(i=0,…,m)i(i=0,…,m)行取出視頻id對應的最大的值(因為計算的是余弦相似度)作為該幀對應各視頻id的結果,這個過程可以用下圖來直觀的表述出來:
如上圖所示,以qF1幀查詢為例,由于已經對該幀查詢的結果按相似性進行的排序,因而qF1幀查詢對A視頻查詢的結果為AF1,其余以此類推。最后對這m幀經過最大值篩選后的結果,按視頻id進行相似性分數的歸并,最終得到多幀相似性排序分數,即:
A視頻分數:AF1+AF2+AF1+...+AF3 B視頻分數:BF1+BF1+BF1+...+BF1 C視頻分數:CF1+CF3+0.0+...+0.0上面假設C視頻對于查詢視頻的每幀,在設置得閾值條件下無返回結果,因而用分數0.0來表示(可以視為將所有的結果在初始化的時候初始化為0)。實際query的時候,對于每一幀的查詢結果,不需要將所有的查詢結果返回回來,可以通過設置一個相似度閾值只返回一定數目的結果,相似度太小的返回來了也沒什么用,徒增計算量和浪費資源,這樣處理后排序、篩選、合并的計算量大大降低了。
OPQ多幀排序
在對實時性有要求的場景,比如上傳一個視頻,需要從海量的視頻庫中召回相同或者相似的那些視頻,顯然暴力搜索多幀排序無法滿足要求,需要以某種近似最近鄰搜索方法來構建索引。關于近似最近鄰搜索方法,在此前的博文如圖像檢索:再敘ANN Search以及其他的博文中有過很多的介紹,這里僅以OPQ為例來介紹ANN多幀排序方法。
OPQ多幀排序方法和暴力搜索多幀排序都是基于多幀相似性度量,不同的是,由于OPQ(或PQ)計算的非對稱距離,其算出來的值越小,表示兩者越相似,而暴力搜索采用的是余弦相似度,其值越大表示兩者越相似。因而,對于OPQ多幀排序邏輯,在設計的時候,似乎只需要為排序初始化的分數初始化一個比較合理的值,這里只對返回所有結果做初始化,下面是詳細的OPQ多幀排序。
對于某查詢視頻queryVid,假設queryVid有m幀(f1,f2,…,fm)(f1,f2,…,fm),對于第i幀查詢,在距離閾值小于0.1的條件下,返回了k個結果(r1,r2,…,rk)(r1,r2,…,rk),然后對這m幀的結果按視頻id進行最小值選取與合并。舉個簡單的例子,假設某次查詢視頻只有3幀,下面是每幀查詢返回的結果:
查詢視頻第f1幀返回的結果: A1, B1, E1, C1, D1, B2, E2 查詢視頻第f2幀返回的結果: B1, C2, D1, C1, E1 查詢視頻第f3幀返回的結果: A2, C1, B2, D2, E1, D1對于查詢視頻第f1幀返回的結果,假設A1?B1?E1?C1?D1?B2?E2?1.0A1?B1?E1?C1?D1?B2?E2?1.0,后面查詢的同理。對上面每幀查詢的結果,按視頻id取最小值,得下面結果:
查詢視頻第f1幀返回的結果: A1, B1, E1, C1, D1 查詢視頻第f2幀返回的結果: B1, C2, D1, E1 查詢視頻第f3幀返回的結果: A2, C1, B2, D2, E1對于第f2幀返回的結果,給A視頻我們置一個比較大的閾值,比如上面提過的置為1.0來代替,表示第f2幀作為查詢時,與A視頻相似度差得比較大。之后,便可按視頻id對結果進行合并了:
A視頻分數:A1+1.0+A2 B視頻分數:B1+B1+B2 C視頻分數:C1+C2+C1 D視頻分數:D1+D1+D2 E視頻分數:E1+E1+E1然后再對A、B、C、D、E視頻上面求和后的分數從小到大排序,得到的便是最終多幀查詢排序的結果。整個過程在實現的時候,可以采用partial_sort方法來完成,關于partial_sort的用法,可以參考理解你的排序操作。
無論是對于暴力搜索多幀排序、還是OPQ多幀排序,在采用了上述介紹的累積最小(最大)距離的多幀相似度度量后,跟之前采用的基于倒排查詢相比,查詢效果取得了極大的提升。另外對于OPQ多幀排序的結果,還可以對前top@K的結果做一次重排,能夠將累積最小(最大)距離的多幀相似度度量的檢索準確率發揮到最大的程度。
總結
在本篇博文中,小白菜以多幀索引及排序為主題進行了一些討論,包括了
- 多幀相似性度量
- 暴力搜索多幀排序
- OPQ多幀排序
3個方面的內容,這些內容在視頻搜索上一般都會涉及。關于多幀索引及排序的問題,學術上能夠查詢的論文比較少,這里小白菜結合自己的理解以及應用實踐總結了小部分的經驗,希望對遇到這方面問題的小伙伴有些參考的價值,也歡迎在一線從事CBIR的小伙伴拍磚交流。
from:?http://yongyuan.name/blog/multi-frames-ranking-problem.html?
總結
以上是生活随笔為你收集整理的视觉检索:视频多帧排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器视觉:图像与视频朝向检测
- 下一篇: 图像检索:图像拷贝检索PHash改进方案