有以下几个C++的问题:
- 为什么使用多继承?多继承有什么好处?什么是多继承?
一、videopipe大纲
资料汇总:
videopipeline介绍,飞书介绍的链接,怕失联。
https://www.bilibili.com/video/BV1s7421f7Gx/?t=3.68366&spm_id_from=333.1350.jump_directly
PPT➕代码➕视频 (PPT已打印/代码已调通配好环境/视频已生成文稿)
- 重点:
- chap0:如何将图像算法应用到具体视频数据/视频业务上?视频结构化框架的工作原理和流程?视频结构化有哪些好处?有哪些应用场景?
- 视频结构化有哪些技术栈?掌握分类/检测/特征编码等图像算法在视频结构化中的应用;
- 如何开发行为分析类应用?如何开发检索比对类应用;掌握原型开发;掌握视频结构化框架的实现原理和使用方法。
- chap1:结构化数据的特点:可以直接理解,可查询/对比/分类/计算等操作,如表格类数据;非结构化的数据无法查询/对比/分类/计算,如视频/语音/图片/文字
- 现实世界大部分数据都是非结构化的:如视频网址/短视频平台/监控安防/直播/无人机/门禁系统/电子警察/车载系统
- 视频结构化的好处:AI自动理解。CV+NLP算法实现视频结构化→结构化数据→行为分析;
- 视频结构化的直接好处:将重量级的非结构化数据→轻量级的结构化数据
- 视频结构化的终极好处:视频可以被查询/被比对/分类/被计算,进而被机器理解,减轻人工负担。
- 视频结构化的应用场景:前述视频网址/短视频平台/监控安防/直播/无人机/门禁系统/电子警察/车载系统
- 视频结构化应用的常见架构:软件层面→业务平台➕算法服务;硬件层面→后端智能分析/边缘智能分析/前端智能分析;视算力下沉的程度决定;服务器分析/边缘设备分析/板卡分析
- chap2:视频结构化主要技术栈:视频接入、解码、推理、跟踪、数据中介、OSD叠加、视频编码、视频推流
管道其实就是把这些环节穿起来;一个环节只负责感意见视频;这样的好处就是①职责单一,可以模块化/插件化,一个插件只做一个事情,把所有插件穿起来就是一个完整的流程。基本上视频结构化视频分析都是这样的框架/流模式。- 3.1 主要技术栈——视频接入src node:枪机/球机/NVR/sensor/file等;视频流接入:rtsp/私有协议/rtmp/取流模块;sensor是VI模块;未知视频流是socket模块
NVR网络视频录像存视频,外加还有一个分发的能力——视频分发平台、视频存储平台、视频管控平台。- 前端智能、边缘智能、后端智能;前置和边缘/后端有点差异,技术栈是有差异的。
- 3.2 视频解码:镜头感光→sensor光信号转电信号→主控板图片转视频流/压缩编码→网络传输→解码模块→显式;
- 解码模块:ffmepg/gstreamer/nvidia video codec sdk等 硬件加速平台
- 解码是一个相当耗时的操作,CPU上解码的话,性能跟不上。爱奇艺的CPU I9已经算好的了,解码那种高清的可能也就只能解记录;几十路这样数量级的高清视频流的解码,就必须要使用一些专门的赢家你加速,gpu npu,专门带有这种编解码的模块。
- 为什么要将图片压缩成视频?压缩的主要功能一个是方便传输,第二个方便存储。图片是一个体积非常大的数据,把图片编码压缩成视频流后体积总体是小一些。
- 常见的图像推理算法:分类、检测、特征编码/识别、分割、超分、换脸;算法的推理加速库如何工作?
- 3.3 图像算法推理
- 怎么提升推理环节的性能?——这个非常关键。推理显存GPU;CPU内存
每次都是图像/视频流这样重量级的数据在GPU和CPU之间倒腾,copy to copy from来回折腾了三次。这个是非常抵消的一个操作;那怎么去提升性能呢 - 只有跟踪在CPU上,跟踪的数据是结构化的数据,是轻量级的,无所谓。
- 板卡GPU和CPU是独立的,内存和显存是独立的;中间是copy to copy from的操作,中间通过PCIE的这种插槽的方式去做数据传输;所以可能会有一些带宽的限制。
- 还有一种像jetson这种板卡,它的物理显存和物理内存是统一的,就不涉及这种copy to copy from这种操作,直接是共享的;相当于物理层面就是共享的。需要注意。
- 怎么提升推理环节的性能?——这个非常关键。推理显存GPU;CPU内存
- 3.4 目标跟踪:跟踪算法效果好坏的主要指标是:ID switch
还有就是算法速度/实时性也是指标。 - 3.5 数据中介
- 3.6 OSD叠加
- OSD叠加的主要目的是什么?方便调试;自然直观。检测框+跟踪框+行为分析等等。方便调试结果直观。
- OSD叠加可以叠加哪些信息?
- 怎么提升OSD的绘图性能?——GPU上完成绘图,整个流程只拷贝两次。性能提升非常快的。cuda opencv有自带加速版本的绘图,Nvidia的板子可以直接用。
板卡有对应的加速绘图的API的;用对应的API加速就可以在显存里面画图了;绘图后就直接编码;编码完后再拷贝下来。
- 3.7 视频编码:图片往外推太大了;要把图片编码为视频流传出去;输出就是字节流/视频流。有一些对应的SDK工具,ffmpeg/gstreamer
- 编码比解码更消耗性能:例如单CPU可以解码10路,可能只能编码2路。大概是这样的一个比例。
- 编码控制:常见三种控制,分辨率、帧率、码率。
- 高清1080p,准高清720p;
- 帧率一般25fps;但是拍快速运动的物体,可能需要一些高帧率相机如60fps,120fps;高帧率相机不仅对硬件有要求,对算法也有要求。
- 码率:1s秒钟包含了多少数据;8M/4M/1M.512k/32k,32k可能视频就不是很清晰了。
- 高清视频-码率4M/8M
- 转码的流程:把一种分辨率的视频转为另一种分辨率;解码和编码的组合。——视频上云上,有这些转码的需求;博主上传高清视频,手机上看128k CIF分辨率就可以了。就是直播
- 3.8 视频推流:
- 录像和预录像:
- 原始录像和OSD录像的差异:
- 原始录像几乎不消耗硬件性能。时钟技术——不精准。一般使用这个原始录像,不消耗硬件性能;同时录10路的话,基本上一般的硬件是扛不住的,CPU肯定更扛不住了;GPU也会影响一些环节;所以最好不要涉及到编码,涉及编码的环节最好避免。
- OSD录像:图片可能是压缩过的。需要再次编码,非常消耗性能。
- 3.1 主要技术栈——视频接入src node:枪机/球机/NVR/sensor/file等;视频流接入:rtsp/私有协议/rtmp/取流模块;sensor是VI模块;未知视频流是socket模块
- chap3
- chap4 主要硬件平台
- 5.1 认识硬件加速平台:硬件解码、硬件编码、推理、OSD绘图叠加,都需要用到硬件加速。
为什么需要硬件加速?加速卡有哪些?加速卡有自己的显存。- 英伟达的GPU显卡分两级:消费级2080ti和数据中心级算力卡T4。
- NPU 神经网络加速处理单元
- 谷歌的TPU:tensorr处理单元、张量处理。
- 为什么CPU不够用?为什么深度学习AI模型推理时需要AI加速?编解码的时候为什么一定要用额外的硬件如GPU这种硬件来加速?
- 数据在软硬设备中的交换的过程。99%的数据/程序都是在CPU软的这一侧。
- 5.5 瑞芯微平台:与nvidia、华为、寒武纪有非常大的差异。硬件主要分为三大块:端侧、边缘侧、云端。
- 瑞芯微没有云端的硬件产品;主要集中在消费级的设备、智能前端、边缘侧。
- 5.1 认识硬件加速平台:硬件解码、硬件编码、推理、OSD绘图叠加,都需要用到硬件加速。
- chap5 行为分析类应用
- 5.4 目标停留/逗留
- 什么时候需要判断目标停止/逗留?——违停、事故撞车导致停车、可疑人员逗留/闲逛。
- 判断流程——
- chap6 检索比对类应用
- chap7 视频结构化技术应用难点
- chap8 实战类准备
- 生产者消费者模式
- 维持框架持续运行的动力(泵结构)
- 保证框架扩展的能力(接口和回调)
- chap9 认识框架
- chap10 使用框架
1. 为什么选择gstreamer不选择ffmpeg?
- gst主要使用起来方便,但是二次开发难,尤其gst硬件加速的部分大部分人都搞不了;gst国内资料少,看官方文档也不知所以
gst的性能还可以;但opencv封装的gst后,性能变差;随便创建一个videocapture,open后什么都不敢,top看线程久涨了十几个。
重写videocapture类后,每路流2个线程,CPU解码40路1080p视频,一共121个线程。(40*2+40*1消费线程+1主线程)——以后都将改为基于ffmpeg的了。
为什么Deepstream和mxVision性能高一些,有什么特殊优化吗?——答:直接的数据搬运少了
资源建议:b站北小才的视频智能检测,C++。
硬件编码订阅rtmp流,卡顿。——答:看下pipeline管道图。