Abstract
ORB 是 Oriented Fast and Rotated Brief 的簡稱,可以用來對圖像中的關鍵點快速創建特征向量,這些特征向量可以用來識別圖像中的對象。
其中,Fast 和 Brief 分別是特征檢測算法和向量創建算法。ORB 首先會從圖像中查找特殊區域,稱為關鍵點。關鍵點即圖像中突出的小區域,比如角點,比如它們具有像素值急劇的從淺色變為深色的特征。然后 ORB 會為每個關鍵點計算相應的特征向量。ORB 算法創建的特征向量只包含 1 和 0,稱為二元特征向量。1 和 0 的順序會根據特定關鍵點和其周圍的像素區域而變化。該向量表示關鍵點周圍的強度模式,因此多個特征向量可以用來識別更大的區域,甚至圖像中的特定對象。
ORB 的特點是速度超快,而且在一定程度上不受噪點和圖像變換的影響,例如旋轉和縮放變換等。
FAST 算法
ORB 特征檢測的第一步是查找圖像中的關鍵點,而關鍵點檢測算法即使用 FAST 算法。
FAST 是 Features from Accelerated Segments Test 的簡稱,可以快速選擇關鍵點,算法步驟如下:
給與一個像素點 p,FAST 比較目標 p 圓圈范圍中的 16 個像素,每個像素按高於 p,小於 p,或者與 p 相似,分為三類。

注意這里的比較是帶有閾值 h 的。對於給定的閾值 h,更亮的像素將是亮度超過 Ip+h 的像素,更暗的像素將是亮度低於 Ip-h 的像素,相似像素將是亮度在這兩個值之間的像素。在對像素分類后, 如果圈圈上有 8 個以上的相連像素,暗於或亮於 p 則將像素 p 選作關鍵點。
而 FAST 如此高效的原因是,僅將 p 與圓圈中的 4 個等距像素相比。這種方法已經證明和比較 16 個周圍像素的效果相同。如果至少有一對連續像素的亮度高於或低於 p,則將 p 選作關鍵點。這種優化使得在整個圖像中搜索關鍵點的時間縮短了四倍。

但是,這些關鍵點可以像我們提供什么樣的信息?對比鄰近像素的亮度有何意義?首先觀察一下 FAST 算法標記關鍵點的圖像。

可以看出關鍵點位於亮度有變化的區域,此類區域通常確定了某種邊緣,例如貓的爪子。邊緣定義了貓的界限,以及臉部區域的界限,因此這些關鍵點使我們能夠識別這只貓,而不是圖像中的任何其他對象或背景。
BRIEF 算法
我們已經知道 ORB 如何使用 FAST 確定圖像中的關鍵點,下面我們將了解 ORB 如何使用 BRIEF 算法,並將這些關鍵點轉換為特征向量。
ORB 算法的第二步是將第一個算法發現的關鍵點變成特征向量,這些特征向量可以共同表示一個對象。
要創建特征向量,ORB 會用到 BRIEF 算法。BRIEF 是 Binary Robust Independent Elementary Features 的簡稱,它的作用是根據一組關鍵點創建二元特征向量。正如在簡介視頻中看到的,二元特征向量又稱為二元描述符,是僅包含 1 和 0 的特征向量。在 BRIEF 中 每個關鍵點由一個二元特征向量描述,該向量一般為 128-512 位的字符串,其中僅包含 1 和 0。

注意,這里的“位”是二進制位的簡稱,1 位只能存儲一個二進制值,要么 1 要么是 0。位字符串是一組位,這些是位字符串示例。

第一個是 1 位字符串 因此只存儲 1 位。第二個是 2 位字符串,因此可以存儲 2 個二進制位。在此示例中它存儲的是 0 和 1。同樣,第三個是 3 位字符串,因此可以存儲 3 個位,以此類推。計算機運行的是二進制或機器代碼,因此使用二元特征向量的一大優勢是可以非常高效地存儲在內存中,並且可以快速計算。速度對實時應用來說極為關鍵,這些特性不僅使 BRIEF 速度非常快,而且使 BRIEF 能夠在計算資源非常有限的設備(例如智能手機)上運行。
BRIEF 如何為每個點創建這些二元描述符?BRIEF 算法首先利用高斯核對給定圖像進行平滑處理,以防描述符對高頻噪點過於敏感。然后,對於給定關鍵點,例如貓爪上的這個點。

BRIEF 從該關鍵點周圍界定好的鄰域內隨機選擇一對像素,關鍵點周圍的鄰域稱為 Patch,它是一個具有特定像素寬度和高度的正方形。
這里顯示的隨機對中的第一個像素,是一個藍色正方形,它是從以關鍵點為中心的高斯分布中抽取的一個像素,標准偏差或分散趨勢為 σ。

這里顯示為黃色正方形的像素,是隨機對中的第二個像素。它是從以該第一個像素為中心的高斯分布中抽取的像素,標准偏差為 σ/2,經驗表明這種高斯選擇提高了特征匹配率。
BRIEF 然后開始為關鍵點構建二元描述符,方法是如下所示地比較這兩個像素的亮度。如果第一個像素比第二個亮,則為描述符中的相應位分配值 1,否則分配值 0。
在這個示例中第二個像素比第一個亮,因此我們為特征向量的第一個位分配值 0。特征向量的第一個位對應的是這個關鍵點的第一個隨機點對,然后 BRIEF 會針對同一關鍵點選擇新的隨機像素對比較它們的亮度並為特征向量中的下個位分配 1 或 0。

在上面新選取的隨機像素中,我們看到現在第一個像素比第二個亮,因此為特征向量中的第二個位分配值 1。
對於 256 位向量,BRIEF 會針對同一關鍵點重復這一流程 256 次,然后轉到下個關鍵點。接着將 256 個像素亮度比較結果放入該關鍵點的二元特征向量中。BRIEF 像這樣為圖像中的每個關鍵點創建一個向量。
縮放不變性和旋轉不變性
ORB 使用 FAST 檢測圖像中的關鍵點,並且通過額外的幾個步驟確保無論對象的大小或位置如何都能檢測到圖像中的對象。
給定一個圖像 ORB 算法首先開始構建圖像金字塔。
圖像金字塔是單個圖像的多尺度表示法,由一系列原始圖像的不同分辨率版本組成。金字塔的每個級別都由上個級別的圖像下采樣版本組成。下采樣是指圖像分辨率被降低,比如圖像按照 1/2 比例下采樣。因此一開始的 4x4 正方形區域現在變成 2x2 正方形。圖像的下采樣包含更少的像素,並且以 1/2 的比例降低大小。

這是一個包含 5 個級別的圖形金字塔示例,在每個級別圖像都以 1/2 的比例下采樣。到了第四級別圖像的分辨率是原始圖像的 1/16。ORB 創建好圖像金字塔后,它會使用 FAST 算法從每個級別不同大小的圖像中快速找到關鍵點。因為金字塔的每個級別由原始圖像的更小版本組成,因此原始圖像中的任何對象在金字塔的每個級別也會降低大小。
通過確定每個級別的關鍵點 ORB 能夠有效發現不同尺寸的對象的關鍵點,這樣的話 ORB 實現了部分縮放不變性。這一點很重要,因為對象不太可能在每個圖像中的大小都完全一樣,尤其是像貓這樣的對象某個時刻可能靠近相機,在另一個時刻離相機很遠。

現在 ORB 獲得了與這個圖像金字塔每個級別相關的關鍵點。在發現金字塔所有級別中的關鍵點后,ORB 現在為每個關鍵點分配一個方向,例如朝左或朝右,取決於該關鍵點周圍的強度是如何變化的。
我們詳細了解下背后原理。ORB 首先選擇金字塔Level 0 中的圖像,對於該圖像 ORB 將計算關鍵點的方向。

方法是首先計算以該關鍵點為中心的方框中的強度形心。強度形心可以看做給定 patch 中的平均像素強度的位置。計算強度形心后,通過畫一條從關鍵點到強度形心的向量,獲得該關鍵點的方向,如上圖所示。這個關鍵點的方向是向下並朝左,因為這個區域的亮度朝着這個方向增強。
為金字塔級別 0 的圖像中的每個關鍵點分配方向后,ORB 現在為所有其他金字塔級別的圖像重復相同流程。需要注意的是,在每個圖像金字塔級別,Patch 大小並沒有縮減,因此相同 Patch 在每個金字塔級別覆蓋的圖像區域將更大,導致關鍵點的大小各不相同。

可以從此處看出這一點。在此圖中,圓圈表示每個關鍵點的大小,更高的金字塔級別中的關鍵點大小更大。
找到關鍵點並為其分配方向后,ORB 現在使用修改后的 BRIEF 版本創建特征向量,這個修改后的 BRIEF 版本稱為 rBRIEF,即 Rotation-Aware BRIEF。無論對象的方向如何,它都可以為關鍵點創建相同的向量,使得 ORB 算法具有旋轉不變性,意味着它可以在朝着任何角度旋轉的圖像中檢測到相同的關鍵點。和 BRIEF 一樣 rBRIEF 首先在給定關鍵點周圍的已界定 patch 中隨機選擇 256 個像素對,以構建 256 位向量。然后根據關鍵點的方向角度旋轉這些隨機像素對,使隨機點的方向與關鍵點的一致。最后, rBRIEF 對比隨機像素對的亮度並相應地分配 1 和 0 創建對應的特征向量,為圖像中的所有關鍵點創建的所有特征向量集合稱之為 ORB 描述符。
使用 ORB 描述符進行對象識別
你已經知道 ORB 算法的原理,但可能會疑問到底可以如何使用 ORB 描述符進行對象識別呢?我們來看一個示例以了解 ORB 如何檢測到具有不同大小和方向的同一對象。
假設我想在其他圖像中檢測到此人的面孔,例如在這個多人合影中,我們將第一張圖像稱為訓練圖像,第二張圖像,即要對其進行人臉檢測的圖像,稱為查詢圖像。

給定這個訓練圖像,我想在這個查詢圖像中查找相似的特征,第一步是計算訓練圖像的 ORB 描述符並將其存儲到內存中。

ORB 描述符將包含二元特征向量,用於描述這個訓練圖像中的關鍵點。第二步是計算並保存查詢圖像的 ORB 描述符,獲得訓練和查詢圖像的描述符后,最后一步是使用相應的描述符對這兩個圖像進行關鍵點匹配,通常使用匹配函數來完成這一步。
匹配函數的目的是匹配兩個不同圖像的關鍵點,方法是比較這兩個圖像的描述符,看看它們是否很相近可以匹配。當匹配函數對比兩個關鍵點時,它會根據某種指標得出匹配質量,這種指標表示關鍵點特征向量的相似性。可以將這個指標看作與兩個關鍵點之間的標准歐幾里得距離相似性。某些指標會直接檢測特征向量是否包含相似順序的 1 和 0。需要注意的是,不同的匹配函數使用不同的指標來判斷匹配質量。對於 ORB 等使用的二元描述符來說,通常使用漢明指標,因為它執行起來非常快。
漢明指標通過計算二元描述符之間的不同位數量判斷兩個關鍵點之間的匹配質量。在比較訓練圖像和查詢圖像的關鍵點時,差異數最少的關鍵點對被視為最佳匹配。匹配函數對比完訓練圖像和查詢圖像中的所有關鍵點后,返回最匹配的關鍵點對。

我們的訓練圖像和查詢圖像之間的最匹配點顯示在此處,可以清晰地看出訓練圖像和查詢圖像之間最匹配的點主要對應的是訓練圖像的面孔。有一兩個特征不是太匹配,原因可能是該圖像區域的強度模式比較相似。因為大部分點對應的是訓練圖像中的臉部,可以看出匹配函數能夠在查詢圖像中正確地識別該面孔。
后記
本文是 Udacity 計算機視覺納米學位課程筆記,下一步將在 OpenCV 中應用 ORB 算法,並觀察 ORB 算法的魯棒性。