[AI开发]基于DeepStream的视频结构化解决方案

本文介绍视频结构化,利用深度学习将视频非结构化数据转为结构化数据,常见流程含目标检测、分类、跟踪、行为分析。还介绍常见目标检测算法,如SSD、YOLO、Faster - RCNN。此外,提及GStreamer框架适合视频结构化处理,以及使用DeepStream SDK做视频结构化应用的好处。

 

视频结构化的定义

利用深度学习技术实时分析视频中有价值的内容,并输出结构化数据。相比数据库中每条结构化数据记录,视频、图片、音频等属于非结构化数据,计算机程序不能直接识别非结构化数据,因此需要先将这些数据转换成有结构格式,用于后续计算机程序分析。视频结构化最常见的流程为:目标检测、目标分类(属性识别)、目标跟踪、目标行为分析。最后的目标行为分析严格来讲不属于视频结构化的范畴,可以算作前面每个环节结果的应用。由于现实生产过程中,一个完整的应用系统总会存在“目标行为分析”这个过程(否则光得到基础数据不能加以利用),所以本篇文章将其包含进来。

 

目标检测

对单张图片中感兴趣的目标进行识别、定位,注意两点,一个是检测的对象是静态图片,二是不但需要识别目标的类别,还需要给出目标在原图片中的坐标值,通常以(left, top, width, height)的形式给出。注意目标检测仅仅给出目标大概位置坐标(一个矩形区域),它跟图像分割不同,后者定位更加具体,能够给出图片中单个目标的轮廓边界。

 

目标分类(属性识别)

通常目标被检测出来之后,会进行二次(多次)推理,识别出目标更加具体的属性,比如小轿车的颜色、车牌子奥迪还是奔驰等等。对于人来讲,可以二次推理出人的性别、年龄、穿着、发型等等外貌属性。这个环节主要对检测出来的目标进行更加具体的属性识别。

 

目标跟踪

前面两个环节操作的对象是静态单张图片,而视频有时序性,前后两帧中的目标有关联关系。目标跟踪就是为了将视频第N帧中的目标和第N+1帧中的同一目标关联起来,通常做法是给它们赋予同一个ID。经过目标跟踪环节后,理论情况下,一个目标从进入视频检测范围到离开,算法赋予该目标的ID固定不变。但是现实生产过程中,由于各种原因,比如目标被遮挡、目标漏检(第N帧检测到,第N+1帧没检测到)、跟踪算法自身准确性等等原因,系统并不能锁定视频中同一个目标的ID。目标ID不能锁定,会造成目标行为分析不准的问题,后面会提到。

 

目标行为分析

视频中目标被跟踪到,赋予唯一ID之后,我们可以记录目标在视频检测范内的运动轨迹(二维坐标点集合),通过分析目标轨迹点数据,我们可以做很多应用。比如目标是否跨域指定区域、目标运动方向、目标运动速度、目标是否逗留(逗留时长)、目标是否密集等等。该应用多存在于安防、交通视频分析领域。

 

目标检测算法

常见基于深度学习神经网络的目标检测算法有3种,SSD、YOLO以及Faster-RCNN,具体请搜索网络,介绍文章非常多了。三者各有优劣,遵循一个原则:速度快的准确性不好,很多目标检测不准,很多小目标检测不到、容易漏检等;准确性好的速度不快,可能达不到实时检测的要求,或者需要更高的硬件条件。鱼和熊掌不可兼得,牺牲速度可以换来准确性。这三种常见目标检测算法,综合性比较好的是YOLO(现在已经是YOLO V3版本),准确性、小目标检测、检测速度上都可以接受。SSD速度快,我在RTX 2080 的GPU上,能够检测32路1080P高清实时流,但是YOLO V3勉强可以跑到16路。Faster-RCNN准确性更好,但是速度太慢,如果你有很好的GPU硬件支持,或者单台服务器要求检测视频路数比较少,可以采用Faster-RCNN。下图第一张是SSD算法效果,第二张是YOLO V3的算法效果,两者模型都是采用同样的数据集训练而成,可以很明显看到,后者比前者效果好很多(忽略图中速度值)。

需要注意的是,不管是何种算法,它们的检测效果受数据集质量影响非常大,数据集数量不够、标注质量不高,都会严重影响最终检测结果。做深度学习应用型系统,数据集的重要性非常明显。

 

视频结构化处理流程框架

前面说到过,视频结构化包含多个环节,各个环节相连而成,形成一个Pipeline的结构。在实际生产过程中,我们还需要有视频流接入的环节,它负责接收视频流数据,由于网络接收到的视频数据是编码过后的格式,我们还需要解码的环节,将原始视频数据解码成一张张RGB格式的图片(这之前可能还需要颜色空间转换,将YUV格式转换成RGB),之后将单帧图片送给推理模型进行推理,返回推理结果。

很明显,视频结构化是一个数据流式的处理过程,如果对GStreamer框架比较熟悉的人可能或想到,GStreamer非常适合做这件事情。这里是GStreamer的官网:https://gstreamer.freedesktop.org/,跟FFmpeg类似,它主要用于音视频多媒体程序开发,但是两个侧重点不同,GStreamer中将多媒体处理流程中的每个环节都封装成单个的插件,每个插件负责不同的任务,比如有接收视频流的、有负责编解码的、有颜色空间转换的等等,这些常用插件都已经有现成非常成熟的,不需要自己开发。插件和插件之间通过某个协议进行连接,最终形成一个完整的Pipeline。目前来看,使用FFmpeg的人明显多余GStreamer。在我们这个应用场景中,GStreamer非常适合我们,Nvidia官方推出的智能视频分析SDK DeepStream也是基于GStreamer开发而成,Nvidia为我们准备好了现成的插件,有负责推理的,有负责目标跟踪的,还有负责图片叠加和显示的。我们在使用DeepStream的同时,也可以使用GStreamer中已有的其他插件,他们可以无缝集成,非常方便。

这里必须要提一下,GStreamer是C语言开发的,而我们知道C语言并非面向对象,如果要用到面向对象的特性必须采取其他措施,GStreamer就是使用了GObject那一套东西,GObject又是什么呢?它是一套在C中使用面向对象编程的规范。如果已经非常熟悉主流面向对象语言的人,再去接收GObject这种编程风格,会要疯掉,反人类(我这样觉得)。下图是采用DeepStream SDK开发视频结构化的Pipeline,简单示意,并非真实生产中的结构:

 

使用DeepStream 做视频结构化应用的好处

如果你用的推理硬件是Nvidia出的,比如Tesla系列显卡、Geforce系列显卡等等,那么使用DeepStream SDK的好处有:

(1)内置推理加速插件nvinfer,注意普通深度学习模型(caffe、tensorflow等)在没有经过tensorRT加速之前,速度是上不来的。而DeepStream内置的nvinfer推理插件不断支持各种目标检测算法(SSD、YOLO、Faster-RCNN)以及各种深度学习框架模型(自由切换),内部还自带tensorRT INT8/FP16加速功能,不需要你做额外操作;

(2)内置目标跟踪插件nvtracker,目前DeepStream 3.0提供两种跟踪算法,一种基于IOU的,这种算法简单,但是快;另外一种KLT算法,准确但是相对来讲慢一些,而且由于这个算法是跑在CPU上,基于KLT的跟踪算法对CPU占用相对大一些;

(3)内置其他比较有用的插件,比如用于视频叠加(目标方框叠加到视频中)的nvosd、硬件加速解码插件nvdec_h264,专门采用GPU加速的解码插件,还有其他颜色转换的插件。

(4)提供跟视频处理有关的各种元数据类型以及API,方便你扩展自己的元数据类型,元数据在GStreamer中是一个很重要的概念。

使用DeepStream SDK的前提是要先掌握GStreamer的基本用法,否则就是抓瞎,前者其实就是后者的一堆插件集合,方便供你构建视频推理Pipeline。当然,你还需要一些CUDA编程的基础知识。

 

下面提供一个基于YOLO V3 16路1080P高清视频实时目标检测、跟踪、叠加、目标行为判断、结构化数据上报 应用系统截图(截取其中4路图像),由于某些原因,不再做过多的技术细节介绍了。

转载于:https://www.cnblogs.com/xiaozhi_5638/p/10831459.html

<think>我们正在讨论如何将DeepstreamKafka集成,特别是使用Deepstream将数据发送到Kafka。根据用户的问题,他想要查找相关的技术文章,并提到了几个关键词:deepstreamintegratekafka,senddatatokafkausingdeepstream,deepstreamkafkaproducerexample。根据之前的引用,我们知道Kafka是一个分布式事件流平台,常用于构建实时数据管道和流处理应用(引用[4])。KafkaConnect是Kafka的集成API,用于将其他系统的数据导入Kafka或将Kafka的数据导出到其他系统(引用[1])。但是,用户的问题是关于Deepstream的,所以我们需要关注Deepstream如何作为生产者直接发送数据到Kafka。Deepstream是一个用于构建实时应用程序的平台,特别擅长处理视频流和分析。它通常用于计算机视觉和人工智能应用。因此,将Deepstream的分析结果发送到Kafka是一种常见的需求,以便后续处理或其他系统集成。解决方案可能包括:1.使用Deepstream的插件或扩展机制,编写一个Kafka生产者插件。2.在Deepstream的应用代码中,直接使用Kafka的生产者API(如kafka-python)将数据发送到Kafka。由于用户要求的是技术文章或示例,我们可以提供以下思路:###方法1:在Deepstream应用程序中直接使用Kafka生产者在Deepstream的Python应用程序中,我们可以初始化一个Kafka生产者,然后在Deepstream处理完每一帧数据后,将结果通过Kafka生产者发送出去。示例步骤:1.安装必要的库:`deepstream-sdk`和`kafka-python`(或confluent-kafka-python)。2.在Deepstream的pipeline中,添加一个自定义组件(例如,一个probe)来获取分析结果。3.在该组件的回调函数中,将数据发送到Kafka。###方法2:使用Deepstream的元数据(Metadata)扩展Deepstream允许在对象检测等结果上附加元数据。我们可以利用这个机制,将数据发送到Kafka。###示例代码框架以下是一个简单的代码框架,展示如何在DeepstreamPython应用中使用Kafka生产者:```pythonfromkafkaimportKafkaProducerimportjsonimportpyds#初始化Kafka生产者producer=KafkaProducer(bootstrap_servers='kafka-broker:9092',value_serializer=lambdav:json.dumps(v).encode('utf-8'))#Deepstream处理回调函数defsend_to_kafka(data):#将数据转换为字典或JSONmessage={'object_id':data.object_id,'label':data.label,'confidence':data.confidence,'bbox':[data.left,data.top,data.width,data.height]}producer.send('deepstream-topic',message)#在Deepstream的sinkpadprobe函数中调用send_to_kafkadefosd_sink_pad_buffer_probe(pad,info,user_data):#获取批处理数据batch_meta=pyds.gst_buffer_get_nvds_batch_meta(hash(gst_buffer))forframe_metainbatch_meta.frame_meta_list:forobj_metainframe_meta.obj_meta_list:#构建数据并发送send_to_kafka(obj_meta)returnGst.PadProbeReturn.OK#在创建pipeline时,将probe添加到sinkpad```注意:这只是一个概念性示例,实际实现需要根据Deepstream的版本和具体应用进行调整。###相关资源用户可能需要参考以下类型的资源:-Deepstream官方文档中关于元数据扩展和插件开发的部分。-KafkaPython客户端的文档(如kafka-python或confluent-kafka-python)。-社区中关于Deepstream和Kafka集成的博客文章或示例项目。§§相关问题§§1.如何安装和配置Deepstream以支持Kafka生产者?2.在Deepstream中发送数据到Kafka时,如何确保数据的高吞吐量和低延迟?3.除了直接使用Kafka生产者API,还有哪些方法可以将Deepstream数据发送到Kafka?</think>### DeepstreamKafka集成方案 要将Deepstream的分析数据发送到Kafka,主要有两种实现方式,核心原理都是通过Deepstream的元数据处理层(Metadata Layer)捕获分析结果,再通过Kafka生产者API传输: #### 方法1: 直接集成Kafka生产者 在Deepstream应用程序中直接调用Kafka生产者API发送数据,适用于自定义数据结构: ```python from kafka import KafkaProducer import json # 初始化Kafka生产者 producer = KafkaProducer( bootstrap_servers='kafka-server:9092', value_serializer=lambda v: json.dumps(v).encode('utf-8') ) def send_to_kafka(obj_meta): """将对象元数据发送到Kafka""" message = { 'object_id': obj_meta.object_id, 'class_id': obj_meta.class_id, 'confidence': obj_meta.confidence, 'bbox': [obj_meta.rect_params.left, obj_meta.rect_params.top, obj_meta.rect_params.width, obj_meta.rect_params.height] } producer.send('deepstream-topic', message) # 在Deepstream的probe回调中调用 def osd_sink_pad_buffer_probe(pad, info, user_data): batch_meta = pyds.gst_buffer_get_nvds_batch_meta(hash(gst_buffer)) for frame_meta in batch_meta.frame_meta_list: for obj_meta in frame_meta.obj_meta_list: send_to_kafka(obj_meta) return Gst.PadProbeReturn.OK ``` #### 方法2: 使用Kafka Connect适配器 通过Kafka Connect的REST API转发数据,适合标准化数据格式场景: 1. **配置Kafka Connect**:创建HTTP Sink Connector ```json { "name": "deepstream-http-connector", "config": { "connector.class": "io.confluent.connect.http.HttpSinkConnector", "tasks.max": "1", "http.api.url": "http://kafka-connect:8083", "topics": "deepstream-topic" } } ``` 2. **Deepstream发送数据**: ```python import requests def connect_to_kafka(data): requests.post( "http://kafka-connect:8083/", json=data, headers={"Content-Type":"application/vnd.kafka.json.v2+json"} ) ``` #### 关键配置注意事项 1. **数据序列化**:推荐使用Avro格式并配合Schema Registry,确保数据模式兼容性 2. **容错机制**:配置Kafka生产者的重试策略和ACK机制 ```python producer = KafkaProducer( retries=5, acks='all', request_timeout_ms=30000 ) ``` 3. **性能优化**: - 启用`linger_ms`和`batch_size`提升吞吐量 - 使用异步发送避免阻塞Deepstream流水线 4. **安全认证**:若启用SASL/SSL,需配置认证参数: ```python security_protocol='SASL_SSL', sasl_mechanism='PLAIN', sasl_plain_username='user', sasl_plain_password='pass' ``` #### 应用场景优势 1. **实时视频分析管道**:将Deepstream的物体检测结果输入Kafka,供下游AI模型消费[^4] 2. **边缘计算集成**:在边缘节点运行Deepstream,通过Kafka集群实现中心化数据处理[^1] 3. **状态持久化**:利用Kafka的分区复制机制确保分析数据不丢失[^5] 4. **流处理衔接**:通过Kafka Streams对视频分析结果进行实时聚合[^3] > **架构示意图** > $$ \text{Deepstream} \xrightarrow{\text{Metadata}} \text{Kafka Producers} \rightarrow \underset{\text{(分区复制)}}{\boxed{\text{Kafka Cluster}}} \rightarrow \text{Stream Processing} $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值