Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Model] add pptracking model #357

Merged
merged 57 commits into from
Oct 26, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
92eb0ab
add override mark
ChaoII Sep 30, 2022
c34b67a
Merge branch 'develop' into develop
jiangjiajun Oct 5, 2022
5ac31e7
Merge branch 'develop' into develop
jiangjiajun Oct 6, 2022
dd64a46
Merge branch 'develop' of github.com:PaddlePaddle/FastDeploy into dev…
ChaoII Oct 8, 2022
ff5ee8f
Merge branch 'develop' of github.com:ChaoII/FastDeploy into develop
ChaoII Oct 8, 2022
38ce0cf
Merge branch 'develop' of github.com:PaddlePaddle/FastDeploy into dev…
ChaoII Oct 8, 2022
cff22b8
delete some
ChaoII Oct 9, 2022
d6215ad
Merge branch 'develop' of github.com:PaddlePaddle/FastDeploy into dev…
ChaoII Oct 9, 2022
db3c81e
recovery
ChaoII Oct 9, 2022
1d64e35
Merge branch 'develop' of github.com:PaddlePaddle/FastDeploy into dev…
ChaoII Oct 9, 2022
0251b22
Merge branch 'develop' of github.com:PaddlePaddle/FastDeploy into dev…
ChaoII Oct 10, 2022
2910b3f
recovery
ChaoII Oct 11, 2022
f2f95ad
Merge branch 'develop' of github.com:PaddlePaddle/FastDeploy into dev…
ChaoII Oct 11, 2022
c54af78
add tracking
ChaoII Oct 11, 2022
fff9af0
Merge branch 'develop' of github.com:PaddlePaddle/FastDeploy into dev…
ChaoII Oct 11, 2022
f8f6998
add tracking py_bind and example
ChaoII Oct 12, 2022
5b845b4
Merge branch 'develop' of github.com:PaddlePaddle/FastDeploy into dev…
ChaoII Oct 12, 2022
9f79627
add pptracking
ChaoII Oct 12, 2022
6b9a5c4
add pptracking
ChaoII Oct 12, 2022
1d134b0
Merge branch 'develop' of github.com:PaddlePaddle/FastDeploy into dev…
ChaoII Oct 12, 2022
d800402
iomanip head file
ChaoII Oct 13, 2022
d7b534e
Merge branch 'develop' of github.com:PaddlePaddle/FastDeploy into dev…
ChaoII Oct 13, 2022
c92e5d5
add opencv_video lib
ChaoII Oct 13, 2022
a0b7f67
add python libs package
ChaoII Oct 13, 2022
cef6dd5
Merge branch 'develop' into develop
jiangjiajun Oct 13, 2022
a4dedb8
complete comments
ChaoII Oct 13, 2022
d80be12
Merge branch 'develop' of github.com:PaddlePaddle/FastDeploy into dev…
ChaoII Oct 13, 2022
3da3d36
Merge branch 'develop' of github.com:ChaoII/FastDeploy into develop
ChaoII Oct 13, 2022
00fa281
Merge branch 'develop' into develop
jiangjiajun Oct 16, 2022
1902c3c
Merge branch 'develop' into develop
jiangjiajun Oct 17, 2022
e8c6f0b
Merge branch 'develop' into develop
jiangjiajun Oct 17, 2022
9552329
add jdeTracker_ member variable
ChaoII Oct 17, 2022
33ab3e6
Merge branch 'develop' of github.com:ChaoII/FastDeploy into develop
ChaoII Oct 17, 2022
0a18021
add 'FASTDEPLOY_DECL' macro
ChaoII Oct 18, 2022
e86411c
remove kwargs params
ChaoII Oct 18, 2022
c80dbd9
Merge branch 'develop' into develop
jiangjiajun Oct 20, 2022
6eb6a7a
Merge branch 'develop' into develop
jiangjiajun Oct 20, 2022
cb424cd
Merge branch 'develop' into develop
jiangjiajun Oct 20, 2022
c4bf265
Merge branch 'develop' into develop
jiangjiajun Oct 20, 2022
7dbd62a
[Doc]add pptracking doc
ChaoII Oct 21, 2022
5b93f1d
Merge branch 'develop' of github.com:ChaoII/FastDeploy into develop
ChaoII Oct 21, 2022
4e8db89
Merge branch 'develop' into develop
jiangjiajun Oct 21, 2022
9a3f1a4
[Doc]update pptracking docs
ChaoII Oct 21, 2022
5eaf19e
Merge branch 'develop' of github.com:ChaoII/FastDeploy into develop
ChaoII Oct 21, 2022
df0d551
delete 'ENABLE_PADDLE_FRONTEND' switch
ChaoII Oct 21, 2022
23f329d
add pptracking unit test
ChaoII Oct 21, 2022
a5f5544
update pptracking unit test
ChaoII Oct 22, 2022
20edce2
modify test video file path and remove trt test
ChaoII Oct 24, 2022
09d9a7f
update unit test model url
ChaoII Oct 24, 2022
2e09944
Merge branch 'develop' into develop
jiangjiajun Oct 25, 2022
b23bb44
remove 'FASTDEPLOY_DECL' macro
ChaoII Oct 25, 2022
0734229
Merge branch 'develop' of github.com:ChaoII/FastDeploy into develop
ChaoII Oct 25, 2022
edcdab6
Merge branch 'develop' into develop
jiangjiajun Oct 25, 2022
dd99333
fix build python packages about pptracking on win32
ChaoII Oct 25, 2022
faaa94e
Merge branch 'develop' of github.com:ChaoII/FastDeploy into develop
ChaoII Oct 25, 2022
bef7cc9
Merge branch 'develop' into develop
jiangjiajun Oct 25, 2022
25c1576
Merge branch 'develop' into develop
jiangjiajun Oct 26, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@ fastdeploy/version.py
fastdeploy/core/config.h
python/fastdeploy/c_lib_wrap.py
python/fastdeploy/LICENSE*
python/build_cpu.sh
python/fastdeploy/ThirdPartyNotices*
*.so*
fpython/astdeploy/libs/third_libs
fastdeploy/core/config.h
fastdeploy/pybind/main.cc
python/fastdeploy/libs/lib*
python/fastdeploy/libs/third_libs
__pycache__
build_fd_android.sh
python/scripts/process_libraries.py
Expand Down
Empty file modified benchmark/run_benchmark_yolo.sh
100644 → 100755
Empty file.
2 changes: 1 addition & 1 deletion cmake/opencv.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,6 @@ else()
endif()
find_package(OpenCV REQUIRED PATHS ${OpenCV_DIR})
include_directories(${OpenCV_INCLUDE_DIRS})
list(APPEND DEPEND_LIBS opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs)
list(APPEND DEPEND_LIBS opencv_core opencv_video opencv_highgui opencv_imgproc opencv_imgcodecs)
endif()
endif()
21 changes: 11 additions & 10 deletions docs/api/vision_results/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@

FastDeploy根据视觉模型的任务类型,定义了不同的结构体(`fastdeploy/vision/common/result.h`)来表达模型预测结果,具体如下表所示

| 结构体 | 文档 | 说明 | 相应模型 |
| :----- | :--- | :---- | :------- |
| ClassifyResult | [C++/Python文档](./classification_result.md) | 图像分类返回结果 | ResNet50、MobileNetV3等 |
| SegmentationResult | [C++/Python文档](./segmentation_result.md) | 图像分割返回结果 | PP-HumanSeg、PP-LiteSeg等 |
| DetectionResult | [C++/Python文档](./detection_result.md) | 目标检测返回结果 | PP-YOLOE、YOLOv7系列模型等 |
| FaceDetectionResult | [C++/Python文档](./face_detection_result.md) | 目标检测返回结果 | SCRFD、RetinaFace系列模型等 |
| KeyPointDetectionResult | [C++/Python文档](./keypointdetection_result.md) | 关键点检测返回结果 | PP-Tinypose系列模型等 |
| FaceRecognitionResult | [C++/Python文档](./face_recognition_result.md) | 目标检测返回结果 | ArcFace、CosFace系列模型等 |
| MattingResult | [C++/Python文档](./matting_result.md) | 目标检测返回结果 | MODNet系列模型等 |
| OCRResult | [C++/Python文档](./ocr_result.md) | 文本框检测,分类和文本识别返回结果 | OCR系列模型等 |
| 结构体 | 文档 | 说明 | 相应模型 |
|:------------------------|:----------------------------------------------|:------------------|:------------------------|
| ClassifyResult | [C++/Python文档](./classification_result.md) | 图像分类返回结果 | ResNet50、MobileNetV3等 |
| SegmentationResult | [C++/Python文档](./segmentation_result.md) | 图像分割返回结果 | PP-HumanSeg、PP-LiteSeg等 |
| DetectionResult | [C++/Python文档](./detection_result.md) | 目标检测返回结果 | PP-YOLOE、YOLOv7系列模型等 |
| FaceDetectionResult | [C++/Python文档](./face_detection_result.md) | 目标检测返回结果 | SCRFD、RetinaFace系列模型等 |
| KeyPointDetectionResult | [C++/Python文档](./keypointdetection_result.md) | 关键点检测返回结果 | PP-Tinypose系列模型等 |
| FaceRecognitionResult | [C++/Python文档](./face_recognition_result.md) | 目标检测返回结果 | ArcFace、CosFace系列模型等 |
| MattingResult | [C++/Python文档](./matting_result.md) | 目标检测返回结果 | MODNet系列模型等 |
| OCRResult | [C++/Python文档](./ocr_result.md) | 文本框检测,分类和文本识别返回结果 | OCR系列模型等 |
| MOTResult | [C++/Python文档](./mot_result.md) | 多目标跟踪返回结果 | pptracking系列模型等 |
40 changes: 40 additions & 0 deletions docs/api/vision_results/mot_result.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# MOTResult 多目标跟踪结果

MOTResult代码定义在`fastdeploy/vision/common/result.h`中,用于表明多目标跟踪中的检测出来的目标框、目标跟踪id、目标类别和目标置信度。

## C++ 定义

```c++
fastdeploy::vision::MOTResult
```

```c++
struct MOTResult{
// left top right bottom
std::vector<std::array<int, 4>> boxes;
std::vector<int> ids;
std::vector<float> scores;
std::vector<int> class_ids;
void Clear();
std::string Str();
};
```

- **boxes**: 成员变量,表示单帧画面中检测出来的所有目标框坐标,`boxes.size()`表示框的个数,每个框以4个float数值依次表示xmin, ymin, xmax, ymax, 即左上角和右下角坐标
- **ids**: 成员变量,表示单帧画面中所有目标的id,其元素个数与`boxes.size()`一致
- **scores**: 成员变量,表示单帧画面检测出来的所有目标置信度,其元素个数与`boxes.size()`一致
- **class_ids**: 成员变量,表示单帧画面出来的所有目标类别,其元素个数与`boxes.size()`一致
- **Clear()**: 成员函数,用于清除结构体中存储的结果
- **Str()**: 成员函数,将结构体中的信息以字符串形式输出(用于Debug)

## Python 定义

```python
fastdeploy.vision.MOTResult
```

- **boxes**(list of list(float)): 成员变量,表示单帧画面中检测出来的所有目标框坐标。boxes是一个list,其每个元素为一个长度为4的list, 表示为一个框,每个框以4个float数值依次表示xmin, ymin, xmax, ymax, 即左上角和右下角坐标
- **ids**(list of list(float)):成员变量,表示单帧画面中所有目标的id,其元素个数与`boxes`一致
- **scores**(list of float): 成员变量,表示单帧画面检测出来的所有目标置信度
- **class_ids**(list of int): 成员变量,表示单帧画面出来的所有目标类别

14 changes: 14 additions & 0 deletions examples/vision/tracking/pptracking/cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
PROJECT(infer_demo C CXX)
CMAKE_MINIMUM_REQUIRED (VERSION 3.10)

# 指定下载解压后的fastdeploy库路径
option(FASTDEPLOY_INSTALL_DIR "Path of downloaded fastdeploy sdk.")

include(${FASTDEPLOY_INSTALL_DIR}/FastDeploy.cmake)

# 添加FastDeploy依赖头文件
include_directories(${FASTDEPLOY_INCS})

add_executable(infer_demo ${PROJECT_SOURCE_DIR}/infer.cc)
# 添加FastDeploy库依赖
target_link_libraries(infer_demo ${FASTDEPLOY_LIBS})
79 changes: 79 additions & 0 deletions examples/vision/tracking/pptracking/cpp/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# PP-Tracking C++部署示例

本目录下提供`infer.cc`快速完成PP-Tracking在CPU/GPU,以及GPU上通过TensorRT加速部署的示例。

在部署前,需确认以下两个步骤

- 1. 软硬件环境满足要求,参考[FastDeploy环境要求](../../../../../docs/cn/build_and_install/download_prebuilt_libraries.md)
- 2. 根据开发环境,下载预编译部署库和samples代码,参考[FastDeploy预编译库](../../../../../docs/cn/build_and_install/download_prebuilt_libraries.md)

以Linux上 PP-Tracking 推理为例,在本目录执行如下命令即可完成编译测试(如若只需在CPU上部署,可在[Fastdeploy C++预编译库](../../../../../docs/cn/build_and_install/download_prebuilt_libraries.md/CPP_prebuilt_libraries.md)下载CPU推理库)

```bash
#下载SDK,编译模型examples代码(SDK中包含了examples代码)
wget https://bj.bcebos.com/fastdeploy/release/cpp/fastdeploy-linux-x64-gpu-0.3.0.tgz
tar xvf fastdeploy-linux-x64-gpu-0.3.0.tgz
cd fastdeploy-linux-x64-gpu-0.3.0/examples/vision/tracking/pptracking/cpp/
mkdir build && cd build
cmake .. -DFASTDEPLOY_INSTALL_DIR=${PWD}/../../../../../../../fastdeploy-linux-x64-gpu-0.3.0
make -j

# 下载PP-Tracking模型文件和测试视频
wget https://bj.bcebos.com/paddlehub/fastdeploy/fairmot_hrnetv2_w18_dlafpn_30e_576x320.tgz
tar -xvf fairmot_hrnetv2_w18_dlafpn_30e_576x320.tgz
wget https://bj.bcebos.com/paddlehub/fastdeploy/person.mp4
wget https://bj.bcebos.com/paddlehub/fastdeploy/person.mp4


# CPU推理
./infer_demo fairmot_hrnetv2_w18_dlafpn_30e_576x320 person.mp4 0
# GPU推理
./infer_demo fairmot_hrnetv2_w18_dlafpn_30e_576x320 person.mp4 1
# GPU上TensorRT推理
./infer_demo fairmot_hrnetv2_w18_dlafpn_30e_576x320 person.mp4 2
```

以上命令只适用于Linux或MacOS, Windows下SDK的使用方式请参考:
- [如何在Windows中使用FastDeploy C++ SDK](../../../../../docs/cn/faq/use_sdk_on_windows.md)

## PP-Tracking C++接口

### PPTracking类

```c++
fastdeploy::vision::tracking::PPTracking(
const string& model_file,
const string& params_file = "",
const string& config_file,
const RuntimeOption& runtime_option = RuntimeOption(),
const ModelFormat& model_format = ModelFormat::PADDLE)
```

PP-Tracking模型加载和初始化,其中model_file为导出的Paddle模型格式。

**参数**

> * **model_file**(str): 模型文件路径
> * **params_file**(str): 参数文件路径
> * **config_file**(str): 推理部署配置文件
> * **runtime_option**(RuntimeOption): 后端推理配置,默认为None,即采用默认配置
> * **model_format**(ModelFormat): 模型格式,默认为Paddle格式

#### Predict函数

> ```c++
> PPTracking::Predict(cv::Mat* im, MOTResult* result)
> ```
>
> 模型预测接口,输入图像直接输出检测结果。
>
> **参数**
>
> > * **im**: 输入图像,注意需为HWC,BGR格式
> > * **result**: 检测结果,包括检测框,跟踪id,各个框的置信度,对象类别id,MOTResult说明参考[视觉模型预测结果](../../../../../docs/api/vision_results/)


- [模型介绍](../../)
- [Python部署](../python)
- [视觉模型预测结果](../../../../../docs/api/vision_results/)
- [如何切换模型推理后端引擎](../../../../../docs/cn/faq/how_to_change_backend.md)
158 changes: 158 additions & 0 deletions examples/vision/tracking/pptracking/cpp/infer.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
// Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "fastdeploy/vision.h"

#ifdef WIN32
const char sep = '\\';
#else
const char sep = '/';
#endif

void CpuInfer(const std::string& model_dir, const std::string& video_file) {
auto model_file = model_dir + sep + "model.pdmodel";
auto params_file = model_dir + sep + "model.pdiparams";
auto config_file = model_dir + sep + "infer_cfg.yml";
auto model = fastdeploy::vision::tracking::PPTracking(
model_file, params_file, config_file);

if (!model.Initialized()) {
std::cerr << "Failed to initialize." << std::endl;
return;
}

fastdeploy::vision::MOTResult result;
cv::Mat frame;
int frame_id=0;
cv::VideoCapture capture(video_file);
// according to the time of prediction to calculate fps
float fps= 0.0f;
while (capture.read(frame)) {
if (frame.empty()) {
break;
}
if (!model.Predict(&frame, &result)) {
std::cerr << "Failed to predict." << std::endl;
return;
}
// std::cout << result.Str() << std::endl;
cv::Mat out_img = fastdeploy::vision::VisMOT(frame, result, fps , frame_id);
cv::imshow("mot",out_img);
cv::waitKey(30);
frame_id++;
}
capture.release();
cv::destroyAllWindows();
}

void GpuInfer(const std::string& model_dir, const std::string& video_file) {
auto model_file = model_dir + sep + "model.pdmodel";
auto params_file = model_dir + sep + "model.pdiparams";
auto config_file = model_dir + sep + "infer_cfg.yml";

auto option = fastdeploy::RuntimeOption();
option.UseGpu();
auto model = fastdeploy::vision::tracking::PPTracking(
model_file, params_file, config_file, option);

if (!model.Initialized()) {
std::cerr << "Failed to initialize." << std::endl;
return;
}

fastdeploy::vision::MOTResult result;
cv::Mat frame;
int frame_id=0;
cv::VideoCapture capture(video_file);
// according to the time of prediction to calculate fps
float fps= 0.0f;
while (capture.read(frame)) {
if (frame.empty()) {
break;
}
if (!model.Predict(&frame, &result)) {
std::cerr << "Failed to predict." << std::endl;
return;
}
// std::cout << result.Str() << std::endl;
cv::Mat out_img = fastdeploy::vision::VisMOT(frame, result, fps , frame_id);
cv::imshow("mot",out_img);
cv::waitKey(30);
frame_id++;
}
capture.release();
cv::destroyAllWindows();
}

void TrtInfer(const std::string& model_dir, const std::string& video_file) {
auto model_file = model_dir + sep + "model.pdmodel";
auto params_file = model_dir + sep + "model.pdiparams";
auto config_file = model_dir + sep + "infer_cfg.yml";

auto option = fastdeploy::RuntimeOption();
option.UseGpu();
option.UseTrtBackend();
auto model = fastdeploy::vision::tracking::PPTracking(
model_file, params_file, config_file, option);

if (!model.Initialized()) {
std::cerr << "Failed to initialize." << std::endl;
return;
}

fastdeploy::vision::MOTResult result;
cv::Mat frame;
int frame_id=0;
cv::VideoCapture capture(video_file);
// according to the time of prediction to calculate fps
float fps= 0.0f;
while (capture.read(frame)) {
if (frame.empty()) {
break;
}
if (!model.Predict(&frame, &result)) {
std::cerr << "Failed to predict." << std::endl;
return;
}
// std::cout << result.Str() << std::endl;
cv::Mat out_img = fastdeploy::vision::VisMOT(frame, result, fps , frame_id);
cv::imshow("mot",out_img);
cv::waitKey(30);
frame_id++;
}
capture.release();
cv::destroyAllWindows();
}

int main(int argc, char* argv[]) {
if (argc < 4) {
std::cout
<< "Usage: infer_demo path/to/model_dir path/to/video run_option, "
"e.g ./infer_model ./pptracking_model_dir ./person.mp4 0"
<< std::endl;
std::cout << "The data type of run_option is int, 0: run with cpu; 1: run "
"with gpu; 2: run with gpu and use tensorrt backend."
<< std::endl;
return -1;
}

if (std::atoi(argv[3]) == 0) {
CpuInfer(argv[1], argv[2]);
} else if (std::atoi(argv[3]) == 1) {
GpuInfer(argv[1], argv[2]);
} else if (std::atoi(argv[3]) == 2) {
TrtInfer(argv[1], argv[2]);
}
return 0;
}
Loading