提交 1d9f8a23 编写于 作者: M MaoXianxin

更新2篇OpenCV文章

上级 4116bc59
......@@ -3,7 +3,7 @@
来看看4.5.2都有哪些重要改进:
- **core模块**:增加并行后端的支持。特殊编译的OpenCV可以允许选择并行后端,并/或通过plugin动态载入。
- **imgpro模块**:增加智能剪刀功能(如下演示)。CVAT标注工具已经集成此功能,可在线体验https://cvat.org
- **imgpro模块**:增加智能剪刀功能(如下演示)。CVAT标注工具已经集成此功能,可在线体验[https://cvat.org](https://cvat.org)
- **videoio模块**:改进硬件加速的视频编解码任务。从4.5.2开始,新的内置属性让用户更容易使用API
......@@ -17,7 +17,7 @@ VideoCapture capture(filename, CAP_FFMPEG,
- **DNN模块:**
- - 改进TensorFlow解析错误的调试
- 改进TensorFlow解析错误的调试
- 改进layers和activations,支持更多模型
......@@ -29,7 +29,7 @@ VideoCapture capture(filename, CAP_FFMPEG,
- **G-API模块:**
- - Python支持
- Python支持
- - 引入新的Python后端:G-API可以运行Python的任意kernels作为pipeline的一部分
- 扩展G-API Python绑定的推理支持
......@@ -58,13 +58,13 @@ VideoCapture capture(filename, CAP_FFMPEG,
- **文档:**
- - [GSoC]增加TF和PyTorch分类转换案例
- [GSoC]增加TF和PyTorch分类转换案例
- [GSoC]增加TF和PyTorch分割转换案例
- [GSoC]增加TF和PyTorch检测转换案例
- **社区贡献:**
- - core:增加带cuda stream标志的cuda::Stream构造函数
- core:增加带cuda stream标志的cuda::Stream构造函数
- highgui:Win32上的OpenGL暴露VSYNC窗口属性
- highgui:Win32上的pollKey()实现
- imgcodecs:增加PNG的Exif解析
......@@ -78,4 +78,4 @@ VideoCapture capture(filename, CAP_FFMPEG,
更多详细信息请参考:
https://github.com/opencv/opencv/wiki/ChangeLog#version452
\ No newline at end of file
[https://github.com/opencv/opencv/wiki/ChangeLog#version452](https://github.com/opencv/opencv/wiki/ChangeLog#version452)
\ No newline at end of file
**好消息!曾为非正式但又广为流行的OpenCV-Python软件包现已成为官方OpenCV项目了!**
OpenCV-Python是Python的一个预编译的只支持CPU的OpenCV包,使用pip install opencv-python便可在Windows、Linux(x86_64和aarch64)以及MacOS(x86_64)上安装Python的OpenCV。
此软件包包含预编译的OpenCV以及Python绑定,所以无需单独安装OpenCV。软件包的开发和维护者Olli-Pekka Heinisuo([https://github.com/skvark](https://github.com/skvark))同意将此方案转交给OpenCV成为官方项目。感谢Olli-Pekka Heinisuo和其他33名贡献者的工作。OpenCV团队目前正在针对最新的基于Apple M1的硬件提供支持。
非常高兴opencv-python、opencv-python-headless、opencv-contrib-python和opencv-contrib-python-headless终于“回家”了!
更多OpenCV-Python信息:
[https://github.com/opencv/opencv-python](https://github.com/opencv/opencv-python)
新闻链接:
[https://opencv.org/opencv-python-is-now-an-official-opencv-project/](https://opencv.org/opencv-python-is-now-an-official-opencv-project/)
\ No newline at end of file
......@@ -103,12 +103,12 @@ float trackerEval(Mat img, trackerConfig& trackState, Net& siamRPN)
全部代码请参考:
https://github.com/opencv/opencv/blob/master/samples/dnn/dasiamrpn_tracker.cpp
[https://github.com/opencv/opencv/blob/master/samples/dnn/dasiamrpn_tracker.cpp](https://github.com/opencv/opencv/blob/master/samples/dnn/dasiamrpn_tracker.cpp)
参考资料:
1. 原始论文:https://arxiv.org/abs/1808.06048
1. 原始论文:[https://arxiv.org/abs/1808.06048](https://arxiv.org/abs/1808.06048)
2. 原始PyTorch实现:https://github.com/foolwood/DaSiamRPN
2. 原始PyTorch实现:[https://github.com/foolwood/DaSiamRPN](https://github.com/foolwood/DaSiamRPN)
3. OpenCV中Python实现:https://github.com/opencv/opencv/blob/master/samples/dnn/dasiamrpn_tracker.py
\ No newline at end of file
3. OpenCV中Python实现:[https://github.com/opencv/opencv/blob/master/samples/dnn/dasiamrpn_tracker.py](https://github.com/opencv/opencv/blob/master/samples/dnn/dasiamrpn_tracker.py)
\ No newline at end of file
......@@ -142,7 +142,7 @@ conv3x3和conv3x3_parallel在我的笔记本电脑上运行时间对比如下:
- Windows并发(运行时部分, Windows,MSVC++ >= 10自动使用)
- Pthreads
在刚发布的[OpenCV 4.5.2版本](http://mp.weixin.qq.com/s?__biz=MjM5NTE3NjY5MA==&mid=2247485520&idx=1&sn=fbdcafdbdecb75cb327cbc91f280960d&chksm=a6fdc1cd918a48dbcd156126656c8c6a5c29618bf57669d1d5045573b3d7cc6e911b978967e6&scene=21#wechat_redirect),增加了支持并行框架的选择。特殊编译的OpenCV可以允许选择并行后端,并/或通过plugin动态载入。如:
在刚发布的OpenCV 4.5.2版本,增加了支持并行框架的选择。特殊编译的OpenCV可以允许选择并行后端,并/或通过plugin动态载入。如:
```
# TBB plugin
......@@ -160,8 +160,8 @@ cmake --build . --config Release
参考资料:
[1] https://docs.opencv.org/master/d7/dff/tutorial_how_to_use_OpenCV_parallel_for_.html
[1] [https://docs.opencv.org/master/d7/dff/tutorial_how_to_use_OpenCV_parallel_for_.html](https://docs.opencv.org/master/d7/dff/tutorial_how_to_use_OpenCV_parallel_for_.html)
[2] https://github.com/opencv/opencv/wiki/ChangeLog
[2] [https://github.com/opencv/opencv/wiki/ChangeLog](https://github.com/opencv/opencv/wiki/ChangeLog)
[3] https://github.com/opencv/opencv/pull/19470
\ No newline at end of file
[3] [https://github.com/opencv/opencv/pull/19470](https://github.com/opencv/opencv/pull/19470)
\ No newline at end of file
文件已添加
文件已添加
2011年12月微信3.5版本正式上线“扫一扫”二维码,历经9年蜕变,“扫一扫”从二维码名片到扫码支付、从小程序码到健康码,二维码已经成为一种生活方式,连接着数字与现实。
现在,在腾讯WeChatCV团队的贡献下,微信扫码引擎正式加入OpenCV开源了!只需3行代码,你便轻松拥有微信的扫码能力:
```
import cv2
detector = cv2.wechat_qrcode_WeChatQRCode("detect.prototxt", "detect.caffemodel", "sr.prototxt", "sr.caffemodel")
img = cv2.imread("img.jpg")
res, points = detector.detectAndDecode(img)
print(res, points)
```
微信扫码引擎收录于:
opencv_contrib/modules/wechat_qrcode
开发文档:
[https://docs.opencv.org/master/d5/d04/classcv_1_1wechat__qrcode_1_1WeChatQRCode.html](https://docs.opencv.org/master/d5/d04/classcv_1_1wechat__qrcode_1_1WeChatQRCode.html)
微信扫码引擎是一款基于开源引擎ZXing,并高度优化和深度改造的高性能轻量二维码识别器。
# 基于CNN的二维码检测
**“一图多码**”是扫码支付经常遇到的线下场景。早在2016年,微信扫码引擎在业内率先支持远距离二维码检测、自动调焦定位、多码检测识别。然而,传统方法需要牺牲40%以上的性能来支持多码的检测与识别。伴随着深度学习技术的成熟和移动端计算能力的提升,微信扫码引擎引入基于CNN的二维码检测器解决上述问题。
![](./imgs/26.jpg)
图1 二维码检测器
我们以SSD框架为基础,构造了短小精干的二维码检测器(图1),采用残差连接(Residual Concat)、深度卷积(Depthwise Convolution)、空洞卷积(Dilated Convolution)、卷积投影(Convolution Projection)等技术进行了针对性的优化。**整个模型大小仅943KB**,iPhone7(A10)单CPU的推理时间仅需20ms,很好地满足“低延时、小体积、高召回”的业务需求。
检测代码:
[https://github.com/opencv/opencv_contrib/blob/master/modules/wechat_qrcode/src/wechat_qrcode.cpp#L156](https://github.com/opencv/opencv_contrib/blob/master/modules/wechat_qrcode/src/wechat_qrcode.cpp#L156)
模型文件:
[https://github.com/WeChatCV/opencv_3rdparty/blob/wechat_qrcode/detect.prototxt](https://github.com/WeChatCV/opencv_3rdparty/blob/wechat_qrcode/detect.prototxt)
参数文件:
[https://github.com/WeChatCV/opencv_3rdparty/blob/wechat_qrcode/detect.caffemodel](https://github.com/WeChatCV/opencv_3rdparty/blob/wechat_qrcode/detect.caffemodel)
# 基于CNN的二维码增强
**大图小码**”是远距扫码和长按识码经常面临的难点,二维码增强技术可以让小码更加清晰。2014年,微信率先在对话中上线“识别图中二维码”能力,离不开增强技术的加持。在长按识别的场景中,二维码图像经过用户的裁剪、压缩、转发,图像质量严重受损,分辨率急剧下降,边缘变得模糊不清,这给扫码引擎的识别带来了极大的挑战。
传统图像增强算法很难完美地解决以上问题,因此微信扫码引擎率先在识别流程中引入了基于深度学习的超分辨率技术(图2)。在网络结构上,密集连接(Dense Concat)、深度卷积(Depthwise Convolution)、反向卷积(Deconvolution)、残差学习(Residual Learning)等技术改善模型的性能;在目标函数上,针对二维码强边缘和二值化的特点,结合L2/L1损失、边界加权、二值约束设计了针对二维码的目标函数。经过精心的调优,**超分辨率模型大小仅23KB**,在iPhone7(A10)单CPU的推理时间仅需6ms(100x100超分200x200),完全满足移动端的应用需求。
![](./imgs/27.jpg)
图2 二维码超分辨率
超分代码:[https://github.com/opencv/opencv_contrib/blob/master/modules/wechat_qrcode/src/wechat_qrcode.cpp#L68](https://github.com/opencv/opencv_contrib/blob/master/modules/wechat_qrcode/src/wechat_qrcode.cpp#L68)
模型文件:
[https://github.com/WeChatCV/opencv_3rdparty/blob/wechat_qrcode/sr.prototxt](https://github.com/WeChatCV/opencv_3rdparty/blob/wechat_qrcode/sr.prototxt)
参数文件:
[https://github.com/WeChatCV/opencv_3rdparty/blob/wechat_qrcode/sr.caffemodel](https://github.com/WeChatCV/opencv_3rdparty/blob/wechat_qrcode/sr.caffemodel)
# 更鲁棒的定位点检测
二维码在识别的时候,通常需要根据扫描像素行/列匹配对应比例来寻找定位点(图3)。
![](./imgs/28.jpg)
图3 二维码定位点
在定位点检测上,我们提出面积法的定位点检测方法,相比于传统扫描线方法更为鲁棒和高效,有效地避免了误召回和漏召回;在定位点匹配上,特征聚类方法使得扫码引擎可以高效和准确地匹配多个定位点;在图像二值化上,引入多种更为鲁棒的二值化方法,有效地提高解码的成功率。
核心代码:
[https://github.com/opencv/opencv_contrib/blob/master/modules/wechat_qrcode/src/wechat_qrcode.cpp#L117](https://github.com/opencv/opencv_contrib/blob/master/modules/wechat_qrcode/src/wechat_qrcode.cpp#L117)
结合传统计算机视觉和深度学习技术,微信扫码引擎解决了一图多码、大图小码、鲁棒解码等业务痛点和技术难点。如今,该引擎在OpenCV上正式开源,期待广大开发者与我们一同打造业内领先的扫码引擎!
\ No newline at end of file
作者:梁峻豪,王天麒,孙中夏 (南方科技大学计算机科学与工程系)
最近,我们为OpenCV贡献了一维条形码识别模块,代码收录在:
最近,我们为OpenCV贡献了一维条形码识别模块,代码收录在:[https://github.com/opencv/opencv_contrib/tree/master/modules/barcode](https://github.com/opencv/opencv_contrib/tree/master/modules/barcode)
https://github.com/opencv/opencv_contrib/tree/master/modules/barcode。
我们收集的数据集(数据集地址:https://github.com/SUSTech-OpenCV/BarcodeTestDataset,
共250张条码图片)上进行了测试,我们的识别算法正确率达到了96%,速度为20ms每张图像。作为对比,我们也测试了ZXing在该数据集上的表现,其正确率为64.4%,速度为90ms每张图像。
我们收集的数据集(数据集地址:[https://github.com/SUSTech-OpenCV/BarcodeTestDataset](https://github.com/SUSTech-OpenCV/BarcodeTestDataset),共250张条码图片)上进行了测试,我们的识别算法正确率达到了**96%**,速度为**20ms**每张图像。作为对比,我们也测试了ZXing在该数据集上的表现,其正确率为**64.4%**,速度为**90ms**每张图像。
注:测试速度不包含初始化以及读图时间。同时,我们的算法是C++实现,ZXing是Java实现。另外,对于用图片数据集进行的测试,ZXing99%的时间是在做彩色图到灰度图的转换。
......@@ -90,8 +86,8 @@ ok, decoded_info, decoded_type, corners = bardet.detectAndDecode(img)
更多使用方式请参考文档:
https://docs.opencv.org/master/dc/df7/classcv_1_1barcode_1_1BarcodeDetector.html
[https://docs.opencv.org/master/dc/df7/classcv_1_1barcode_1_1BarcodeDetector.html](https://docs.opencv.org/master/dc/df7/classcv_1_1barcode_1_1BarcodeDetector.html)
# 参考文献
王祥敏,汪国有. 一种基于方向一致性的条码定位算法[EB/OL]. 北京:中国科技论文在线 [2015-04-22]. http://www.paper.edu.cn/releasepaper/content/201504-338.
\ No newline at end of file
王祥敏,汪国有. 一种基于方向一致性的条码定位算法[EB/OL]. 北京:中国科技论文在线 [2015-04-22]. [http://www.paper.edu.cn/releasepaper/content/201504-338](http://www.paper.edu.cn/releasepaper/content/201504-338).
\ No newline at end of file
......@@ -16,9 +16,7 @@ nanodet通过一些论文里的trick组合起来得到了一个兼顾精度、
最后,项目作者借鉴了 YOLO 系列的做法,将边框回归和分类使用同一组卷积进行计算,然后 split 成两份。最后,项目作者借鉴了 YOLO 系列的做法,将边框回归和分类使用同一组卷积进行计算,然后 split 成两份,这样就组成了nanodet网络。
作者把nanodet发布在github上,项目地址: https://github.com/RangiLyu/nanodet,
下载代码和模型文件到本地,按照README文档运行一个前向推理程序。接下来,我阅读前向推理主程序demo.py文件,尝试理解在运行这个主程序时需要调用哪些函数和.py文件。在前向推理主程序demo.py文件,对一幅图片做目标检测是在Predictor类的成员函数inference里实现的,它里面包含了对输入图片做预处理preprocess,前向计算forward和后处理postprocess这三个步骤。Predictor类的定义如下图所示
作者把nanodet发布在github上,项目地址: [https://github.com/RangiLyu/nanodet](https://github.com/RangiLyu/nanodet),下载代码和模型文件到本地,按照README文档运行一个前向推理程序。接下来,我阅读前向推理主程序demo.py文件,尝试理解在运行这个主程序时需要调用哪些函数和.py文件。在前向推理主程序demo.py文件,对一幅图片做目标检测是在Predictor类的成员函数inference里实现的,它里面包含了对输入图片做预处理preprocess,前向计算forward和后处理postprocess这三个步骤。Predictor类的定义如下图所示
![](./imgs/9.jpg)
......@@ -44,11 +42,9 @@ nanodet通过一些论文里的trick组合起来得到了一个兼顾精度、
综上所述,在预处理模块Pipeline类包含了很多冗余的计算,图像预处理本身是一个简单问题,但是在官方代码里却把简单问题搞复杂化了。
官方代码仓库(https://github.com/RangiLyu/nanodet)
里提供了基于 ncnn 推理框架的实现,基于mnn,libtorch,openvino的实现,但是没有基于Opencv的dnn模块的实现。于是我就编写一套基于Opencv的dnn模块的实现,程序里包含Python和C++两个版本的代码。
官方代码仓库([https://github.com/RangiLyu/nanodet](https://github.com/RangiLyu/nanodet))里提供了基于 ncnn 推理框架的实现,基于mnn,libtorch,openvino的实现,但是没有基于Opencv的dnn模块的实现。于是我就编写一套基于Opencv的dnn模块的实现,程序里包含Python和C++两个版本的代码。
**地址是** **https://github.com/hpc203/nanodet-opncv-dnn-cpp-python**
**地址是**[ **https://github.com/hpc203/nanodet-opncv-dnn-cpp-python**](https://github.com/hpc203/nanodet-opncv-dnn-cpp-python)
在这套程序里,图像预处理模块沿用了ultralytics代码仓库里的letterbox函数使用opencv库里的resize和copyMakeBorder就可以实现保持高宽比的resize。此外,在网上有很多介绍nanodet网络结构的文章,但是在文章里没有对nanodet后处理模块做详细介绍的。因此,在编写这套程序时,我最关注的是nanodet的后处理模块,在nanodet网络输出之后,经过怎样的矩阵计算之后得到检测框的左上和右下两个顶点的坐标(x,y)的值的。接下来,我结合代码来理解后处理模块的运行原理。首先,原图经过预处理之后形成一个320x320的图片作为nanodet网络的输入,经过forward前向计算后会得到40x40,20x20,10x10这三种尺度的特征图(换言之就是原图缩小8倍,16倍,32倍),在程序代码里设断点调试,查看中间变量,截图如下:
......@@ -82,4 +78,4 @@ nanodet通过一些论文里的trick组合起来得到了一个兼顾精度、
![](./imgs/22.jpg)
**Github传送门****https://github.com/hpc203/nanodet-opncv-dnn-cpp-python**
\ No newline at end of file
**Github传送门**[**https://github.com/hpc203/nanodet-opncv-dnn-cpp-python**](https://github.com/hpc203/nanodet-opncv-dnn-cpp-python)
\ No newline at end of file
......@@ -56,6 +56,10 @@
## OpenCV
**2021-05-26新增**[微信二维码引擎OpenCV开源!3行代码让你拥有微信扫码能力-2021-01-31](./OpenCV/微信二维码引擎OpenCV开源!3行代码让你拥有微信扫码能力-2021-01-31.md)
**2021-05-26新增**[OpenCV-Python成为官方OpenCV项目-2021-02-26](./OpenCV/OpenCV-Python成为官方OpenCV项目-2021-02-26.md)
**2021-05-25新增**[用OpenCV实现条形码识别-2021-04-22](./OpenCV/用OpenCV实现条形码识别-2021-04-22.md)
**2021-05-25新增**[OpenCV中的并行计算parallel_for_(1)-2021-04-07](./OpenCV/OpenCV中的并行计算parallel_for_(1)-2021-04-07.md)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册