整理不易,持续更新,如果对你有用的话,❤️那就给个⭐️🌟支持一下吧~ 🙃🤪🍀
这份文档主要记录了onnxruntime的一些参考资料,包含C++/Java/Python,以及本人在使用过程中的一些经验。
- [1] onnxruntime官网学习资料
- [2] onnxruntime自定义op
- [3] onnxruntime-gpu和cuda版本对应
- [4] onnxruntime-openmp
- [5] onnxruntime和cuda之间的版本对应-很详细
- [6] onnxruntime-api文档
- [7] onnxruntime-python-api-docs
- [8] onnxruntime-java-api-docs
- [1] onnx_runtime_cpp-github
- [2] onnxruntime python/c/c++/java使用案列
- [3] onnxruntime-各种语言官方案列
- [4] onnxruntime的c++使用
- [5] onnxruntime-cxx官方案例
- [6] onnxruntime-FAQ
- [7] onnxruntime-c++多输入多数出case
- [1] onnxruntime源码编译
- [2] linux编译onnxruntime
- [3] onnxruntime编译选项解析
- [4] onnxtunrime中CMake使用指南和ABI-Dev-Notes
- [5] onnxruntime-cmake_guildline.md
- [6] mac编译中出现has no symbols提示
TEST(CApiTest, access_tensor_data_elements) {
/**
* Create a 2x3 data blob that looks like:
*
* 0 1 2
* 3 4 5
*/
std::vector<int64_t> shape = {2, 3};
int element_count = 6; // 2*3
std::vector<float> values(element_count);
for (int i = 0; i < element_count; i++)
values[i] = static_cast<float>(i);
Ort::MemoryInfo info("Cpu", OrtDeviceAllocator, 0, OrtMemTypeDefault);
Ort::Value tensor = Ort::Value::CreateTensor<float>(info, values.data(), values.size(), shape.data(), shape.size());
float expected_value = 0;
for (int64_t row = 0; row < shape[0]; row++) {
for (int64_t col = 0; col < shape[1]; col++) {
ASSERT_EQ(expected_value++, tensor.At<float>({row, col}));
}
}
}
const float *var_angles = output_var_tensors.front().GetTensorMutableData<float>();
const float *conv_angles = output_conv_tensors.front().GetTensorMutableData<float>();
const float mean_yaw = (var_angles[0] + conv_angles[0]) / 2.0f;
const float mean_pitch = (var_angles[1] + conv_angles[1]) / 2.0f;
const float mean_roll = (var_angles[2] + conv_angles[2]) / 2.0f;
Ort::Value不允许复制拷贝,因此无法通过=
去使用输出的结果,但是可以结合引用&+At<>
来获取,使用方式如下:
ort::Value &var_angles_tensor = output_var_tensors.at(0);
ort::Value &conv_angles_tensor = output_conv_tensors.at(0);
const float mean_ref_yaw =
(var_angles_tensor.At<float>({0}) + conv_angles_tensor.At<float>({0})) / 2.0f;
const float mean_ref_pitch =
(var_angles_tensor.At<float>({1}) + conv_angles_tensor.At<float>({1})) / 2.0f;
const float mean_ref_roll =
(var_angles_tensor.At<float>({2}) + conv_angles_tensor.At<float>({2})) / 2.0f;
可以看到At<>
的源码为:
inline T& Value::At(const std::vector<int64_t>& location) {
static_assert(!std::is_same<T, std::string>::value, "this api does not support std::string");
T* out;
ThrowOnError(GetApi().TensorAt(p_, location.data(), location.size(), (void**)&out));
return *out;
}
实际上也是利用指针p_
获取数据,只不过At
替我们处理了数据位置的计算。这个方法返回的实际上是一个非const
引用,这意味着你可以通过这个引用直接修改内存中的值。
std::vector<OrtSessionHandler::DataOutputType> OrtSessionHandler::OrtSessionHandlerIml::
operator()(const std::vector<float*>& inputData)
{
if (m_numInputs != inputData.size()) {
throw std::runtime_error("Mismatch size of input data\n");
}
Ort::MemoryInfo memoryInfo = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
std::vector<Ort::Value> inputTensors;
inputTensors.reserve(m_numInputs);
for (int i = 0; i < m_numInputs; ++i) {
inputTensors.emplace_back(std::move(
Ort::Value::CreateTensor<float>(memoryInfo, const_cast<float*>(inputData[i]), m_inputTensorSizes[i],
m_inputShapes[i].data(), m_inputShapes[i].size())));
}
auto outputTensors = m_session.Run(Ort::RunOptions{nullptr}, m_inputNodeNames.data(), inputTensors.data(),
m_numInputs, m_outputNodeNames.data(), m_numOutputs);
assert(outputTensors.size() == m_numOutputs);
std::vector<DataOutputType> outputData;
outputData.reserve(m_numOutputs);
int count = 1;
for (auto& elem : outputTensors) {
DEBUG_LOG("type of input %d: %s", count++, toString(elem.GetTensorTypeAndShapeInfo().GetElementType()).c_str());
outputData.emplace_back(
std::make_pair(std::move(elem.GetTensorMutableData<float>()), elem.GetTensorTypeAndShapeInfo().GetShape()));
}
return outputData;
}
#include <assert.h>
#include <vector>
#include <onnxruntime_cxx_api.h>
int main(int argc, char* argv[]) {
Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test");
Ort::SessionOptions session_options;
session_options.SetIntraOpNumThreads(1);
session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED);
#ifdef _WIN32
const wchar_t* model_path = L"model.onnx";
#else
const char* model_path = "model.onnx";
#endif
Ort::Session session(env, model_path, session_options);
// print model input layer (node names, types, shape etc.)
Ort::AllocatorWithDefaultOptions allocator;
// print number of model input nodes
size_t num_input_nodes = session.GetInputCount();
std::vector<const char*> input_node_names = {"input","input_mask"};
std::vector<const char*> output_node_names = {"output","output_mask"};
std::vector<int64_t> input_node_dims = {10, 20};
size_t input_tensor_size = 10 * 20;
std::vector<float> input_tensor_values(input_tensor_size);
for (unsigned int i = 0; i < input_tensor_size; i++)
input_tensor_values[i] = (float)i / (input_tensor_size + 1);
// create input tensor object from data values
auto memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
Ort::Value input_tensor = Ort::Value::CreateTensor<float>(memory_info, input_tensor_values.data(), input_tensor_size, input_node_dims.data(), 2);
assert(input_tensor.IsTensor());
std::vector<int64_t> input_mask_node_dims = {1, 20, 4};
size_t input_mask_tensor_size = 1 * 20 * 4;
std::vector<float> input_mask_tensor_values(input_mask_tensor_size);
for (unsigned int i = 0; i < input_mask_tensor_size; i++)
input_mask_tensor_values[i] = (float)i / (input_mask_tensor_size + 1);
// create input tensor object from data values
auto mask_memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
Ort::Value input_mask_tensor = Ort::Value::CreateTensor<float>(mask_memory_info, input_mask_tensor_values.data(), input_mask_tensor_size, input_mask_node_dims.data(), 3);
assert(input_mask_tensor.IsTensor());
std::vector<Ort::Value> ort_inputs;
ort_inputs.push_back(std::move(input_tesor));
ort_inputs.push_back(std::move(input_mask_tensor));
// score model & input tensor, get back output tensor
auto output_tensors = session.Run(Ort::RunOptions{nullptr}, input_node_names.data(), ort_inputs.data(), ort_inputs.size(), output_node_names.data(), 2);
// Get pointer to output tensor float values
float* floatarr = output_tensors[0].GetTensorMutableData<float>();
float* floatarr_mask = output_tensors[1].GetTensorMutableData<float>();
printf("Done!\n");
return 0;
}
- [0] onnxruntime源码阅读:模型推理过程概览
- [1] onnxruntime源码解析:引擎运行过程总览
- [2] pytorch-onnx-operator-export-type设置
- [3] onnxruntime与pytorch对接方法汇总
- [4] onnxruntime的设计理念
- [5] onnxruntime增加新的operator和kernel
- [6] onnx模型如何修改或删除里面的node即修改图的方法
- [7] onnxruntime添加一个新的execution-provider
- [8] onnxruntime图优化方法说明
- [9] onnx结构分析
- [0] YoloV5 目标检测 ONNXRuntime C++实现
- [1] YoloV3 目标检测 ONNXRuntime C++实现
- [2] TinyYoloV3 目标检测 ONNXRuntime C++实现
- [3] YoloV4 目标检测 ONNXRuntime C++实现
- [4] SSD 目标检测 ONNXRuntime C++实现
- [5] SSDMobileNetV1 目标检测 ONNXRuntime C++实现
- [6] YoloX 2021最新!目标检测 ONNXRuntime C++实现
- [7] TinyYoloV4VOC 目标检测 ONNXRuntime C++实现
- [8] TinyYoloV4COCO 目标检测 ONNXRuntime C++实现
- [9] YoloR 2021最新!目标检测 ONNXRuntime C++实现
- [10] ScaledYoloV4 CVPR2021!目标检测 ONNXRuntime C++实现
- [11] EfficientDet 目标检测 ONNXRuntime C++实现
- [12] EfficientDetD7 目标检测 ONNXRuntime C++实现
- [13] EfficientDetD8 目标检测 ONNXRuntime C++实现
- [14] YOLOP 2021最新自动驾驶全景识别!ONNXRuntime C++实现
- [0] GlintArcFace 格林深瞳!人脸识别 ONNXRuntime C++实现
- [1] GlintCosFace 格林深瞳!人脸识别 ONNXRuntime C++实现
- [2] GlintPartialFC 格林深瞳!人脸识别 ONNXRuntime C++实现
- [3] FaceNet 人脸识别 ONNXRuntime C++实现
- [4] FocalArcFace 人脸识别 ONNXRuntime C++实现
- [5] FocalAsiaArcFace 人脸识别 ONNXRuntime C++实现
- [6] TencentCurricularFace 腾讯!人脸识别 ONNXRuntime C++实现
- [7] TencentCifpFace 腾讯!人脸识别 ONNXRuntime C++实现
- [8] CenterLossFace 人脸识别 ONNXRuntime C++实现
- [9] SphereFace 人脸识别 ONNXRuntime C++实现
- [10] PoseRobustFace 人脸识别 ONNXRuntime C++实现
- [11] NaivePoseRobustFace 人脸识别 ONNXRuntime C++实现
- [12] MobileFaceNet 3.8Mb!人脸识别 ONNXRuntime C++实现
- [13] CavaGhostArcFace 人脸识别 ONNXRuntime C++实现
- [14] CavaCombinedFace 人脸识别 ONNXRuntime C++实现
- [15] MobileSEFocalFace 4.5Mb!人脸识别 ONNXRuntime C++实现
- [0] UltraFace 1Mb超轻量级人脸检测 ! ONNXRuntime C++实现
- [1] RetinaFace CVPR2020! 人脸检测 ONNXRuntime C++实现
- [2] FaceBoxes 1.6Mb人脸检测!ONNXRuntime C++实现
- [0] PFLD 1.0Mb!106点人脸关键点检测 ONNXRuntime C++实现
- [1] PFLD98 4.8Mb!98点人脸关键点检测 ONNXRuntime C++实现
- [2] MobileNetV268 9.4Mb! 68点人脸关键点检测 ONNXRuntime C++实现
- [3] MobileNetV2SE68 11Mb!68点人脸关键点检测 ONNXRuntime C++实现
- [4] PFLD68 2.8Mb!68点人脸关键点检测 ONNXRuntime C++实现
- [5] FaceLandmark1000 赞!2.0Mb!1000点!人脸关键点检测 ONNXRuntime C++实现
- [0] AgeGoogleNet 年龄估计 ONNXRuntime C++实现
- [1] GenderGoogleNet 性别识别 ONNXRuntime C++实现
- [2] EmotionFerPlus 情绪识别 ONNXRuntime C++实现
- [3] VGG16Age 年龄估计 ONNXRuntime C++实现
- [4] VGG16Gender 性别识别 ONNXRuntime C++实现
- [5] SSRNet 190Kb!年龄估计 ONNXRuntime C++实现
- [6] EfficientEmotion7 7种情绪识别 ONNXRuntime C++实现
- [7] EfficientEmotion8 8种情绪识别 ONNXRuntime C++实现
- [8] MobileEmotion7 7种情绪识别 ONNXRuntime C++实现
- [9] ReXNetEmotion7 7种情绪识别 ONNXRuntime C++实现
- [0] EfficientNetLite4 1000图像分类 ONNXRuntime C++实现
- [1] ShuffleNetV2 1000图像分类 ONNXRuntime C++实现
- [2] DenseNet121 1000图像分类 ONNXRuntime C++实现
- [3] GhostNet 1000图像分类 ONNXRuntime C++实现
- [4] HdrDNet 1000图像分类 ONNXRuntime C++实现
- [5] IBNNet 1000图像分类 ONNXRuntime C++实现
- [6] MobileNetV2 1000图像分类 ONNXRuntime C++实现
- [7] ResNet 1000图像分类 ONNXRuntime C++实现
- [8] ResNeXt 1000图像分类 ONNXRuntime C++实现
【新的模型案例将会不断加入进来!!!欢迎关注收藏~】