我正在做一个需要使用TFlite C++ API的项目。我以前用Python做过。但是,问题是使用C++ API从模型推理比Python推理慢5倍。2模型是mediapipes hand和palmtflite模型。3我能知道C推理比Python推理慢的原因吗?4有什么方法可以使它更快吗?下面我附上了相关部分的Python和C代码。非常感谢。
Python推理:
self.interp_joint.set_tensor(self.in_idx_joint, img_norm.reshape(1, 224, 224, 3))
joints = self.interp_joint.get_tensor(self.out_idx_joint)
C++推理:
float* input_data_ptr = hand_landmarks_interpreter->typed_tensor<float>(in_idx_hand);
memcpy(input_data_ptr, img_norm.data, img_norm.total() * img_norm.elemSize());
hand_landmarks_interpreter->Invoke();
TfLiteIntArray *output_dims = hand_landmarks_interpreter->tensor(out_idx_hand)->dims;
auto output_size = output_dims->data[output_dims->size - 1];
float* result = hand_landmarks_interpreter->typed_tensor<float>(out_idx_hand);
注:花费大量时间的部分是invoke
命令。在这两种情况下,图像都被重新整形为正确的大小(224,224,3),并且它们是CV_32FC3类型。
CMakeLists.txt内容(我正在Visual Studio代码环境中使用cmake构建我的项目。):
cmake_minimum_required(VERSION 3.16)
project(main C CXX)
set(TENSORFLOW_SOURCE_DIR "C:/MyApps/Tensorflow/tensorflow_src" CACHE PATH
"Directory that contains the TensorFlow project"
)
if(NOT TENSORFLOW_SOURCE_DIR)
get_filename_component(TENSORFLOW_SOURCE_DIR
"C:/MyApps/Tensorflow/tensorflow_src"
ABSOLUTE
)
endif()
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR})
add_subdirectory(
"C:/MyApps/Tensorflow/tensorflow_src/tensorflow/lite"
"${CMAKE_CURRENT_BINARY_DIR}/tensorflow-lite"
EXCLUDE_FROM_ALL
)
add_compile_options(-static-libgcc -static-libstdc++)
set(SOURCES main.cpp hand_tracker.cpp non_max_suppression_fast.cpp
${PROJECT_SOURCE_DIR}/hand_tracker.h ${PROJECT_SOURCE_DIR}/non_max_suppression_fast.h)
set(CMAKE_CXX_STANDARD 11)
add_executable(main
${SOURCES}
)
target_link_libraries(main
tensorflow-lite
${OpenCV_LIBS}
)
1条答案
按热度按时间ahy6op9u1#
默认情况下,当运行C时,你的实现可能只使用一个CPU内核。然而,在Python中,负载分布在多个内核上。这使得执行速度显著加快!上次我没有时间研究如何在使用C的CPU上更快地进行推理,我只是将所有内容导出为Python库并在那里运行它:/但是,也许有人可以给予更多关于如何使用多个内核运行推理的见解(或者我抽出时间去查找)。