Files
窦玉玲 50f3977ea1 update deepsort/README.md.
Signed-off-by: 窦玉玲 <675135048@qq.com>
2022-10-27 07:53:36 +00:00
..
2022-10-22 10:12:05 +08:00
2022-10-22 10:12:05 +08:00
2022-10-14 17:21:48 +08:00
2022-10-22 10:12:05 +08:00
2022-10-19 09:47:38 +08:00
2022-10-27 07:53:36 +00:00
2022-10-14 17:21:48 +08:00

DeepSORT目标跟踪

1 介绍

DeepSORT目标跟踪后处理插件基于MindXSDK开发在晟腾芯片上进行目标检测和跟踪可以对行人进行画框和编号将检测结果可视化并保存。项目主要流程为通过live555服务器进行拉流输入视频然后进行视频解码将264格式的视频解码为YUV格式的图片图片缩放后经过模型推理进行行人识别识别结果经过FairMOT后处理后得到识别框对识别框进行跟踪并编号用编号覆盖原有的类别信息再将识别框和类别信息分别转绘到图片上最后将图片编码成视频进行输出。

1.1 支持的产品

昇腾310(推理)

1.2 支持的版本

本样例配套的CANN版本为5.0.4。支持的SDK版本为2.0.4

MindX SDK安装前准备可参考《用户指南》安装教程

1.3 软件方案介绍

基于MindX SDK的 DeepSORT目标识别业务流程为待检测视频存放在live555服务器上经mxpi_rtspsrc拉流插件输入然后使用视频解码插件mxpi_videodecoder将视频解码成图片再通过图像缩放插件mxpi_imageresize将图像缩放至满足检测模型要求的输入图像大小要求缩放后的图像输入模型推理插件mxpi_tensorinfer得到检测结果本项目开发的DeepSORT后处理插件处理推理结果得到识别框。再接入跟踪插件中识别框进行目标跟踪得到目标的跟踪编号然后在使用本项目开发的mxpi_trackidreplaceclassname插件将跟踪编号覆盖类名信息使用mxpi_object2osdinstances和mxpi_opencvosd分别将识别框和类名存储跟踪编号绘制到原图片再通过mxpi_videoencoder将图片合成视频。

表1.1 系统方案各子系统功能描述:

序号 子系统 功能描述
1 视频输入 接收外部调用接口的输入视频路径对视频进行拉流并将拉取的裸流存储到缓冲区buffer并发送到下游插件。
2 视频解码 用于视频解码当前只支持H264/H265格式。
3 数据分发 对单个输入数据分发多次。
4 数据缓存 输出时为后续处理过程另创建一个线程,用于将输入数据与输出数据解耦,并创建缓存队列,存储尚未输出到下流插件的数据。
5 图像处理 对解码后的YUV格式的图像进行指定宽高的缩放暂时只支持YUV格式 的图像。
6 模型推理插件 目标分类或检测目前只支持单tensor输入图像数据的推理模型。
7 模型后处理插件 实现对DeepSORT模型输出的tensor解析获取目标检测框以及对应的ReID向量传输到跟踪模块。
8 跟踪插件 实现多目标(包括机非人、人脸)路径记录功能。
9 跟踪编号取代类名插件 用跟踪插件产生的编号信息取代后处理插件产生的类名信息,再将数据传入数据流中。
10 目标框转绘插件 将流中传进的MxpiObjectList数据类型转换可用于OSD插件绘图所使用的的 MxpiOsdInstancesList数据类型。
11 OSD可视化插件 主要实现对每帧图像标注跟踪结果。
12 视频编码插件 用于将OSD可视化插件输出的图片进行视频编码输出视频。

1.4 代码目录结构与说明

本工程名称为 DeepSORT工程目录如下图所示

├── models
│   └── aipp_FairMOT.config            # 模型转换aipp配置文件
├── pipeline
│   └── deepsort.pipeline        # pipeline文件
├── plugins
│   ├── FairmotPostProcess     #DeepSORT后处理插件
│       └── move_so.sh
│   ├── Deepsort     # DeepSORT的Tracking
│   │   ├── CMakeLists.txt        
│   │   ├── DeepSort.cpp  
│   │   ├── DeepSort.h
│   │   ├── move_so.sh
│   │   └── build.sh
│   ├── Deepsort .patch  
│   ├── DeepAppearanceDescriptor.patch
│   ├── MunkresAssignment.patch  
│   └── MxpiTrackIdReplaceClassName  # 跟踪编号取代类名插件
│       └── move_so.sh
├── CMakeLists.txt
├── build.sh
├── main.cpp
└── run.sh

2 环境依赖

推荐系统为ubantu 18.04,环境依赖软件和版本如下表:

软件名称 版本 说明 获取方式
MindX SDK 2.0.4 mxVision软件包 链接
ubantu 18.04.1 LTS 操作系统 Ubuntu官网获取
Ascend-CANN-toolkit 5.0.4 Ascend-cann-toolkit开发套件包 链接

在编译运行项目前,需要设置环境变量:

${ascend_toolkit_path}/set_env.sh
${sdk_path}/set_env.sh

其中ascend_toolkit_path是CANN的安装路径sdk_path是mxVision SDK的安装路径。

3 软件依赖

推理中涉及到第三方软件依赖如下表所示。

依赖软件 版本 说明 使用教程
live555 1.09 实现视频转rstp进行推流 链接
ffmpeg 2021-07-21 实现mp4格式视频转为264格式视频 链接

4 模型转换

本项目中适用的模型是FairMOT模型onnx模型可以直接下载。下载后使用模型转换工具 ATC 将 onnx 模型转换为 om 模型,模型转换工具相关介绍参考链接:https://support.huaweicloud.com/tg-cannApplicationDev330/atlasatc_16_0005.html

模型转换,步骤如下:

  1. 从上述 onnx 模型下载链接中下载 onnx 模型至 deepsort/models 文件夹下文件名为mot_v2.onnx 。
  2. 进入 deepsort/models 文件夹下执行命令:
atc --input_shape="input.1:1,3,480,864" --check_report=./network_analysis.report --input_format=NCHW --output=./mot_v2 --soc_version=Ascend310 --insert_op_conf=./aipp_FairMOT.config --framework=5 --model=./mot_v2.onnx

执行该命令后会在当前文件夹下生成项目需要的模型文件 mot_v2.om。执行后终端输出为

ATC start working now, please wait for a moment.
ATC run success, welcome to the next use.

表示命令执行成功。

5 准备

按照第3小结软件依赖安装live555和ffmpeg按照 Live555离线视频转RTSP说明文档将mp4视频转换为h264格式。并将生成的264格式的视频上传到live/mediaServer目录下,然后修改FairMOT/pipeline目录下的fairmot.pipeline文件中mxpi_rtspsrc0的内容。

        "mxpi_rtspsrc0": {
            "factory": "mxpi_rtspsrc",
            "props": {
                "rtspUrl":"rtsp://xxx.xxx.xxx.xxx:xxxx/xxx.264",      // 修改为自己所使用的的服务器和文件名
                "channelId": "0"
            },
            "next": "mxpi_videodecoder0"
        },

6 编译与运行

步骤1 按照第2小结环境依赖中的步骤设置环境变量。按照第5小结准备完成相关安装和修改。

步骤2 按照第 4 小节 模型转换 中的步骤获得 om 模型文件,放置在 deepsort/models 目录下。

步骤3 进入plugins目录将FairmotPostProcess和MxpiTrackIdReplaceClassName插件以如下结构放在 plugins 目录下。[链接]https://gitee.com/ascend/mindxsdk-referenceapps/tree/master/contrib/FairMOT。 将DeepSort开源代码的DeepSort、DeepAppearanceDescriptor和MunkresAssignment以如下结构放在 plugins 目录下。[链接]https://github.com/shaoshengsong/DeepSORT

├── plugins
│   ├── FairmotPostProcess     #DeepSORT后处理插件
│   │   ├── CMakeLists.txt        
│   │   ├── FairmotPostProcess.cpp  
│   │   ├── FairmotPostProcess.h
│   │   ├── move_so.sh
│   │   └── build.sh
│   └── MxpiTrackIdReplaceClassName  # 跟踪编号取代类名插件
│       ├── CMakeLists.txt
│       ├── MxpiTrackIdReplaceClassName.cpp
│       ├── MxpiTrackIdReplaceClassName.h
│       ├── move_so.sh
│       └── build.sh
│   ├── DeepSort     # DeepSORT的Tracking
│   │   ├── CMakeLists.txt        
│   │   ├── DeepSort.cpp  
│   │   ├── DeepSort.h
│   │   ├── kalmanfilter.cpp 
│   │   ├── kalmanfilter.h
│   │   ├── linear_assignment.cpp
│   │   ├── linear_assignment.h
│   │   ├── nn_matching.cpp
│   │   ├── nn_matching.h
│   │   ├── tracker.cpp 
│   │   ├── tracker.h
│   │   ├── track.cpp
│   │   ├── track.h
│   │   ├── move_so.sh
│   │   └── build.sh
│   ├── DeepAppearanceDescriptor    #特征
│   │   ├── FeatureTensor.cpp
│   │   ├── FeatureTensor.h
│   │   ├── model.cpp
│   │   ├── model.h
│   │   └── dataType.h
│   ├── MunkresAssignment
│   │   ├── hungarianoper.cpp
│   │   ├── hungarianoper.h
│   │   └── munkres
│   │        ├── munkres.cpp
│   │        ├── munkres.h
│   │        └── matrix.h

plugins 目录下执行命令:

patch -p1 < MxpiTrackIdReplaceClassName.patch
patch -p1 < FairmotPostProcess.patch
patch -p1 < MunkresAssignment.patch
patch -p1 < DeepAppearanceDescriptor.patch  
patch -p1 < DeepSort.patch  

如果Fairmot文件有更新则需要回退历史版本。

git clone https://gitee.com/ascend/mindxsdk-referenceapps.git
cd /contrib/FairMOT
git reset c2e5c1a51eff4214563d3993a742183e1ff9e55c --hard

步骤4 编译。进入 deepsort 目录,在 deepsort 目录下执行命令:

bash build.sh

执行bash步骤前需要将plugins中所有插件里CMakeLists.txtmove_so.sh文件和主目录下的CMakeLists.txt文件的SDK安装路径${MX_SDK_HOME}替换为用户的SDK安装路径。 第一次运行时候,需要将deepsort/plugins/FairmotPostProcess/move_so.sh文件中的27行修改libdeepsort.so权限的命令注释掉,以后的运行不需要注释。

步骤5 运行。回到deepsort目录下在deepsort目录下执行命令

bash run.sh

命令执行成功后会在当前目录下生成检测结果视频文件out.h264,查看文件验证目标跟踪结果。

7 性能测试

测试帧率:

按照第6小结编译与运行中的步骤进行编译运行服务器会输出运行到该帧的平均帧率。 性能要求单帧推理时间小于100ms。

输入视频帧率为20才能发挥全部性能。

8 精度测试

测试性能: 以MOT16 数据集为基准测试模型的 MOTA 值。 执行步骤: 步骤1 下载MOT16数据集下载官网https://motchallenge.net/。在deepsort目录下下载py-motmetrics工具下载官网https://github.com/cheind/py-motmetrics。或者使用命令

git clone https://github.com/cheind/py-motmetrics.git

将MOT16数据集的gt文件放入/py-motmetrics/motmetrics/data/train/gt/1/gt/。将自己运行得到的txt文件放入/py-motmetrics/motmetrics/data/train/并将命名改为1.txt. 注意自己运行得到的txt文件是按照第一列frame id的数值进行排序的需要先将其按照第二列track id的数值进行排序后放入。

精度要求MOTA准确率大于40。

步骤2 安装 pycocotools 评测工具包。执行命令:

pip install motmetrics

步骤3 在/py-motmetrics-develop/motmetrics/apps/目录下运行命令

python eval_motchallenge.py ../data/train/gt/ ../data/train

每次运行得到的txt文件都需要删除并重新生成。 因为视频流是循环输入故在此测试精度时候选取视频前九百帧进行测试如测试需要可修改deepsort/plugins/DeepSort/DeepSort.cpp中的全局变量control值进行精度测试。

9 常见问题

9.1 测试输入视频流不存在或断流

问题描述:

运行时报错: 执行失败,提示 “connect stream failed.”

解决方案:

确保使用 live555 工具进行推流在deepsort 目录下下载live555并解压将测试用例放在deepsort/live/mediaServer/ 目录下;回到 deepsort/ 文件夹,在此文件夹下运行命令: bash run.sh