ADAS和openVX

分类: computerVision |
OpenVX - Hardware acceleration API for Computer Vision applications and libraries
The Khronos vision API can accelerate high-level libraries, such as
the popular OpenCV open source vision library, or be used by
applications directly.
从这个角度来说,openvx是比openCV更低层的API,opencv可以使用openvx来进行实现,openvx也可以被APP直接调用。
The most widely used cross-platform computer vision library is Open
Source Computer Vision Library (OpenCV), Opencv也是一个在computer
vision中使用很广的一个library,但是跨平台使用还是比较困难,因此需要一个能够跨平台的API,因此一个很好的proposal就是重新加入一个layer来实现这个跨平台的功能:
CV HAL 的API低层的实现细节由hardware 厂商来负责。这就是openvx。
下面是openvx的例子:
http://s12/mw690/002mfkyxgy6S4G6dfeP8b&690
每一个openvx node的实现可能是软件的也可以是硬件的。node之间通常是通过外部memory来传递数据,因此为了消除memory的需求,也可以把几个node合在一起进行实现,数据内部传输。
每一个openvx node的实现可能是软件的也可以是硬件的。node之间通常是通过外部memory来传递数据,因此为了消除memory的需求,也可以把几个node合在一起进行实现,数据内部传输。
基本的API 如下:
1. introduction
openvx是computer vision的一个low level API 框架。包含了下面几个部分:
包括API函数和基于graphic的执行模型以及memory 模型。另外还能支持customer
自己去定义自己的函数。
openvx定义的所有的函数都是可以通过vxu library来自己调用(c function),而不需要通过graphic
model来调用。当然这种用法只是适合早期的算法验证。
openvx的定位是低层的框架,因此可以被APP或者其他的computer
vision的平台比如opencv来调用:
openvx定义了一套统一的API函数接口,把具体实现开发给了硬件厂商,而client端只需要调用就可以而不需要关心API实现的细节。
2. openvx的framework
objects
context:
openvx 的context创建了一个object domain,所有的data
object和framework
objects都存在于这个context中。其实就是一个执行的现场,context都每一个在它里面的object都有一个ref
counter,如果counter为0了,那么这个object就可以被销毁了,这就是memory的自动回收机制(iphone/android也是使用的这种机制)。可以多个clients连接到同一个context上。
kernel:
kernel在openvx中是一个function的抽象的表示。比如sobel
gradient/lucas kanade feature tracking
函数。一个vision函数可以和另外一个函数实现完全相同的功能,但是只要不是function
name相同,那么就是不同的函数。另外一个需要说明的就是一个kernel可以实现在不同的target上(比如CPU/GPU/DSP的不同的kernel实现)
Target:
执行openvx kernel的平台(cpu/gpu/dsp/..) ,
同一个vendor也可以有多个target,使用哪一个target完全由hardware
vendor来决定(比如有些功能是有fixed
function的,那么就用这个,另外一部分是没有的就可以使用CPU/GPU)
Parameter:
抽象的input/output/bidirectional data
object,传递给openvx的function使用。也就是函数的输入输出参数。每一个函数都有一个函数声明,其中就包括函数的参数出现的位置和类型。
Node:
一个node就是一个kernel的instance (带有参数)。 Node 只和一个single graph相关。
A node is an instance of a kernel which will be paired with a
specific set of references (the
parameters).
parameters).
reference:
表示的是kernel的输入输出参数。
Reference - The vx reference assigned to this parameter index
from the Node creation function
(e.g. vxSobel3x3Node).
(e.g. vxSobel3x3Node).
Graph:
很多node组成的DAG图(单向图),可以允许有些node和其它的node之间没有连接关系。
3. openvx Data
Object
data object是一些object,它们是在graph中被处理的。
Array:
可以是一些简单数据类型的array,也可以是structures的array。
convolution: 包含Mx N
(数据类型是vx_int16)的矩阵。也包含了一个用于正则化的scaling factor. 卷积
Delay:
可以插入手工控制的delay
Distribution:
包含频率分布(比如historgram)
Image: 图像object
LUT: lookup table 对象
Matrix: 包含MxN的一个矩阵
Pyramid: 包含各种不同分辨率的vx_image
对象的一个对象(图像金字塔)
Remap: 在做image
tranformation的时候使用,包含的是从源到目的的一个map。
Scalar:
矢量数据
Threshold:
包含thresholding的配置
可以认为上面是openvx自己定义的一些高级的数据类型。
4. Graphs concept
openvx的核心就是图模型,通过DAG图可以来描述每一个node和其他node的dependency关系。
图中的node是在node create的时候加入到graph中的。
图中的node的连接并不是依靠order的描述来连接的,也就是不存在a->b->c这样的连接描述,而是完全依靠的是数据的dependency关系。两个连接在一起的node直接的数据类型(data
object)必须是匹配的比如都是vximage类型(一个输出一个输入).
基于这种连接机制,因此在一个graph中只能允许最多一个node可以输出任何类型的data object
reference,否则连接就没有办法进行了。
Graph Nodes are linked together via data dependencies with no
explicitly-stated ordering. The same reference may be linked to
other nodes. Linking has a limitation however, in that only one
node in a graph may output to any specific data object reference.
That is, only a single writer of an object may exist in a given
graph. This prevents indeterminate ordering from data dependencies.
All writers in a graph shall produce output data before any reader
of that data accesses it.
virtual data object:
因为graph的连接是基于data object的dependency连接在一起的。如果有一些中间的data
object是不会被access的,那么这些中间的data object可以声明为virtual(Private)。
Node parameter:
一些基本的atomic数据类型(vx_int32/vx_enum/vx_scalar/vx_image)
,当出现在node创建函数的参数上的时候会被framwork转换成vx_scalar类型.
graph parameters:
参数也可以出现在graph中。这些参数实际上图中一些node的配置参数。
参数也可以出现在graph中。这些参数实际上图中一些node的配置参数。
execution model:
图执行的模式可以是synchronous blocking
mode,也就是同步blocking模式。vxProcessGraph
函数一旦被调用就会block住,直到这个graph执行完成。
也可以是Asychronous single-issue-per-reference mode
(vxScheduleGraph and vxWaitGraph),这是一种异步单发的执行模式。
graph 形式
使用DAG图来进行执行,这里有几个限制需要加入来保证执行的结果是确定的而不是有随机的。
Processing Graph是一个包含node集合N和data
object集合D的一个二部图,也就是说一个edge(N,D)的两个顶点必须分别在这两个集合中。因为包含方向,因此(Nx,Dy)和(Dx,Ny)是不同的,前面一个表示node写数据到数据节点中去,而另外一个表示的是一个node从数据object中读数据。每一条edge有一个name,因为一个node的输入和输出都是edge表示的,因此每一个edge实际上表示的就是node的参数,和data
object对应。
每一个node的参数都有一个type(input,output,inout)。
node有下面几种类型:
这里对processing graph 有几个限制:
图中的每一个node的执行都包含了一个原子操作(firing),用来消耗每一个输入data
object的数据并且处理它和给每一个output data
object产生输出。也就是一个node的每一个输入和输出都和一个data
object连接在一起。只有当一个node的所有输入edge的数据都ready的时候,这个node才能执行。
http://s1/mw690/002mfkyxgy6S6CJJ3iga0&690
上图显示的就是一个graph,蓝色的node是data object,粉色的是node,剩下的就是edge。另外在这个图上,magnitude和phase node是没有关联的,因此他们之间是independent的。
上图显示的就是一个graph,蓝色的node是data object,粉色的是node,剩下的就是edge。另外在这个图上,magnitude和phase node是没有关联的,因此他们之间是independent的。
openvx支持用户自定义函数。除了CDF外,用户vendor还有其它的方法来extend它们自己的API。如果某些API的用途很广,不排除在后面的版本中会把这些API加入成正式的API.
比如User Node Tiling:
The ability to break the image data into smaller sized units
allows for optimized computation on these smaller units with fast
memory access or parallel execution of a user node on multiple
image tiles simultaneously.
基本的vision函数:
openvx中提供了很多基本的vision 函数的API以及要求的输入输出参数,比如下面的函数:
graph的lifecycle:
construction: 调用API来创建,node和data object连接在一起。
verification: 检查正确性
execution: 执行图
deconstruction: 析构
构造,使用和释放