Skip to content

Commit 8035210

Browse files
committed
Merge branch 'develop' of https://github.com/PaddlePaddle/FastDeploy into develop
2 parents d09fbd8 + fe9aff1 commit 8035210

File tree

368 files changed

+5323
-1447
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

368 files changed

+5323
-1447
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,5 @@ yalc.*
4141
examples/vision/collect_quantize_cc.sh
4242
examples/vision/tests_quantize
4343
fastdeploy/LICENSE
44-
fastdeploy/ThirdPartyNotices.txt
44+
fastdeploy/ThirdPartyNotices.txt
45+
FastDeployCSharp.cmake

.gitmodules

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[submodule "poros/third_party/googletest"]
2+
path = poros/third_party/googletest
3+
url = https://github.com/google/googletest.git
4+
[submodule "poros/third_party/gflags"]
5+
path = poros/third_party/gflags
6+
url = https://github.com/gflags/gflags.git

CMakeLists.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,12 @@ option(WITH_CSHARPAPI "Whether to compile with c# api" OFF)
7979
############################# Options for Android cross compiling #########################
8080
if(ANDROID)
8181
option(WITH_OPENCV_STATIC "Whether to use OpenCV static lib for Android." OFF)
82-
option(WITH_LITE_STATIC "Whether to use OpenCV Paddle Lite static lib for Android." OFF)
83-
option(WITH_FLYCV_STATIC "Whether to use OpenCV FlyCV static lib for Android." OFF)
84-
option(WITH_OPENMP "Whether to use OpenCV OpenMP support for Android." OFF)
85-
option(WITH_JAVA "Whether to build jni lib for Android." OFF)
82+
option(WITH_LITE_STATIC "Whether to use Paddle Lite static lib for Android." OFF)
83+
option(WITH_OPENMP "Whether to use OpenMP support for Android." OFF)
84+
option(WITH_JAVA "Whether to build JNI lib for Android." OFF)
8685
option(WITH_STATIC_LIB "Whether to build FastDeploy static lib." OFF)
8786
endif()
87+
8888
# Whether to build fastdeploy with vision/text/... examples, only for testings.
8989
option(BUILD_EXAMPLES "Whether to build fastdeploy with vision examples" OFF)
9090

FastDeploy.cmake.in

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ include(${CMAKE_CURRENT_LIST_DIR}/utils.cmake)
4848

4949
# Set C++11 as standard for the whole project
5050
if(NOT MSVC)
51-
set(CMAKE_CXX_STANDARD 11)
5251
set(CMAKE_CXX_FLAGS "-Wno-format")
5352
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=1)
5453
endif(NOT MSVC)
@@ -131,9 +130,9 @@ endif()
131130

132131
if(ENABLE_RKNPU2_BACKEND)
133132
if(RKNN2_TARGET_SOC STREQUAL "RK356X")
134-
set(RKNPU2_LIB ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/rknpu2_runtime/RK356X/lib/librknn_api.so)
133+
set(RKNPU2_LIB ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/rknpu2_runtime/lib/librknnrt.so)
135134
elseif (RKNN2_TARGET_SOC STREQUAL "RK3588")
136-
set(RKNPU2_LIB ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/rknpu2_runtime/RK3588/lib/librknn_api.so)
135+
set(RKNPU2_LIB ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/rknpu2_runtime/lib/librknnrt.so)
137136
else ()
138137
message(FATAL_ERROR "RKNN2_TARGET_SOC is not set, ref value: RK356X or RK3588")
139138
endif()

README_CN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
</div>
4545

4646

47-
**⚡️FastDeploy**是一款**全场景****易用灵活****极致高效**的AI推理部署工具, 支持**云边端**部署。提供超过 🔥160+ **Text****Vision****Speech****跨模态**模型📦**开箱即用**的部署体验,并实现🔚**端到端**的推理性能优化。包括 [物体检测](./examples/vision/detection)[字符识别(OCR)](./examples/vision/ocr)[人脸](./examples/vision/facedet)[人像扣图](./examples/vision/matting)[多目标跟踪系统](./examples/vision/tracking/pptracking)[NLP](./examples/text)[Stable Difussion文图生成](./examples/multimodal/stable_diffusion)[TTS](./examples/audio/pp-tts) 等几十种任务场景,满足开发者**多场景、多硬件、多平台**的产业部署需求。
47+
**⚡️FastDeploy**是一款**全场景****易用灵活****极致高效**的AI推理部署工具, 支持**云边端**部署。提供超过 🔥160+ **Text****Vision****Speech****跨模态**模型📦**开箱即用**的部署体验,并实现🔚**端到端**的推理性能优化。包括 [物体检测](./examples/vision/detection)[字符识别(OCR)](./examples/vision/ocr)[人脸](./examples/vision/facedet)[人像扣图](./examples/vision/matting)[多目标跟踪系统](./examples/vision/tracking/pptracking)[NLP](./examples/text)[Stable Diffusion文图生成](./examples/multimodal/stable_diffusion)[TTS](./examples/audio/pp-tts) 等几十种任务场景,满足开发者**多场景、多硬件、多平台**的产业部署需求。
4848

4949
<div align="center">
5050

README_EN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ English | [简体中文](README_CN.md) | [हिन्दी](./docs/docs_i18n/R
4141
</div>
4242

4343
**⚡️FastDeploy** is an **Easy-to-use** and **High Performance** AI model deployment toolkit for Cloud, Mobile and Edge with 📦**out-of-the-box and unified experience**, 🔚**end-to-end optimization** for over **🔥160+ Text, Vision, Speech and Cross-modal AI models**.
44-
Including [image classification](examples/vision/classification), [object detection](examples/vision/detection), [OCR](./examples/vision/ocr), [face detection](./examples/vision/facedet), [matting](./examples/vision/matting), [pp-tracking](./examples/vision/tracking/pptracking), [NLP](./examples/text), [stable difussion](./examples/multimodal/stable_diffusion), [TTS](./examples/audio/pp-tts) and other tasks to meet developers' industrial deployment needs for **multi-scenario**, **multi-hardware** and **multi-platform**.
44+
Including [image classification](examples/vision/classification), [object detection](examples/vision/detection), [OCR](./examples/vision/ocr), [face detection](./examples/vision/facedet), [matting](./examples/vision/matting), [pp-tracking](./examples/vision/tracking/pptracking), [NLP](./examples/text), [stable diffusion](./examples/multimodal/stable_diffusion), [TTS](./examples/audio/pp-tts) and other tasks to meet developers' industrial deployment needs for **multi-scenario**, **multi-hardware** and **multi-platform**.
4545

4646
<div align="center">
4747

benchmark/cpp/CMakeLists.txt

100644100755
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,31 @@ add_executable(benchmark_yolov5 ${PROJECT_SOURCE_DIR}/benchmark_yolov5.cc)
1212
add_executable(benchmark_ppyolov8 ${PROJECT_SOURCE_DIR}/benchmark_ppyolov8.cc)
1313
add_executable(benchmark_ppcls ${PROJECT_SOURCE_DIR}/benchmark_ppcls.cc)
1414
add_executable(benchmark_precision_ppyolov8 ${PROJECT_SOURCE_DIR}/benchmark_precision_ppyolov8.cc)
15+
add_executable(benchmark_ppseg ${PROJECT_SOURCE_DIR}/benchmark_ppseg.cc)
16+
add_executable(benchmark_ppocr_det ${PROJECT_SOURCE_DIR}/benchmark_ppocr_det.cc)
17+
add_executable(benchmark_ppocr_cls ${PROJECT_SOURCE_DIR}/benchmark_ppocr_cls.cc)
18+
add_executable(benchmark_ppocr_rec ${PROJECT_SOURCE_DIR}/benchmark_ppocr_rec.cc)
1519

1620
if(UNIX AND (NOT APPLE) AND (NOT ANDROID))
1721
target_link_libraries(benchmark_yolov5 ${FASTDEPLOY_LIBS} gflags pthread)
1822
target_link_libraries(benchmark_ppyolov8 ${FASTDEPLOY_LIBS} gflags pthread)
1923
target_link_libraries(benchmark_ppcls ${FASTDEPLOY_LIBS} gflags pthread)
2024
target_link_libraries(benchmark_precision_ppyolov8 ${FASTDEPLOY_LIBS} gflags pthread)
25+
target_link_libraries(benchmark_ppseg ${FASTDEPLOY_LIBS} gflags pthread)
26+
target_link_libraries(benchmark_ppocr_det ${FASTDEPLOY_LIBS} gflags pthread)
27+
target_link_libraries(benchmark_ppocr_cls ${FASTDEPLOY_LIBS} gflags pthread)
28+
target_link_libraries(benchmark_ppocr_rec ${FASTDEPLOY_LIBS} gflags pthread)
2129
else()
2230
target_link_libraries(benchmark_yolov5 ${FASTDEPLOY_LIBS} gflags)
2331
target_link_libraries(benchmark_ppyolov8 ${FASTDEPLOY_LIBS} gflags)
2432
target_link_libraries(benchmark_ppcls ${FASTDEPLOY_LIBS} gflags)
2533
target_link_libraries(benchmark_precision_ppyolov8 ${FASTDEPLOY_LIBS} gflags)
34+
target_link_libraries(benchmark_ppseg ${FASTDEPLOY_LIBS} gflags)
35+
target_link_libraries(benchmark_ppocr_det ${FASTDEPLOY_LIBS} gflags)
36+
target_link_libraries(benchmark_ppocr_cls ${FASTDEPLOY_LIBS} gflags)
37+
target_link_libraries(benchmark_ppocr_rec ${FASTDEPLOY_LIBS} gflags)
38+
endif()
39+
# only for Android ADB test
40+
if(ANDROID)
41+
install_fastdeploy_libraries(${CMAKE_CURRENT_BINARY_DIR})
2642
endif()

benchmark/cpp/README.md

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
# FastDeploy C++ Benchmarks
2+
3+
## 1. 编译选项
4+
以下选项为benchmark相关的编译选项,在编译用来跑benchmark的sdk时,必须开启。
5+
6+
|选项|需要设置的值|说明|
7+
|---|---|---|
8+
| ENABLE_BENCHMARK | ON | 默认OFF, 是否打开BENCHMARK模式 |
9+
| ENABLE_VISION | ON | 默认OFF,是否编译集成视觉模型的部署模块 |
10+
| ENABLE_TEXT | ON | 默认OFF,是否编译集成文本NLP模型的部署模块 |
11+
12+
运行FastDeploy C++ Benchmark,需先准备好相应的环境,并在ENABLE_BENCHMARK=ON模式下从源码编译FastDeploy C++ SDK. 以下将按照硬件维度,来说明相应的系统环境要求。不同环境下的详细要求,请参考[FastDeploy环境要求](../../docs/cn/build_and_install)
13+
14+
## 2. Benchmark 参数设置说明
15+
16+
<div id="参数设置说明"></div>
17+
18+
19+
| 参数 | 作用 |
20+
| -------------------- | ------------------------------------------ |
21+
| --model | 模型路径 |
22+
| --image | 图片路径 |
23+
| --device | 选择 CPU/GPU/XPU,默认为 CPU |
24+
| --cpu_thread_nums | CPU 线程数,默认为 8 |
25+
| --device_id | GPU/XPU 卡号,默认为 0 |
26+
| --warmup | 跑benchmark的warmup次数,默认为 200 |
27+
| --repeat | 跑benchmark的循环次数,默认为 1000 |
28+
| --profile_mode | 指定需要测试性能的模式,可选值为`[runtime, end2end]`,默认为 runtime |
29+
| --include_h2d_d2h | 是否把H2D+D2H的耗时统计在内,该参数只在profile_mode为runtime时有效,默认为 false |
30+
| --backend | 指定后端类型,有default, ort, ov, trt, paddle, paddle_trt, lite 等,为default时,会自动选择最优后端,推荐设置为显式设置明确的backend。默认为 default |
31+
| --use_fp16 | 是否开启fp16,当前只对 trt, paddle-trt, lite后端有效,默认为 false |
32+
| --collect_memory_info | 是否记录 cpu/gpu memory信息,默认 false |
33+
| --sampling_interval | 记录 cpu/gpu memory信息采样时间间隔,单位ms,默认为 50 |
34+
35+
## 3. X86_64 CPU 和 NVIDIA GPU 环境下运行 Benchmark
36+
37+
### 3.1 环境准备
38+
39+
Linux上编译需满足:
40+
- gcc/g++ >= 5.4(推荐8.2)
41+
- cmake >= 3.18.0
42+
- CUDA >= 11.2
43+
- cuDNN >= 8.2
44+
- TensorRT >= 8.5
45+
46+
在GPU上编译FastDeploy需要准备好相应的CUDA环境以及TensorRT,详细文档请参考[GPU编译文档](https://github.com/PaddlePaddle/FastDeploy/blob/develop/docs/cn/build_and_install/gpu.md)
47+
48+
### 3.2 编译FastDeploy C++ SDK
49+
```bash
50+
# 源码编译SDK
51+
git clone https://github.com/PaddlePaddle/FastDeploy.git -b develop
52+
cd FastDeploy
53+
mkdir build && cd build
54+
cmake .. -DWITH_GPU=ON \
55+
-DENABLE_ORT_BACKEND=ON \
56+
-DENABLE_PADDLE_BACKEND=ON \
57+
-DENABLE_OPENVINO_BACKEND=ON \
58+
-DENABLE_TRT_BACKEND=ON \
59+
-DENABLE_VISION=ON \
60+
-DENABLE_TEXT=ON \
61+
-DENABLE_BENCHMARK=ON \ # 开启benchmark模式
62+
-DTRT_DIRECTORY=/Paddle/TensorRT-8.5.2.2 \
63+
-DCUDA_DIRECTORY=/usr/local/cuda \
64+
-DCMAKE_INSTALL_PREFIX=${PWD}/compiled_fastdeploy_sdk
65+
66+
make -j12
67+
make install
68+
69+
# 配置SDK路径
70+
cd ..
71+
export FD_GPU_SDK=${PWD}/build/compiled_fastdeploy_sdk
72+
```
73+
### 3.3 编译 Benchmark 示例
74+
```bash
75+
cd benchmark/cpp
76+
mkdir build && cd build
77+
cmake .. -DFASTDEPLOY_INSTALL_DIR=${FD_GPU_SDK}
78+
make -j4
79+
```
80+
81+
### 3.4 运行 Benchmark 示例
82+
83+
在X86 CPU + NVIDIA GPU下,FastDeploy 目前支持多种推理后端,下面以 PaddleYOLOv8 为例,跑出多后端在 CPU/GPU 对应 benchmark 数据。
84+
85+
- 下载模型文件和测试图片
86+
```bash
87+
wget https://bj.bcebos.com/paddlehub/fastdeploy/yolov8_s_500e_coco.tgz
88+
wget https://gitee.com/paddlepaddle/PaddleDetection/raw/release/2.4/demo/000000014439.jpg
89+
tar -zxvf yolov8_s_500e_coco.tgz
90+
```
91+
92+
- 运行 yolov8 benchmark 示例
93+
94+
```bash
95+
96+
# 统计性能
97+
# CPU
98+
# Paddle Inference
99+
./benchmark_ppyolov8 --model yolov8_s_500e_coco --image 000000014439.jpg --device cpu --cpu_thread_nums 8 --backend paddle --profile_mode runtime
100+
101+
# ONNX Runtime
102+
./benchmark_ppyolov8 --model yolov8_s_500e_coco --image 000000014439.jpg --device cpu --cpu_thread_nums 8 --backend ort --profile_mode runtime
103+
104+
# OpenVINO
105+
./benchmark_ppyolov8 --model yolov8_s_500e_coco --image 000000014439.jpg --device cpu --cpu_thread_nums 8 --backend ov --profile_mode runtime
106+
107+
# GPU
108+
# Paddle Inference
109+
./benchmark_ppyolov8 --model yolov8_s_500e_coco --image 000000014439.jpg --device gpu --device_id 0 --backend paddle --profile_mode runtime --warmup 200 --repeat 2000
110+
111+
# Paddle Inference + TensorRT
112+
./benchmark_ppyolov8 --model yolov8_s_500e_coco --image 000000014439.jpg --device gpu --device_id 0 --backend paddle_trt --profile_mode runtime --warmup 200 --repeat 2000
113+
114+
# Paddle Inference + TensorRT + FP16
115+
./benchmark_ppyolov8 --model yolov8_s_500e_coco --image 000000014439.jpg --device gpu --device_id 0 --backend paddle --profile_mode runtime --warmup 200 --repeat 2000 --use_fp16
116+
117+
# ONNX Runtime
118+
./benchmark_ppyolov8 --model yolov8_s_500e_coco --image 000000014439.jpg --device gpu --device_id 0 --backend ort --profile_mode runtime --warmup 200 --repeat 2000
119+
120+
# TensorRT
121+
./benchmark_ppyolov8 --model yolov8_s_500e_coco --image 000000014439.jpg --device gpu --device_id 0 --backend paddle --profile_mode runtime --warmup 200 --repeat 2000
122+
123+
# TensorRT + FP16
124+
./benchmark_ppyolov8 --model yolov8_s_500e_coco --image 000000014439.jpg --device gpu --device_id 0 --backend trt --profile_mode runtime --warmup 200 --repeat 2000 --use_fp16
125+
126+
# 统计内存显存占用
127+
# 增加--collect_memory_info选项
128+
./benchmark_ppyolov8 --model yolov8_s_500e_coco --image 000000014439.jpg --device cpu --cpu_thread_nums 8 --backend paddle --profile_mode runtime --collect_memory_info
129+
```
130+
注意,为避免对性能统计产生影响,测试性能时,最好不要开启内存显存统计的功能,当指定--collect_memory_info参数时,只有内存显存参数是稳定可靠的。更多参数设置,请参考[参数设置说明](#参数设置说明)
131+
132+
133+
## 4. ARM CPU 环境下运行 Benchmark
134+
- TODO
135+
136+
## 5. 昆仑芯 XPU 环境下运行 Benchmark
137+
- TODO

benchmark/cpp/benchmark_ppcls.cc

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,47 @@
1616
#include "macros.h"
1717
#include "option.h"
1818

19+
namespace vision = fastdeploy::vision;
20+
namespace benchmark = fastdeploy::benchmark;
21+
1922
int main(int argc, char* argv[]) {
23+
#if defined(ENABLE_BENCHMARK) && defined(ENABLE_VISION)
2024
// Initialization
2125
auto option = fastdeploy::RuntimeOption();
2226
if (!CreateRuntimeOption(&option, argc, argv, true)) {
2327
return -1;
2428
}
2529
auto im = cv::imread(FLAGS_image);
2630
// Set max_batch_size 1 for best performance
27-
option.trt_option.max_batch_size = 1;
31+
if (FLAGS_backend == "paddle_trt") {
32+
option.trt_option.max_batch_size = 1;
33+
}
2834
auto model_file = FLAGS_model + sep + "inference.pdmodel";
2935
auto params_file = FLAGS_model + sep + "inference.pdiparams";
3036
auto config_file = FLAGS_model + sep + "inference_cls.yaml";
31-
auto model_ppcls = fastdeploy::vision::classification::PaddleClasModel(
37+
auto model_ppcls = vision::classification::PaddleClasModel(
3238
model_file, params_file, config_file, option);
33-
fastdeploy::vision::ClassifyResult res;
39+
vision::ClassifyResult res;
40+
// Run once at least
41+
model_ppcls.Predict(im, &res);
42+
// 1. Test result diff
43+
std::cout << "=============== Test result diff =================\n";
44+
// Save result to -> disk.
45+
std::string cls_result_path = "ppcls_result.txt";
46+
benchmark::ResultManager::SaveClassifyResult(res, cls_result_path);
47+
// Load result from <- disk.
48+
vision::ClassifyResult res_loaded;
49+
benchmark::ResultManager::LoadClassifyResult(&res_loaded, cls_result_path);
50+
// Calculate diff between two results.
51+
auto cls_diff =
52+
benchmark::ResultManager::CalculateDiffStatis(res, res_loaded);
53+
std::cout << "Labels diff: mean=" << cls_diff.labels.mean
54+
<< ", max=" << cls_diff.labels.max
55+
<< ", min=" << cls_diff.labels.min << std::endl;
56+
std::cout << "Scores diff: mean=" << cls_diff.scores.mean
57+
<< ", max=" << cls_diff.scores.max
58+
<< ", min=" << cls_diff.scores.min << std::endl;
3459
BENCHMARK_MODEL(model_ppcls, model_ppcls.Predict(im, &res))
60+
#endif
3561
return 0;
3662
}

benchmark/cpp/benchmark_ppocr_cls.cc

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#include "flags.h"
16+
#include "macros.h"
17+
#include "option.h"
18+
19+
int main(int argc, char* argv[]) {
20+
#if defined(ENABLE_BENCHMARK) && defined(ENABLE_VISION)
21+
// Initialization
22+
auto option = fastdeploy::RuntimeOption();
23+
if (!CreateRuntimeOption(&option, argc, argv, true)) {
24+
return -1;
25+
}
26+
auto im = cv::imread(FLAGS_image);
27+
// Classification Model
28+
auto cls_model_file = FLAGS_model + sep + "inference.pdmodel";
29+
auto cls_params_file = FLAGS_model + sep + "inference.pdiparams";
30+
if (FLAGS_backend == "paddle_trt") {
31+
option.paddle_infer_option.collect_trt_shape = true;
32+
}
33+
if (FLAGS_backend == "paddle_trt" || FLAGS_backend == "trt") {
34+
option.trt_option.SetShape("x", {1, 3, 48, 10}, {4, 3, 48, 320},
35+
{8, 3, 48, 1024});
36+
}
37+
auto model_ppocr_cls = fastdeploy::vision::ocr::Classifier(
38+
cls_model_file, cls_params_file, option);
39+
int32_t res_label;
40+
float res_score;
41+
// Run once at least
42+
model_ppocr_cls.Predict(im, &res_label, &res_score);
43+
// 1. Test result diff
44+
std::cout << "=============== Test result diff =================\n";
45+
int32_t res_label_expect = 0;
46+
float res_score_expect = 1.0;
47+
// Calculate diff between two results.
48+
auto ppocr_cls_label_diff = res_label - res_label_expect;
49+
auto ppocr_cls_score_diff = res_score - res_score_expect;
50+
std::cout << "PPOCR Cls label diff: " << ppocr_cls_label_diff << std::endl;
51+
std::cout << "PPOCR Cls score diff: " << abs(ppocr_cls_score_diff)
52+
<< std::endl;
53+
BENCHMARK_MODEL(model_ppocr_cls,
54+
model_ppocr_cls.Predict(im, &res_label, &res_score));
55+
#endif
56+
return 0;
57+
}

0 commit comments

Comments
 (0)