1.OpenCV中几种卷积的实现方式
2.人脸识别的对比 – OpenCV, Dlib and Deep Learning
3.OpenCV中DNN库的架构
4.OpenCV/dnn库的各层实现架构
5.opencv中的Dnn模块怎么用Java调用
6.在windows11上编译opencv使用cuda加速
OpenCV中几种卷积的实现方式
自从opencv引入dnn模块后,卷积实现方式不断扩展,以适应PC、手机、边缘计算设备的部署需求。目前,家谱管理源码可调用CUDA、OpenCL、Tengine、Vulkan实现卷积。Tengine、Vulkan特别适用于移动设备和边缘计算,它们内部是如何实现的?
Vulkan是一个渲染库,与OpenGL、DirectX等GPU渲染库相比,移动设备上使用较多,而深度学习模型又需要在移动设备上部署。因此,探索是否可以使用Vulkan实现卷积等深度学习操作。
接下来,让我们看看OpenCV是如何使用Vulkan实现深度神经网络中的卷积。
打开OpenCV源码库的modules/dnn/src目录,可以看到最后一个文件夹是vkcom。"vkcom"这个名字由"Vulkan"库本身与"comp"(glsl语言的源代码后缀)组成。glsl语言可以通过以下命令编译:“vkcom”。GLSL是OpenGL着色语言,用于编写OpenGL着色器的编程语言,通常与并行处理功能强大的GPU结合使用。深度学习操作如卷积、池化都是对图像颜色的处理,因此可以将这些操作实现为着色器,用GLSL编写,然后使用Vulkan调用GPU。
Vulkan实现的卷积代码示例如下:
代码中指定了输入输出变量(第3、6、applua工程源码9、行)。在第行计算了输出变量convolved_image_data的值。第行开始的for循环遍历卷积核的c、w、h,计算单个像素位置的卷积结果。显然,这个卷积仅计算一个像素位置的卷积结果,卷积核的滑动过程由Vulkan管理GPU,多个GPU计算单元并行完成。
在OpenCV中,文件conv.comp首先被编译为二进制,然后将此二进制作为字符串放入conv_spv.cpp中。cpp文件定义了conv_spv数组,其中包含编译后的卷积着色器执行代码。由OpBase::createShaderModule函数将此二进制送入vkCreateShaderModule,从而调度GPU。
通过分析代码,可以看到Vulkan实现的算子被调用的方式,这同样适用于CUDA、OpenCL、Ngraph、Inference Engine等实现的算子。
Vulkan渲染库在OpenCV中的调用逻辑已经阐述完毕。Tengine是如何使用的?在convolution_layer.cpp的forward函数的行,调用了tengine_forward(tengine_graph)。
Tengine_forward来自teng_run_graph函数,我们只需调用库即可得到结果。传入的graph是卷积图,由create_conv_graph在第行创建。create_conv_graph使用create_conv_node、create_input_node生成卷积算子所需的图。
使用Tengine相对使用Vulkan、公式源码全CUDA等库完成算子,要简单许多。调用库内的函数生成节点,使用节点构建图即可,无需自己实现算子内的计算。
本文概述了OpenCV中卷积实现方式的多样性,以下为总结:
本文详细分析了使用Vulkan用着色器实现卷积计算的方法及其调用路径,这个路径在分析其他类型实现时也很有用。本文还探讨了不同库算子的兼容性。当然,不同算子兼容还涉及更多细节,本文仅关注卷积forward函数的传递。
本文后半部分简要介绍了Tengine在OpenCV中的集成。发现集成过程相对简单,在convolution_layer.cpp中直接运行Tengine库构建的卷积计算图。这也表明,如果存在更好的边缘计算库,很容易集成到OpenCV中。
通过几天的分析,我们已经了解了OpenCL、Vulkan、Tengine的实现方式。可以预计,CUDA、Halide、Inference Engine nn、Inference Engine NGraph等实现也会类似。
人脸识别的对比 – OpenCV, Dlib and Deep Learning
在本教程中,我们将比较和探讨OpenCV、Dlib和深度学习中的几种人脸识别方法。我们将提供代码示例,并讨论每种方法的优缺点,同时分享如何根据特定应用选择合适模型的实用规则。 我们假设图像尺寸为×。亿图源码一、OpenCV中的Haar级联人脸检测器
基于Haar级联的人脸检测技术自年Viola和Jones提出以来,一直是先进的人脸检测技术。近年来进行了许多改进,OpenCV提供了多种基于Haar的模型。 代码示例用于加载haar级联模型文件并将其应用于灰度图像。输出包含检测到的面孔列表,每个成员是包含坐标和尺寸的四个元素列表。优点
简单、高效,适合实时应用。缺点
可能在检测复杂背景下的小或部分遮挡的脸时表现不佳。二、OpenCV中的DNN人脸检测器
这种模型基于ResNet-架构,使用Caffe或TensorFlow进行训练。输出为归一化坐标,表示边界框。 代码加载模型,并使用前向传播进行检测。输出为4-D矩阵,边界框坐标需乘以原始图像大小。优点
克服了Haar级联的缺点,适用于更复杂背景。缺点
计算速度慢于基于Haar的检测器。三、Dlib中的HoG Face检测器
基于HoG特征和SVM的模型,由5个HOG过滤器组成,适用于多种视角。模型嵌入头文件中。 代码加载检测器,将图像通过检测器,输出为包含坐标和大小的面部列表。优点
适用于多种条件,如非正面角度。数字银行源码缺点
可能在检测小脸时表现不佳。四、Dlib中的CNN人脸检测器
基于CNN的检测器,使用MMOD(最大边缘对象检测器)训练。训练过程简单,无需大量数据。代码加载模型,输出坐标。优点
适用于多种角度和大小的人脸检测。缺点
速度较慢。五、准确度对比
使用FDDB数据集评估模型。结果表明,Dlib在视觉上表现更好,但准确性稍逊于Haar级联和OpenCV-DNN。主要原因是输出边界框大小不同,以及Dlib模型在小脸检测方面存在局限性。优点
视觉上更精确的边界框。缺点
在准确性评估时存在偏见,尤其在小脸检测方面。六、速度对比
使用×图像评估方法的实时性。OpenCV-DNN、Dlib和Dlib的CNN检测器在CPU和GPU上均有显著差异。硬件
处理器:英特尔酷睿i7 KRAM: GB
GPU:NVIDIA GTX Ti, GB内存
操作系统:Linux . LTS
编程语言:Python
代码
在给定图像上运行每个方法次,结果表明除了MMOD外,所有方法均能在实时内执行。MMOD在GPU上非常快,但在CPU上速度较慢。结论
综上所述,建议在大多数情况下使用OpenCV-DNN,因为它快速且准确,即使面对小尺寸人脸。对于中、大型图像尺寸,Dlib的HoG检测器在CPU上速度较快,适用于已知不会处理非常小面孔的应用。高分辨率照片处理时,OpenCV-DNN方法表现较好,因为它能检测小面孔。基于这些分析,可根据具体应用选择合适的人脸识别方法。OpenCV中DNN库的架构
OpenCV/DNN库架构清晰,核心计算单元为算子。算子通过节点被调用,节点在层的前向计算过程中选择性地执行。层的前向计算在网络的前向计算函数中被调用。层内容包含了层对象、输入输出矩阵以及需要调用的节点,多个层内容组成网络。为兼容不同层,使用工厂模式生成层;为兼容不同后台算子,使用策略模式生成节点与数据转换器。
网络架构包括:网络、层内容和层。网络负责整合层内容与层,层内容整合层对象、计算节点、数据转换器与矩阵,用于前向计算。层内容中的计算节点负责具体计算,包含输入数据地址和各种算子,算子可能使用不同后台库实现。
算子可以由不同后台库如vkcom、inf_engine、CUDA等实现,仅需直接调用相关库函数。计算节点用于调用算子,处理不同计算需求。此外,库中也包含直接实现的GPU与CPU算子,包括OpenCL与多线程算子。这些算子同样在层对象的前向计算中被选择性调用。
计算节点扩展了层的计算方式,提供灵活的计算支持。CPU多线程与OpenCL也能够包装成计算节点形式。其他库实现的计算也参照计算节点写法,或采用相似实现方式。OpenCV/DNN库架构清晰,灵活支持各种计算需求。
OpenCV/dnn库的各层实现架构
OpenCV/dnn库的深度网络架构解析
OpenCV/dnn的核心数据结构,即LayerData,是构建深度网络的关键。通过Net类的map结构,这个数据结构构建了一个有向图,代表了网络的层级结构。一旦初始化完毕,map中的所有信息配置完毕,就可以启动深度网络的前向传播过程。 LayerData内部结构详述:它包含了层的编号、名称、类型,以及与计算相关的对象,如计算实例layerInstance和数据转换器。
layerInstance存储了当前层的计算对象,OpenCV/dnn通过工厂模式动态获取,例如,输入层类型为卷积时,会返回一个Convolution_Layer对象。
工厂模式在这里扮演了核心角色,LayerFactory类就是这个“工厂”,通过createLayerInstance函数,根据输入的层类型和参数,生成并返回对应的具体层对象,如Convolution_Layer。 为了统一接口,抽象出了Layer类,而Convolution_Layer等具体层类型成为其子类。这样,无论传入哪种类型的层,LayerFactory都能根据预注册的信息生成相应的对象。 LayerFactory的实现涉及一个表,存储着层类型与其构造函数的对应关系。当需要创建新的层时,工厂会从表中找到对应构造函数并执行,从而得到所需层的实例,如Convolution_Layer。 为了简化注册过程,引入了宏,允许将模版函数直接注册,这样在需要创建层时,只需调用预定义的注册函数,即可得到完整的层对象。一旦所有层都完成注册,LayerData的getLayerInstance()函数就能在运行时获取并执行其计算功能。 综上,OpenCV/dnn库通过这种设计,实现了深度网络中层的动态创建和计算过程的高效管理。opencv中的Dnn模块怎么用Java调用
1.检查环境变量设定。
比如:所编辑的Dll在目录“D:/cppProjects/nativecode/release”内,将这个路径复制添加到电脑的环境变量中的path变量内即可。
2.检查项目属性设定。
右击项目名|选择属性properties|在左边列表内选择“Java Build Path”|在右边选项卡用选择“source”|点开项目名前的“+”号,选择“Native library location”,“Edit”选择上面“D:/cppProjects/nativecode/release”路径。(当然如果将dll拷贝到workspace下也可以用相对路径。也可右击“src”设定其properties内Native Library项。)
在windows上编译opencv使用cuda加速
在Windows 环境下,利用CUDA加速OpenCV的编译过程可以显著提升性能。以下是具体步骤的概述:
1. **环境与软件准备**:
- 安装Windows 、Visual Studio 、CMake-gui以及Anaconda(用于管理Python环境)。
- 确保已安装CUDA工具包、Visual Studio编译器,还需下载OpenCV源码和opencv-contrib源码。
- 需要安装CUDA及CUDNN环境,确保Opencv与opencv-contrib版本匹配。
2. **安装步骤**:
- 下载并安装Visual Studio 和CMake-gui。
- 使用管理员权限打开CMake-gui,设置OpenCV源码路径,可能需要设置Python路径(如果安装在虚拟环境中)。
- 配置Visual Studio版本和平台(位)。
- 配置过程中,确保WITH_CUDA、OPENCV_DNN_CUDA、ENABLE_FAST_MATH等CUDA相关选项被选中,并勾选BUILD_opencv_python3和opencv_contrib模块。
3. **编译过程**:
- 打开CMake-gui,配置CUDA架构(根据显卡型号选择合适的算力)。
- 生成Visual Studio项目(OpenCV.sln),并选择对应版本的Visual Studio打开。
- 选择release版本和x平台进行编译,这可能需要几分钟。
- 完成第一个编译后,进行安装,将OpenCV安装到Anaconda环境中。
4. **测试与参考**:
- 编译成功后,可通过打印数值确认。编译教程参考了如下的博客:
- [opencv-python使用GPU资源](/lujx_/article/details/)
- [CMake编译OpenCV 4.5.5/4.6.0/4.7.0 GPU版及VS配置](/optimistwenshen/article/details/)
- [Windows上编译OpenCV使用CUDA加速DNN模型推理](/optimistwenshen/article/details/)
通过以上步骤,您可以在Windows 上利用CUDA为OpenCV编译加速,提升深度学习和计算机视觉任务的性能。
OpenCV图像处理-DNN模块之分类和检测应用
OpenCV图像处理 - DNN模块的分类和检测应用
OpenCV的深度学习模块(DNN)涵盖了丰富的功能,本文将探讨如何结合GoogleNet进行图像分类和利用Mobilenet-SSD进行目标检测。首先,让我们了解一下DNN模块的应用概况。 DNN模块支持多种深度学习框架的预训练模型,如OpenCV的通用API,允许解析自定义层、执行非最大抑制操作并获取各层信息。例如,加载模型的基本步骤如下:cv2.dnn.readNet(model_path, weights_path)
针对图像分类,我们以支持类的ImageNet数据集和GoogleNet为例,使用OpenCV实现图像标签预测,标签信息存储在文本文件中,读取模型的API如下:labels = read_label_file('labels.txt')
net.setInput(...)
接着,通过将读取的图像转换为四维张量输入模型,进行预测:input_blob = cv2.dnn.blobFromImage(image, ...)
net.forward(input_blob)
对于目标检测,OpenCV的DNN模块支持SSD(Single Shot MultiBox Detector)和Mobile Net-SSD。以Caffe训练的Mobile Net-SSD为例,用于单张和视频检测。视频检测的代码部分有所修改://... (代码调整部分)
通过以上步骤,您可以开始在OpenCV中利用DNN模块进行图像分类和目标检测。对于更多教程和资源,您可以关注GitHub上的OpenCV教程,中文和英文版本都欢迎star支持。