从头开始训练一个检测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 testCUDA-version: 10010 (10010), cuDNN: 7.6.5, CUDNN_HALF=1, GPU count: 1CUDNN_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.jpgDone! Loaded 24 layers from weights-fileDetection layer: 16 - type = 28Detection 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-fileDetection layer: 82 - type = 28Detection layer: 94 - type = 28Detection layer: 106 - type = 28
20201105151910.jpg: Predicted in 31.717000 milli-seconds.
QR_CODE: 100%
通过对比发现YOLOv3比YOLOv3-tiny的耗时多。扫码的实时性要求比较高,YOLOv3-tiny更适合QR。
检测模型下载
- yolov3-tiny.weights for QR Code
- yolov3.weights for QR Code
从头开始训练一个检测QR二维码区域的YOLOv3模型相关推荐
- Matlab实现 通过检测QR二维码位置探测图案进行精确定位
近邻点集融合算法 QR二维码结构简介 QR二维码识别中在对图像预处理后最重要的一步就是要进行定位,QR二维码中有三个位置探测图形,通过扫描其特征便可以进行精细定位. 其中位置探测图形的比例特征如下: ...
- 【OpenCV 4开发详解】QR二维码检测
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- OpenCV4.0 快速QR二维码检测测试示例
点击我爱计算机视觉标星,更快获取CVML新技术 近几年由于微信大力推广移动支付,二维码已经成为手机App的标配,在众多种类的二维码中,QR码是最为流行的. 刚刚发布的OpenCV4.0-Alpha新增 ...
- Android OpenCV(四十):QR二维码检测与识别
QR二维码 QR码(英语:Quick Response Code:全称为快速响应矩阵图码)是二维码的一种,于1994年由日本DENSO WAVE公司发明.QR来自英文Quick Response的缩写 ...
- 目标检测:二维码检测方案
Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...
- Jetson Nano 从入门到实战(转载)(案例:Opencv配置、人脸检测、二维码检测)
目录 1. Jetson Nano简介 2. Jetson Nano环境配置 2.1 开箱配件介绍 2.2 烧录系统 2.3 开机和基本设置 2.4 开发环境配置 2.4.1 更新源和软件 2.4.2 ...
- Jetson Nano 从入门到实战(案例:Opencv配置、人脸检测、二维码检测)
目录 1. Jetson Nano简介 2. Jetson Nano环境配置 2.1 开箱配件介绍 2.2 烧录系统 2.3 开机和基本设置 2.4 开发环境配置 2.4.1 更新源和软件 2.4.2 ...
- Opencv的使用小教程3——利用轮廓检测实现二维码定位
Opencv的使用小教程3--利用轮廓检测实现二维码定位 二维码具有什么特征 实现效果 识别二维码的流程 1.预处理图像 2.寻找轮廓 3.通过寻找到的轮廓确定"回"的位置 4.创 ...
- QR二维码的攻击方法与防御
Blackeagle · 2013/07/03 18:59 QR二维码(Quick Response Code)是由日本丰田子公司Denso Wave于1994年发明并开始使用的一种矩阵二维码符号.与 ...
最新文章
- webpack entry和output配置属性
- 淘系的音视频编辑方案:非线性编辑引擎
- 树莓派 触摸屏_如何用树莓派搭建一个颗粒物(PM2.5)传感器
- React之函数式组件
- 闲谈神经网络--写给初学者(三)
- 智能车路径提取matlab_遗传算法求解多车型车辆路径问题
- mysql log error_MySQL日志之error_log
- 3.Entity Framework Core 5.0 设置字段属性
- 教程——Wind Turbine Maintenance(Agents)
- ie 验证码图片不显示解决
- JavaWeb~Servlet~深入理解Cookie
- 经济学十大原理(七)政府有时候可以改善市场结果
- system32下 exe文件作用
- 投资组合的方差公式推导
- 09|自研or借力(下):集成Gin替换已有核心
- 关于sessions.ser文件的一些思考
- 分享125个ASP源码,总有一款适合你
- php php_openssl.dll,php_openssl.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...
- Python网络爬虫:爬取豆瓣上《小王子》书评
- php项目css加载失败,浅谈CSS加载失败的6个原因