这是本文档旧的修订版!


拥有强大运算能力的超级计算机或服务器集群可以模拟人类的神经网络进行深度学习,从而自动识别事物特征并解决问题。类似地,,现代嵌入式处理器的强劲能力也使得边缘计算上的人工智能(AI)成为现实。这通常是指的机器学习(ML)和嵌入式视觉应用的配合,使得处理器程序能够根据摄像头采集的数据自主学习,获取经验和判断事物的能力。提到机器学习,就不得不提到几个最受欢迎的框架:TensorFlow和pytorch,OpenCV,三者被广泛地应用在业界和学术领域。

  • TensorFlow 由Google开发,于2015年发布。是静态深度学习框架,它需要创建图计算,并且创建之后不可更改,通过session会话进行数据输入和计算。
  • pytorch 由Facebook开发,于2017年发布。是动态深度学习框架,和python的逻辑是一样的,要对变量做任何操作都是灵活的。整个流程:计算图、传入变量数据、求梯度、参数更新等操作,对于编程者的可读性较强。
  • OpenCV是计算机视觉库,包含了大量的图像处理和计算机视觉的算法和少许机器学习算法。

在实际应用中,往往是OpenCV+TensorFlow或OpenCV+Pytorch来实现结合做图像识别等应用。比如,OpenCV 创始人 Gary Bradski 等人近期就发表了一篇 Kornia 的综述。Kornia 是一个基于 PyTorch 的可微分的计算机视觉库。嵌入式人工智能和机器学习一般都和视觉应用有关。在Digi的ConnectCore系列中,主要是在DEY上实现OpenCV的相关开发和应用。

OpenCV进阶理解

机器学习框架一般是基于OpenCL标准在异构平台上运行程序的框架,所谓异构平台,一般情况我们指GPU和CPU两种处理器混合的平台。由于GPU本身特殊的硬件架构,GPU被设计成拥有非常强大的并行运算能力,这正是神经网络机器学习所需要的。通过openCL可以利用GPU强大的并行能力代替CPU进行运算,OpenCL由在OpenCL设备上运行的kernel函数语言和控制平台的API组成。

OpenCL包含两个主要部分:device和host。在CPU和GPU组成的异构平台中,我们一般把运行核函数的GPU处理器部分称为device,把控制平台API的CPU称为host。相应的,把host上的内存(就是内存)称为host memory;而把device上的内存(例如GPU显存)称为device memory或者device buffer。在OpenCV里,我们把这两种内存封装为cv::Mat和cv::ocl::oclMat结构。

数据调度和传输 OpenCV的OCL模块中,在GPU上进行运算之前我们必须把内存转成GPU可以直接调用的显存。而在GPU上的运算结束后,我们还需要将在GPU显存上的数据转移到CPU可用的内存上。这两个操作在oclMat中定义为两个成员函数,分别为oclMat::download和oclMat::upload。由于这两个数据传输操作受PCI总线宽带的限制,在实际应用中应尽量减少数据传输,把尽可能多的运算在gpu device上计算完成后,再把数据传回cpu host,以达到最大的数据吞吐量。