微信扫一扫背后的秘密:基于运动估计的智能传图算法
一、項目背景
圖1.1 常見的圖像識別應用
本項目提出的圖像算法主要解決如下問題:在移動設備實時獲取圖像的過程中,讓算法自動決定何時進行圖片發送請求、何時中斷發送請求,并將此策略用在實時的圖像檢索應用中。
目前的移動端圖像檢索應用,在選擇發送圖像時機時,多采用如下兩種策略:
1.將圖像不斷地發送至后臺,根據服務器端反饋結果,來決定停止發送;
2.加入用戶交互,如拍照的方式,觸發傳送請求,如Google Goggles、百度識圖、SOSO慧眼等當前主流視覺搜索引擎所做的那樣。
采用第一種方案,可以保證用戶較為方便地使用,由于傳圖密度較大,可以保證圖片的質量比較好,但是缺點也是顯而易見的,該策略會造成較大的網絡傳輸量以及服務器端計算的壓力;采用第二種方案,缺點是需要加入用戶的交互,提高了操作的難度,且要考慮所在應用(如微信掃一掃)已有交互習慣的搭配性,因此其關鍵點是如何在保證圖片質量的情況下大幅減小網絡傳輸量和服務器運算壓力。
二、技術介紹
(一)拍照識別與實時識別
圖像識別是需要大數據量和大計算量的,所以一定是要放在云端。圖像識別的方式有拍照識別,也有實時識別,但是我們看到市面上的所有產品幾乎都是用的拍照識別的方式。其實早在做SOSO慧眼的時候,模式識別團隊的同學就在思考一個問題,為什么一定要拍?我想拍照識別的最大好處就是用戶意圖明確,從而流量大幅減少。但是拍照識別的一個壞處就是用戶一定要主動觸發,而用戶主動觸發的情況下,只會進行一次識別嘗試,一旦沒有識別結果,用戶的感受就會很差。如前面所述,實時識別才是更好的用戶體驗,但是不停傳送圖片的方法會造成大量的流量浪費,也會造成服務器壓力過大。也正是因為此我們在上文中所提到的這些同類產品都沒有實時識別的功能,而唯一有實時識別的 Goggles,經過測試,其采用的方案基本上也是定時上傳的,只需用一會兒流量消耗就會很大。
那么我們的想法就是如何判斷用戶的意圖?也就是只有用戶確實在對準一個物體的時候會自動地上傳一張圖片進行識別?而在用戶運動的過程中,或者圖像模糊的情況下,能夠不進行傳輸。通過這樣的方式,實現了智能判斷上傳識別圖像的方法,傳輸的數據量大幅縮減。
(二)基于運動估計的智能傳圖算法
1) 運動估計
運動估計的英文名稱是(Motion Estimation). 是視頻編碼和視頻處理(例如去交織)中廣泛使用的一種技術。我們這里將本來用于視頻編碼的運動估計思想移植到手機攝像頭來,視頻與手機攝像頭的圖像序列均有共同的連續圖像相關性,因此運動估計算法是可以通用的。但是同時這二者又有很多不同點,比如手機攝像頭獲取圖像分辨率往往較低,同時在用戶實際使用的時候手機不會有太大幅度的運動。更主要的是,視頻編碼中所用的全局運動估計算法是非常慢的,即使在PC上也往往不能達到實時,因此我們進行這些特性進行了修改,來使得算法在各種低端手機上也能達到非常高效的性能。
圖2.1 塊匹配算法示意
我們采用的是最簡單的基于塊匹配的運動估計算法,示意圖如圖2.1所示。根據傳入視頻圖像大小,對于視頻幀中間的特定區域在其周圍的一個有限鄰域內采用由里到外的方式進行搜索。找到最相似的塊后,根據二者位置獲取兩幀之間的運動矢量。搜索過程采用逼近算法,首先進行大步長的移動,找到相似度相對較小的區域,然后在區域內減小步長,逐步逼近得到最終的搜索結果。為了保證算法的高速,對于超過一定閾值的過大的視頻幀圖像,我們首先進行了降采樣的處理。獲取的運動矢量包含了方向和幅度兩個信息。在手機這種場景中,根據實際的需求,我們所需要判斷的運動主要有以下4種狀態:運動、靜止、運動到靜止、靜止到運動。其中前兩個狀態是根據實際的運動幅度判斷出來的,后兩個狀態是根據前面的狀態生成的。而運動到靜止就是通常使我們認為可以上傳圖片的時機,而靜止過程中的圖片我們可以認為其圖像區域沒有明顯的變化(或只有小幅移動),因此只需要上傳其中一張就可以了。當然,雖然有了運動矢量,但具體到實際問題,更重要的是考慮防止抖動的影響以及用戶慢速運動等很多情況,不能簡單用閾值區分。運動估計算法整體流程圖如圖2.2所示。
?
圖2.2 運動估計算法流程圖
2) 圖像有效性判別
有了上面的運動估計,我們已經可以較好地預測用戶的意圖,從而在運動到靜止狀態的時候啟動傳圖到后臺的識別過程。但是用戶的手機存在對焦過程,并不是每一幀都是清晰的,即使是清晰的圖像也不一定適合進行圖像或者文字識別。因此有必要對于需要上傳的圖像進行有效性判斷。
為了提高識別率,以及根據圖像識別的特征,我們采用基于FAST特征點的清晰度判別算法。針對實際使用的圖片,修改訓練了一套自己的FAST角點檢測引擎,能夠有較好的速度和角點檢測能力。我們對于有效圖片的定義是,第一清晰,第二具有較為豐富的紋理。這兩點正好符合FAST的特征,在圖片不清晰的時候,往往FAST點較少,在比如較多空白或者單一顏色的圖片中,FAST點同樣很少,因此只需要對于需要上傳圖片的FAST點進行判斷,即可以獲得較為有效的上傳圖片。
在我們的實際應用中,僅需要在檢測到運動到靜止狀態時,進行FAST點判斷的過程,如果為清晰則直接上傳當前幀,如果不清晰而后面仍然為靜止狀態,則在后面的幀中繼續進行FAST角點檢測,直到獲得符合上傳條件的幀圖像。
經過優化,我們的引擎在iOS主流機型上均具有很好的性能,在每秒處理10幀的情況下,通常1-2幀處理即可進行運動和有效性估計。占用的CPU資源更是幾乎忽略不計:
?
三、微信如何“掃”
用戶只需要打開微信“掃一掃”界面,進入“封面”或者“翻譯”模式,即可進入識別狀態,如下圖所示:
圖3.1 微信掃封面界面
其中客戶端的處理流程如下:
?
圖3.2 客戶端-后臺處理流程
?
“掃一掃”從攝像頭獲取實時的圖像,預判邏輯會以一定的時間間隔從實時視頻流當中截取圖像進行處理,在規定的狀態發生后,會自動觸發圖片發送邏輯,將圖片發送至后臺進行檢索。
四、后續改進
雖然運動估計的算法已經能夠比較簡單而且快速地解決了智能上傳圖像識別的問題,但是后續仍然可以有很多改進的空間,比如可以區分圖像和文字特征的不同,采用不同的清晰度判別方法,比如可以加入跟蹤算法從而保持在已經識別到的物體尚在視頻區域內時,不論其旋轉或者拉遠拉近,均不會因為圖像發生變化而再次啟動識別,等等。
這種探索只是一個簡單而初步的嘗試,但隨著研究的深入,相信實時識別的技術一定會成為圖像識別的主流。
附記:
感謝關注微信模式識別團隊的最新技術:
微信5.0:
http://weixin.qq.com/
SOSO慧眼:
http://huiyan.qq.com/?
總結
以上是生活随笔為你收集整理的微信扫一扫背后的秘密:基于运动估计的智能传图算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 六大Web负载均衡原理与实现
- 下一篇: 利用dns解析来实现网站的负载均衡