本文引用自“螞蟻金服科技”公眾號(hào),原文由支付寶技術(shù)團(tuán)隊(duì)原創(chuàng)分享。 本次收錄時(shí)有改動(dòng)。
1、引言
最早接觸2維碼掃碼功能,是在2011年,那會(huì)移動(dòng)互聯(lián)網(wǎng)正是起步階段,大家都感覺智能手機(jī)可以更強(qiáng)大,但到底要做些什么功能,都是在探索和創(chuàng)新。2維碼掃描功能就是這些創(chuàng)新功能之一。
當(dāng)然,2維碼掃描說到底還是圖像識(shí)別,這種技術(shù)不是一般的公司能搞定的,所以大家用的最多的2維碼掃描庫(kù)就是ZXing。這個(gè)庫(kù),很多人應(yīng)該非常熟悉,用過這個(gè)庫(kù)的人,基本都記住了下面這個(gè)圖片(ZXing的logo)。
▲ ZXing工程的logo
這個(gè)庫(kù)的使用前題就是需要手機(jī)攝像頭有自動(dòng)對(duì)焦功能,那會(huì)手機(jī)成本還沒現(xiàn)在這么低,所以自動(dòng)對(duì)焦功能不是所有手機(jī)都具備,也就限制了2維碼掃碼功能在一些較低端的手機(jī)上的使用,同時(shí)也制約了掃碼功能的普及。
后來(lái)的事情大家都知道了,微信這種社交IM越來(lái)越受歡迎,微信里可以用來(lái)掃碼加好友的“掃一掃”功能,讓2維碼掃描功能幾乎變成了IM軟件的標(biāo)配。
▲ 早期微信里的“掃一掃”功能
現(xiàn)在的微信,不僅可以掃2維友加好友,還可以掃碼支付以及各種圖像識(shí)別方面的功能,越做越豐富。2維碼掃碼功能從一個(gè)單一的圖像識(shí)別技術(shù),逐漸演變成了移動(dòng)線聯(lián)網(wǎng)的入口功能。
從去年開始,微信對(duì)2維碼掃描功能進(jìn)行了升級(jí),不僅可以在UI上讓用戶知道被掃描2維碼的中心點(diǎn),還能同時(shí)識(shí)別最多3個(gè)2維碼,相當(dāng)強(qiáng)大。
▲ 現(xiàn)在的微信可以同時(shí)識(shí)別最多3個(gè)2維碼(注意綠點(diǎn))
如上圖所示,原本大家都習(xí)以為常的2維碼掃描功能,原來(lái)還可以做的這么友好。
正好看到支付寶分享的這篇2維碼掃描優(yōu)化文章,市面上真正分享這方面的技術(shù)的文章幾乎沒有,而2維碼掃碼加友作為IM中最常見的功能之一,對(duì)于即時(shí)通訊網(wǎng)的開發(fā)者來(lái)說,雖然不需要自已從底層開發(fā),但了解這方面的知識(shí),還是很有必要的。
本文要分享的是支付寶針對(duì)2維碼掃描功能,在2維碼殘缺、變形、變色等等惡劣條件下,是如何提升掃碼識(shí)別率、識(shí)別速度的技術(shù)實(shí)踐總結(jié)。希望能帶給你啟發(fā)。
學(xué)習(xí)交流:
- 即時(shí)通訊/推送技術(shù)開發(fā)交流5群:215477170[推薦]
- 移動(dòng)端IM開發(fā)入門文章:《新手入門一篇就夠:從零開發(fā)移動(dòng)端IM》
- 開源IM框架源碼:https://github.com/JackJiang2011/MobileIMSDK
(本文同步發(fā)布于:http://www.52im.net/thread-3150-1-1.html)
2、技術(shù)背景
隨著支付寶的線下場(chǎng)景不斷擴(kuò)大,收錢碼、口碑、共享單車、充電寶、停車?yán)U費(fèi)等產(chǎn)品讓我們的生活越來(lái)越便利。
二維碼因?yàn)槌杀镜汀⒓嫒菪院贸蔀榱司€上線上最主要的連接工具,也因此面臨更多新的挑戰(zhàn)。
因?yàn)槎S碼是一種點(diǎn)陣式信息編碼方式,任何視覺上的缺損、彎曲以及光線作用都會(huì)極大的影響識(shí)別成功率,如果識(shí)別困難也就意味著用戶可能選擇放棄,影響支付體驗(yàn)也影響用戶心智。
用戶掃碼體驗(yàn)的最關(guān)鍵的主要有以下幾個(gè)因素:
- 1)識(shí)別率:這是掃碼服務(wù)的基礎(chǔ)指標(biāo),識(shí)別率能直接體現(xiàn)識(shí)別能力,識(shí)別率如果無(wú)法提高意味著大量的用戶將無(wú)法使用更便捷的服務(wù);
- 2)識(shí)別耗時(shí):包括 app 啟動(dòng)耗時(shí)以及圖像識(shí)別耗時(shí),這是衡量一個(gè)用戶從點(diǎn)擊 app 到正確識(shí)別到內(nèi)容耗時(shí),每增加 1s,將有相當(dāng)大量的用戶放棄等待并離開;
- 3)精準(zhǔn)反饋:識(shí)別結(jié)果不僅需要及時(shí)反饋給用戶,還需要非常精準(zhǔn),特別是在目前線下有多個(gè)二維碼的場(chǎng)景下,需要避免用戶二次操作。
本文將從以上三個(gè)方面,分享支付寶掃碼技術(shù)團(tuán)隊(duì)是如何為用戶打造一個(gè)又準(zhǔn)又快又穩(wěn)的極致掃碼體驗(yàn)。
我們對(duì)用戶反饋進(jìn)行了大量統(tǒng)計(jì)分析,發(fā)現(xiàn)絕大部分識(shí)別失敗都是因?yàn)槎S碼并不標(biāo)準(zhǔn),并且很遺憾的是在使用我們?cè)缙诘膾叽a版本進(jìn)行識(shí)別率測(cè)試時(shí)發(fā)現(xiàn)識(shí)別率只有 60%。下面的文字,將首先從提高識(shí)別率的方向著手。
3、提高識(shí)別率策略1:優(yōu)化樁點(diǎn)查找算法長(zhǎng)寬比耐受
以往的掃碼算法,檢查長(zhǎng)寬比例時(shí)允許差異 40%,但是由于使用前向誤差,判斷結(jié)果跟長(zhǎng)寬的先后順序相關(guān),這會(huì)導(dǎo)致有些長(zhǎng)寬比失調(diào)的碼,橫著掃不出來(lái),但是旋轉(zhuǎn) 90 度豎著卻能掃出來(lái)了(^OMG^)。
優(yōu)化策略總結(jié):
- 1)通過修改長(zhǎng)寬比的判定規(guī)則,長(zhǎng)寬比將不再受先后順序影響;
- 2)對(duì)于已知長(zhǎng)度,修改規(guī)則將可接受的寬度范圍擴(kuò)大,增強(qiáng)長(zhǎng)寬比的耐受。
在我們對(duì)比測(cè)試集中,識(shí)別率提高了 1% 左右。
4、提高識(shí)別率策略2:新增1:5:1樁點(diǎn)識(shí)別模式模式
在一張圖片中,要找到二維碼,關(guān)鍵在找二維碼特征定位點(diǎn):
三個(gè)角的回字型圖案,這就是二維碼特征定位點(diǎn)。
中間區(qū)域的黑白色塊比例是1:1:3:1:1:
以往的掃碼算法,樁點(diǎn)識(shí)別是通過狀態(tài)機(jī) 查找11311模式后 取中間位置確定x位置(此時(shí)掃描線在第一行11311比例處)在x位置縱向搜索11311模式, 確定y位置再以 (x,y) 位置橫向搜索11311比例,修正x位置。
這種模式在樁點(diǎn)污損的情況下,識(shí)別能力較差只要在任何一次11311模式搜索中遇到干擾點(diǎn),哪怕是一個(gè)像素的椒鹽噪聲也能使樁點(diǎn)查找失敗。(支付寶藍(lán)的樁點(diǎn),會(huì)在藍(lán)色區(qū)域產(chǎn)生大量噪點(diǎn),導(dǎo)致識(shí)別率低下)
為此,我們新增了一種樁點(diǎn)識(shí)別方式。在狀態(tài)機(jī)達(dá)到151模式的時(shí)候,開始嘗試確認(rèn)樁點(diǎn)。(此時(shí)掃描線在第一行151比例處)。
優(yōu)化效果:
- 1)新的查找方法將不再受樁點(diǎn)中心或邊緣部分被污損的影響,支付寶藍(lán)色樁點(diǎn)碼識(shí)別率明顯提升;
- 2)修改后識(shí)別率整體提升了接近 1%,但識(shí)別失敗的耗時(shí)有所提升。
5、提高識(shí)別率策略3:添加一種對(duì)角線過濾規(guī)則
在枚舉所有可能樁點(diǎn)組合 O(N^3) 之前,對(duì)所有可疑樁點(diǎn)進(jìn)行一次對(duì)角線檢查過濾。由于樁點(diǎn)對(duì)角線也應(yīng)該滿足 11311模式 ,用這個(gè)規(guī)則做一次過濾可疑有效減少運(yùn)算量,也就有效降低了識(shí)別成功和失敗的耗時(shí)。
6、提高識(shí)別率策略4:基于 Logistic Regression 的二維碼分類器
在以往的掃碼算法中在拿到三個(gè)樁點(diǎn)后,基于夾角,長(zhǎng)度偏差,單位長(zhǎng)度查三個(gè)數(shù)值,用簡(jiǎn)單公式計(jì)算得到閾值,判斷是否為可能的二維碼,誤判概率較大。
為此,我們引入機(jī)器學(xué)習(xí)中的邏輯回歸算法模型。
基于支付寶豐富的二維碼數(shù)據(jù)集,訓(xùn)練出邏輯回歸模型,作為二維碼分類器,明顯降低了誤判概率,也將明顯降低無(wú)二維碼時(shí)識(shí)別失敗的耗時(shí)。
7、提高識(shí)別率策略5:修改跳行掃描的間隔數(shù)
由于輸入的相機(jī)幀分辨率高,像素點(diǎn)多,運(yùn)算量大,以往的掃碼算法在水平跟垂直方向跳行采樣進(jìn)行計(jì)算。但在實(shí)際運(yùn)算中,由于跳過了太多列,錯(cuò)過了11311模式中某些1位置的點(diǎn),導(dǎo)致樁點(diǎn)查找失敗。
我們通過將跳行計(jì)算行數(shù)修改為可配置項(xiàng),通過線上 AB 灰度測(cè)試得到最合適的跳行策略,整體配置此跳行策略后,識(shí)別率得到明顯提升。
上述優(yōu)化在測(cè)試集的表現(xiàn):
綜上優(yōu)化:掃碼核心識(shí)別能力,在7744張圖片測(cè)試集上提高了6.95個(gè)百分點(diǎn)。
8、特殊策略優(yōu)化
除此上述通用掃碼優(yōu)化之外,我們還對(duì)特殊場(chǎng)景掃碼能力進(jìn)行提高。
8.1 畸變?不怕不怕!
線下場(chǎng)景復(fù)雜多變。飲料瓶身上變形的二維碼、超市小票卷起邊角彎曲的二維碼、路邊小販凹凸不平甚至折疊的二維碼......這些畸變的二維碼容易增加識(shí)別難度,甚至導(dǎo)致識(shí)別失敗。
以往的掃碼算法抗畸變策略中,先用透視變換關(guān)系建立映射關(guān)系。
優(yōu)點(diǎn)是:適應(yīng)性好,滿足大多數(shù)應(yīng)用場(chǎng)景。
不足也明顯:對(duì) Version 1 的碼,因?yàn)橛成潢P(guān)系退化為仿射變換,效果較差,手機(jī)必須和碼平面平行才能方便識(shí)別。當(dāng)物料表面不是平面的時(shí)候,效果較差。
優(yōu)化策略:
- 1)假設(shè)采樣坐標(biāo)系到二維碼坐標(biāo)系遵守一個(gè)更復(fù)雜的映射關(guān)系,并且假設(shè)物料表面的卷曲較小,通過使用二次函數(shù)可以較好的擬合這個(gè)映射關(guān)系;
- 2)實(shí)際發(fā)票上的二維碼版本普遍大于等于 7,高版本二維碼具有多個(gè)輔助定位點(diǎn),更利于構(gòu)造二次映射表;
- 3)基于以上推論,使用新的映射代替舊的透視變換,進(jìn)行更精準(zhǔn)的采樣。
用新的策略,發(fā)票碼這個(gè)場(chǎng)景的二維碼識(shí)別能力提升明顯。
▲注意:由于采用了增強(qiáng)算法,請(qǐng)對(duì)準(zhǔn)二維碼稍作等待
樣本測(cè)試結(jié)果:
8.2 容錯(cuò)識(shí)別能力提升
商戶或者供應(yīng)商生成二維碼后,通常會(huì)在二維碼的中間部分貼上 Logo,這部分有可能會(huì)使二維碼 Decode 時(shí)出錯(cuò)。
優(yōu)化策略:
對(duì)于采樣后拿到的 BitMatrix,對(duì)于中間部分一塊矩形區(qū)域內(nèi)的點(diǎn),采用某些策略來(lái)改變中間點(diǎn)的值,使它能夠通過容錯(cuò)邊界的檢查。目前采用兩種策略,第一種是反轉(zhuǎn),第二種是每一個(gè)點(diǎn)隨機(jī)取值。目前所取的矩形區(qū)域是長(zhǎng)、寬的四分之一。
通過此項(xiàng)優(yōu)化后,掃碼的容錯(cuò)能力也得到明顯提升。
9、更小的識(shí)別耗時(shí)
針對(duì)識(shí)別效率,我們使用了GPU計(jì)算二值化,降低識(shí)別單幀耗時(shí)。
所謂圖像二值化就是將圖像上的像素點(diǎn)的灰度值設(shè)置為 0 或 255,也就是將整個(gè)圖像呈現(xiàn)出明顯的只有黑和白的視覺效果。下圖左邊為原圖,右邊是二值化處理過的圖。
在掃碼算法解碼前,有二值化計(jì)算,圖像的二值化計(jì)算能使圖像中數(shù)據(jù)量大為減少,并弱化圖像模糊、顏色對(duì)比度不強(qiáng)、光線過強(qiáng)/太弱、圖像污損等情況下其他信息的干擾,更利于檢測(cè)識(shí)別。
傳統(tǒng)算法是在 CPU 上進(jìn)行二值化運(yùn)算,非常消耗 CPU 資源,但其實(shí) GPU 更擅長(zhǎng)大規(guī)模并行計(jì)算,所以我們選擇使用 GPU 來(lái)做二值化計(jì)算。在安卓平臺(tái)上使用 RenderScript,iOS 平臺(tái)上使用 Metal,都是很底層的框架。
1)iOS優(yōu)化結(jié)果:統(tǒng)一電池、角度、光線等環(huán)境變量, 在iPhone6上測(cè)試掃碼核心5種攝像頭二值化算法。
表現(xiàn)如下:
可以看出,在圖像二值化方面 Metal 有相當(dāng)高的優(yōu)勢(shì),相比原來(lái)的單純 CPU 處理快了接近 150%, 同時(shí)降低了近50個(gè)百分點(diǎn)的CPU資源。
2)Andriod優(yōu)化結(jié)果:由于Android機(jī)型眾多,我們抽取了線上數(shù)據(jù),可以看到GPU 在二值化處理中顯著降低了單幀耗時(shí)30%以上。
10、算法分級(jí)、場(chǎng)景分類、科學(xué)調(diào)度
線下物料千奇百怪,掃碼算法為了解決一些不理想的場(chǎng)景,如二維碼有遮擋、污損、模糊或角度很不好的特殊情況,需要使用一些比較耗時(shí)但比較強(qiáng)大的算法,但普通情況不需要這些算法。
所以,我們對(duì)識(shí)碼算法定了優(yōu)先級(jí),通過時(shí)間推移、跳幀觸發(fā)等方式調(diào)度。
優(yōu)先級(jí):
- 1)高優(yōu)先級(jí):每幀執(zhí)行;
- 2)中優(yōu)先級(jí):降幀率執(zhí)行;
- 3)低優(yōu)先級(jí):低幀率執(zhí)行。
不同優(yōu)先級(jí)的功能執(zhí)行時(shí)機(jī)可配置。不同功能屬于哪個(gè)優(yōu)先級(jí)可配置
特殊場(chǎng)景算法能力:
- 1)反色碼識(shí)別能力;
- 2)容錯(cuò)邊界碼識(shí)別能力;
- 3)污損樁點(diǎn)識(shí)別能力等;
- 4)條碼識(shí)別能力。
附錄:更多阿里團(tuán)隊(duì)分享的文章
《社交軟件紅包技術(shù)解密(七):支付寶紅包的海量高并發(fā)技術(shù)實(shí)踐》
《阿里釘釘技術(shù)分享:企業(yè)級(jí)IM王者——釘釘在后端架構(gòu)上的過人之處》
《來(lái)自阿里OpenIM:打造安全可靠即時(shí)通訊服務(wù)的技術(shù)實(shí)踐分享》
《淘寶技術(shù)分享:手淘億級(jí)移動(dòng)端接入層網(wǎng)關(guān)的技術(shù)演進(jìn)之路》
《阿里技術(shù)分享:深度揭秘阿里數(shù)據(jù)庫(kù)技術(shù)方案的10年變遷史》
《阿里技術(shù)分享:阿里自研金融級(jí)數(shù)據(jù)庫(kù)OceanBase的艱辛成長(zhǎng)之路》
《作者談《阿里巴巴Java開發(fā)手冊(cè)(規(guī)約)》背后的故事》
《淘寶技術(shù)分享:手淘億級(jí)移動(dòng)端接入層網(wǎng)關(guān)的技術(shù)演進(jìn)之路》
《《阿里巴巴Android開發(fā)手冊(cè)(規(guī)約)》背后的故事》
《手機(jī)淘寶消息推送系統(tǒng)的架構(gòu)與實(shí)踐(音頻+PPT) [附件下載]》
《重磅發(fā)布:《阿里巴巴Android開發(fā)手冊(cè)(規(guī)約)》[附件下載]》
《阿里技術(shù)結(jié)晶:《阿里巴巴Java開發(fā)手冊(cè)-v1.6.0-泰山版》[附件下載]》
(本文同步發(fā)布于:http://www.52im.net/thread-3150-1-1.html)