runtime 创建数据模型

本文介绍如何使用Objective-C运行时API中的class_copyPropertyList方法来获取类的所有属性,并通过一个具体实现示例展示了如何将字典中的键值对映射到对象的属性上。
objc_property_t * class_copyPropertyList(Class cls, unsigned int *outCount);//苹果文档获取类所有属性的接口
Class cls //要获取属性的类
unsigned int *outCount //一个指向该属性数组的一个计数指针
objc_property_t*  //返回一个属性指针数组

具体实现

#import "Model.h"

#import <objc/message.h>

@implementation Model

+(instancetype)getDic:(NSDictionary*)dic{

  Model * model =  [[Model alloc]init];

    unsigned int count = 0;

    objc_property_t * ps = class_copyPropertyList([self class], &count);

    for (int i = 0; i<count; i++) {

        objc_property_t p = ps[i];

        id obj = [dic objectForKey:[NSString stringWithFormat:@"%s",property_getName(p)]];

        if (obj) {

             [mode setValue:obj forKey:[NSString stringWithFormat:@"%s",property_getName(p)]];

        }

    }

    return model;

}

@end

以下是一个使用 ONNX Runtime 在 C++ 中部署 MobileNet 模型的示例代码。这个示例假设你已经有了一个 MobileNet 的 ONNX 模型文件,并且已经安装了 ONNX Runtime。 ```cpp #include <iostream> #include <vector> #include <onnxruntime_cxx_api.h> // 函数用于读取图像并将其转换为输入张量 Ort::Value read_image(const std::string& image_path, Ort::MemoryInfo& memory_info, int width, int height) { // 这里应该实现图像读取和预处理逻辑 // 为了简化,我们创建一个随机张量作为示例 std::vector<float> input_tensor_values(width * height * 3); for (size_t i = 0; i < input_tensor_values.size(); ++i) { input_tensor_values[i] = static_cast<float>(rand()) / RAND_MAX; } std::vector<int64_t> input_shape = {1, 3, height, width}; auto input_tensor = Ort::Value::CreateTensor<float>(memory_info, input_tensor_values.data(), input_tensor_values.size(), input_shape.data(), input_shape.size()); return input_tensor; } int main() { // 初始化 ONNX Runtime 环境 Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test"); Ort::SessionOptions session_options; session_options.SetIntraOpNumThreads(1); session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL); // 加载 ONNX 模型 const std::string model_path = "mobilenet.onnx"; Ort::Session session(env, model_path.c_str(), session_options); // 获取输入和输出信息 Ort::AllocatorWithDefaultOptions allocator; auto input_name = session.GetInputName(0, allocator); auto output_name = session.GetOutputName(0, allocator); auto input_type_info = session.GetInputTypeInfo(0); auto input_tensor_info = input_type_info.GetTensorTypeAndShapeInfo(); auto input_dims = input_tensor_info.GetShape(); int width = static_cast<int>(input_dims[3]); int height = static_cast<int>(input_dims[2]); // 读取图像并创建输入张量 Ort::MemoryInfo memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault); auto input_tensor = read_image("test_image.jpg", memory_info, width, height); // 准备输入和输出张量 std::vector<const char*> input_names{input_name}; std::vector<Ort::Value> input_tensors{input_tensor}; std::vector<const char*> output_names{output_name}; std::vector<Ort::Value> output_tensors; // 运行推理 auto output_tensors_ort = session.Run(Ort::RunOptions{nullptr}, input_names.data(), input_tensors.data(), 1, output_names.data(), 1); // 获取输出结果 Ort::Value output_tensor = std::move(output_tensors_ort[0]); float* output_data = output_tensor.GetTensorMutableData<float>(); auto output_shape = output_tensor.GetTensorTypeAndShapeInfo().GetShape(); // 打印输出结果 std::cout << "Output shape: "; for (auto dim : output_shape) { std::cout << dim << " "; } std::cout << std::endl; std::cout << "Output values: "; for (size_t i = 0; i < 10; ++i) { std::cout << output_data[i] << " "; } std::cout << std::endl; return 0; } ``` ### 代码说明: 1. **初始化 ONNX Runtime 环境**:创建 `Ort::Env` 对象和 `Ort::SessionOptions` 对象,并设置一些选项,如线程数和图优化级别。 2. **加载 ONNX 模型**:使用 `Ort::Session` 加载 MobileNet 的 ONNX 模型文件。 3. **获取输入和输出信息**:通过 `session.GetInputName` 和 `session.GetOutputName` 获取输入和输出的名称,通过 `session.GetInputTypeInfo` 获取输入张量的形状信息。 4. **读取图像并创建输入张量**:在 `read_image` 函数中,应该实现图像读取和预处理逻辑,这里为了简化,创建了一个随机张量作为示例。 5. **运行推理**:使用 `session.Run` 方法运行推理,传入输入张量和输出名称。 6. **获取输出结果**:从输出张量中获取数据,并打印输出结果的形状和前 10 个值。 ### 编译和运行: 编译时需要链接 ONNX Runtime 库,例如: ```sh g++ -o mobilenet_deployment mobilenet_deployment.cpp -L/path/to/onnxruntime/lib -lonnxruntime -I/path/to/onnxruntime/include ``` 运行时需要将 `mobilenet.onnx` 和 `test_image.jpg` 放在正确的路径下: ```sh ./mobilenet_deployment ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值