IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> deepstream meta应用 -> 正文阅读

[大数据]deepstream meta应用

deepstream_user_metadata_app

osd_sink_pad_buffer_probe
{
? //访问帧级usermeta.
}
nvinfer_src_pad_buffer_probe{
? ?//添加帧级usermeta.
}
?

deepstream-test1
对osd的sink加了一个probe函数osd_sink_pad_buffer_probe,如下代码, NvDsFrameMeta下有NvDsFrameMetaList,NvDsFrameMeta下有NvDsObjectMetaList,统计NvDsFrameMeta下人和车的个数,并创建NvDsDisplayMeta,将文本信息挂在NvDsDisplayMeta的NvOSD_TextParams,再将NvDsDisplayMeta挂到NvDsFrameMeta。

osd_sink_pad_buffer_probe{
? ?for (l_frame = batch_meta->frame_meta_list; l_frame != NULL; l_frame = l_frame->next) {
? ? ? NvDsFrameMeta *frame_meta = (NvDsFrameMeta *) (l_frame->data);
? ? ? for (l_obj = frame_meta->obj_meta_list; l_obj != NULL; l_obj = l_obj->next){
? ? ? ? ?//统计人和车个数。
? ? ?}
? ? ? ? 。。。。。。
? ? ?display_meta = nvds_acquire_display_meta_from_pool(batch_meta);
? ? ?NvOSD_TextParams *txt_params ?= &display_meta->text_params[0];
? ? ?nvds_add_display_meta_to_frame(frame_meta, display_meta);?

? }
}


deepstream-gst-metadata-test

这个例子是在streammux之前加的user meta, 在streamnux之后,会被转为NvDsFrameMeta级别的user meta.? 有三个probe函数,从函数名就能看出函数挂在什么地方。
h264parse_src_pad_buffer_probe? ?
{
?/* Attach decoder metadata to gst buffer using gst_buffer_add_nvds_meta() */
? meta = gst_buffer_add_nvds_meta (buf, h264parse_meta.....
? /* Set metadata type */
? meta->meta_type = (GstNvDsMetaType)NVDS_GST_META_BEFORE_DECODER_EXAMPLE;
}
nvdecoder_src_pad_buffer_probe? ?
{
? /* Attach decoder metadata to gst buffer using gst_buffer_add_nvds_meta() */
? meta = gst_buffer_add_nvds_meta (buf, decoder_meta.....
? /* Set metadata type */
? meta->meta_type = (GstNvDsMetaType)NVDS_DECODER_GST_META_EXAMPLE;
}
nvinfer_src_pad_buffer_probe? ? ?
{
? ? NvDsBatchMeta *batch_meta = gst_buffer_get_nvds_batch_meta (buf);
? ? for (l_frame = batch_meta->frame_meta_list; l_frame != NULL; l_frame = l_frame->next) {
? ? ? ? NvDsFrameMeta *frame_meta = (NvDsFrameMeta *) (l_frame->data);
? ? ? ? for (l_user_meta = frame_meta->frame_user_meta_list; l_user_meta != NULL; l_user_meta = l_user_meta->next) {
? ? ? ? ? ? ? if(user_meta->base_meta.meta_type == NVDS_DECODER_GST_META_EXAMPLE)
? ? ? ? ? ? ? {...... }

? ? ? ? ? ? ?if(user_meta->base_meta.meta_type == NVDS_GST_META_BEFORE_DECODER_EXAMPLE)
? ? ? ? ? ? ?{...... }
? ? ? ? }
? ? }
}

deepstream_image_meta_test
有两个probe函数,在这个pgie_src_pad_buffer_probe中,将检测到的object进行jpg编码,挂到object的usermeta,在osd_sink_pad_buffer_probe中可以保存jpg到本地。
osd_sink_pad_buffer_probe{
? ? ? snprintf (fileNameString, FILE_NAME_SIZE, "%s_%d_%d_%d_%s_%dx%d.jpg",
? ? ? ? ? osd_string, frame_number, frame_meta->source_id, num_rects,
? ? ? ? ? obj_meta->obj_label, obj_res_width, obj_res_height);
? ?while (usrMetaList != NULL) {
? ? ? ? ? NvDsUserMeta *usrMetaData = (NvDsUserMeta *) usrMetaList->data;
? ? ? ? ? if (usrMetaData->base_meta.meta_type == NVDS_CROP_IMAGE_META) {
? ? ? ? ? ? NvDsObjEncOutParams *enc_jpeg_image =
? ? ? ? ? ? ? ? (NvDsObjEncOutParams *) usrMetaData->user_meta_data;
? ? ? ? ? ? fwrite (enc_jpeg_image->outBuffer, sizeof (uint8_t),
? ? ? ? ? ? ? ? enc_jpeg_image->outLen, file);
? }
}?
pgie_src_pad_buffer_probe ??
{

? ? ? ?//obj_meta存有位置信息
? ? ? ? nvds_obj_enc_process (ctx, &userData, ip_surf, obj_meta, frame_meta);
}

deepstream_infer_tensor_meta_test

有4级别推理,分别是识别人车,车类型,车颜色,车制造商。 sgi的network_mode是100,那就要自己实现后处理,比如解析tensor data以获取分类置信度和标签,如果置信度大于阀值,就创建classifier_meta,并添加到object_meta。

here we will

* iterate & parse the tensor data to get classification confidence and labels.

* The result would be attached as classifier_meta into its object's metadata.

osd_sink_pad_buffer_probe? ? ?//挂在osd

{

? ?//跟其他例子一样,往帧级meta加个display meta.

? ? nvds_add_display_meta_to_frame (frame_meta, display_meta);

}
pgie_pad_buffer_probe? ?// 挂在一级推理之后
{
? ? PGIE会把推理得到NvDsInferTensorMeta挂到帧级meta,在这个函数中,先获取到NvDsInferTensorMeta数据,再调NvDsInferParseCustomResnet进行解析,存到? ? ? std::vector < NvDsInferObjectDetectionInfo > objectList;最后将所有矩形信息,添加到帧级meta,如下:

? ? ? for (const auto & rect:objlist) {

? ? ? ? ? NvDsObjectMeta *obj_meta =

? ? ? ? ? ? ? nvds_acquire_obj_meta_from_pool (batch_meta);

? ? ? ? ? nvds_add_obj_meta_to_frame (frame_meta, obj_meta, NULL);

? ? ? }
}
sgie_pad_buffer_probe ? //挂在二级推理之后
{
? ?SGIE会把推理得到NvDsInferTensorMeta挂到object级meta,在这个函数中,也是先获取NvDsInferTensorMeta数据,再解析tensor,得到置信度和标签,最后创建NvDsClassifierMeta,添加到object级别meta,如下:

? ? ? ? ? nvds_add_label_info_meta_to_classifier (classifier_meta, label_info);

? ? ? ? ? nvds_add_classifier_meta_to_object (obj_meta, classifier_meta);

}

nvds_remove_obj_meta_from_frame

此函数用于从framemeta上删除objectmeta,比如检测出有人和车的meta,只想留下人的meta,可以应用此函数,如下修改deepstream-test1的例子:

for (l_frame = batch_meta->frame_meta_list; l_frame != NULL;
? ? ? l_frame = l_frame->next) {
? ? ? ? NvDsFrameMeta *frame_meta = (NvDsFrameMeta *) (l_frame->data);
? ? ? ? ? printf("loop\n");
? ? ? ? //nvds_remove_frame_meta_from_batch(batch_meta, frame_meta);
? ? ? ? int offset = 0;
? ? ? ? for (l_obj = frame_meta->obj_meta_list; l_obj != NULL;
? ? ? ? ? ? ? ? ) {
? ? ? ? ? ? obj_meta = (NvDsObjectMeta *) (l_obj->data);
? ? ? ? ? ? NvDsMetaList *obj_next = l_obj->next;
? ? ? ? ? ? if (obj_meta->class_id == PGIE_CLASS_ID_VEHICLE) {
? ? ? ? ? ? ? ? vehicle_count++;
? ? ? ? ? ? ? ? num_rects++;
? ? ? ? ? ? ? ? printf("remove\n");
? ? ? ? ? ? ? ? nvds_remove_obj_meta_from_frame(frame_meta, obj_meta);
? ? ? ? ? ? }
? ? ? ? ? ? if (obj_meta->class_id == PGIE_CLASS_ID_PERSON) {
? ? ? ? ? ? ? ? person_count++;
? ? ? ? ? ? ? ? num_rects++;
? ? ? ? ? ? ? ? ?printf("have person\n");

? ? ? ? ? ? }

? ? ? ? ? ? l_obj = obj_next;

? ? ? ? }?
? ? }
?

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 08:10:56  更:2022-05-08 08:14:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:26:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码