微信二維碼引擎OpenCV開源

 

十天前,微信官方開發團隊在 opencv_contrib 開源了自家優化9年的二維碼引擎!各位讀者可編譯最新版OpenCV及opencv_contrib ,直接使用!

 

 

現在,在騰訊WeChatCV團隊的貢獻下,微信掃碼引擎正式加入OpenCV開源了!只需3行代碼,你便輕鬆擁有微信的掃碼能力:

 

import cv2

detector = cv2.wechat_qrcode_WeChatQRCode("detect.prototxt", "detect.caffemodel", "sr.prototxt", "sr.caffemodel")
img = cv2.imread("img.jpg")
res, points = detector.detectAndDecode(img)

print(res, points)

 

微信掃碼引擎收錄於:

opencv_contrib/modules/wechat_qrcode

開發文檔:

https://docs.opencv.org/master/d5/d04/classcv_1_1wechat__qrcode_1_1WeChatQRCode.html

 

微信掃碼引擎是一款基於開源引擎ZXing,並高度優化和深度改造的高性能輕量二維碼識別器。

 

1. 基於CNN的二維碼檢測

 

“一圖多碼”是掃碼支付經常遇到的線下場景。早在2016年,微信掃碼引擎在業內率先支持遠距離二維碼檢測、自動調焦定位、多碼檢測識別。然而,傳統方法需要犧牲40%以上的性能來支持多碼的檢測與識別。伴隨着深度學習技術的成熟和移動端計算能力的提升,微信掃碼引擎引入基於CNN的二維碼檢測器解決上述問題。

 

圖片

圖1 二維碼檢測器

 

我們以SSD框架爲基礎,構造了短小精幹的二維碼檢測器(圖1),採用殘差連接(Residual Concat)、深度卷積(Depthwise Convolution)、空洞卷積(Dilated Convolution)、卷積投影(Convolution Projection)等技術進行了針對性的優化。整個模型大小僅943KB,iPhone7(A10)單CPU的推理時間僅需20ms,很好地滿足“低延時、小體積、高召回”的業務需求。

 

檢測代碼:

https://github.com/opencv/opencv_contrib/blob/master/modules/wechat_qrcode/src/wechat_qrcode.cpp#L156

模型文件:

https://github.com/WeChatCV/opencv_3rdparty/blob/wechat_qrcode/detect.prototxt

參數文件:

https://github.com/WeChatCV/opencv_3rdparty/blob/wechat_qrcode/detect.caffemodel

 

2. 基於CNN的二維碼增強


大圖小碼”是遠距掃碼和長按識碼經常面臨的難點,二維碼增強技術可以讓小碼更加清晰。2014年,微信率先在對話中上線“識別圖中二維碼”能力,離不開增強技術的加持。在長按識別的場景中,二維碼圖像經過用戶的裁剪、壓縮、轉發,圖像質量嚴重受損,分辨率急劇下降,邊緣變得模糊不清,這給掃碼引擎的識別帶來了極大的挑戰。

 

傳統圖像增強算法很難完美地解決以上問題,因此微信掃碼引擎率先在識別流程中引入了基於深度學習的超分辨率技術(圖2)。在網絡結構上,密集連接(Dense Concat)、深度卷積(Depthwise Convolution)、反向卷積(Deconvolution)、殘差學習(Residual Learning)等技術改善模型的性能;在目標函數上,針對二維碼強邊緣和二值化的特點,結合L2/L1損失、邊界加權、二值約束設計了針對二維碼的目標函數。經過精心的調優,超分辨率模型大小僅23KB,在iPhone7(A10)單CPU的推理時間僅需6ms(100x100超分200x200),完全滿足移動端的應用需求。

 

圖片

圖2 二維碼超分辨率

 

超分代碼:https://github.com/opencv/opencv_contrib/blob/master/modules/wechat_qrcode/src/wechat_qrcode.cpp#L68

模型文件:

https://github.com/WeChatCV/opencv_3rdparty/blob/wechat_qrcode/sr.prototxt

參數文件:

https://github.com/WeChatCV/opencv_3rdparty/blob/wechat_qrcode/sr.caffemodel

 

3. 更魯棒的定位點檢測

 

二維碼在識別的時候,通常需要根據掃描像素行/列匹配對應比例來尋找定位點(圖3)。

 

圖片

圖3 二維碼定位點

 

在定位點檢測上,我們提出面積法的定位點檢測方法,相比於傳統掃描線方法更爲魯棒和高效,有效地避免了誤召回和漏召回;在定位點匹配上,特徵聚類方法使得掃碼引擎可以高效和準確地匹配多個定位點;在圖像二值化上,引入多種更爲魯棒的二值化方法,有效地提高解碼的成功率。

 

核心代碼:

https://github.com/opencv/opencv_contrib/blob/master/modules/wechat_qrcode/src/wechat_qrcode.cpp#L117

 

結合傳統計算機視覺和深度學習技術,微信掃碼引擎解決了一圖多碼、大圖小碼、魯棒解碼等業務痛點和技術難點。如今,該引擎在OpenCV上正式開源,期待廣大開發者與我們一同打造業內領先的掃碼引擎!

 

備註:opencv

圖片

 

微信號:aicvml

QQ羣:805388940

微博知乎:@我愛計算機視覺

投稿:[email protected]

網站:www.52cv.net

圖片

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章