李佩:阿里本地生活線上線下融合場景中的影像檢測技術

人工智慧頻道發表於2018-12-26

【IT168 專稿】本文根據李佩老師在2018年10月17日【第十屆中國系統架構師大會】現場演講內容整理而成。

講師簡介

李佩,阿里本地生活高階演算法總監,人工智慧與策略部負責人,主導本地生活線上與線下業務的演算法策略優化與智慧化程式,對人工智慧如何改造O2O業務場景有著深刻研究。

摘要:

餓了麼(現稱阿里本地生活)作為一家以線上交易與線下履約為核心的本地生活平臺,催生了大量的線上線下融合場景中的影像檢測需求。面對五花八門的業務需求,各類影像識別技術也在千變萬化,如何建立一個靈活統一而快速有效的影像檢測框架,通過對深度學習模型與GPU算力進行整合,在極短的時間內快速響應業務需求達到提效降本的目的,成為線上線下融合場景中值得深究的話題。本次講座將從場景驅動的角度來探討如何建立一個靈活快速又可落地生效的影像檢測框架。

分享大綱:

1.     線上線下融合場景中的影像視覺技術

2.     複雜場景中的影像視覺技術

3.     複雜場景中的文字識別

4.     複雜場景中的三維重建

正文:

線上線下融合場景中的影像視覺技術

今天我演講的標題是線上線下融合場景中的影像識別技術。看到這個標題大家可能會有一些疑惑,影像視覺技術還分線上線下場景?本身影像視覺技術是通用的,不分場景。但是我們在本地生活領域做影像視覺技術的時候,會發現它和傳統搜尋引擎或推薦系統推進領域之下的影像視覺不完全相同。所以我今天不會講常用的一些影像分類或影像相似度演算法,我們講一些類似於目標檢測,或者視覺3D重建的新技術。

什麼是所謂的線上線下融合?過去十年,我們看到O2O領域有大量的應用產生,例如叫車,外賣以及洗車美容等。總體來講,O2O是指將線上訂單與線下實際服務提供能力連線在一起。但是走到了如今,特別是2017年,很多環境都發生了變化,成就了現在的線上線下融合的場景。

線上線下融合與傳統的線上到線下的訂單流程肯定是有一些不同之處。

第一個明顯的不同點是O2O是單向的,是online到Offline。但是OMO是雙向的,不光線上的訂單會流到線下,線下的服務提供能力也會影響到線上的訂單生成。

我以餓了麼為例解釋一下。大家在餓了麼APP下單,外賣會及時配送到大家手中,表面來看,這是一個典形的O2O, 訂單從線上流到線下。但實際上也有反向的一個流程,假設線下的物流配送能力不足,那麼會不會影響線上訂單的產生過程呢?實際上會影響。比如在高峰期的時候,你會發現你平時常訂餐的餐館突然找不到了,但是在下午4點鐘平峰期的時候又出現了。是因為在高峰期的時候,我們會做一些壓力調控,一些供需平衡的策略。在運力比較緊張的時候,我們會縮小線上的配送圈。所以在中午的時候,你不能完成遠距離下單,但在平峰期的時候卻可以。所以說,這個影響是雙向的,線下也會影響到線上的下單流程。

第二點就是傳統的O2O講究連線,但在餓了麼這個領域我們講的更多是融合。連線是旨把線上的流量和線下的服務能力連線在一起,它並不會對線下的服務能力有徹底的改造。但是在融合這個領域,我們通過演算法技術,會對線下進行重新改造,特別是現在我們會通過人工智慧和物聯網的技術,未來對線下的人和物等進行改造,讓它具備一些可以快速複製的一些特徵。

第三點就是在O2O的領域下,線下實際上是被動的,因為訂單是線上上產生的,線下實際上是被動的接受線上的訂單。但是在餓了麼領域,線下實際上是被改造。

最後一點就是在O2O領域,一項關鍵技術叫分單排程,去年也是在這個會議上我給大家介紹過餓了麼的智慧排程 。當然在外賣領域,智慧排程的難度實際上比其他O2O應用領域要大,因為餓了麼每天存在著兩個很高的高峰期,單量比較集中。在高峰期的時候,我們的物流配送能力實際上是跟不上的,所以排程做起來難度比較高。但是在OMO領域,最核心的技術並不是分單排程,而是智慧物聯。智慧物聯怎麼理解?具體來說就是我們要用人工智慧和物聯網的機制,對線上和線下進行融合打通。並且在這種聯合打通的過程中,我們的影像視覺技術會起到非常關鍵的作用。

一些線上線下融合的典型應用場景,例如萬物互聯、虛實結合、人機協同、智慧製造等。

複雜場景中的影像視覺技術

今天的主題是線上線下融合領域中的影像視覺技術。線上線下融合打通,最典型的應用是在本地生活服務場景。在本地生活服務場景中,我們所用的影像視覺技術主要有三種:目標檢測、文字識別、三維重建。

首先給大家簡單的介紹一下目標檢測的一些應用場景。餓了麼有很多線上線下的場景。例如,餓了麼的騎手每天都需要在餓了麼騎手APP上傳一張自己的自拍照,餓了麼會根據自拍照對騎手做現場的著裝規範檢測。但是餓了麼在全國有300萬的註冊配送員,人工檢測是不現實的,所以餓了麼利用影像檢測技術去自動判斷。首先,會對騎手的人臉進行識別,確認騎手是否是系統裡註冊的餓了麼騎手。其次需要對騎手身上的物品進行檢測,例如衣服、帽、餐箱等。所以我們需要進行目標檢測,即物體檢測。我們要通過深度學習技術,檢測這些箱子,帽子等物品是否符合餓了麼的送餐規範。

第二個應用場景是關於場景中的一些目標識別,例如行人識別、辦公桌椅檢測、電梯按鈕檢測與識別等。可能大家要問為什麼餓了麼要做這些事情。因為餓了麼已經開始研究無人配送。大家可以想象一下一個機器人在辦公樓裡穿梭的場景,如果他想要將手中的餐食正確的送到訂餐人手中,他就必須能夠識別周圍的人,周圍的辦公桌椅,甚至在乘坐電梯的時候能夠識別按鈕。

第三個是合規檢測,這就比較好理解。因為餓了麼作為一個本地生活服務平臺,有大量的商家圖片、菜品圖片,所以我們希望我們平臺上的每張圖片都符合規範。例如它上面不能有二維碼,不能有水印,不能有logo等商標的一些附加物的出現。所以我們就要用影像技術去判斷,做一些二維碼檢測,水印檢測等。

最後是場景文字識別,在餓了麼的場景中,比較多的是選單的識別、招牌的識別、指示牌的識別、海報的識別等。這其中比較難的是選單的識別,因為不同餐館的選單都是五花八門的,很難找到類似的。我們需要通過掃描選單的圖片,將菜品的名字和價格準確的抽取出來。

以上提到的這些場景實際上都會用到目標檢測的技術,目標檢測在這些場景中都起到至關重要的作用。

接下來我簡單的介紹一下目標檢測中常用的一些評價指標。

目標檢測其實在做兩件事情,第一件是物體框的迴歸,我們需要找出物體框。第二件是我們需要對框內的物體進行辨別,也就是分類。對於這個分類,我們常用的評價指標是mAP,即先計算每個類別的平均精度,再計算所有類別的精度均值。對於迴歸的物體框的準確性我們使用IOU,即預測的物體框與標註的真實物體面積的交集除以並集。當然,在物體檢測領域還有其他一些重要指標,這兩個只是最常用的,並不是萬能的。

這個是目標檢測演算法發展的一個過程。

2010 年之前,目標檢測演算法主要基於非深度學習。第一個把深度學習應用到目標檢測中的是R-CNN,相關論文發表於2014年。R-CNN是由一位外國人提出來的,然後一位中國人對它進行了優化繼而推出SPP。但SPP執行的速度比較慢,以至於前一位R-CNN的提出者不服氣,便又繼續推出比SPP更快的Fast R-CNN。最後兩位提出者攜手提出Faster R-CNN,一種更有效,更通用的方法。但總體而言,整個框架始終沒有跳出R-CNN 的兩步法思路。

所以目標檢測第一類演算法稱之為兩步法,什麼叫兩步法?第一步就是找出物體框,第二步就是對物體框進行分類。此外,還有另外一類方法稱之為一步法,簡單說就是從YOLO到SSD。

餓了麼實現過的目標檢測演算法比較多,我這邊只是列舉了一些重要和常見的。

R-CNN是最簡單的,也是最好理解的,它的思路非常簡單。第一步先將影像劃分為網格或子區域(或超畫素),將同樣顏色或紋理的相似相鄰超畫素進行聚類,並找出外切的矩形框。第二步就是對這些矩形框執行一個CNN分類演算法,進行分類。R-CNN的提出是一種創新性的革命性的,但以今天的觀點來看,它的速度比較慢。因此後續又提出了很多改進版的R-CNN。

第一個改進版就是SPP,也稱之為金字塔池化。這個演算法最核心的改進就是對所有的候選框共享一次卷積網路前向計算。它的第二個共性就是它可以通過一種金字塔的結構,獲取不同尺度空間下的ROI區域。

這樣的改進能夠讓它更快,並且能夠發現不同尺度之下的地方,既可以發現大的物體也可以發現小的物體。但它的缺點仍然還是比較慢,無法達到實時。所以後續又提出了Fast R-CNN,它簡化了SPP的同時還採取多種加速策略。

但SPP和Fast R-CNN只是對R-CNN進行了改進,並沒有實現顛覆性的創新。真正實現了顛覆性的創新其實是最後的Faster R-CNN。Faster R-CNN創造性的提出了RPN (Region Proposal Networks) 代替 Selective Search,實現端到端的訓練。也就是說原先整個目標檢測分為兩步,第一步是通過一些規則的方式找到一些矩形框。第二步是通過神經網路來做分類。但是Faster R-CNN把第一步的人工規則也轉成了一個神經網路,稱之為Region Proposal Networks,它的第一步是一個神經網路,第二步做分類也是一個神經網路,實現了一種端到端的訓練。這樣的演算法有很高的精度和效能。

這張框架圖是Faster R-CNN的一個主要執行過程,首先它對整張圖進行CNN前向計算獲取卷積響應圖。這個和一般的影像分類操作沒什麼區別,一個主要區別就是中間的這個矩形框。它首先用滑窗法對響應圖進行特徵提取,然後會預測每個畫素對應位置是否有物體的分數(兩個輸出),它會輸出是和否。此外它還會去預測物體框的中心座標與大小(四個輸出),中心座標的X軸、Y軸兩個值。物體框大小主要是通過長和寬來表示,所以一共是四個數字。

所以它的兩個全連線層總共會輸出六個數字,然後進行後處理,典型的就是用NMS來做物體框的選擇,然後把物體框給輸出來。最後對輸出後的物理框做分類,分類方法還是使用傳統的CNN。所以它的創新過程主要體現在中間的矩形框,這也是創新最成功的地方。

接下來再給大家簡單的介紹一下一步法。一步法中代表性的演算法主要是YOLO和SSD。YOLO的英文全稱是You Only Look Once,它只需要把圖片掃描一次,就能把物體檢測出來。它最大的優點是速度比較快,但缺點是精準度比較差。這是YOLO的整個框架,它的核心點是中間的這個大的矩形框。它會把響應圖劃分為S    *S個格子,然後會預測物體框的中心座標與大小,以及是否有物體的置信度,還會預測這個格子在每個物體類別的概率。所以,我們可以看到YOLO框架的整個核心思想和Faster R-CNN 裡面的 Region Proposal Networks是有很多相似之處的。

目前用的比較多的另一種目標檢測演算法是SSD,它是大家做物理檢測用的最多的演算法。它是對YOLO的一種改進,一項重要的改進就是把YOLO的兩個全連線層變得了一種迴圈的模式。它首先會從一張比較大的圖片中尋找物體框,判斷物體的類別,然後把整個圖片縮小,繼續尋找物體框和類別,再縮小,以此迴圈不斷縮小圖片的解析度。最終將這些物體的類別與框輸出來。這樣的優點是,它能夠獲取不同尺度下圖片中物體的資訊,不管是大物體還是小物體,不管物體的尺寸、長寬比怎樣,它都能推測出來。

複雜場景中的文字識別

文字識別在餓了麼有很多的應用場景,第一個就是證件識別,餓了麼平臺有大量的身份證,健康證、營業執照、衛生許可證等。首先我們要做識別,其次要做一些類似於防偽的檢測,例如證件照是否被ps等,這些都是我們OCR常用的場景。

第二個應用就是門頭照的識別,我們要求商戶上傳自己的門頭照,檢視商戶大概的用餐環境,但是很多商戶可能將別人的門頭照上傳到自己的,這個時候我們就需要用文字識別的手段去把門頭照裡面的資訊提取出來,與商戶的資訊進行比對,確保商戶上傳的門頭照是真實的。

第三個應用是票據識別,第一種是小票,例如餓了麼的物流小票、商戶提供的水單等。其次餓了麼業務會涉及到新零售,新零售背後有很長的供應鏈。在供應鏈中,餓了麼的工作人員經常會用紙質的報表對商品進行整理。線下的這些文字如果要逐一錄入到系統之中,需要很大的工作量,所以就需要用文字識別的方式進行檢測和識別。

最後一個應用場景是剛才提到過的選單識別。第一個是字型的匹配,因為選單的字型是千奇百怪的,即便我們能識別200種字型,但有的選單字型我們也是沒有見過的。另外還有菜名識別和價格識別,都是OCR中需要做的。

下面我介紹一下傳統的OCR技術。OCR這個詞早在八九十年代就被提出,它是光學字元識別的縮寫(Optical Character Recognition)。光學字元識別,顧名思義它主要針對印刷體,比如報紙、書本等。傳統的OCR技術主要分為兩步。第一步是傳統的影像處理技術,比如幾何校正,對比度調整,連通域分析,投影分析等。第二步是統計機器學習,最常見的是SVM和AdaBoost兩種模型,這兩種模型會把最終的字元給識別出來。

一般來講,如果印刷體在光照非常好的情況下,傳統的OCR取得的效果相對比較好。但今天我們的主題是線上線下場景中的影像識別,實際上在這種場景之中,我們發現傳統的OCR的效果就比較差。因為線上上線下融合場景中,大多數的文字都是用手機拍攝,手機拍攝就會涉及角度、光線各方面的影響,它實際上是不規範的。另外,實際生活上應用的文字不會像印刷體那樣橫平豎直,它的排列方式、顏色、字型大小等都是千奇百怪的。識別這樣的不規範的照片,傳統的OCR就會遇到一些問題。

傳統的OCR解決方案主要分為三步,第一步是預處理,第二步是文字行提取,第三步是文字行識別。特別要注意的是文字行識別的時候,傳統的OCR實際上沒法識別正常的文字,它只能一個字元一個字元的識別。所以識別到文字行之後,它首先要對文字行進行切割,還要把文字行切割為字元,然後對單個字元進行識別。

但在生活場景中,我們往往面對的是這樣的一些圖片,如何在這樣的圖片中來做文字識別?

現在比較常用的是基於深度學習的OCR。它一般分為兩步,第一步是文字行檢測,是指從一張圖片中把對應的文字行找出來。因為文字行包含在圖片之中,它可能是斜的,也可能是豎著的。第二步是文字行識別,現在基於深度學習的文字行識別一般是一種端到端的方式,也就是說我們並不需要把文字行切割為單字元然後進行分類,而是我們輸入一個文字行圖片,直接就會出來一個文字序列,中間不需要做文字元切割,這就是現在的深度學習技術的一個最大的改進。基於深度學習的文字行識別,它有一些好處。第一個,它是端到端的檢測,能減少中間環節與誤差積累。第二,它的適應能力比較強,它不光能識別報紙、雜誌文字,還能識別招牌、選單等文字。第三,它的人工規則比較少,自動化程度比較高。第四,它的識別精度高。

深度學習我們分為兩部分,第一部分是文字行的檢測,第二部分是文字行的識別。文字行檢測的主流技術主要是三條線在走。第一條線是基於Faster R-CNN做文字行檢測。第二條線是基於SSD,第三條線是基於全卷積網路FCN做圖片的語義分割,然後基於語義分割再做文字行檢測。目前基本上所有的基於深度學習的文字行檢測演算法,都是沿著這三條線在做優化。

基於Faster R-CNN的文字識別方法,比較有名的是CTPN,基於 SSD上的是Textboxes和Textboxe++。另外,基於FCN還有Text-Block FCN。我這裡主要想強調的是EAST,因為目前為止,綜合比較之下,EAST是最好的,因為它能發現任意形狀的四邊形,無論是斜的還是歪的都可以檢測。

在介紹EAST演算法之前先簡單的介紹一下全卷積網路(FCN)。FCN主要是做語義分割,什麼是語義分割?我們剛才說的目標檢測是指找出一個矩形框,物體框在裡面,而語義分割是對圖片進行分割,分割成幾塊,在每一塊上面打一個識別符號。FCN的一個核心特點就是會先做卷積,再做反摺積。卷積會把這個影像不斷的縮小,通過卷積和池化,影像的特徵會逐漸的聚攏,影像會越來越抽象化,大小和解析度會越來越低。當低到一定程度之後,它會做一個反摺積操作,這個反摺積操作採用稱之為upsampling,把影像又逐步放大。由於 FCN 的形狀長得像 U 型,所以 FCN 的一個變種又稱為U-Net。

接下來簡單介紹一下EAST演算法。EAST演算法是基於FCN,全稱是Efficient and Accurate Scene Text Detector,它最大的賣點是可以檢測任意形狀的四邊形。下面有兩張圖片示例,左邊是一張廣告,通過EAST之後,不管字型是斜的還是歪的都能被檢測出來,右邊也是如此。它的檢測結果是一種任意形狀的四邊形,連線四個頂點,構成一個四邊的框,把文字框在裡面,所以EAST演算法的通用能力非常強。

這是EAST模型的核心原理。從區域來看,它的整個網路結構被分為左邊的黃色,中間的綠色和右邊的藍色。黃色部分是卷積操作,不斷把影像縮小,通過卷積操作不斷提取特徵。它通過卷積操作把影像分為四層,分別把影像劃分為原來的1/4、1/8、1/16和1/32,然後再基於每一層,進行特徵合併。

中間綠色部分是從下往上執行,它會把這一層和上一層CNN抽取的特徵首尾相連構成一個新向量。最後獲取最上方的最大特徵向量,基於這個特徵向量再次尋找物體框。找出來的物體框分為兩種,第一種稱之為RBOX,它是一個矩形,邊角是直角,但它可以旋轉。第二種稱之為QUAD,是一個任意的四邊形。

接下來我們來介紹文字行識別。目前最流行的文字行識別是CNN+Bi-LSTM+CTC的方式。所以這張PPT應該從下往上看,首先輸入一張圖片,通過CNN提取影像特徵圖,然後把影像的特徵視為一種時間序列,再通過Bi-LSTM提取序列特徵。兩波特徵提取之後,最後再通過CTC計算最終文字序列的概率。

這個演算法設計的特別巧妙,巧妙之處在於它運用了不同方面的技術來解決問題:CNN是用來做影像分類的,Bi-LSTM一般做文字的挖掘與自然語言處理。而CTC一般是用來做語音識別。所以它相當於把影像識別、文字識別、語音識別三項技術結合在一起做文字行的識別。

 CNN 的原理不再細說。LSTM的整個原理其實非常簡單,這幾個框圖就能解釋。首先它是迴圈的,每個迴圈會做三個操作,第一步,它會把上一狀態記憶一部分,同時忘記一部分,稱之為記憶部分,也就是左下角這個圖,它通過一個記憶向量生成記憶概率,然後把舊狀態的部分資訊記憶下來,同時舊狀態的部分資訊也會被忘掉。第二步,它會產生新的候選值,然後把舊狀態記下來的資訊和新的候選值加起來,得到一個新的狀態,也就是新增部分。第三步,重新整理狀態,即重新整理過去的記憶向量。

在實際場景中,我們用的最多的是Bi-LSTM,也就是雙向的LSTM。雙向的LSTM不光上文的資訊能夠傳遞到下文,下文的資訊也可以反向傳遞到上文。所以它的結構分成了兩層,一層是Forward,一層是Backward,Forward層會從1時刻往t時刻計算,Backward層會從t時刻往1時刻計算。每一次輸出就等於把Forward層輸出和Backward層輸出合併起來,這就是雙向LSTM的核心思想。

最後到了CTC的環節。CTC中文全稱是連線主義時序分類器。它的整個原理比較簡單,傳統的語音識別中,上面是一段聲紋,下面是識別出來的文字。但聲音序列和文字序列肯定是不對齊的,比如聲音是十秒鐘,文字只出了五個字,在打標籤的時候就會涉及到聲波的波峰對應哪個字元的問題,找對應關係是非常麻煩的。而CTC可以不用去找這些對應關係,它是序列的識別,做聲音識別的時候,它不會把聲音切割成單個音符再做識別,而是把整個聲音作為一個主體,再輸出對應。它在裡面加了一些填充字元,一個小寫的E,這個E就是一個空字元。填充完之後,再對序列進行識別,然後做分類。

這是一個CTC大概的處理流程。 首先CTC接收的是雙向的LSTM輸出,即一個向量,它要對向量進行分類,傳統的分類沒有空白字元,CTC首先會把空白字元加到字符集裡,完成步長特徵到字元的分類。然後開始計算每個字元序列的出現概率,並輸出最大概率對應的字元序列。所以它並不會去計算每個字元的概率,而是計算整個序列的概率。最後把空白符號和預測出的重複符號消除掉,做一些後處理,然後輸出。

複雜場景中的三維重建

三維重建其實是3D視覺的子領域,是一門非常古老的學科,遠在深度學習開始之前,就已經存在了大量的三維重建方面的研究。但在近幾年隨著無人駕駛的興起,視覺導航得到了長足的發展。包括近期VR和AR發展,在這個領域我們又看到了大量的基於三維重建的應用。

接下來主要給大家介紹的是三維重建領域的一些核心技術。

餓了麼一直在無人配送領域進行著研究,三維重建是該領域的一項非常核心的技術,基於今天的演講主題,我們主要從影像視覺的角度去分析三維重建,而不涉及到鐳射雷達的點雲資訊。

如何從大量的圖片中完成一個三維重建的過程?下面我們介紹一個最常用也是最核心的應用,假設你對一個物體拍攝了大量的照片,你如何從這些照片中提取出這個物體的3D模型?這張框架圖就給大家展示了一個大概過程。第一步,影像特徵抽取,這裡提取的特徵跟CNN提取的特徵不一樣,這裡提取的主要是一些具有空間尺度不變性的角點特徵,所以角點特徵抽取的演算法一般不用CNN。第二步,特徵點匹配,這涉及到大量的匹配方法。第三步,投影校準,因為這些圖片都是由攝像機拍出來的,所以需要對相機引數進行一些校準。最後進入三維重建過程。

進入三維重建,首先我們需要選擇兩張角度比較合適的圖片作為一個起始,然後進入下面的迴圈環節。迴圈環節分為四步,第一步,增量式的往裡面新增新的影像,即新增新的資訊。第二部,新增新的三角定位關係。因為每往裡面新增一張新的影像,這張影像裡的新的特徵就會和舊的影像之間建立一種三角定位關係。第三步是一項非常重要的操作,稱之為光束平差。早期的光束平差是對攝像機引數的預估。光束平差是一個非常古老的演算法,已經有將近100年的歷史。它會對相機的引數進行一些最優化,然後我們進行離群點過濾,把那些匹配出錯的地方去掉。去掉之後,再往裡面新增一張新的影像,這樣不斷的迴圈,整個3D模型就能增量式的被勾勒出來。

最後,我們介紹一下三維重建裡的特徵提取以及相機引數的優化。特徵提取最常用的是SIFT特徵,它具有尺度不變性,你可以對它進行旋轉、縮放,甚至對光線進行明亮度調整,它的特徵都不會發生變化。SIFT特徵有很多優點,例如給它一張影像,它能產生大量的匹配特徵。它也有一些缺點,例如它的速度如果不進行優化,就無法滿足實時的需求。

這是對SIFT做特徵提取和匹配的一個簡單介紹。

第一步,生成高斯差分金字塔,構建尺度空間。第二步,在金字塔裡面尋找空間極值點,什麼是空間極值點?即如果一個畫素的值比它附近的畫素的值都大或者小,那麼這個畫素點就稱之為空間的極值點。我們需要把空間極值點找出來,去掉不要的空間極值點。第二步,進行特徵點向量描述。這個向量描述用的是128位的向量描述,即把畫素周圍16×16 的畫素取出來,再把它按照4×4的規模分成小格子(見右上角圖),每個格子裡會求它的梯度,梯度會在八個方向上取值形成一個梯度直方圖。梯度直方圖全部拼起來會形成一個128位的向量。第三步,基於128位的向量做特徵點匹配(也就是下面這個過程)。但是匹配過程很容易出錯,因為A圖片中的某一點和B圖片中的某一點很可能長得很像,所以這裡會涉及到大量的優化操作。

對於優化,有一個非常重要的概念叫做重投影誤差。什麼是重投影誤差?即對於空間中的一點,經過多視角的分析,得到它在空間中的一個座標系XYZ,以及一套相機引數。這和人眼來看世界是非常相似的,我們左眼看到一張影像,右眼看到一張影像,基於這兩張影像構建出空間中的XYZ。但構建出的空間點是有誤差的,因為涉及到相機旋轉角度、拍攝位移等問題,我們估算出來的相機引數是不準的。而我們基於估算出的相機引數重新拍照,由於引數估算不準,兩張影像會出現誤差,這個誤差就叫做重投影誤差。

我們的目標就是要最小化重投影誤差,最小化相機引數的誤差。假設我們已經把相機引數最小化了,實際上我們基於相機引數所估算的三維空間點也會發生變化,所以重投影誤差也會發生變化,它是一個迴圈動態的優化過程,整個優化過程有個非常專業的術語叫做光束平差。

光束平差,Bundle Adjustment。它其實就是一個做大型線性規劃的演算法。我們從每一張照片中記錄每一個視角和每一個軌跡,都會得到一個誤差值。最終我們要最小化誤差的平方和。求解誤差平方和最小的方法,傳統的機器學習是用梯度下降法,這裡也跟這個方法類似。當然用梯度誤差法,它的速度是無法滿足實時要求的。最新的方法是稀疏BFGS。稀疏BFGS是一種擬牛頓法,要做二階泰勒展開。擬牛頓法是一種近似的牛頓法,稀疏BFGS是大規模稀疏矩陣中的一種快速的優化演算法。

最後涉及到對匹配的錯誤點進行過濾。比較傳統的演算法稱之為RANSAC。RANSAC過濾演算法有個最大的優點,即假設你的資料集中超過50%的點都是噪點,那麼一般情況下普通的演算法是完成不了分類和聚類的,但RANSAC演算法就可以。它的演算法思想,就是抽樣部分點構建最優模型,統計適應於該模型的點數,反覆抽樣若干次,選擇點數最高的模型。

整個從特徵點提取,到光束平差,到RANSAC的過程聽起來非常複雜,但這有一個非常簡單的應用例子。假設你用手機拍了兩張不同的照片,兩張照片的視角,旋轉方向都是不一致的。但如果你通過SIFT特徵以及Bundle Adjustment,包括剛才的RANSAC,這一套流程下來最後完成兩張圖片的拼接,得到圖中的第二張圖片。其實它不是真的而是歪的,把它經過適當的旋轉之後,就能和第一張圖片拼裝起來。

影像視覺方面的技術更新換代很快,新方法層出不窮,由於時間問題,今天的分享就到這裡,謝謝大家!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545819/viewspace-2286461/,如需轉載,請註明出處,否則將追究法律責任。

相關文章