打开微信,使用扫一扫进入页面后,点击右上角菜单,
点击“发送给朋友”或“分享到朋友圈”完成分享
视频二级结构化是采用先进的智能分析技术,通过一级网络对视频图像中的车辆、行人、非机动车等目标对象进行检测,分类,并将检测结果择优传入二级网络,二级网络对目标类型,外观等属性特征进行二级结构化,为事前中、事后的事件布防、综合布控、研判分析提供数据基础,保证信息查找检索的高效性,提高公安视频的应用效率。简而言之,视频结构化就是一种智能分析,能够对视频数据进行深度挖掘和信息提取。
1 | 如需获取源代码.请联系AE/FAE部门 |
1 | git checkout sec_strc_demo |
1 | cd cnstream |
1 2 3 4 | mkdir build cd build cmake .. make -j8 |
1 |
./run.sh |
cnstream是一款以数据为驱动的pipeline插件系统,二级结构化demo基于寒武纪视频处理框架cnstream.
dataSurce: 数据源插件,负责多种格式的图片视频解码。
Inferencer 推理插件,负责将输入到深度学习网络进行推理。在demo使用网络:resnet34_ssd.cambricon
Tracker: 追踪插进,负责标识视频中的同一移动物体。
Inferencerex:用户自定义插件,在inferencer插件的基础上添加二级结构化的功能,将根据一级网络检测结果,截图图像,并根据图像分类结果,运行不同的推理网络。
在demo中使用了行人和车辆的二级结构化网络: resnet18_car.cambricon和resnet18_pedestrian.cambricon。
Osd:在图像显示前,对检测结果根据score进行择优,并绘制图像边框,属性信息。
Encoder:将包含检测结果的数据编码为视频文件。
{
"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"
}
}
}
优化前:
在进行优化之前,程序的运行逻辑是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的平均帧率有部分提高。
整体来说效果一般,存在误检,漏检的情况,还远远达不到商用的效果,仅仅作为demo展示,后期还需要重新训练模型。
热门帖子
精华帖子