2.1 深度学习模块分层架构总览
在1.3.2节中,我们通过一个图像分类程序展示了DNN模块的简单用法。知其然还需知其所以然,我们不仅需要知道如何使用,而且需要知道这是如何实现的,以及具体的结构。这样,在做后期性能调优的时候,我们的盲点会更少,可以有的放矢,更进一步。OpenCV深度学习模块的分层架构如图2-1所示。
图2-1 OpenCV深度学习模块的分层架构
第一层:Python语言绑定层。它提供了Python语言的调用接口,使得基于DNN模块的应用开发更加快速、便捷,这也是学习DNN模块的很好切入点。处于同一层的组件还包括正确性测试、性能测试和示例程序。
1)正确性测试针对每个DNN层的实现进行单元测试,保证计算输出的正确性。
2)性能测试提供DNN模块使用各种加速后端运行各种网络模型的测试用例,最终给出运行时间数据。
3)示例程序展示了使用DNN模块实现常见的深度学习计算机视觉应用的具体方法。
第二层:C++API层。OpenCV提供了C++语言编程接口,这也是DNN模块的原生接口。
注意 OpenCV提供的是C++API。如果用户的应用程序是基于C语言的实现,需要在C++语言之上加一层C API适配层。我们曾向OpenCV社区提过建议,增加C语言接口,社区表示正在计划中。另外,DNN的接口数量并不多,按需由开发人员在应用程序中添加,也是可以接受的。
第三层:DNN引擎层。这一层包括各种实现细节:如何导入一个深度学习的模型、如何管理数据对象、DNN网络的内部表示、各种网络层类型的实现及层级别的优化等。我们会在2.4节展开分析。
第四层:引擎加速层。DNN模块针对不同的硬件设备提供了不同的加速方案。任何软件都是运行在特定硬件上的,进行深度学习模型部署的时候,我们需要根据目标硬件合理地选择加速方案以达到最好的性能。引擎加速层主要有CPU加速、GPU加速、Intel推理引擎加速和Halide加速等。
读者可以通过阅读本章后续章节,进一步了解OpenCV DNN内部不同层次的实现细节。