社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

强强联合,OpenCV搭载飞桨模型,帮你轻松玩转深度学习

我爱计算机视觉 • 3 年前 • 532 次点击  

OpenCV 是一个跨平台的开源的计算机视觉库,提供了 Python、Ruby、MATLAB 等语言的接口。下一个版本OpenCV 5.0 不仅仅支持常规的图像分类、目标检测、图像分割和风格迁移功能,还引入上百个的CV方向任务。


飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,集深度学习核心训练和推理框架、基础模型库、端到端开发套件和丰富的工具组件于一体,是中国首个自主研发、功能丰富、开源开放的产业级深度学习平台。飞桨目前官方模型库支持300+个产业级开源算法,覆盖语音、视觉、NLP、推荐等领域大规模应用。


随着人工智能及深度学习视觉技术的快速发展,OpenCV从3.3版本就开始引入DNN模块,通过ONNX等多种格式支持对深度学习模型的加载和推理,并且支持OpenCL加速,非常方便用户使用,后端的推理引擎也支持多种选择。


应广大开发者的要求,飞桨社区和OpenCV社区双方启动合作,在OpenCV DNN模块中增加PaddlePaddle飞桨模型的支持。飞桨一系列特色模型可快速通过OpenCV进行加载和推理,极大方便了应用开发者,大大加速开发流程。


下面详细跟大家介绍OpenCV DNN模块以及如何通过 OpenCV DNN模块进行飞桨PaddlePaddle模型的加载和预测。


什么是DNN模块?


OpenCV中的DNN(Deep Neural Network)模块是专门用于实现深度学习预测推理功能的模块,包括目标检测、图像分割任务等。OpenCV可以载入其他深度学习框架(例如PaddlePaddle、PyTorch等等)训练好的模型,并使用该模型进行预测。


为什么要用DNN模块?


OpenCV的DNN模块主要有以下三点优势:


1、轻量,由于DNN模块只实现了推理功能,它的代码量、编译运行开销与其他深度学习框架比起来会少很多。


2、方便,DNN模块提供了内建的CPU和GPU加速且无须依赖第三方库。


3、通用,DNN模块支持多种网络模型格式,因此用户无须额外进行网络模型的转换就可以直接使用,同时它还支持多种运算设备和操作系统。


除此之外,DNN模块还在网络层面做了一些优化,包括层融合、内存复用等。下图为不同框架在 CPU 上使用Tiny YOLOV4算法进行目标检测任务时速度的比较。(图片来自LearnOpenCV.com)



可以看到在相同视频下,OpenCV的DNN模块可以达到35FPS,而使用OpenMP和AVX编译的Darknet只有15FPS,速度提升了足足1.3倍!


如何利用DNN模块部署飞桨模型?


目前DNN模块部署支持ONNX模型,而飞桨开源框架在升级2.0之后也支持模型导出为ONNX格式。框架内置paddle.onnx.export接口(https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/onnx/export_cn.html),用户在代码中可以调用接口以ONNX协议格式保存模型。此外,对于用户已经保存的飞桨模型,也可以通过Paddle2ONNX加载后进行转换。Paddle2ONNX为飞桨与ONNX开源组织合作的项目。不了解的童鞋快戳链接,了解Paddle2ONNX项目。


项目链接:

https://github.com/PaddlePaddle/Paddle2ONNX


整体流程图如下图所示:



下面将向大家展示如何将PaddleSeg的人像分割模型导出为 ONNX 格式的模型,并使用OpenCV的DNN模块进行部署。


环境准备


pip install paddlepaddle-gpupip install paddlehubpip install paddle2onnx


将人像分割模型导出为ONNX格式


1、获得PaddleSeg人像分割的预测模型


wget https://x2paddle.bj.bcebos.com/inference/models/humanseg_hrnet18_small_v1.zipunzip humanseg_hrnet18_small_v1.zip


2、通过Paddle2ONNX导出ONNX模型


paddle2onnx --model_dir humanseg_hrnet18_small_v1 \--model_filename model.pdmodel \--params_filename model.pdiparams \--opset_version 11 \--save_file humanseg_hrnet18_tiny.onnx


这样在当前路径就能获得名为humanseg_hrnet18_tiny.onnx的ONNX模型


OpenCV DNN模块加载模型


运行如下代码:




上述代码主要分为三个步骤:


1、通过cv2.dnn.readNetFromONNX接口加载ONNX模型

2、对图片进行预处理并进行预测
3、对预测结果后处理并可视化


完整代码在如下链接:

https://github.com/opencv/opencv/blob/master/samples/dnn/dnn_model_runner/dnn_conversion/paddlepaddle/paddle_humanseg.py


最终就可以得到下图所示的分割结果啦!



是不是很方便呢,想体验的小伙伴赶紧上手试试吧!

未来,飞桨社区将与OpenCV在技术和社区上展开更深入合作,在现有基础上支持更多飞桨模型;同时原生支持飞桨模型的加载和推理,并通过更深层次的优化获得极佳的推理性能。欢迎大家持续关注飞桨。


直播预告


10.20号,我们还将邀请OpenCV中文社区的负责人于仕琪老师给大家介绍下一个版本OpenCV5.0规划以及如何使用OpenCV部署飞桨模型。敬请期待!


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/121613
 
532 次点击