乾貨|史上最全的支付寶二維碼掃碼優化技術方案

小螞蟻說:

二維碼又稱二維條碼,常見的二維碼為QR Code,QR全稱Quick Response,是一個近幾年來移動設備上超流行的一種編碼方式,它比傳統的Bar Code條形碼能存更多的信息,也能表示更多的數據類型。

設備掃描二維條碼,通過識別條碼的長度和寬度中所記載的二進制數據,可獲取其中所包含的信息。

乾貨|史上最全的支付寶二維碼掃碼優化技術方案

一、背景

在過去的 2017 年,支付寶的線下場景不斷擴大,收錢碼、口碑、共享單車、充電寶、停車繳費等產品讓我們的生活越來越便利。二維碼因為成本低、兼容性好成為了線上線上最主要的連接工具,也因此面臨更多新的挑戰。因為二維碼是一種點陣式信息編碼方式,任何視覺上的缺損、彎曲以及光線作用都會極大的影響識別成功率,如果識別困難也就意味著用戶可能選擇放棄,影響支付體驗也影響用戶心智。

用戶掃碼體驗的最關鍵的主要有以下幾個因素:

  1. 識別率:這是掃碼服務的基礎指標,識別率能直接體現識別能力,識別率如果無法提高意味著大量的用戶將無法使用更便捷的服務;
  2. 識別耗時:包括 app 啟動耗時以及圖像識別耗時,這是衡量一個用戶從點擊 app 到正確識別到內容耗時,每增加 1s,將有相當大量的用戶放棄等待並離開;
  3. 精準反饋:識別結果不僅需要及時反饋給用戶,還需要非常精準,特別是在目前線下有多個二維碼的場景下,需要避免用戶二次操作;

本文將從以上三個方面,分享支付寶掃碼技術團隊是如何為用戶打造一個又準又快又穩的極致掃碼體驗。

二、提高識別率

我們對用戶反饋進行了大量統計分析,發現絕大部分識別失敗都是因為二維碼並不標準,並且很遺憾的是在使用我們早期的掃碼版本進行識別率測試時發現識別率只有 60%;

策略1:優化樁點查找算法長寬比耐受

以往的掃碼算法,檢查長寬比例時允許差異 40%,但是由於使用前向誤差,判斷結果跟長寬的先後順序相關,這會導致有些長寬比失調的碼,橫著掃不出來,但是旋轉 90 度豎著卻能掃出來了(^OMG^)。

乾貨|史上最全的支付寶二維碼掃碼優化技術方案

優化策略

  • 通過修改長寬比的判定規則,長寬比將不再受先後順序影響;
  • 對於已知長度,修改規則將可接受的寬度範圍擴大,增強長寬比的耐受;

在我們對比測試集中,識別率提高了 1% 左右。

策略2:新增1:5:1樁點識別模式模式

在一張圖片中,要找到二維碼,關鍵在找二維碼特徵定位點:

乾貨|史上最全的支付寶二維碼掃碼優化技術方案

三個角的回字型圖案,這就是二維碼特徵定位點。中間區域的黑白色塊比例是1:1:3:1:1

乾貨|史上最全的支付寶二維碼掃碼優化技術方案

以往的掃碼算法,樁點識別是通過狀態機 查找11311模式後 取中間位置確定x位置(此時掃描線在第一行11311比例處)在x位置縱向搜索11311模式, 確定y位置再以(x,y)位置橫向搜索11311比例,修正x位置。這種模式在樁點汙損的情況下,識別能力較差只要在任何一次11311模式搜索中遇到干擾點,哪怕是一個像素的椒鹽噪聲也能使樁點查找失敗。(支付寶藍的樁點,會在藍色區域產生大量噪點,導致識別率低下)

乾貨|史上最全的支付寶二維碼掃碼優化技術方案

為此,我們新增了一種樁點識別方式。在狀態機達到151模式的時候,開始嘗試確認樁點。(此時掃描線在第一行151比例處)。

乾貨|史上最全的支付寶二維碼掃碼優化技術方案

優化效果

  • 新的查找方法將不再受樁點中心或邊緣部分被汙損的影響,支付寶藍色樁點碼識別率明顯提升;
  • 修改後識別率整體提升了接近 1%,但識別失敗的耗時有所提升;

策略3: 添加一種對角線過濾規則

在枚舉所有可能樁點組合 O(N^3) 之前,對所有可疑樁點進行一次對角線檢查過濾。由於樁點對角線也應該滿足 11311模式 ,用這個規則做一次過濾可疑有效減少運算量,也就有效降低了識別成功和失敗的耗時。

乾貨|史上最全的支付寶二維碼掃碼優化技術方案

策略4: 基於 Logistic Regression 的二維碼分類器

在以往的掃碼算法中在拿到三個樁點後,基於夾角,長度偏差,單位長度查三個數值,用簡單公式計算得到閾值,判斷是否為可能的二維碼,誤判概率較大。

為此,我們引入機器學習中的邏輯迴歸算法模型。基於支付寶豐富的二維碼數據集,訓練出邏輯迴歸模型,作為二維碼分類器,明顯降低了誤判概率,也將明顯降低無二維碼時識別失敗的耗時。

策略5: 修改跳行掃描的間隔數

由於輸入的相機幀分辨率高,像素點多,運算量大,以往的掃碼算法在水平跟垂直方向跳行採樣進行計算。但在實際運算中,由於跳過了太多列,錯過了11311模式中某些1位置的點,導致樁點查找失敗。

我們通過將跳行計算行數修改為可配置項,通過線上 AB 灰度測試得到最合適的跳行策略,整體配置此跳行策略後,識別率得到明顯提升。

上述優化在測試集的表現

乾貨|史上最全的支付寶二維碼掃碼優化技術方案

綜上優化,掃碼核心識別能力,在7744張圖片測試集上提高了6.95個百分點。

特殊策略優化

除此上述通用掃碼優化之外,我們還對特殊場景掃碼能力進行提高。

1. 畸變?不怕不怕!

線下場景複雜多變。飲料瓶身上變形的二維碼、超市小票捲起邊角彎曲的二維碼、路邊小販凹凸不平甚至摺疊的二維碼......這些畸變的二維碼容易增加識別難度,甚至導致識別失敗。以往的掃碼算法抗畸變策略中,先用透視變換關係建立映射關係。優點是:適應性好,滿足大多數應用場景。 不足也明顯:對 Version 1 的碼,因為映射關係退化為仿射變換,效果較差,手機必須和碼平面平行才能方便識別。當物料表面不是平面的時候,效果較差。

優化策略

  • 假設採樣座標系到二維碼座標系遵守一個更復雜的映射關係,並且假設物料表面的捲曲較小,通過使用二次函數可以較好的擬合這個映射關係;
  • 實際發票上的二維碼版本普遍大於等於 7,高版本二維碼具有多個輔助定位點,更利於構造二次映射表;
  • 基於以上推論,使用新的映射代替舊的透視變換,進行更精準的採樣;

用新的策略,發票碼這個場景的二維碼識別能力提升明顯。

乾貨|史上最全的支付寶二維碼掃碼優化技術方案

▲注意:由於採用了增強算法,請對準二維碼稍作等待。

乾貨|史上最全的支付寶二維碼掃碼優化技術方案

2. 容錯識別能力提升

商戶或者供應商生成二維碼後,通常會在二維碼的中間部分貼上 Logo,這部分有可能會使二維碼 Decode 時出錯。

優化策略:

對於採樣後拿到的 BitMatrix,對於中間部分一塊矩形區域內的點,採用某些策略來改變中間點的值,使它能夠通過容錯邊界的檢查。目前採用兩種策略,第一種是反轉,第二種是每一個點隨機取值。目前所取的矩形區域是長、寬的四分之一。

通過此項優化後,掃碼的容錯能力也得到明顯提升。

乾貨|史上最全的支付寶二維碼掃碼優化技術方案

三、更小的識別耗時

GPU計算二值化,降低識別單幀耗時

所謂圖像二值化就是將圖像上的像素點的灰度值設置為 0 或 255,也就是將整個圖像呈現出明顯的只有黑和白的視覺效果。下圖左邊為原圖,右邊是二值化處理過的圖。

乾貨|史上最全的支付寶二維碼掃碼優化技術方案

在掃碼算法解碼前,有二值化計算,圖像的二值化計算能使圖像中數據量大為減少,並弱化圖像模糊、顏色對比度不強、光線過強/太弱、圖像汙損等情況下其他信息的干擾,更利於檢測識別。

傳統算法是在 CPU 上進行二值化運算,非常消耗 CPU 資源,但其實 GPU 更擅長大規模並行計算,所以我們選擇使用 GPU 來做二值化計算。在安卓平臺上使用 RenderScript,iOS 平臺上使用 Metal,都是很底層的框架。

優化結果

  1. iOS: 統一電池、角度、光線等環境變量, 在iPhone6上測試掃碼核心5種攝像頭二值化算法。表現如下:
乾貨|史上最全的支付寶二維碼掃碼優化技術方案

乾貨|史上最全的支付寶二維碼掃碼優化技術方案

乾貨|史上最全的支付寶二維碼掃碼優化技術方案

可以看出,在圖像二值化方面 Metal 有相當高的優勢,相比原來的單純 CPU 處理快了接近 150%, 同時降低了近50個百分點的CPU資源。

  1. Android機型眾多,我們抽取了線上數據,可以看到GPU 在二值化處理中顯著降低了單幀耗時30%以上。

單幀耗時

傳統二值化

65ms

RS二值化

44ms

乾貨|史上最全的支付寶二維碼掃碼優化技術方案

四、調度維穩

線下物料千奇百怪,掃碼算法為了解決一些不理想的場景,如二維碼有遮擋、汙損、模糊或角度很不好的特殊情況,需要使用一些比較耗時但比較強大的算法,但普通情況不需要這些算法。所以,我們對識碼算法定了優先級,通過時間推移、跳幀觸發等方式調度:

優先級: 暫定高中低三個優先級。

  • 高優先級 每幀執行
  • 中優先級 降幀率執行
  • 低優先級 低幀率執行
  • 不同優先級的功能執行時機可配置。 不同功能屬於哪個優先級可配置

特殊場景算法:

為碼核心的一種特定能力,如:

  • 反色碼識別能力
  • 容錯邊界碼識別能力
  • 汙損樁點識別能力等
  • 條碼識別能力

看完以上這些,你get了嗎?還有什麼不懂的問題,歡迎在下方的留言區與我們交流!技術哥哥們在這裡等著你哦!

最後,歡迎喜歡鑽研技術的同學加入我們,一起利用計算機視覺、AR、AI、3D 渲染技術為用戶打造更酷更便利的體驗!簡歷請投下方郵箱:

乾貨|史上最全的支付寶二維碼掃碼優化技術方案


分享到:


相關文章: