openvx specification 第二章:设计概述

第二章:设计概述

2.1 应用场景

Openvx可以直接用于应用程序,也可以作为高级框架或平台api的加速层。就是​

 

2.2 设计目标

Openvx被设计成一个标准化的计算机视觉功能框架,能够在各种平台上运行,并可以让供应商在该平台上实现加速。Openvx可以通过为常用视觉函数以及函数集合提供抽象来提高视觉应用程序的性能和效率,从而尽可能的减少运行时间。

Openvx的目标是尽可能多的覆盖常用的视觉程序。

2.2.1 硬件的优化

本文档中没有说明在其实现中可以使用那种加速方法或技术,供应商可以选择任意数量的实现方法,比如使用并行或者是专门的硬件设备。

本规范也没有对某个性能级别做出声明或要求,因为这可能在不同平台和使用场景之间存在明显的不同。

2.2.2 硬件约束

Openvx专注于可以被不同硬件显著加速的视觉功能。本规范的未来版本可能会在实现这些功能的硬件加速时将附加的视觉功能纳入核心标准。

2.3 设想

2.3.1 可移植性

Openvx的设计宗旨是尽可能地最大化功能和性能的可移植性,同时尽量让API函数不同的设备上都能够使用。在一些情况下对可移植性进行了这种:如使用此API构造的可移植图在不同的openvx实现中返回的结果应该是相似的(在一定的精度范围内)。

在本规范中定义为“实现定义”(implementation-defined)的情况下,可移植性可能会收到损害。

2.3.2 不透明性

Openvx旨在解决广泛的设备和平台中的兼容性问题,从深度嵌入式系统到桌面机器及分布式计算架构。Openvx API为解决这一系列的实现提供了可能,这有别于大多数的程序数据使用不透明的对象将特定的硬件需求强加到特定的实现上。

除了面向客户的结构数据之外,所有的数据都是不透明的。每个实现都提供了用于访问数据的标准化接口,可以满足特定的硬件、平台的分配需求。

从其他API导入或共享的内存不属于openvx,这些仍需要创建者进行维护和访问。Openvx没有规定对内存分配方法或不透明内存对象布局的任何要求,也没有规定架构上结构的字节打包及对齐方式。

2.4 面向对象的行为

Openvx对象在编译时是安全关键型应用程序的强类型对象,在运行时是动态应用程序的强类型对象。每个对象在vx_type_e列表中都有其类型定义和关联枚举值。任何对象都可以向下安全的转为vx_reference,这可以在保证在需要这样做的函数合法,特别是 vxQueryReference,它可以使用vx_enum来获取vx_type_e的值。

2.5 openvx框架对象

该规范定义了以下openvx框架对象:

  1. Object: Contex:openvx上下文是所有openvx对象的对象域。所有数据对象和所有框架对象都存在于上下文中。Openvx上下文保持所有对象的引用计数,并且在解构过程中进行垃圾收集以释放丢失的引用。虽然多个客户端可以连接到openvx上下文,但所有的数据都是私有的额,因为引用数据对象的引用之提供给创建方。在不同上下文中创建的数据对象上调用openvx函数的结果是由实现定义的。
  2. Object: Kernel: openvx中的内核是计算机视觉函数的抽象表示,如“Sobel Gradient” 或 “Lucas Kanade Feature Tracking”. 一个视觉函数可以从其他函数中实现许多类似或相同的特性,但只要它使用相同的字符串和枚举来命名,并符合openvx指定的结果,它仍然被认为是一个单一的、唯一的内核。在这方面,内核类似于函数的签名。
  3. Object:Parameter:一种传递个计算机视觉函数的抽象的输入或者输出。该节点包含该参数在内核描述中的使用情况。包括:
    1. Signature Index:签名中参数的编号索引;
    2. Object Type:对象类型,如VX_TYPE_IMAGE等vx_type_e中定义的类型;
    3. Usage Model: VX_INPUT 或 VX_OUTPUT;
    4. Presence State:VX_PARAMETER_STATE_REQUIRED, or  VX_PARAMETER_STATE_OPTIONAL
  4. Object: Node: 节点是一个内核实例,它与一组特定的引用(参数)配对。节点仅从单个图创建并于单个图关联。当从一个节点中提取一个vx_parameter时,可以访问一个额外的属性:
    1. Reference: 从节点创建函数中分配给这个参数索引的vx_reference(如 vxSobel2*3Node).
  5. Object: Graph: 一组以有向(仅单向)非循环(不回循环)方式连接的节点。一个图可能有一些点集,这些节点集与同一图中的其他节点集没有连接,具体看图的形式。

 

2.6 openvx的数据对象

数据对象是由节点中的图形处理的对象

  1. Object:Array:不透明的数组对象,可以是基本数据类型或结构体的数组;
  2. Object:Convolution:卷积,包含一个由vx_int16类型值组成的M*N的矩阵,还包含一个用于归一化的比例因子。通常与vxuConvolve 和 vxConvolveNode一块使用;
  3. Object:Delay:包含一个由用户手动控制的、暂时延迟的对象列表;
  4. Object:Distribution: 包含频率分布(如直方图)的不透明对象;
  5. Object:Image:图像对象,可能是vx_df_image_e中的某种格式;
  6. Object:LUT:查找表对象;
  7. Object:matrix: 由标量值组成的M*N的矩阵;
  8. Object:Pyramid:包含多层缩放vx_image对象的对象;
  9. Object: Scalar: 包含单一基本数据类型;
  10. Object:Threshold:阈值配置;
  11. Object:ObjectArray:数组对象,可以是任何数据对象的数组(不包含Delay 与 ObjectArray对象) ;
  12. Object:Tensor:多维数据对象,用于神经网络等中的扩展函数。

 

2.7 错误对象 Error Objects

错误对象在平台发生严重的问题(如内存不足或句柄不足)时,会从创建对象的函数处返回。检查可以在创建或者其他api进行调用时进行。使用实例:

vx_<object> obj = vxCreate<Object>(context, ...);
vx_status status = vxGetStatus((vx_reference)obj);
if (status == VX_SUCCESS) {
    // object is good
}

2.8 Graphs Concepts

graph 是openvx中至关重要得计算概念。使用graph作为解决计算机视觉问题目的是为任何得实现都提供可实现性,图在进行计算之前其所有得依赖关系都是知道得,所以这可以让在不同得实现方式下都能发挥其最大得计算能力。

graph是由许多nodes组成得,nodes可以通过其创建函数生成添加。graphs在处理时必须创建,在实现时必须验证。graphs创建完毕之后可以根据需求进行多次调整。

2.8.1 Linking Nodes

Graphs Nodes(图节点)通过数据依赖关系连接在一起,并没有固定的顺序,同一个引用可以连接到其他的节点。但是一个图中只有一个节点可以输出到任何特定的数据对象引用,也就是在一个给定的图中只能有一个输入(写入)。这种方式可以防止数据依赖关系的不确定排序,图中所有的写入者都必须在访问数据操作发生之前生成输出数据

2.8.2 虚拟数据对象

openvx中图节点之间的连接是通过数据对象来实现的。当openvx的客户机知道它们不需要访问中间数据对象的时候,这些数据就可以被创建为虚拟的。虚拟数据对象可以同非虚拟数据一样使用,也可以将图中的节点连接起来。虚拟数据存在以下几点不同:

  1. Inaccessible - 不可访问性。从图外引用虚拟数据对象会失败。虚拟数据属于节点内部,可以在节点内调用虚拟数据;
  2. Scoped  - 作用域:其作用域为创建他们的图中。注意虚拟数据活动范围仅限于单个图形,即要在图执行之前完成定义,且程序在连续的图执行中不应保留虚拟数据对象。(离开作用域即释放)。
  3. Intermediates - 中间使用:因为不能被客户机访问,所以只能用于图内的中间操作
  4. Dimensionless or Formatless - 无量纲或无格式:虚拟数据在创建时可能是未完全定义的,在具体使用时会从虚拟对象的节点来推到得出其具体形式。(类似多态。)
  5. Attributes - 属性:未完全定义的虚拟数据也可以查询其属性。若在对象参与图形验证之前查询,则返回的属性值是用户提供的值(如0维),若在图验证之后查询,返回的属性为图验证时确定的值。
  6. Inheritance - 继承性:子对象会继承父对象的属性。
  7. Optimizations - 最优化:在图形验证和执行过程中不需要创建虚拟数据对象,因此虚拟数据对象大小可能为0.

虚拟数据对象的这些限制让供应商能够优化数据对象的某些应用,可能不分配这样的对象,也可以创建对象的中间子对象,当然供应商还可以在远程主机上分配对象。

2.8.3 Node Parameters 节点参数

节点创建函数的参数可以定义为原子类型(如vx_int32、vx_enum),也可以定义为对象(eg:vx_scalar、vx_image),其中原子变量将自动转为vx_scalar引用以供节点使用,vx_scalar类型的节点参数可以在图形执行过程中修改,但是在修改时要重新验证图。修改所有节点参数对象的方法是:通过vxGetParameterByindex获取对vx_parameter的引用,然后将该引用传递给vxQueryParameter以获取该对象的引用。

vx_parameter param = vxGetParameterByIndex(node, p);
vx_reference ref;
vxQueryParameter(param, VX_PARAMETER_REF, &ref, sizeof(ref));

参数类型未知的时候也可以使用相同的函数来进行检索:

vx_enum type;
vxQueryParameter(param, VX_PARAMETER_TYPE, &type, sizeof(type));
/* cast the ref to the correct vx_<type>. Atomics are now vx_scalar */

2.8.4 Graph Parameters

图参数是由图的作者定义的,每一个图的参数都是通过‘vxAddParameterToGraph’函数指定的节点内的特定参数。客户端可以在不引用节点的情况下通过'vxSetGraphParameterByIndex'Z设置参数。

2.8.5 Execution Model

图必须在以下两种情况下执行:

1. Synchronous blocking mode:同步阻塞模式,此过程中vxProcessGraph将阻塞,直到图完成;

2. Asynchronous single-issue-per-reference mode:

Asynchronous Mode:

在异步模式下,图必须是一个问题一个引用,这也就是说给定一个构造好的图G,它可能被调整多次,但是只能按照自身的顺序执行。异步图形接口的多个图形应用没有定义行为,可以基于行为或供应商实现并行或串行执行。

 

 

 

 

问题:

 

openvx包括几个框架:Context、Kernel、Parameter、Node及graph。context就是作用域,相当于一个文件(工程项目?);Kernel就是封装得各种视觉函数,可直接通过api调用函数(也就是调用kernel?);Node是运算结点,多个节点组成graph以完成某一任务。对问题处理主要是靠graph进行,图由好多节点组成,节点之间通过数据依赖得关系连接在一起。数据依赖是指两个节点通过共享数据得方式来实现连接?比如一个节点对某类型得数据进行操作,另一节点对操作完后得数据进行进一步处理,算是连接起来了吧(留验证)。虚拟数据相较于具体得数据类型不需要给与其严格得定义,会根据节点内的输入或计算信息等确定出具体的形式,但是其使用有一定限制。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页