# vehicle behaviour analysis # 使用VideoPipe做车辆行为分析(交通事件检测,计数/停车)。 ### 提前准备 ### 1. 已准备好 `VideoPipe` 编译/运行环境(参见视频教程) 2. 已准备好本案例所需的测试模型和测试数据(即 `vp_data`,具体参见视频教程) 3. 已安装好本案例中 `Python3` 所需的依赖库(主要是`numpy`,`pandas`,`opencv`,`flask`,`faiss`等,其余按需安装即可) ### 主要文件 ### 1. `vehicle_ba_pipeline.cpp` 运行VideoPipe管道,读取视频文件,并进行车辆检测、跟踪、行为分析(跨线/停止),最后将结果通过Socket/UDP发送给后台服务。 2. `vehicle_ba_server.py` 接收行为分析结果并写入数据库,并提供一个基于 `flask` 的Web UI供数据查询。 3. `clean.sh` 帮助清空当前workspace下面的所有缓存数据。 ![](./docs/1.png) ### 如何使用 ### 1. CMake编译 `vehicle_ba_pipeline.cpp` 生成二进制文件并运行, 它会生成行为分析结果。 (编译之前请先修改代码中 `des_ip` 的值) 2. 运行 `python3 vehicle_ba_server.py` 接收行为分析结果,然后打开浏览器访问 `http://server-ip:7878` 浏览行为分析结果. (运行前,请先修改 `bind_ip` , `live_stream_0` 以及 `live_stream_1` 的值) ### 数据流向 ### 1. [pipeline -> BA results and other related data -> send via socket] 2. [receive BA data -> display BA results from web] ``` please run `sh clean.sh` if you want to restart sample from scratch. ``` ### VideoPipe管道介绍 ### ![](./vp_analysis_board.png) 1. `layer_1` 模拟获取车辆监控视频,实际可以换成rtsp/rtmp/udp/视频监控平台,或者直接从摄像机Sensor抓图。注意这里同时接入2个通道(`channel_index` 从0开始)。 2. `layer_2` 完成车辆检测,从大图中定位车辆位置,创建 `vp_frame_target` 对象,初始化它们的`primary_class_id`/`primary_label`/`primary_score`。 3. `layer_3` 完成车辆颜色分类,基于前面检测结果完成车辆颜色分类(`二级推理`),更新 `vp_frame_target` 的 `secondary_labels`/`secondary_class_ids`/`secondary_scores`。 4. `layer_4` 完成车辆车型分类,基于前面检测结果完成车辆车型分类(`二级推理`),更新 `vp_frame_target` 的 `secondary_labels`/`secondary_class_ids`/`secondary_scores`。 5. `layer_5` 完成车辆目标跟踪,基于SORT算法完成车辆目标跟踪,更新 `vp_frame_target` 的`track_id`、`tracks`。 6. `layer_6` 完成跨线/计数判断,基于`tracks`和`BA配置参数`,完成跨线逻辑判断,创建 `vp_ba_result` 对象。 7. `layer_7` 完成停止/停车判断,基于`tracks`和`BA配置参数`,完成停止逻辑判断,创建 `vp_ba_result` 对象。 8. `layer_8` 完成数据代理,将管道中的BA行为分析结果(`vp_ba_result`)按自定义格式,以Socket/UDP方式转发给Python后台服务。 9. `layer_9` 完成跨线结果绘制,将计数判断结果(`vp_ba_result`)绘制到帧上。 10. `layer_10` 完成停止结果绘制,将停车判断结果(`vp_ba_result`)绘制到帧上。 11. `layer_11` 完成录制工作,接收前面BA节点发出的`录制`指令(`vp_image_record_control_meta`/`vp_video_record_control_meta`),完成`截图`和`录像`功能。 12. `layer_12` 完成管道拆分工作,基于`channel_index`拆分管道,通道index相同的帧数据流向同一个分支。 13. `layer_13` 占位节点。 14. `layer_14` - `screen_des_0` 负责第`1通道`的GUI输出显示,显示基本无延时。 - `rtmp_des_0` 负责第`1通道`rtmp编码推流,Web UI通过rtmp地址可以实时播放,有若干秒延时。 - `screen_des_1` 负责第`2通道`的GUI输出显示,显示基本无延时。 - `rtmp_des_1` 负责第`2通道`rtmp编码推流,Web UI通过rtmp地址可以实时播放,有若干秒延时。 ### 重要知识点 ### 1. `通道合并`的工作原理。 2. `跨线`、`停止`判断逻辑。 3. `截图`、`录像`工作原理。 4. `vp_split_node` 类型工作原理。 # Sample运行截图 # **计数(跨线) && 停车(停止)** ![](../../doc/p48.png)