python cuda 如何优化if python opencv cuda加速_python cuda 如何优化if


20200411更新:

经过评论区 @鹤汀凫渚 的指导,我成功的用最简单的方法在python中调用到了GPU加速后的函数,这里把这位朋友的评论贴出来供各位参考:


python cuda 如何优化if python opencv cuda加速_OpenCV_02



以下原文:

本文的核心目的就是加速,在实时图像处理的路上,没有什么比得上加速,速度足够快就能上更复杂的模型,速度足够快就能有更多的预处理,总之,加速就是一切。

为了弥补Opencv-Python接口没有cuda加速的缺陷,本文旨在通过调用C++上才有的cuda模块,对Opencv进行加速,然后将其打包为Python接口后调用。

ps:本来笔者最开始采用的是Cython的第三方解决方案,但是经过同事指教后发现官方的API更加明晰,故改回使用Python官方的API来完成。

目录:

  1. 图像数组的跨平台传递。
  2. 在C++下编写cuda加速的OpenCV代码。

--------------------------------------------------------------------------------

图像数组的跨平台传递

在采用PyTorch或者TF等深度学习框架的项目中,OpenCV主要的工作是针对图像的预处理,因此绝大部分情况下,数据的IO都是通过Python进行的,如何将图像数据从Python跨平台传输到C++下就是我们首先要解决的问题,而在Python下的图像数据基本都是保存为ndarray类型,因此我们需要在C++下也同样引入Numpy库,这个库可以通过APT直接安装,头文件会与Python3的头文件放在一起。

本文主要涉及的C++第三方库包括:

  • OpenCV
  • Numpy
  • Python3.6

代码逻辑为:

  1. 接收来自Python的ndarray数组,将其转为PyArrayObject类
  2. 将PyArrayObject转为OpenCV的Mat类数据
  3. 调用OpenCV对Mat进行图像处理,本文为了演示仅做BGR2GRAY处理
  4. 将处理后的Mat转换为PyArrayObject类
  5. 将PyArrayObject传回给Python,Python会自动将其识别为ndarray类对象

为了完成上面的逻辑,我们需要新建三个类文件:

  1. interface.cpp/.h :接口类,主要负责步骤1,5
  2. conversion.cpp/.h :转换类,主要负责步骤2,4
  3. process.cpp/.h :处理类,主要负责步骤3

先从interface.cpp文件开始:


//interface.cpp


然后是conversion.cpp:


//conversion.cpp


最后是process.cpp:


//process.cpp


最后给出setup.py文件:


from


通过Python3 setup.py install build_ext --inplace命令就可以将包安装进Python3中