條形碼和二維碼在識別的時候主要包含定位和解碼兩個步驟。尋找碼的位置,除了用傳統的圖像算法之外,也可以藉助深度學習。那麼深度學習的效率如何,我做了一個實驗。
爲QR二維碼訓練YOLOv3模型
編譯Darknet
下載Darknet
git clone https://github.com/AlexeyAB/darknet --depth 1
我的環境是Windows,所以需要安裝以下工具:
- CMake 3.18.4
- Visual Studio 2019 Community edition
- OpenCV 4.5.0。系統環境變量中添加
OpenCV_DIR = C:\opencv\build
。 在PATH中添加C:\opencv\build\x64\vc15\bin
。 - CUDA 10.1
- cuDNN 7.6.5
環境搭建的時候,CUDA是最坑的。雖然在命令行中發現nvcc
可以工作,但CMake可能死活找不到。這裏的問題是CUDA的Visual Studio插件沒有裝對地方。有人提到的方法是CUDA要在Visual Studio之後安裝
。但依然可能找不到,原因就是系統中包含了多個版本的VC++編譯器。在我的環境中,CUDA插件是沒有正確安裝的,所以要手動從C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\visual_studio_integration\MSBuildExtensions
拷貝到C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations
接下來就是運行build.ps1
編譯Darknet。如果PowerShell的安全策略是默認的,需要用管理員權限
啓動並修改權限:
Set-ExecutionPolicy Bypass
build.ps1
編譯完之後運行命令查看下是不是GPU版本:
darknet.exe detector test
CUDA-version: 10010 (10010), cuDNN: 7.6.5, CUDNN_HALF=1, GPU count: 1
CUDNN_HALF=1
準備數據
在網上找一些QR的圖片,我手裏有250張。然後用labeImg標註每張圖的QR位置:
我在LabelImg里加入了碼型識別,在框選的時候會自動得到對應的碼型。以下是我的數據集。
在Darknet的data目錄下創建qrcode和qrcode-valid目錄。把這些圖片和標註信息拷貝到兩個目錄中,一個用於訓練,一個用於校驗。
創建相應的配置文件:qrcode.data
, qrcode.txt
, qrcode-valid.txt
, qrcode.names
, qrcode-yolo3v.cfg
and qrcode-yolov3-tiny.cfg
:
-
qrcode.data:
classes = 1 train = data/qrcode.txt valid = data/qrcode-valid.txt names = data/qrcode.names backup = backup/
-
qrcode.txt和qrcode-valid.txt包含了兩個目錄中的文件名。這兩個文件可以通過https://github.com/theAIGuysCode/YoloGenerateTrainingFile/blob/master/generate_train.py 這個Python腳本自動生成
-
qrcode-yolo3v.cfg基於yolo3v.cfg
-
qrcode-yolov3-tiny.cfg基於yolo3v-tiny.cfg
因爲只需要訓練一個類,cfg文件做以下修改:
classes=1
filters=18
max_batches = 4000
steps=3200,3600
具體意義可以參考文檔:https://github.com/AlexeyAB/darknet#how-to-train-to-detect-your-custom-objects
訓練模型
下載darknet53.conv.74開始訓練模型:
darknet.exe detector train data/qrcode.data cfg/qrcode-yolov3.cfg darknet53.conv.74
darknet.exe detector train data/qrcode.data cfg/qrcode-yolov3-tiny.cfg darknet53.conv.74
QR區域檢測性能測試
我的硬件配置
GPU: NVIDIA RTX2060
CPU: Intel(R) Core(TM) i5-4460 CPU @ 3.20GHz, 3201 Mhz, 4 Core(s), 4 Logical Processor(s)
測試圖片
YOLOv3-tiny測試
darknet.exe detector test qrcode.data qrcode-yolov3-tiny.cfg qrcode-yolov3-tiny_last.weights 20201105151910.jpg
Done! Loaded 24 layers from weights-file
Detection layer: 16 - type = 28
Detection layer: 23 - type = 28
20201105151910.jpg: Predicted in 3.717000 milli-seconds.
QR_CODE: 97%
YOLOv3測試
darknet.exe detector test qrcode.data qrcode-yolov3.cfg qrcode-yolov3_last.weights 20201105151910.jpg
Done! Loaded 107 layers from weights-file
Detection layer: 82 - type = 28
Detection layer: 94 - type = 28
Detection layer: 106 - type = 28
20201105151910.jpg: Predicted in 31.717000 milli-seconds.
QR_CODE: 100%
通過對比發現YOLOv3比YOLOv3-tiny的耗時多。掃碼的實時性要求比較高,YOLOv3-tiny更適合QR。