视频二级结构化demo wuhao2019-11-06 09:42:03 回复 查看 资源共享 综合话题
视频二级结构化demo



1.基础概念

 视频二级结构化是采用先进的智能分析技术,通过一级网络对视频图像中的车辆、行人、非机动车等目标对象进行检测,分类,并将检测结果择优传入二级网络,二级网络对目标类型,外观等属性特征进行二级结构化,为事前中、事后的事件布防、综合布控、研判分析提供数据基础,保证信息查找检索的高效性,提高公安视频的应用效率。简而言之,视频结构化就是一种智能分析,能够对视频数据进行深度挖掘和信息提取。

 

 

2.demo复现


下载源代码

1
git clone git@172.10.80.76:video/cnstream.git

切换分支

1
git checkout sec_strc_demo

进入代码目录

1
cd cnstream

编译代码

1
2
3
4
mkdir build
cd build
cmake ..
make -j8

 运行代码

1

cd cnstream/samples/secondary_structure

./run.sh


3.代码结构

cnstream是一款以数据为驱动的pipeline插件系统,二级结构化demo基于寒武纪视频处理框架cnstream.

 

demopipeline如下图所示:

pipeline.png

  

  1. dataSurce:  数据源插件,负责多种格式的图片视频解码。

  2. Inferencer 推理插件,负责将输入到深度学习网络进行推理。在demo使用网络:resnet34_ssd.cambricon

  3. Tracker:    追踪插进,负责标识视频中的同一移动物体。

  4. Inferencerex:用户自定义插件,在inferencer插件的基础上添加二级结构化的功能,将根据一级网络检测结果,截图图像,并根据图像分类结果,运行不同的推理网络。

    demo中使用了行人和车辆的二级结构化网络: resnet18_car.cambricon和resnet18_pedestrian.cambricon。                  

  5. Osd:在图像显示前,对检测结果根据score进行择优,并绘制图像边框,属性信息。

  6. Encoder:将包含检测结果的数据编码为视频文件。

 

 

pipeline配置文件:

{

  "source" : {

    "class_name" : "cnstream::DataSource",

    "parallelism" : 0,

    "next_modules" : ["detector"],

    "custom_params" : {

      "source_type" : "ffmpeg",

      "output_type" : "mlu",

      "decoder_type" : "mlu",

      "device_id" : 0

    }

  },

  "detector" : {

    "class_name" : "cnstream::Inferencer",

    "parallelism" : 32,

    "max_input_queue_size" : 20,

    "next_modules" : ["tracker"],

    "custom_params" : {

      "model_path" : "../data/models/MLU100/Primary_Detector/resnet34ssd/resnet34_ssd.cambricon",

      "func_name" : "subnet0",

      "postproc_name" : "PostprocSsd",

      "device_id" : 0

    }

  },

  "tracker" : {

    "class_name" : "cnstream::Tracker",

    "parallelism" : 32,

    "max_input_queue_size" : 20,

    "next_modules" : ["classifier"],

    "custom_params" : {

      "model_path" : "../data/models/MLU100/Deepsort/deepsort.cambricon",

      "func_name" : "subnet0"

    }

  },

  

    "classifier" : {

    "class_name" : "cnstream::Inferencerex",

    "parallelism" : 32,

    "max_input_queue_size" : 20,

    "next_modules" : ["osd"],

    "custom_params" : {

      "model_list_path" : "files.list_model",

      "func_name" : "subnet0",

      "preproc_name" : "PreprocResnet18",

      "postproc_name" : "PostprocResnet18",

      "device_id" : 0

    }

  },

  "osd" : {

    "class_name" : "cnstream::Osd",

    "parallelism" : 32,

    "max_input_queue_size" : 20,

    "next_modules" : ["encoder"],

    "custom_params" : {

      "label_path" : "../data/models/MLU100/Primary_Detector/resnet34ssd/label_voc.txt",

      "sec_lable_path_lsit" : "files.list_sec_label"

    

    }

  },

  "encoder" : {

    "class_name" : "cnstream::Encoder",

    "parallelism" : 32,

    "max_input_queue_size" : 20,

    "custom_params" : {

      "dump_dir" : "output"

    }

  }

}

 

 

 

 

4.性能优化

 

trackerId

优化前:

在进行优化之前,程序的运行逻辑是Inferencerex插件将遍历Inferencer插件检测到的所有objs,并根据bounding box截取objs的图像resize到二级结构化网络要求的size,进行推理。可以想象,Inferencer插件检测到的物体可能有多个,如果将每个物体在逐帧依次送入到Inferencerex进行二级结构化推理,在这里将成为pipeline的性能瓶颈。并且由于检测网络的不稳定性,同1运动物体输入到网络的检测结果可能有差异,将导致在输出视频中,二级结构化信息词条抖动。

优化后:

使用trackerId可以优化二阶结构化网络的输入策略。trackerId是Tracker模块对视频中同1运动物体的标识,将该标识添加到Inferencer插件的输出结果信息中,在Inferencerex插件中维护1个已推理的trackerId hashmap,只将含新出现trackerID的obj送入到二阶结构化网络进行推理,将极大的减少MLU100的推理负担。并且同1物体的检测结果词条抖动消息消除,但是于此同时,如果目标的第一次检测结果含错误信息,将导致在该目标在整个视频画面的检测信息都为错误的。后期应该在择优问题上进行优化。

经过测试,Inferencerex的平均处理帧率提高了40倍左右。

 

 

内存复用

cnstream的整个pipeline中,对图像的处理原则为不改变原始图像数据。

在二级结构化网络(resnet18_car.cambricon和resnet18_pedestrian.cambricon)的预处理中,将根据一级网络的输出bounding box将 进行截取,并resize到要求size 输入到二级网络。

优化前:

每个bounding box将拷贝1分原始图像,并在拷贝图像上根据bounding box截取图像。

优化后:

将原始图像的副本拷贝到动态内存中。每次截取图像,直接在动态内存中截图图像,减少内存拷贝。

经过测试,Inferencerex的平均帧率有部分提高。

 

 

5.运行结果


 

 整体来说效果一般,存在误检,漏检的情况,还远远达不到商用的效果,仅仅作为demo展示,后期还需要重新训练模型。

 

 

 

 

 

 

 

 

 

 

 

 

 


官方微博 官方微信
版权所有 © 2019 寒武纪 Cambricon 备案/许可证号:京ICP备17003415
关闭