详解百度大脑EdgeBoard出色的视频处理技术

背景介绍

视频处理是人工智能应用中的一个重要方向,对于一款端上部署的 AI 加速产品,其视频接入能力是产品技术实力的重要体现,同时也直接影响用户的产品体验。端上的嵌入式设备,受制于本身的 CPU 等硬件资源,同时支持多种视频设备及多种视频格式是极大的挑战。

EdgeBoard 是百度基于 FPGA 打造的嵌入式 AI 解决方案,能够提供强大的算力,并支持定制化模型,适配各种不同的场景,并大幅提高设备的 AI 推理能力,具有高性能、高通用、易集成等特点。EdgeBoard 作为一款面向各个层次的 AI 开发者的硬件平台,兼顾了多种视频输入,包括 MIPI、BT1120、USB 摄像头、IPC(IP Camera,网络摄像头)、GigE 工业摄像头,这极大地体现出 EdgeBoard 在视频处理上出色的技术实力,而同时支持如此多的视频接入设备在一般的 AI 端产品上也是不常见的。

本文将详细介绍 EdgeBoard 上的视频处理方案,如何兼顾效率和通用性,在二者之间取得平衡,最大程度上满足用户的需求。

Linux V4L2结构

内核 V4L2模块

Linux 系统发展至今,以其优越的跨平台特性和扩展移植性在嵌入式操作系统领域占据很大的份额,EdgeBoard 采用的是 Xilinx PetaLinux 工具打造的 Linux 内核,操作系统采用的是 RootFS,如果用户需要 Ubuntu 操作系统,可以直接在 Xilinx 论坛上获得 arm64 Ubuntu 操作系统。

Video4Linux2(简称 V4L2)是 Linux 下关于视频采集相关设备的驱动框架,为驱动和应用程序提供了一套统一的接口规范。支持三类设备,分别会在 /dev 目录下产生不同的设备节点:

1. 视频输入输出设备(video capture device,video output device),分别是提供视频捕获功能的摄像头类型设备和提供视频输出功能的设备,对应的设备名为 videoX。这是我们最常用的一种设备类型。

2.VBI 设备(Vertical Blanking Interval),对 VBI 数据进行控制、发送或抓取的设备,对应设备名 vbiX。

3. radio 设备,提供 FM/AM 发送和接收的设备,对应设备名 radioX

V4L2 在 Linux 系统中的结构图如下:

 

image.png

 

 

从图中可以看出,驱动的框架层次分明,最上层通过字符设备提供 video 和 media 两种控制接口,分别从视频流控制(video)和媒体子设备控制(media)两种不同的角度抽象出操作接口。中间内核驱动层通过三层设备驱动分别从视频抽象,V4L2 设备功能定义,子设备功能定义三个层面展开,模块化的设计提供了非常完善的扩展性。最下方是硬件层,除了提供常用摄像头传感器的功能外,对于常用的视频转换也有很好的支持。

在应用层的软件支持也非常丰富,比如广泛使用的 FFmpeg、Gstreamer、LiVes、MPlayer 等对本地视频设备的支持也都是通过 V4L2 提供的接口实现的。

Xilinx V4L2驱动结构

深入理解 V4L2 框架对于 FPGA 视频方案的灵活配置有很大的帮助作用,也方便 FPGA 开发人员快速验证视频功能。本节以 Xilinx 视频处理子系统为例,介绍一套完整的 V4L2 内核功能的实现,如下图。

 

image.png

 

 

结合上一节提到的 V4L2 结构图可以看出 V4 L2 内核对应了全部视频框架的内容。中间部分,xilinx 通过 xvip_dma 结构实现了整体的 video_device 功能,给用户层提供必要的控制设备接口(右侧用户层接口);左侧部分,是内核将所有的 xilinx 视频相关设备组合成 xvip_composite_device,即 v4l2_device,通过该模块可以扩展具体的子设备功能,即 v4l2_subdev,包括 TPG、VTC、RGB2YUV、scaler 等等;右侧部分,是用户层的接口,用户层调用接口实现对视频设备的操作;顶层部分,为了提高数据搬运的效率使用了 DMA 设备功能,即 xilinx_dma_device。下层部分,对于内部数据的管理,使用了 v4l2 统一抽象提供的 vb2_queue、vb2_buffer 等模块实现。

V4L2结构应用实例解析

这里以在 EdgeBoard 上使用的 MIPI 摄像头(MIPI 开发介绍见 https://www.csdn.net/article/a/2019-08-21/15979781)为例介绍 V4L2 的具体应用。

MIPI 摄像头视频通路

对 MIPI 摄像头的支持采用了 xilinx video 框架,符合标准的驱动以及和硬件结合的流程。具体的实现为:硬件上采用 FPGA 的 IP 实现视频通路上的各种视频预处理,内核驱动模块使用 vipp 对应的功能,应用层通过 /dev/media 节点将这些子设备之间的连接关系进行关联,通过 /dev/video 控制视频的传输及视频抓取。

 

image.png

 

 

V4L2子设备驱动(摄像头驱动)的编写方法

从上文可以看出,虽然利用已有的 IP 和驱动资源,可以快速搭建 MIPI 摄像头的数据接入功能,但还缺少对于摄像头本身的参数控制功能等,这部分功能的实现是在驱动模块完成。本节将介绍一下此类驱动的结构和开发流程。

相对于实现一个完整的 V4L2 驱动功能比较庞大,针对摄像头驱动的实现相对简单了许多,只需要实现 V4L2 的子设备驱动即可,因为大部分功能已经在 video_device 里实现了。详细的子设备驱动结构图如下

 

image.png

 

 

结合前文的整体结构图,这里的核心是实现一个 v4l2_subdev 结构,即填充其内部各操作接口结构体,其中核心是 v4l2_subdev_ops,通过该接口实现从用户层对其配置各种参数,以对视频流的控制。media_entity 目地是实现各个 v4l2_subdev 之间的连接通路。用户层对 mediaX 设备的操作都需要这个结构的支持。

基于 V4L2的软件开发

应用层的软件开发,推荐使用 gstreamer 或者 opencv videocapture,opencv 的底层实现可能依赖 gstreamer,如果这些不能满足读者的要求,需要更详细的参数控制,或者软件环境不具备这两种支持,可以考虑直接操作 v4l2 设备。如下将介绍 V4L2 软件层面的具体方法。

V4L2 通常支持三种不同 IO 访问方式(其他内核里支持的方式暂不讨论),包括

1.read/write 基本 IO 访问方式,read 方式读取一帧数据,数据需要从内核空间传输到用户空间,增加了内存访问的开销,对于图像类的应用效率不高

2. 内存映射方式,这是在内核空间开辟的缓冲区,这些缓冲区可能支持 DMA 功能,这样极大的提高了数据从设备搬运到内存的效率。用户只需要使用 mmap()系统调用将其映射到用户空间后,可以直接使用。这种方式支持的设备很多。

3. 用户空间缓冲区方式,这是在用户空间开辟的缓冲区,再把缓冲区的指针告诉内核,这种方式虽然也能减少内存拷贝,但是内核驱动或者硬件设备在处理这些用户空间的地址会麻烦很多,不是所有的设备都会支持

这里以第二种方式详细说明具体使用过程,参考如下流程图

 

image.png

 

 

包括这几个步骤:

1、 使用 open()打开设备

2、 使用 ioctl()进行初始化参数设置,一般包括查询设备能力(VIDIOC_QUERYCAP),设置视频捕获相关参数,如帧率控制(VIDIOC_S_PARM)、图像的窗口尺寸(VIDIOC_S_CROP)、像素点的格式和宽高(VIDIOC_S_FMT)等,详细支持的参数可以使用上面介绍的工具进行查询

3、 使用 ioctl()申请帧缓冲(VIDIOC_REQBUFS),并查询申请到的缓冲区的信息(VIDIOC_QUERYBUF)

4、 使用 mmap()对申请到的缓冲区进行内存映射,保存映射得到的地址

5、 使用 ioctl()把帧缓冲进行入队操作(VIDIOC_QBUF)

6、 使用 ioctl()开始视频流进行捕获(VIDIOC_STREAMON)

7、 使用 selet()等待接收到数据

8、 使用 ioctl()取出帧缓冲即出队操作(VIDIOC_DQBUF)

9、 进行数据处理,

10、 重复帧缓冲入队操作,如此循环

11、 退出时,停止采集工作(VIDIOC_STREAMOFF),使用 unmap()和 close()释放资源

用户层工具介绍(技术小福利)

上文介绍完 EdgeBoard 中视频处理的完整方案,现介绍 V4L2 开发中常用的调试工具,有助于提升开发效率。

得益于 Linux 丰富的开源资源,操作 v4l2 设备的应用层工具也非常多。默认的 EdgeBoard PetaLinux 系统已经配置好常用的几个工具,特此介绍给大家。v4l-utils 是专门控制 v4l 设备的一系列命令工具集,包含以下实用程序:

1. v4l2-ctl:用来全方位的配置 v4l2 设备,对于内核模块暴露出来的接口,几乎都有支持。特别是软件开发时候使用的 ioctl 控制命令,也可以使用该工具来直接设置,帮助我们调试驱动或软件。

2. v4l2-compliance:兼容性工具,用于测试 v4l 设备驱动程序的 v4l2 API 兼容性,会打印出来各个 ioctal 命令接口是否有支持。多用在 v4l 应用软件开发过程中。

3.v4l2-dbg:直接获取和设置 v4l2 设备寄存器的工具,这依赖于设备驱动的支持。可以使用 v4l2-compliance 查看 VIDIOC_DBG_G/S_REGISTER 命令接口是否可用,在可用的情况下,可以使用该工具来测试。

4.v4l2-sysfs-path:检查平台已经加载的 v4l2 设备以及相应的设备节点。

5. media-ctl:媒体设备的控制工具,帮助我们在 v4l2 各个子设备间建立连接。

gstreamer 是 Linux 平台广泛应用的视频流工具,特别是嵌入式平台,良好的软件架构及衍生出其丰富的扩展插件对不同硬件平台都具有良好的支持。

这里给出一个命令行示例,就可以了解它的独特之处了,如下:

gst-launch-1.0 v4l2src device=/dev/video4 ! video/x-raw,width=1280,height=720 ! videorate ! image/jpeg,framerate=1/4 ! multifilesink location="frame%d.jpg" index=100

这条命令的意思是打开 v4l2 视频源即 /dev/video4 这个 USB 视频设备,抓取其 1280x720 宽度的原始 jpeg 图片流按照 4 秒 1 帧的速度保存到本地文件,命名格式为 frame100.jpg 开始

 

总结
本文以 MIPI 摄像头为例介绍了在 EdgeBoard 中采用 V4L2 结构的视频处理方案,得益于 V4L2 结构的灵活性和可扩展性,像 BT1120、USB 摄像头等也采用类似的方案,实现了对多视频接入方案的支持。对于需要视频接入方案的用户,可以直接购买 EgdeBoard 产品,实现视频接入的即插即用。官网地址:https://ai.baidu.com/tech/hardware/deepkit

福利
据可靠小道消息:EdgeBoard 正在打折中,历史最低价,降价 1000 元,有兴趣可以看看:https://aim.baidu.com/product/search?word=edgeboard

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章