Skip to content

Latest commit

 

History

History
343 lines (303 loc) · 12.8 KB

README.md

File metadata and controls

343 lines (303 loc) · 12.8 KB

ByteTrack Demo

English | 简体中文

目录

1. 简介

本例程用于说明如何使用sophon-stream快速构建视频目标跟踪应用。

本例程插件的连接方式如下图所示:

elements.jpg

ByteTrack是一个简单、快速、强大的多目标跟踪器,且不依赖特征提取模型。

论文 (https://arxiv.org/abs/2110.06864)

源代码 (https://github.com/ifzhang/ByteTrack)

2. 特性

  • 支持BM1684X(x86 PCIe、SoC)和BM1684(x86 PCIe、SoC、arm PCIe)
  • 支持检测模块和跟踪模块解耦,可适配各种检测器,本例程主要以YOLOX作为检测器
  • 支持多路视频流
  • 支持多线程

3. 准备模型与数据

​在scripts目录下提供了相关模型和数据的下载脚本download.sh

# 安装unzip,若已安装请跳过,非ubuntu系统视情况使用yum或其他方式安装
sudo apt install unzip
chmod -R +x scripts/
./scripts/download.sh

脚本执行完毕后,会在当前目录下生成data目录,其中包含modelsvideos两个子目录。

下载的模型包括:

./data/models
├── BM1684
│   ├── yolox_s_fp32_1b.bmodel    # 用于BM1684的FP32 BModel,batch_size=1
│   ├── yolox_s_fp32_4b.bmodel    # 用于BM1684的FP32 BModel,batch_size=4
│   ├── yolox_s_int8_1b.bmodel    # 用于BM1684的INT8 BModel,batch_size=1
│   └── yolox_s_int8_4b.bmodel    # 用于BM1684的INT8 BModel,batch_size=4
├── BM1684X
│   ├── yolox_s_fp32_1b.bmodel    # 用于BM1684X的FP32 BModel,batch_size=1
│   ├── yolox_s_fp32_4b.bmodel    # 用于BM1684X的FP32 BModel,batch_size=4
│   ├── yolox_s_int8_1b.bmodel    # 用于BM1684X的INT8 BModel,batch_size=1
└── └── yolox_s_int8_4b.bmodel    # 用于BM1684X的INT8 BModel,batch_size=4

下载的数据包括:

./data/videos
└──  test_car_person_1080P.avi                 # 测试视频

4. 环境准备

4.1 x86/arm PCIe平台

如果您在x86/arm平台安装了PCIe加速卡(如SC系列加速卡),可以直接使用它作为开发环境和运行环境。您需要安装libsophon、sophon-opencv和sophon-ffmpeg,具体步骤可参考x86-pcie平台的开发和运行环境搭建arm-pcie平台的开发和运行环境搭建

4.2 SoC平台

如果您使用SoC平台(如SE、SM系列边缘设备),刷机后在/opt/sophon/下已经预装了相应的libsophon、sophon-opencv和sophon-ffmpeg运行库包,可直接使用它作为运行环境。通常还需要一台x86主机作为开发环境,用于交叉编译C++程序。

5. 程序编译

程序运行前需要编译可执行文件。

5.1 x86/arm PCIe平台

可以直接在PCIe平台上编译程序,具体请参考sophon-stream编译

5.2 SoC平台

通常在x86主机上交叉编译程序,您需要在x86主机上使用SOPHON SDK搭建交叉编译环境,将程序所依赖的头文件和库文件打包至sophon_sdk_soc目录中,具体请参考sophon-stream编译。本例程主要依赖libsophon、sophon-opencv和sophon-ffmpeg运行库包。

6. 程序运行

6.1 Json配置说明

bytetrack demo中各部分参数位于config目录,结构如下所示

./config
   ├── bytetrack_demo.json       # bytetrack demo 配置
   ├── bytetrack.json            # bytetrack目标跟踪器参数配置
   ├── decoder.json              # 解码配置
   ├── engine.json               # sophon-stream graph配置
   ├── infer.json                # 目标检测器推理配置
   ├── post.json                 # 目标检测器后处理配置
   └── pre.json                  # 目标检测器前处理配置

其中,bytetrack_demo.json是例程的整体配置文件,管理输入码流等信息。在一张图上可以支持多路数据的输入,channels参数配置输入的路数,channel中包含码流url等信息。

配置文件中不指定channel_id属性的情况,会在demo中对每一路数据的channel_id从0开始默认赋值。

{
  "channels": [
    {
      "channel_id": 2,
      "url": "../bytetrack/data/videos/test_car_person_1080P.avi",
      "source_type": "VIDEO",
      "sample_interval": 1,
      "loop_num": 1,
      "fps": -1
    },
    {
      "channel_id": 3,
      "url": "../bytetrack/data/videos/test_car_person_1080P.avi",
      "source_type": "VIDEO",
      "sample_interval": 1,
      "loop_num": 1,
      "fps": -1
    },
    {
      "channel_id": 20,
      "url": "../bytetrack/data/videos/test_car_person_1080P.avi",
      "source_type": "VIDEO",
      "sample_interval": 1,
      "loop_num": 1,
      "fps": -1
    },
    {
      "channel_id": 30,
      "url": "../bytetrack/data/videos/test_car_person_1080P.avi",
      "source_type": "VIDEO",
      "sample_interval": 1,
      "loop_num": 1,
      "fps": -1
    }
  ],
  "download_image": true,
  "draw_func_name": "draw_bytetrack_results",
  "engine_config_path": "../bytetrack/config/engine.json"
}

engine.json包含对每一张graph的配置信息。这里摘取一部分作为示例:在一张图内,需要初始化每个element的信息和element之间的连接方式。element_id是唯一的,起到标识身份的作用。element_config指向该element的详细配置文件地址,port_id是该element的输入输出端口编号,多输入或多输出的情况下,输入/输出编号也不可以重复。is_src标志当前端口是否是整张图的输入端口,is_sink标识当前端口是否是整张图的输出端口。 connection是所有element之间的连接方式,通过element_id和port_id确定。

[
    {
        "graph_id": 0,
        "device_id": 0,
        "graph_name": "bytetrack",
        "elements": [
            {
                "element_id": 5000,
                "element_config": "../bytetrack/config/decode.json",
                "ports": {
                    "input": [
                        {
                            "port_id": 0,
                            "is_sink": false,
                            "is_src": true
                        }
                    ],
                    "output": [
                        {
                            "port_id": 0,
                            "is_sink": false,
                            "is_src": false
                        }
                    ]
                }
            },
            {
                "element_id": 5001,
                "element_config": "../bytetrack/config/yolox_pre.json",
                "ports": {
                    "input": [
                        {
                            "port_id": 0,
                            "is_sink": false,
                            "is_src": false
                        }
                    ],
                    "output": [
                        {
                            "port_id": 0,
                            "is_sink": false,
                            "is_src": false
                        }
                    ]
                }
            },
            {
                "element_id": 5002,
                "element_config": "../bytetrack/config/yolox_infer.json",
                "ports": {
                    "input": [
                        {
                            "port_id": 0,
                            "is_sink": false,
                            "is_src": false
                        }
                    ],
                    "output": [
                        {
                            "port_id": 0,
                            "is_sink": false,
                            "is_src": false
                        }
                    ]
                }
            },
            {
                "element_id": 5003,
                "element_config": "../bytetrack/config/yolox_post.json",
                "ports": {
                    "input": [
                        {
                            "port_id": 0,
                            "is_sink": false,
                            "is_src": false
                        }
                    ],
                    "output": [
                        {
                            "port_id": 0,
                            "is_sink": false,
                            "is_src": false
                        }
                    ]
                }
            },
            {
                "element_id": 5004,
                "element_config": "../bytetrack/config/bytetrack.json",
                "ports": {
                    "input": [
                        {
                            "port_id": 0,
                            "is_sink": false,
                            "is_src": false
                        }
                    ],
                    "output": [
                        {
                            "port_id": 0,
                            "is_sink": true,
                            "is_src": false
                        }
                    ]
                }
            }
        ],
        "connections": [
            {
                "src_element_id": 5000,
                "src_port": 0,
                "dst_element_id": 5001,
                "dst_port": 0
            },
            {
                "src_element_id": 5001,
                "src_port": 0,
                "dst_element_id": 5002,
                "dst_port": 0
            },
            {
                "src_element_id": 5002,
                "src_port": 0,
                "dst_element_id": 5003,
                "dst_port": 0
            },
            {
                "src_element_id": 5003,
                "src_port": 0,
                "dst_element_id": 5004,
                "dst_port": 0
            }
        ]
    }
]

bytetrack.json等配置文件是对具体某个element的配置细节,设置了模型参数、动态库路径、阈值等信息。该配置文件不需要指定id字段和device_id字段,例程会将engine.json中指定的element_iddevice_id传入。其中,thread_number是element内部的工作线程数量,一个线程会对应一个数据队列,多路输入情况下,需要合理设置数据队列数目,来保证线程工作压力均匀且合理。

{
    "configure": {
        "track_thresh": 0.5,
        "high_thresh": 0.6,
        "match_thresh": 0.7,
        "frame_rate": 30,
        "track_buffer": 30
    },
    "shared_object": "../../build/lib/libbytetrack.so",
    "name": "bytetrack",
    "side": "sophgo",
    "thread_number": 2
}

6.2 运行

对于PCIe平台,可以直接在PCIe平台上运行测试;对于SoC平台,需将交叉编译生成的动态链接库、可执行文件、所需的模型和测试数据拷贝到SoC平台中测试。

SoC平台上,动态库、可执行文件、配置文件、模型、视频数据的目录结构关系应与原始sophon-stream仓库中的关系保持一致。

测试的参数及运行方式是一致的,下面主要以PCIe模式进行介绍。

运行可执行文件

./main --demo_config_path=../bytetrack/config/bytetrack_demo.json

2路视频流运行结果如下

total time cost 5246889 us.
frame count is 1422 | fps is 271.018 fps.

7. 性能测试

测试视频elevator-1080p-25fps-4000kbps.h264,编译选项为Release模式,结果如下:

设备 路数 算法线程数 CPU利用率(%) 系统内存(M) 系统内存峰值(M) TPU利用率(%) 设备内存(M) 设备内存峰值(M) 平均FPS 峰值FPS
SE7 8 4-4-4 505.98 208.26 216.78 99.94 1432.99 1623.00 318.06 332.26
SE5-16 4 4-4-4 238.21 118.36 119.81 94.40 1258.89 1397.00 130.36 143.47
SE5-8 3 3-3-3 160.97 96.19 97.71 92.69 993.08 1128.00 82.01 91.24

测试说明

  1. 性能测试结果具有一定的波动性,建议多次测试取平均值;
  2. BM1684/1684X SoC的主控CPU均为8核 ARM A53 42320 DMIPS @2.3GHz;