条形码和二维码在识别的时候主要包含定位和解码两个步骤。寻找码的位置,除了用传统的图像算法之外,也可以借助深度学习。那么深度学习的效率如何,我做了一个实验。
下载Darknet
git clone https://github.com/AlexeyAB/darknet --depth 1
我的环境是Windows,所以需要安装以下工具:
OpenCV_DIR = C:\opencv\build
。 在PATH中添加C:\opencv\build\x64\vc15\bin
。环境搭建的时候,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
我的硬件配置
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%
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。