从头开始训练一个检测QR二维码区域的YOLOv3模型

条形码和二维码在识别的时候主要包含定位和解码两个步骤。寻找码的位置,除了用传统的图像算法之外,也可以借助深度学习。那么深度学习的效率如何,我做了一个实验。

为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位置:

从头开始训练一个检测QR二维码区域的YOLOv3模型_第1张图片
我在LabelImg里加入了码型识别,在框选的时候会自动得到对应的码型。以下是我的数据集。

从头开始训练一个检测QR二维码区域的YOLOv3模型_第2张图片
在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

从头开始训练一个检测QR二维码区域的YOLOv3模型_第3张图片

darknet.exe detector train data/qrcode.data cfg/qrcode-yolov3-tiny.cfg darknet53.conv.74

从头开始训练一个检测QR二维码区域的YOLOv3模型_第4张图片

QR区域检测性能测试

我的硬件配置

GPU: NVIDIA RTX2060
CPU: Intel(R) Core(TM) i5-4460  CPU @ 3.20GHz, 3201 Mhz, 4 Core(s), 4 Logical Processor(s)

测试图片

从头开始训练一个检测QR二维码区域的YOLOv3模型_第5张图片

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%

从头开始训练一个检测QR二维码区域的YOLOv3模型_第6张图片
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%

从头开始训练一个检测QR二维码区域的YOLOv3模型_第7张图片
通过对比发现YOLOv3比YOLOv3-tiny的耗时多。扫码的实时性要求比较高,YOLOv3-tiny更适合QR。

检测模型下载

  • yolov3-tiny.weights for QR Code
  • yolov3.weights for QR Code

你可能感兴趣的:(YOLO,深度学习,qr,机器学习)