从视频源头到边缘智能:实现端到端AI解决方案的技术挑战与实践
- 引言
- 端到端AI解决方案打通
- 视频源头采集
- 视频传输和存储
- 边缘计算和盒子设备
- SDK
- 示列
引言
随着人工智能技术的快速发展,端到端AI解决方案在各个领域的应用越来越广泛。这些解决方案能够实现从数据采集到结果输出的完整流程,将人工智能算法与物理设备、网络通信和云服务等技术有机结合,为用户提供全面、高效的智能化体验。
使用边缘计算的好处在于它能够将数据处理和分析推近到数据源头附近,减少了数据传输和延迟,提高了响应速度和实时性。尤其在视频监控等实时应用场景中,边缘计算能够有效减轻云端的负载,提供更快速的数据处理和响应能力。此外,边缘计算还具备离线运行的能力,即使在网络不稳定或无网络连接的情况下,仍然能够进行本地的数据处理和分析,确保系统的稳定性和可靠性。
大致的解决方案流程图如下:
A[视频源头采集] --> B[选择合适的摄像机设备]
B --> C[配置摄像机参数(分辨率、帧率等)]
C --> D[视频数据采集]
D --> E[视频编码(H.264、H.265等)]
E --> F[视频传输]
F --> G[选择合适的传输协议]
G --> H[网络带宽评估和调整]
H --> I[选择合适的存储介质]
I --> J[存储容量规划]
J --> K[边缘计算和盒子设备]
K --> L[选择合适的边缘盒子设备]
L --> M[盒子硬件要求和选择]
M --> N[盒子操作系统选择]
N --> O[配置盒子依赖项和运行环境]
O --> P[安装和配置SDK]
P --> Q[SDK初始化]
Q --> R[设置SDK参数]
R --> S[调用SDK接口]
端到端AI解决方案打通
设备除了我们已知的盒子以外NVR(网络视频录像机)、DVR(数字视频录像机,还需要知道在视频摄像监控上面有哪些类型的设备:
- 摄像机(Camera):摄像机是视频监控系统中最基础和核心的设备之一。它用于捕捉视频图像,并将图像转换为电子信号进行处理和传输。摄像机根据不同的应用场景和需求,可以分为多种类型,如固定式摄像机、球型摄像机、枪型摄像机、红外摄像机等。摄像机通常通过有线或无线方式连接到其他设备。
- PTZ摄像机(Pan-Tilt-Zoom Camera):PTZ摄像机具有云台、俯仰和变焦功能,可以通过远程控制来实现方向、角度和焦距的调整。这些摄像机可用于实时监控和跟踪移动目标,广泛应用于安防、交通监控等领域。
- 高清摄像机(High Definition Camera):高清摄像机具备高分辨率和优质图像捕捉能力,可以提供更清晰、更细节的视频图像。这些摄像机适用于对图像质量要求较高的场景,如银行、商场、公共场所等。
- 网络摄像机(Network Camera):网络摄像机是一种可以通过网络传输视频信号的摄像机,也被称为IP摄像机。它们可以通过以太网连接到网络,直接将视频流传输到NVR、DVR或计算机上进行存储、处理和监控。网络摄像机具有灵活的安装和配置选项,适用于大型监控系统和远程监控。
- 存储设备(Storage Device):存储设备用于存储和保存摄像机捕捉到的视频数据。在监控系统中,NVR(网络视频录像机)和DVR(数字视频录像机)是常见的存储设备。它们可以接收和处理来自摄像机的视频信号,并将数据存储在硬盘驱动器或其他存储介质上,以供后续检索、回放和分析。
- 交换机(Switch):交换机在监控系统中起到连接和组网的作用。它们用于建立局域网(LAN),连接各种设备,包括摄像机、存储设备、服务器等。交换机通常支持高带宽和快速数据传输,以确保信息传输稳定。
视频源头采集
在端到端AI解决方案中,视频源头采集是实现智能视频分析的关键一步。在进行视频源头采集时,需要考虑以下两个方面:摄像机类型和配置参数,以及视频编码标准和参数选择。
摄像机类型和配置参数
选择合适的摄像机设备对于视频源头采集至关重要。根据具体应用需求,可以选择不同类型的摄像机,例如网络摄像机(IP摄像机)、模拟摄像机或者高清摄像机。每种摄像机类型都有其特定的特点和适用场景。
配置参数包括但不限于分辨率、帧率、曝光度、对比度等。这些参数需要根据具体场景和需求进行设置。例如,在需要捕捉细节的情况下,可以选择更高的分辨率和帧率,而在低光环境下,可能需要调整曝光度和增加对比度来获得更清晰的图像。
视频编码标准和参数选择
视频编码标准决定了视频数据的压缩和传输方式。常用的视频编码标准包括H.264、H.265等。选择适当的视频编码标准可以在保证视频质量的同时减小数据量,提高传输效率。
除了编码标准,还需要选择合适的编码参数。编码参数包括比特率、GOP大小、编码质量等。这些参数的选择需要平衡视频质量和传输效率。例如,较高的比特率和编码质量可以获得更好的视频质量,但会增加数据量,对带宽和存储需求提出更高要求。
通过合理选择摄像机类型和配置参数,以及视频编码标准和参数,可以实现高质量、高效率的视频源头采集,为后续的视频分析和处理提供优质的数据基础。
视频传输和存储
在端到端AI解决方案中,视频传输和存储是关键的环节,它涉及到选择合适的网络传输协议和存储介质,以及进行容量规划。
网络传输协议
选择合适的网络传输协议对于视频传输的稳定性和效率至关重要。下面是一些常用的网络传输协议:
- RTSP(实时流传输协议):
- 特点:RTSP是一种用于控制多媒体数据传输的应用层协议。它可以实现实时的流媒体传输,并提供灵活的控制机制,包括播放、暂停、快进等操作。RTSP常用于视频监控领域,具有较低的延迟和较好的实时性能。
- 适用场景:适用于需要实时监控和控制的场景,如视频会议、视频直播和实时监控系统。
- RTMP(实时消息传输协议):
- 特点:RTMP是一种用于音频、视频和数据传输的协议。它在传输过程中使用了实时消息通信机制,能够实现实时的数据传输和交互。RTMP支持流式传输和播放,适用于实时的多媒体应用。
- 适用场景:适用于实时的多媒体应用,如在线直播、视频点播和实时音视频通信。
- SRT(安全可靠传输):
- 特点:SRT是一种开源的传输协议,旨在提供安全可靠的流媒体传输。它使用了前向纠错、重传和加密等机制,以确保传输的稳定性和安全性。SRT适用于不稳定网络环境下的视频传输,能够在丢包或带宽抖动的情况下保持流畅的播放。
- 适用场景:适用于网络环境不稳定、丢包率较高的场景,如远程监控、移动应用和云端视频传输。
- 国标协议ONVIF(开放网络视频接口)。
- 特点:ONVIF是一个行业联盟组织创建的标准协议,旨在促进不同厂商的网络视频设备之间的互操作性。它定义了一组标准的接口和协议,使不同厂商的设备可以进行互联和互操作,从而方便设备的集成和管理。
- 适用场景:ONVIF广泛应用于视频监控系统,可以实现多种设备的联动和集成,包括网络摄像机、NVR(网络视频录像机)、VMS(视频管理软件)等。通过使用ONVIF协议,可以实现设备的发现、视频流的传输、事件的触发和设备的配置等功能。
其中使用国标协议的步骤:
- 安装并配置支持国标协议的视频采集设备或摄像机。
- 在接收端的盒子设备上,使用相应的SDK或库来实现对国标协议的解析和接收(这部分下面会介绍)。
- 根据需要对协议进行配置,例如指定传输的码流类型、分辨率、帧率等参数。
- 通过指定协议的URL或地址,实现视频数据的传输和接收。
带宽需求
在选择网络传输协议时,还需要考虑到所需的带宽。带宽需求取决于视频的分辨率、帧率和编码参数等。较高的分辨率和帧率以及更高的编码质量可能需要更大的带宽来确保视频传输的顺畅性和稳定性。因此,在进行网络传输时,需要对带宽进行评估和规划,以满足视频传输的需求。
存储介质和容量规划
视频存储是将采集的视频数据保存在合适的存储介质中,以备后续的分析和回放。在选择存储介质时,需要考虑容量、稳定性和可扩展性等因素。
常见的存储介质包括硬盘、固态硬盘(SSD)和云存储等。硬盘具有大容量和相对低成本的优势,适合存储大量的视频数据。SSD则具有更高的读写速度和更好的抗震性能,适合对实时性要求较高的应用场景。云存储可以提供高度可扩展的存储解决方案,同时提供备份和灾备功能。
在进行存储容量规划时,需要考虑到视频数据的持续产生和存储周期。具体的容量规划取决于视频的采集频率、分辨率、帧率以及存储周期的要求。以下是进行存储容量规划的一般步骤:
- 估算视频数据产生的速率:根据视频的分辨率、帧率和编码参数,估算每秒钟产生的数据量。
- 计算存储需求:根据每秒钟产生的数据量,结合存储周期的要求,计算所需的总存储容量。例如,如果需要存储一周的视频数据,可以根据每秒钟的数据量和一周的秒数来计算总容量。
- 考虑数据压缩和优化:使用视频编码技术对数据进行压缩,以减小存储需求。不同的编码标准和参数会对存储容量产生影响。
- 选择合适的存储介质:根据存储需求和实际情况,选择合适的存储介质。硬盘和SSD通常是常见的选择,可以根据需要进行扩展和备份。
- 实施存储管理策略:定期清理和归档不再需要的视频数据,以释放存储空间。根据存储容量的实际使用情况,进行存储管理和优化。
通过合适的网络传输和存储策略,可以确保视频数据的稳定传输和可靠存储,为后续的数据分析和处理提供高质量的数据基础。
边缘计算和盒子设备
在实现端到端AI解决方案时,边缘计算是一个重要的环节。边缘计算利用靠近数据源的边缘设备(例如盒子)来进行数据处理和分析,以减少数据传输和响应时间。
盒子硬件要求和选择
选择适合的盒子硬件对于实现高效的边缘计算至关重要。以下是一些关键的盒子硬件要求和选择要点:
- 处理器和内存:选择具有足够计算能力和内存容量的处理器,以支持复杂的算法和模型推理。常见的处理器包括ARM、Intel Core和AMD Ryzen等。内存容量应根据实际需要来决定。
- 存储设备:选择具有足够容量和高速读写性能的存储设备,以存储和访问数据。硬盘和SSD是常见的选择,可根据需求选择适当的容量和类型。
- 网络连接:确保盒子具有稳定的网络连接,以便与其他设备进行通信和数据传输。支持以太网、Wi-Fi和蜂窝网络等连接方式的盒子是常见的选择。
- 温度和环境要求:根据盒子所处的环境和应用场景,考虑其温度范围和抗震性能等要求。
在选择盒子硬件时,需要综合考虑计算能力、存储需求、网络连接和环境要求等因素,以满足实际的边缘计算需求。
盒子操作系统和依赖项
选择合适的操作系统和安装必要的依赖项对于盒子的正常运行和应用程序的部署至关重要。
- 操作系统:常见的盒子操作系统包括Linux(例如Ubuntu、CentOS等)和Windows IoT等。根据应用程序的需求和硬件平台的兼容性,选择适合的操作系统。
- 依赖项和库:根据应用程序的需求,安装和配置必要的依赖项和库。这可能包括图像处理库、机器学习框架、网络传输库等。使用包管理工具(如apt、yum等)或者手动安装来满足应用程序的依赖项。
确保盒子操作系统的稳定性和安全性,并根据应用程序的需求安装所需的依赖项和库,以确保边缘计算的顺利进行。
其实设备的数据采集信息到盒子的流程,可以简化成下图所示,区别就在于是否有存储介质,和存储介质是什么,在哪里的。
可能在视频采集设备到存储设备连接上,有些复杂的设备组合,比如加一个在NVR上交换机,目的就是用交换机连上一个存储设备。
如果没有存储设备,那就是采集视频设备与边缘盒子直接的通信
如果有存储设备,就是存储设备和盒子通信(这个流程就更简单)
有存储介质的方式:在这种方式下,视频摄像头设备将采集到的视频数据存储到介质(如硬盘、SSD等),然后盒子通过某种方式访问存储介质,获取视频数据进行后续处理。常见的有存储介质的方式包括:
- 本地存储:摄像头设备将视频数据存储到本地存储介质,盒子通过网络或其他方式访问设备上的存储介质获取视频数据。这种方式常用于边缘计算场景,盒子可以通过网络传输或直接访问存储设备获取数据。
- 中心存储:视频摄像头设备将视频数据存储到中心服务器或网络存储设备,盒子通过网络连接到中心存储设备获取视频数据。这种方式常用于集中管理和存储大量摄像头设备的视频数据,比如阿里云的oss
无存储介质的方式:在这种方式下,视频摄像头设备将采集到的视频数据直接传输给盒子,不经过存储介质的中间步骤。常见的无存储介质的方式包括:
- 实时传输协议:视频摄像头设备通过实时传输协议(如RTSP、RTMP等)将实时视频流传输给盒子。盒子可以直接接收并处理实时的视频数据。这种方式适用于需要实时性较高的场景,如视频监控、视频会议等。
- 流媒体服务器:视频摄像头设备将视频数据传输给流媒体服务器,盒子通过访问流媒体服务器获取视频数据。流媒体服务器负责接收、存储和分发视频数据,盒子可以通过流媒体协议(如HTTP、HLS等)访问服务器获取数据。
在无存储介质下,设备与边缘盒子之间的通信可以通过不同的方式实现,具体取决于设备的类型、协议和通信接口。以下是一般情况下设备与盒子通信的一些常见方式:
- 设备驱动程序:对于一些标准化的设备,操作系统通常提供相应的设备驱动程序。边缘盒子可以使用适当的设备驱动程序来与设备进行通信,获取设备发送的数据。驱动程序可以提供统一的接口,使得设备数据可以被盒子识别和处理。
- 接口协议和API:某些设备提供特定的接口协议和API,允许其他设备或应用程序与其进行通信。边缘盒子可以使用相应的协议和API来与设备进行交互。例如,摄像机设备可能支持RTSP(Real-Time Streaming Protocol)协议,通过该协议盒子可以获取设备的视频流数据。
- SDK:一些设备厂商提供特定的SDK,用于与其设备进行通信和控制。这些SDK通常包含了与设备交互所需的函数、方法和协议。通过使用SDK,边缘盒子可以使用设备厂商提供的API来实现与设备的通信。具体使用SDK的步骤可能会因设备厂商和SDK而有所不同,通常涉及以下几个步骤:
- 下载和安装SDK:从设备厂商的官方网站或其他可信来源下载适用于您的设备和操作系统的SDK,并按照提供的安装说明进行安装。
- 导入SDK库和头文件:在您的项目中,将SDK提供的库文件和头文件导入到您的开发环境中。这通常需要在项目配置中进行设置,以确保编译和链接时可以正确使用SDK的函数和功能。
- 初始化设备连接:使用SDK提供的函数或方法初始化设备连接。这可能涉及指定设备的IP地址、端口号、用户名和密码等连接参数。
- 调用SDK函数:通过调用SDK提供的函数或方法,可以实现与设备的通信。这包括发送指令、接收数据、订阅事件等操作。SDK文档通常会提供详细的API参考和示例代码,以帮助您使用SDK进行设备通信。
- 处理设备数据:一旦设备连接建立,您可以使用SDK提供的功能来获取设备发送的数据。根据SDK的文档和示例,了解如何解析和处理设备数据,以便在边缘盒子中进行后续的处理和分析。
SDK
设备网络SDK 是基于设备私有网络通信协议开发的,为嵌入式网络硬盘录像机、NVR、视频服务器、网络摄像机、网络球机、解码器、报警主机等网络产品服务的配套模块,用于远程访问和控制设备软件的二次开发。
使用设备网络SDK,您可以利用提供的功能和接口来实现与设备的通信、数据传输和控制。
确定设备和相应的网络SDK:首先,您需要确定您使用的设备以及相关的网络SDK。根据设备的类型和厂商,您可以查找相应的SDK和文档。
一般来说设备的SDK接口函数都是C或者C++写的,为数不多的树莓派倒是提供从采集设备到存储设备到算力设备的都用python语言的。
因为性能和效率:C和C++是编译型语言,直接编译为机器码,因此在性能和效率方面具有优势。对于一些对计算性能和资源利用效率要求较高的应用场景,使用C或C++可以更好地满足需求。相比之下,Python是解释型语言,需要在运行时逐行解释执行,因此相对而言较慢。
SDK开发通常分为C/S架构(Client/Server)和B/S架构(Browser/Server)
- C/S架构:在C/S架构中,客户端和服务器之间建立直接的通信连接。SDK通常用于客户端应用程序的开发,提供与服务器进行通信的接口和功能。客户端应用程序使用SDK与服务器进行数据交换、请求处理等操作。这种架构适用于需要在客户端进行数据处理和交互的应用,如桌面应用程序、移动应用等。
- B/S架构:在B/S架构中,客户端通过浏览器与服务器进行通信,而不需要在客户端安装额外的软件或SDK。服务器端提供Web服务,客户端通过浏览器访问Web页面来与服务器进行交互。在B/S架构中,SDK通常用于服务器端的开发,提供对服务器的功能和数据进行管理的接口。这种架构适用于Web应用和云服务等场景。
除了C/S架构和B/S架构,还有其他架构模式可以使用SDK进行开发,如分布式架构、微服务架构等。这些架构模式根据具体需求和应用场景的不同,将系统划分为多个组件或服务,SDK可以用于开发这些组件或服务的接口和功能,以实现各个组件或服务之间的通信和协作。
服务器可以是指设备的服务器端,用于提供数据、功能或处理请求。例如,对于视频监控系统,服务器可以是NVR(网络视频录像机)或视频流媒体服务器,SDK用于开发与这些服务器进行通信的客户端应用程序
下图为海康的sdk基本调用流程
虚线框的流程是可选部分,不会影响其他流程和模块的功能使用。
海康NVR基本调用流程主要包含以下模块:
- 初始化SDK:调用NET_DVR_Init函数进行SDK的初始化,包括内存预分配等操作。
- 设置连接超时时间:通过调用NET_DVR_SetConnectTime函数设置SDK中的网络连接超时时间。
- 设置接收异常消息的回调函数:使用NET_DVR_SetDVRMessage或NET_DVR_SetExceptionCallBack_V30函数设置回调函数,用于接收预览、报警、回放、透明通道和语音对讲等模块发生的异常信息。
- 从解析服务器获取设备的IP地址:通过调用NET_DVR_GetDVRIPByResolveSvr_EX函数从解析服务器获得设备的IP地址,可以通过设备名称、DDNS域名或序列号进行查询。
- 用户注册设备:调用NET_DVR_Login_V30函数进行用户的注册,成功后返回的用户ID作为其他功能操作的唯一标识。
- 预览模块:通过调用预览相关的函数,从设备获取实时码流,进行解码和显示,实现预览功能。
- 回放和下载模块:通过按时间或文件名的方式远程回放或下载设备的录像文件,支持断点续传功能。
- 参数配置模块:设置和获取设备的各种参数,包括设备参数、网络参数、通道压缩参数、串口参数、报警参数、异常参数、交易信息和用户配置等。
- 远程设备维护模块:实现关闭设备、重启设备、恢复默认值、远程硬盘格式化、远程升级和配置文件导入/导出等维护功能。
- 语音对讲转发模块:实现与设备的语音对讲和语音数据获取。
- 报警模块:处理设备上传的各种报警信号。
- 透明通道模块:通过将IP数据报文解析后直接发送到串行口,实现对串行设备的控制。
- 云台控制模块:实现对云台的基本操作、预置点、巡航、花样扫描和透明云台的控制。
示列
下面是使用海康NVR SDK的部署流程,包括下载SDK、导入、IP通道资源配置和回放和下载模块的调用示例代码。请注意,由于篇幅限制,以下示例仅展示了部分流程和代码片段,并假设你已经有了CentOS系统和C/C++开发环境的基础。
- 下载SDK:
a. 访问海康官方网站(https://www.hikvision.com/)并找到SDK下载页面。
b. 根据你的需求选择适当的SDK版本并下载到本地计算机。 - 导入SDK:
a. 将下载的SDK解压到你的工作目录中。
b. 打开终端,进入SDK解压后的目录。 - 创建新的C/C++项目:
a. 在终端中使用以下命令创建一个新的C/C++项目:
mkdir my_nvr_project
cd my_nvr_project
- 配置项目:
a. 打开项目所在目录,在终端中运行以下命令:
cmake path_to_sdk_directory
make
- 编写代码:
a. 在项目目录中创建一个新的源代码文件(例如main.cpp),并编辑它。
b. 在main.cpp中编写代码,包括包含必要的头文件和函数调用。以下是一个示例代码片段,展示了如何使用海康NVR SDK进行IP通道资源配置和回放和下载模块的调用:
vi main.cpp
#include <iostream>
#include "HCNetSDK.h"
int main() {
// 初始化SDK
NET_DVR_Init();
// 设置连接超时时间
NET_DVR_SetConnectTime(2000, 1);
// 用户登录设备
NET_DVR_USER_LOGIN_INFO loginInfo = {0};
NET_DVR_DEVICEINFO_V40 deviceInfo = {0};
loginInfo.bUseAsynLogin = 0;
strncpy(loginInfo.sDeviceAddress, "192.168.1.100", NET_DVR_DEV_ADDRESS_MAX_LEN);
strncpy(loginInfo.sUserName, "admin", NAME_LEN);
strncpy(loginInfo.sPassword, "password", NAME_LEN);
LONG userID = NET_DVR_Login_V40(&loginInfo, &deviceInfo);
if (userID < 0) {
std::cout << "Failed to login. Error code: " << NET_DVR_GetLastError() << std::endl;
NET_DVR_Cleanup();
return -1;
}
// 登录成功,可以进行其他操作
// IP通道资源配置
NET_DVR_IPPARACFG_V40 ipParaCfg = {0};
DWORD dwReturned = 0;
if (!NET_DVR_GetDVRConfig(userID, NET_DVR_GET_IPPARACFG_V40, 0, &ipParaCfg, sizeof(ipParaCfg), &dwReturned)) {
std::cout << "Failed to get IP channel configuration. Error code: " << NET_DVR_GetLastError() << std::endl;
NET_DVR_Logout(userID);
NET_DVR_Cleanup();
return -1;
}
// 在这里对IP通道配置进行修改
if (!NET_DVR_SetDVRConfig(userID, NET_DVR_SET_IPPARACFG_V40, 0, &ipParaCfg, sizeof(ipParaCfg))) {
std::cout << "Failed to set IP channel configuration. Error code: " << NET_DVR_GetLastError() << std::endl;
NET_DVR_Logout(userID);
NET_DVR_Cleanup();
return -1;
}
// 回放和下载模块调用
NET_DVR_FIND_DATA_V30 findData = {0};
LONG findHandle = NET_DVR_FindFile_V30(userID, &findData);
if (findHandle < 0) {
std::cout << "Failed to find file for playback. Error code: " << NET_DVR_GetLastError() << std::endl;
NET_DVR_Logout(userID);
NET_DVR_Cleanup();
return -1;
}
// 在这里对回放和下载进行操作
if (!NET_DVR_StopFindFile(findHandle)) {
std::cout << "Failed to stop file finding. Error code: " << NET_DVR_GetLastError() << std::endl;
}
// 注销设备
NET_DVR_Logout(userID);
// 释放SDK资源
NET_DVR_Cleanup();
return 0;
}
- 构建和运行项目:
a. 在终端中使用以下命令构建项目:
b. 运行项目:
make
./my_nvr_project
上述代码示例演示了使用海康NVR SDK进行初始化SDK、设置连接超时时间、登录设备、进行IP通道资源配置、回放和下载模块的调用以及注销设备和释放SDK资源的流程。
请注意,实际项目的代码和功能将根据需求而有所不同。你可以根据SDK提供的文档和功能进行相应的函数调用和实现,以满足你的具体需求。