基于YOLOv5的qr码二维码识别,采用YOLOv 5定位出qr码区域,在调用zbar
这里有个细节,YOLOv5的预训练模型是不带二维码检测的,得自己搞数据集训练。实测中发现传统方法在复杂场景下容易翻车,比如QR码被遮挡、光照不均或者存在大量干扰元素的时候,这时候上深度学习就香多了。基于YOLOv5的qr码二维码识别,采用YOLOv 5定位出qr码区域,在调用zbar,zxing或者opencv对qr码进行识别。基于YOLOv5的qr码二维码识别,采用YOLOv 5定位出qr码区域
基于YOLOv5的qr码二维码识别,采用YOLOv 5定位出qr码区域,在调用zbar,zxing或者opencv对qr码进行识别
直接上干货!今天跟大家唠唠怎么用YOLOv5玩转二维码识别。实测中发现传统方法在复杂场景下容易翻车,比如QR码被遮挡、光照不均或者存在大量干扰元素的时候,这时候上深度学习就香多了。

基于YOLOv5的qr码二维码识别,采用YOLOv 5定位出qr码区域,在调用zbar,zxing或者opencv对qr码进行识别
先甩个核心流程:YOLOv5负责框出二维码位置,抠出这个小方块扔给解码库(zbar/opencv随便挑)。这里有个细节,YOLOv5的预训练模型是不带二维码检测的,得自己搞数据集训练。我直接拿labelImg标注了2000张含二维码的图片,注意标注时候要把整个QR码框进去,包括边缘的空白区。

训练配置文件特别要注意这两个参数:
nc: 1 # 就检测二维码一个类别
anchors: [ [10,13, 16,30, 33,23], [30,61, 62,45, 59,119], [116,90, 156,198, 373,326] ] # 官方预设不用改
实测用YOLOv5s模型在GTX 1660上训了300个epoch,mAP@0.5能飙到0.97。训练完的模型推理代码长这样:
import torch
model = torch.hub.load('ultralytics/yolov5', 'custom', path='qr_detection.pt')
results = model(img)
boxes = results.xyxy[0].cpu().numpy() # 拿到检测框坐标
抠图解码才是真功夫!这里容易踩的坑是直接截取整图送解码器,其实应该先做透视变换把二维码拉正。个人比较喜欢用OpenCV的warpPerspective:
import cv2
qrcode_roi = img[y1:y2, x1:x2]
gray = cv2.cvtColor(qrcode_roi, cv2.COLOR_BGR2GRAY)
# 最后上解码
from pyzbar import pyzbar
barcodes = pyzbar.decode(gray)
print(barcodes[0].data.decode('utf-8'))
遇到模糊二维码时,可以试试先做超分处理。最近发现RealESRGAN效果不错:
from basicsr.archs.rrdbnet_arch import RRDBNet
model = RRDBNet(num_in_ch=3, num_out_ch=3)
upscaled_img = esrgan_upscale(qrcode_roi) # 具体实现参考ESRGAN项目
实测在奶茶店扫码场景下(强光/水渍/贴纸覆盖),这套方案识别率比传统方法高38%。最后提醒:部署时记得把YOLOv5转成ONNX格式,推理速度能提升20%左右。代码量不大但细节多,建议把预处理和后处理单独封装成类。
更多推荐
所有评论(0)