Windows C++ ONNX Runtime环境配置与推理实战指南
1. 项目概述为什么要在Windows上用C搞ONNX Runtime如果你正在做AI模型部署尤其是想把训练好的PyTorch或TensorFlow模型塞到C应用里跑起来那ONNX RuntimeORT绝对是你绕不开的一个工具。它是一个高性能的推理引擎专门用来跑ONNX格式的模型。在Windows上用C搭配Visual Studio 2022来搞这个场景非常明确你需要一个高性能、低延迟、能直接集成到现有C桌面应用、游戏或者服务端程序中的AI推理模块。比如你想在某个工业检测软件里加一个视觉缺陷识别或者在游戏里搞个实时语音驱动的NPC表情用Python做推理可能太重或者不好集成这时候C版的ONNX Runtime就是最优解。我自己在好几个工业视觉项目里都这么干过把PyTorch训练的模型转成ONNX然后用C的ORT封装成DLL给主程序调用。整个过程最磨人的往往不是写代码而是第一步把环境配通。网上资料零散版本对不上编译报错能卡你半天。所以这篇东西我就把从零开始在Windows 11/10系统上用VS2022配置C版ONNX Runtime并跑通第一个推理测试的完整过程掰开揉碎了讲清楚。目标是让你看完就能动手一次成功避开我踩过的所有坑。2. 环境准备与核心组件解析配置环境不是简单地下个库就完事你得知道每个组件是干嘛的为什么选这个版本这样才能在出问题时自己排查。2.1 开发环境清单与版本选择工欲善其事必先利其器。以下是经过验证的组合稳定性最高操作系统Windows 10 64位版本20H2或更高或 Windows 11。必须是64位系统因为ONNX Runtime的预编译包基本都是x64的。开发工具Visual Studio 2022社区版即可。关键点安装时必须勾选“使用C的桌面开发”工作负载并且确保包含了“MSVC v143 - VS 2022 C x64/x86生成工具”和“Windows 10/11 SDK”。SDK版本选最新的或项目指定的比如10.0.22621.0。ONNX Runtime这里有个重要选择。官网提供了两种主要发行版预编译库推荐给新手和快速原型直接从GitHub Releases页面下载比如onnxruntime-win-x64-1.16.3.zip。里面包含了头文件include、导入库lib和动态链接库dll。优点是开箱即用不用自己编译缺点是功能固定比如默认可能只包含CPU执行提供程序EP。从源码编译如果你想启用CUDA进行GPU加速或者需要裁剪功能、进行深度定制那就需要自己编译。这个过程稍复杂需要CMake和对应的CUDA工具链。注意对于绝大多数“配置和简单测试”的需求强烈建议直接使用预编译的CPU版本。它能帮你跳过最复杂的编译坑先快速建立起“环境可用”的信心。本篇主要基于预编译库进行。2.2 获取ONNX Runtime预编译库我们以CPU版本为例演示如何获取。打开ONNX Runtime的GitHub发布页https://github.com/microsoft/onnxruntime/releases在最新的稳定版比如v1.16.3的“Assets”下拉列表中找到名为onnxruntime-win-x64-1.16.3.zip的文件并下载。这个包包含了运行和开发所需的所有文件。将ZIP包解压到一个你喜欢的、路径中不含中文或空格的目录。例如我习惯放在D:\Libs\onnxruntime。解压后的目录结构通常如下onnxruntime-win-x64-1.16.3/ ├── include/ # 头文件 (.h) │ └── onnxruntime/ ├── lib/ # 导入库文件 (.lib) │ └── onnxruntime.lib └── dll/ # 运行时动态库 (.dll) ├── onnxruntime.dll ├── onnxruntime_providers_shared.dll └── ... (其他可能的依赖dll)记住这个路径我们稍后在VS项目中需要引用它。2.3 准备一个简单的ONNX模型用于测试光有引擎不行还得有“燃料”——也就是ONNX模型。为了测试我们可以用一个超级简单的模型。方法一推荐使用Python快速生成 如果你有Python环境可以用以下脚本生成一个用于加法运算的模型import torch import torch.nn as nn import onnx class AddModel(nn.Module): def forward(self, x, y): return x y model AddModel() x torch.randn(1, 3, 224, 224, requires_gradFalse) # 示例输入1 y torch.randn(1, 3, 224, 224, requires_gradFalse) # 示例输入2 torch.onnx.export(model, (x, y), “simple_add.onnx” input_names[“input1”, “input2”], output_names[“output”], opset_version11) print(“模型已导出为 simple_add.onnx”)运行后得到simple_add.onnx文件。方法二备用直接下载 你也可以从ONNX模型库如https://github.com/onnx/models下载一个现成的简单模型比如MNIST手写数字识别模型。但注意模型可能有一定复杂度。将准备好的.onnx模型文件放在你的项目目录下例如D:\MyORTProject\models\simple_add.onnx。3. 创建与配置Visual Studio 2022 C项目这是核心环节每一步配置都有其作用。3.1 创建新项目打开VS2022选择“创建新项目”。选择“控制台应用C”点击下一步。输入项目名称如ORT_Test选择合适的位置点击“创建”。这样就得到了一个带有main.cpp的空白控制台项目。3.2 配置项目属性关键步骤我们需要告诉VS头文件在哪、库文件在哪、链接哪个库、运行时去哪找DLL。打开项目属性在“解决方案资源管理器”中右键点击你的项目ORT_Test选择“属性”。设置配置和平台确保右上角的“配置”是“所有配置”“平台”是“x64”。这样Debug和Release模式就一次性配好了。第一步配置包含目录头文件路径在属性页中导航到“C/C” - “常规” - “附加包含目录”。点击下拉箭头选择“编辑”。添加你解压的ONNX Runtime的include文件夹的完整路径。例如D:\Libs\onnxruntime\onnxruntime-win-x64-1.16.3\include。为什么这么做这样你在代码里写#include onnxruntime/core/session/onnxruntime_c_api.h时编译器才知道去哪找这个文件。第二步配置库目录.lib文件路径导航到“链接器” - “常规” - “附加库目录”。添加ONNX Runtime的lib文件夹路径。例如D:\Libs\onnxruntime\onnxruntime-win-x64-1.16.3\lib。为什么这么做链接器在将你的代码和ONNX Runtime库连接起来时需要知道onnxruntime.lib这个导入库文件的位置。第三步添加附加依赖项要链接的库名导航到“链接器” - “输入” - “附加依赖项”。添加onnxruntime.lib。如果是Debug配置并且你有对应的Debug版lib通常预编译包只提供Release版可能需要链接onnxruntime.lib名字可能一样但路径不同。我们这里用Release版lib通常也可用于Debug链接但运行时需要对应DLL。为什么这么做明确告诉链接器我们需要和onnxruntime.lib这个库进行静态链接实际上是动态链接的导入库。第四步配置运行时库可选但建议导航到“C/C” - “代码生成” - “运行时库”。为了减少依赖建议在Release配置下选择“多线程/MT”在Debug配置下选择“多线程调试/MTd”。这样会将C标准库静态链接到你的exe中发布时不需要携带msvcp140.dll等。但如果你选择动态链接/MD则需要确保目标机器上有对应的VC运行库。注意ONNX Runtime的预编译包通常是用/MD或/MDd编译的。如果你选择/MT可能会在链接时遇到“库冲突”的警告LNK4098。对于测试项目忽略此警告或保持与ORT一致的/MD通常没问题。第五步复制DLL到输出目录确保程序能运行这是最容易忽略的一步会导致“找不到onnxruntime.dll”的运行时错误。在“解决方案资源管理器”中右键项目 - “添加” - “新建筛选器”命名为“dll”方便管理。右键这个“dll”筛选器 - “添加” - “现有项”。浏览到你解压的ONNX Runtime的dll目录例如...\dll选择onnxruntime.dll和onnxruntime_providers_shared.dll点击“添加”。添加后在解决方案资源管理器中右键点击这两个dll文件选择“属性”。在属性窗口中将“复制到输出目录”设置为“如果较新则复制”。为什么这么做这样每次编译时VS会自动将这些运行时必需的DLL复制到你的exe文件所在的输出目录如x64\Debug确保程序启动时能加载到它们。4. 编写第一个ONNX Runtime C推理程序环境配好了我们来写代码。这个过程就像开车启动引擎初始化环境、加载地图加载模型、设定路线准备输入、开车执行推理、看结果。4.1 基本代码结构解析我们将创建一个完整的main.cpp。我会逐段解释。#include onnxruntime/core/session/onnxruntime_c_api.h #include onnxruntime/core/session/onnxruntime_cxx_api.h #include vector #include iostream #include chrono int main() { // --- 1. 初始化ONNX Runtime环境 --- Ort::Env env(ORT_LOGGING_LEVEL_WARNING, “TestONNXRuntime”); Ort::SessionOptions session_options; // 设置线程数可选 session_options.SetIntraOpNumThreads(1); session_options.SetInterOpNumThreads(1); // 对于CPU可以设置执行模式默认就是ORT_SEQUENTIAL session_options.SetExecutionMode(ORT_SEQUENTIAL); // --- 2. 创建会话加载模型 --- const wchar_t* model_path L“D:\\MyORTProject\\models\\simple_add.onnx”; // 注意宽字符和路径 Ort::Session session(env, model_path, session_options); // --- 3. 准备输入数据 --- // 3.1 获取模型输入输出信息 Ort::AllocatorWithDefaultOptions allocator; size_t num_input_nodes session.GetInputCount(); std::vectorconst char* input_node_names(num_input_nodes); std::vectorOrt::AllocatedStringPtr input_node_names_ptr; // 用于管理内存 std::vectorstd::vectorint64_t input_node_dims; std::cout “Number of inputs: “ num_input_nodes std::endl; for (size_t i 0; i num_input_nodes; i) { auto input_name session.GetInputNameAllocated(i, allocator); input_node_names[i] input_name.get(); input_node_names_ptr.push_back(std::move(input_name)); auto type_info session.GetInputTypeInfo(i); auto tensor_info type_info.GetTensorTypeAndShapeInfo(); auto dims tensor_info.GetShape(); input_node_dims.push_back(dims); std::cout “Input[“ i “] name: “ input_node_names[i] std::endl; std::cout “Input[“ i “] shape: “; for (auto dim : dims) { std::cout dim “ “; } std::cout std::endl; } // 3.2 根据模型期望的维度创建输入数据这里假设是float型形状[1,3,224,224] std::vectorfloat input_tensor_values_1; std::vectorfloat input_tensor_values_2; size_t total_size 1 * 3 * 224 * 224; // 计算张量元素总数 input_tensor_values_1.resize(total_size, 1.0f); // 全部填充为1.0 input_tensor_values_2.resize(total_size, 2.0f); // 全部填充为2.0 // --- 4. 创建输入Tensor --- // 获取模型输入类型通常是ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT auto memory_info Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault); // 创建输入Tensor对象 std::vectorOrt::Value input_tensors; input_tensors.push_back(Ort::Value::CreateTensorfloat( memory_info, input_tensor_values_1.data(), total_size, input_node_dims[0].data(), input_node_dims[0].size() )); input_tensors.push_back(Ort::Value::CreateTensorfloat( memory_info, input_tensor_values_2.data(), total_size, input_node_dims[1].data(), input_node_dims[1].size() )); // --- 5. 准备输出 --- size_t num_output_nodes session.GetOutputCount(); std::vectorconst char* output_node_names(num_output_nodes); std::vectorOrt::AllocatedStringPtr output_node_names_ptr; for (size_t i 0; i num_output_nodes; i) { auto output_name session.GetOutputNameAllocated(i, allocator); output_node_names[i] output_name.get(); output_node_names_ptr.push_back(std::move(output_name)); std::cout “Output[“ i “] name: “ output_node_names[i] std::endl; } // --- 6. 执行推理 --- auto start_time std::chrono::high_resolution_clock::now(); auto output_tensors session.Run(Ort::RunOptions{nullptr}, input_node_names.data(), input_tensors.data(), input_tensors.size(), output_node_names.data(), output_node_names.size()); auto end_time std::chrono::high_resolution_clock::now(); auto duration std::chrono::duration_caststd::chrono::milliseconds(end_time - start_time); std::cout “Inference time: “ duration.count() “ ms” std::endl; // --- 7. 解析输出结果 --- if (output_tensors.size() 0 output_tensors[0].IsTensor()) { float* floatarr output_tensors[0].GetTensorMutableDatafloat(); auto tensor_info output_tensors[0].GetTensorTypeAndShapeInfo(); auto output_dims tensor_info.GetShape(); size_t output_size tensor_info.GetElementCount(); std::cout “Output shape: “; for (auto dim : output_dims) { std::cout dim “ “; } std::cout std::endl; std::cout “Output size: “ output_size std::endl; // 简单验证因为我们输入是全1和全2加法模型输出应该是全3 std::cout “First 10 elements of output: “; for (int i 0; i 10 i output_size; i) { std::cout floatarr[i] “ “; } std::cout std::endl; // 简单检查 bool correct true; for (int i 0; i output_size; i) { if (std::abs(floatarr[i] - 3.0f) 1e-6) { correct false; break; } } if (correct) { std::cout “Inference result is correct! (All elements are ~3.0)” std::endl; } else { std::cout “Inference result might be wrong.” std::endl; } } // --- 8. 清理RAII对象会自动清理这里无需手动释放--- std::cout “Done.” std::endl; return 0; }4.2 代码关键点与内存管理心得宽字符路径Ort::Session构造函数在Windows上接受const wchar_t*类型的模型路径。所以要用L“...”前缀或者用std::wstring并调用.c_str()。内存信息Ort::MemoryInfo::CreateCpu创建了一个描述内存位置CPU和分配器类型的对象。这是创建Tensor所必需的。RAII是救星ONNX Runtime C API 使用了名为Ort::的命名空间并大量采用RAII资源获取即初始化设计。像Ort::EnvOrt::SessionOrt::Value这些对象你不需要也不应该手动调用Release之类的函数。它们会在析构时自动清理资源。这极大地避免了内存泄漏。管理字符串内存session.GetInputNameAllocated返回一个Ort::AllocatedStringPtr这是一个智能指针帮你管理从ORT内部获取的字符串内存。你必须保存好这些智能指针比如放在一个vector里确保在它们被使用期间比如在session.Run调用时不会被释放。这就是代码中input_node_names_ptr和output_node_names_ptr的作用。Tensor数据是连续的CreateTensor时你传入的原始数据指针如input_tensor_values_1.data()所指向的内存必须是连续的。使用std::vector是安全便捷的选择。5. 编译、运行与结果验证5.1 编译项目在VS2022顶部工具栏将“解决方案配置”切换到“Release”和“x64”。首次运行建议用Release速度更快且预编译库通常是Release版。点击“生成” - “生成解决方案”或按F7。如果前面的配置都正确编译应该会成功。如果遇到链接错误LNK2019: 无法解析的外部符号...请检查“附加依赖项”里是否正确添加了onnxruntime.lib。“附加库目录”路径是否正确并且该路径下确实有onnxruntime.lib文件。项目平台是否为x64。5.2 运行与调试编译成功后按Ctrl F5开始执行不调试运行程序。如果按F5调试控制台窗口会在程序结束后立即关闭不方便看输出。观察控制台输出。你应该能看到类似以下的信息Number of inputs: 2 Input[0] name: input1 Input[0] shape: 1 3 224 224 Input[1] name: input2 Input[1] shape: 1 3 224 224 Number of outputs: 1 Output[0] name: output Inference time: 15 ms Output shape: 1 3 224 224 Output size: 150528 First 10 elements of output: 3 3 3 3 3 3 3 3 3 3 Inference result is correct! (All elements are ~3.0) Done.恭喜这表示你的ONNX Runtime C环境已经成功配置并且完成了第一次推理。5.3 可能遇到的运行时错误及解决错误无法找到“onnxruntime.dll”或0xc000007b原因这是最常见的问题。系统在运行你的exe时在可搜索的路径如exe所在目录、系统PATH中找不到onnxruntime.dll及其依赖如onnxruntime_providers_shared.dll。解决确保按照3.2 第五步将DLL文件添加到了项目并设置了“复制到输出目录”。去输出目录如x64\Release下检查是否确实有这些DLL文件。如果还有问题可以尝试将DLL所在目录如...\dll添加到系统的PATH环境变量中需要重启VS或电脑但这通常不是最佳实践。错误std::bad_alloc或程序崩溃原因可能是输入Tensor的形状input_node_dims或数据与模型期望的不匹配。比如模型期望[1, 3, 224, 224]的输入你却创建了[224, 224, 3]的数据。解决仔细核对控制台打印的模型输入输出形状并确保你创建的std::vector大小和CreateTensor时传入的total_size计算正确。推理时间异常长原因第一次运行可能会有初始化开销。但如果持续很长检查是否在Debug模式下运行。Debug模式性能极差务必使用Release模式进行性能测试。优化可以尝试在SessionOptions中设置图形优化级别session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL);。6. 进阶配置与性能调优要点基础测试通过后你可能想做得更多。这里分享几个实战中的进阶要点。6.1 启用GPU加速CUDA如果你有NVIDIA GPU并安装了CUDA可以大幅提升推理速度。获取支持CUDA的ONNX Runtime包去GitHub Releases页面下载带有gpu标签的包如onnxruntime-win-x64-gpu-1.16.3.zip。或者从源码编译时指定--use_cuda。修改代码在创建Ort::SessionOptions后添加以下代码来指定CUDA执行提供程序。#include onnxruntime/core/providers/cuda/cuda_provider_factory.h // 需要CUDA版ORT头文件 ... Ort::SessionOptions session_options; OrtSessionOptionsAppendExecutionProvider_CUDA(session_options, 0); // 0表示设备ID确保DLL到位CUDA版的包会包含额外的onnxruntime_providers_cuda.dll等文件。同样需要将它们复制到输出目录并且确保系统有正确的CUDA和cuDNN环境。注意模型和输入输出数据会在CPU和GPU之间移动有拷贝开销。对于极小的模型GPU加速可能不明显甚至更慢。6.2 使用TensorRT进一步加速仅限NVIDIA如果你追求极致的延迟并且模型算子都被TensorRT支持可以尝试TensorRT后端。需要下载支持TensorRT的ONNX Runtime包或自行编译。代码中需要先启用CUDA Provider然后再追加TensorRT Provider并设置相关参数如最大工作空间大小、精度模式等。配置更为复杂。6.3 多线程与性能优化设置线程数SetIntraOpNumThreads设置单个操作内部并行化的线程数如一个矩阵乘法的并行计算。SetInterOpNumThreads设置多个操作间并行执行的线程数。对于简单的顺序模型InterOp意义不大。通常设置为物理核心数。执行模式SetExecutionMode(ORT_SEQUENTIAL)是顺序执行确定性好。ORT_PARALLEL可能在某些有并行分支的模型上提升速度。优化级别session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL);启用所有图优化如常量折叠、算子融合等通常能带来性能提升。6.4 处理动态输入形状很多模型如NLP的BERT支持动态批次大小或序列长度。在代码中tensor_info.GetShape()返回的维度可能包含-1表示该维度是动态的。在运行时指定形状你可以在创建输入Tensor时使用你实际需要的形状。例如模型输入形状是[-1, 256]你可以在运行时指定为[16, 256]。代码调整对于动态维度input_node_dims中的对应值会是-1。你在创建Tensor时需要将其替换为实际值。std::vectorint64_t current_input_shape input_node_dims[i]; for (auto dim : current_input_shape) { if (dim -1) { dim your_actual_dim_value; // 例如实际的批次大小 } } // 使用 current_input_shape 创建Tensor7. 集成到实际项目中的注意事项当你把ORT集成到大型C项目中时还有一些工程化的问题要考虑。二进制兼容性确保你的项目编译环境特别是MSVC编译器版本和运行时库与使用的ONNX Runtime预编译库一致。否则可能出现奇怪的链接或运行时错误。最好使用相同版本的VS编译整个项目。依赖管理不建议直接把ORT的DLL和LIB文件放在项目源码里。更好的做法是使用CMake的find_package如果ORT提供了CMake配置。或者将ORT作为一个独立的“第三方库”包在构建系统如CMake中通过include_directories和link_directories引用。在CI/CD流水线中自动下载指定版本的ORT包。错误处理示例代码为了简洁没有做详细的错误处理。生产代码中ORT的API调用应该用try...catch包裹并检查返回的Ort::Value是否有效。内存与性能 profiling使用性能分析工具如VS的性能探查器、VTune来定位推理瓶颈。可能是数据预处理、后处理或者是模型本身的某些算子。模型版本管理ONNX模型本身可能有版本opset版本。确保你的ONNX Runtime版本支持模型使用的算子集版本。通常较新的ORT版本向后兼容性较好。配置一次可能只需要半天但一个稳定、高效的推理环境是后续所有AI应用开发的基石。花时间把这一步搞扎实后面写业务逻辑才会顺畅。如果在配置过程中遇到本文未覆盖的奇怪问题第一反应应该是去ONNX Runtime的GitHub Issues里搜索大概率已经有人遇到并解决了。

相关新闻

会议论文参考文献格式全解析:GB/T 7714与IEEE标准实操指南

会议论文参考文献格式全解析:GB/T 7714与IEEE标准实操指南

1. 项目概述:会议论文参考文献的格式之惑刚入行的研究生或者需要撰写学术报告的朋友,估计都遇到过这个让人头疼的问题:参考文献里引用了一篇会议论文,到底该怎么写?是写“会议论文集”还是“会议录”?出版社…

2026/7/31 9:54:15 阅读更多 →
MATLAB实现多无人机协同路径规划与防撞策略

MATLAB实现多无人机协同路径规划与防撞策略

1. 动态环境下多无人机协同路径规划的核心挑战在复杂动态环境中实现多无人机系统的协同作业,本质上需要解决三个维度的耦合问题:空间维度上的路径优化、时间维度上的任务调度、以及安全维度上的碰撞规避。这就像指挥一支空中芭蕾舞团,既要保证…

2026/7/31 9:54:15 阅读更多 →
【视频处理革命】LosslessCut:无损剪辑工具让视频处理效率提升500%

【视频处理革命】LosslessCut:无损剪辑工具让视频处理效率提升500%

【视频处理革命】LosslessCut:无损剪辑工具让视频处理效率提升500% 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字内容创作爆炸的时代,…

2026/7/31 9:54:15 阅读更多 →

最新新闻

SPICE协议在PVE虚拟化环境中的优化配置与实践

SPICE协议在PVE虚拟化环境中的优化配置与实践

1. 为什么选择SPICE协议? SPICE(Simple Protocol for Independent Computing Environments)是红帽开发的远程显示协议,专为虚拟化环境优化。相比传统的VNC和RDP,SPICE在以下几个方面具有显著优势: 多媒体性…

2026/7/31 10:33:27 阅读更多 →
华为CANN metadef架构与异构计算优化实践

华为CANN metadef架构与异构计算优化实践

1. CANN metadef 核心架构解析在异构计算领域,华为的CANN(Compute Architecture for Neural Networks)作为昇腾AI处理器的软件基石,其metadef机制是连接算法模型与硬件执行的关键桥梁。最近在OpenEuler社区看到不少开发者询问CANN…

2026/7/31 10:33:27 阅读更多 →
变压器安装工程的关键技术参数中,接地电阻值与绝缘电阻值的合格范围分别是多少?

变压器安装工程的关键技术参数中,接地电阻值与绝缘电阻值的合格范围分别是多少?

摘要:本文依据 GB 50169、GB 50150 等国家规范,明确 10kV 及以下配电变压器安装工程的核心电阻合格标准:容量>100kVA 的变压器共用接地电阻应≤4Ω(≤100kVA 可放宽至≤10Ω);绝缘电阻同温度下不…

2026/7/31 10:33:27 阅读更多 →
计算机毕业设计之北工国际健身俱乐部

计算机毕业设计之北工国际健身俱乐部

本系统为会员而设计制作北工国际健身俱乐部,旨在实现北工国际健身俱乐部智能化、现代化管理。本北工国际健身俱乐部管理自动化系统的开发和研制的最终目的是将北工国际健身俱乐部的运作模式从手工记录数据转变为网络信息查询管理,从而为现代管理人员的使…

2026/7/31 10:33:27 阅读更多 →
计算机毕业设计之趵突泉景区的智慧导游小程序

计算机毕业设计之趵突泉景区的智慧导游小程序

当今社会已经步入了科学技术进步和经济社会快速发展的新时期,国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统趵突泉景区的智慧导游采取了人工的管理方法&…

2026/7/31 10:33:27 阅读更多 →
荷载规范中的基本风压

荷载规范中的基本风压

荷载规范中的基本风压 《建筑结构荷载规范》(GB50009-2001)结构荷载规范原文 8.1.2 基本风压的确定方法和重现期直接关系到当地基本风压值的大小,因而也直接关系到建筑结构在风荷载作用下的安全,必须以强制性条文作规定。 确定基本风压的方法包括对观测场地、风速仪的类…

2026/7/31 10:32:26 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻