避坑指南:Windows系统配置NCNN环境常见问题解决方案(含VS2022/CMake/Protobuf配置)

YOLO系列如何通过ncnn模型部署Android ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。 ncnn 从设计之初深刻考虑手机端的部署和使用。 无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。 阅读详情

Windows平台NCNN环境配置:从零到一的深度避坑实战

如果你在Windows上配置NCNN时,感觉像是走进了一个布满暗坑的迷宫,那么这篇文章就是为你准备的路线图。我花了整整两周时间,在几台不同配置的Windows 10/11机器上反复折腾,从Visual Studio版本冲突到Protobuf编译的诡异错误,几乎把能踩的雷都踩了一遍。最终,我整理出了一套经过验证的、高成功率的配置流程。这篇文章不会像官方文档那样只告诉你理想路径,而是会聚焦于那些让你卡住数小时甚至数天的“魔鬼细节”,并提供具体的解决方案。无论你是刚接触移动端推理框架的开发者,还是从Linux/Mac环境迁移过来的老手,这些实战经验都能帮你节省大量时间。

1. 环境基石:工具链的精准选择与配置陷阱

在Windows上搞开发,工具链本身就是第一道坎。Visual Studio、CMake、MSVC编译器……版本不匹配是绝大多数编译错误的根源。很多人第一步就错了。

1.1 Visual Studio版本:不是越新越好

我强烈建议使用 Visual Studio 2022,并且务必通过安装器勾选以下两个关键组件:

  • “使用C++的桌面开发”工作负载:这是基础。
  • “适用于v143生成工具的C++ MFC”(在“单个组件”中搜索):一些较老的第三方库或特定配置可能需要MFC支持,预先装上能避免后续链接错误。

注意:避免使用Visual Studio 2019或更早版本。虽然NCNN理论上支持,但你在编译Protobuf等高版本依赖库时,可能会遇到C++语言标准兼容性问题,导致一堆令人费解的模板错误。

安装完成后,不要急着从开始菜单打开VS。我们后续的关键操作都在一个特殊的命令行中完成:“Developer Command Prompt for VS 2022” 或更推荐的 “x64 Native Tools Command Prompt for VS 2022”。后者直接为你配置好了64位编译环境(cl, link, nmake等命令的路径),这是后续所有命令行操作的起点。你可以把它固定到任务栏,接下来会频繁使用。

1.2 CMake:GUI与命令行的双线作战

去CMake官网下载最新稳定版的安装程序(如3.28+)。安装时,务必勾选 “Add CMake to the system PATH for all users”。这样你才能在刚才的VS命令行里直接使用cmake命令。

CMake在这里扮演两个角色:

  1. 生成器:将CMakeLists.txt转换为Visual Studio能理解的.sln工程文件或Makefile。
  2. 配置器:通过-D参数传递关键选项,如安装路径、是否开启某些功能。

一个常见的坑是:直接在资源管理器里双击运行CMake GUI,然后用它去配置和生成项目。对于简单的项目可行,但对于NCNN这种有复杂依赖(Protobuf)的项目,GUI里手动指定依赖库的路径非常容易出错,尤其是当路径包含空格或中文字符时。更可靠的方式是全程使用命令行,这样所有参数都清晰可追溯。

验证你的CMake和编译器环境是否就绪,打开“x64 Native Tools Command Prompt for VS 2022”,输入:

cmake --version
cl

你应该能看到CMake版本信息和MSVC编译器的版本详情。

2. 依赖库编译:Protobuf与OpenCV的静/动态库之争

依赖库是拦路虎,尤其是Protobuf。网上很多教程一笔带过,但这里细节决定成败。

2.1 Protobuf编译:静态库的稳妥之选

Protobuf必须从源码编译,因为我们需要得到与NCNN匹配的、特定版本的库文件(.lib)和头文件。直接从GitHub的Release页面下载源码压缩包(如protobuf-cpp-3.21.12.zip),解压到没有空格和中文的路径,例如D:\Libs\protobuf-3.21.12。

接下来是关键步骤,在VS命令行中操作:

cd /d D:\Libs\protobuf-3.21.12
mkdir build_vs_static
cd build_vs_static

然后执行CMake配置命令。这里有一个重要决策:编译为静态库(MT/MTd)还是动态库(MD/MDd)。为了部署简便,避免运行时还要携带protobuf.dll,我推荐编译为静态库。

cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../install -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=ON -Dprotobuf_WITH_ZLIB=OFF ..

参数解读:

  • -G "NMake Makefiles":指定生成NMake格式的Makefile,以便后续使用nmake命令编译。
  • -DCMAKE_BUILD_TYPE=Release:编译Release版本,体积小,速度快。
  • -DCMAKE_INSTALL_PREFIX=../install:指定编译产物的安装目录,方便管理。
  • -Dprotobuf_MSVC_STATIC_RUNTIME=ON:关键! 让Protobuf链接到C++静态运行时库,避免与后续项目产生运行时库冲突。
  • -Dprotobuf_WITH_ZLIB=OFF:关闭ZLIB支持,除非你确需压缩功能,否则简化依赖。

配置成功后,依次执行:

nmake
nmake install

完成后,检查D:\Libs\protobuf-3.21.12\install目录,你应该看到bin, include, lib三个子目录。lib目录下的libprotobuf.lib就是我们需要的静态库文件。

2.2 OpenCV:使用预编译库是明智之举

对于OpenCV,除非你有极特殊的定制需求(比如要裁剪掉90%的模块以减小体积),否则强烈建议直接使用官方预编译好的库。从OpenCV官网下载对应你Visual Studio版本的Windows pack(例如opencv-4.8.0-windows.exe),它本质上是一个自解压文件。

将其解压到一个简单路径,如D:\Libs\opencv。里面已经包含了我们需要的include头文件夹和x64\vc16\bin(动态库dll)及x64\vc16\lib(导入库lib)文件夹。省去了数小时的编译时间,且非常稳定。

为了方便后续在CMake中引用,我们可以手动设置一个环境变量OpenCV_DIR,指向OpenCV的CMake配置路径。以管理员身份打开系统环境变量设置,新建一个系统变量:

  • 变量名:OpenCV_DIR
  • 变量值:D:\Libs\opencv\build\x64\vc16\lib (注意,这个路径下通常有OpenCVConfig.cmake文件)

这样,在后续的CMake项目中,find_package(OpenCV REQUIRED)命令就能自动定位到你的OpenCV了。

3. NCNN编译:参数配置与“找不到Protobuf”的终极解决

终于来到主角环节。从NCNN的GitHub Release页面下载源码(如ncnn-20240226-full-source.zip),解压到类似D:\Libs\ncnn的路径。

在VS命令行中,进入NCNN源码目录并创建构建目录:

cd /d D:\Libs\ncnn
mkdir build_vs
cd build_vs

接下来是CMake配置命令,这是整个流程中最容易出错的一步。你需要精确地告诉CMake Protobuf的位置。

cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../install -DNCNN_VULKAN=OFF -DNCNN_API=ON -DNCNN_SHARED_LIB=OFF ^
-DProtobuf_INCLUDE_DIR=D:\Libs\protobuf-3.21.12\install\include ^
-DProtobuf_LIBRARIES=D:\Libs\protobuf-3.21.12\install\lib\libprotobuf.lib ^
-DProtobuf_PROTOC_EXECUTABLE=D:\Libs\protobuf-3.21.12\install\bin\protoc.exe ..

逐行解析关键参数:

  • -DNCNN_VULKAN=OFF:如果你没有Vulkan显卡或不需要GPU加速,先关掉,能极大简化编译。
  • -DNCNN_SHARED_LIB=OFF:编译为静态库(生成.lib文件)。这样你的应用程序最终只需一个exe,无需附带ncnn的dll。
  • -DProtobuf_INCLUDE_DIR:指向你之前编译Protobuf安装目录下的include文件夹。
  • -DProtobuf_LIBRARIES:必须指向具体的.lib文件路径,而不是目录。这是很多教程含糊其辞导致失败的地方。
  • -DProtobuf_PROTOC_EXECUTABLE:指向protoc.exe编译器,NCNN在编译过程中需要用它来编译.proto文件。

如果一切顺利,CMake的输出中应该能看到Found Protobuf: ...以及Found OpenCV: ...的字样。如果报错“Could NOT find Protobuf”,99%的原因是上面三个Protobuf_开头的路径没指对。请再次检查路径是否存在,以及libprotobuf.lib文件是否成功生成。

配置成功后,同样使用nmake和nmake install进行编译和安装。编译时间会比较长,耐心等待。完成后,在D:\Libs\ncnn\install目录下,你会得到NCNN的include头文件和lib静态库文件。

4. Visual Studio项目实战:属性配置与链接器地狱

现在,我们创建一个新的Visual Studio控制台项目,来实际使用编译好的NCNN库。假设项目名为NCNNTest。

4.1 项目属性配置(关键步骤)

右键项目 -> 属性,我们需要配置两个主要部分:“VC++目录”和“链接器”。

1. C/C++ -> 常规 -> 附加包含目录: 这里添加所有依赖库的头文件路径。每行一个。

D:\Libs\ncnn\install\include\ncnn
D:\Libs\opencv\build\include
D:\Libs\protobuf-3.21.12\install\include

2. 链接器 -> 常规 -> 附加库目录: 添加所有.lib文件所在的目录。

D:\Libs\ncnn\install\lib
D:\Libs\opencv\build\x64\vc16\lib
D:\Libs\protobuf-3.21.12\install\lib

3. 链接器 -> 输入 -> 附加依赖项: 手动输入需要链接的库文件名。这是另一个大坑点,库的顺序和名称必须正确。

ncnn.lib
opencv_world480.lib
libprotobuf.lib

提示:opencv_world480.lib中的“480”对应OpenCV 4.8.0版本,请根据你实际下载的版本修改。使用opencv_world版本(一个lib包含所有模块)比链接十几个单独的opencv_core.lib、opencv_imgproc.lib要方便得多。

4. 运行时库设置(避免冲突): 确保你的项目属性 C/C++ -> 代码生成 -> 运行时库 设置与之前编译Protobuf和NCNN时保持一致。如果你之前编译Protobuf时使用了-Dprotobuf_MSVC_STATIC_RUNTIME=ON,那么这里应该选择 “多线程(/MT)” (Release)或 “多线程调试(/MTd)” (Debug)。不一致会导致链接错误 LNK2038 或 LNK2005。

4.2 一个简单的验证程序

将以下代码粘贴到你的main.cpp中,它不执行复杂推理,只测试库是否能被正确链接和初始化。

#include <iostream>
#include <ncnn/net.h>
#include <opencv2/core.hpp>

int main() {
    std::cout << "Testing NCNN and OpenCV linkage..." << std::endl;

    // 测试NCNN:创建一个空的网络
    ncnn::Net net;
    std::cout << "NCNN Net object created successfully." << std::endl;

    // 测试OpenCV:创建一个简单的矩阵
    cv::Mat testMat = cv::Mat::zeros(100, 100, CV_8UC1);
    std::cout << "OpenCV Mat created with size: " << testMat.rows << "x" << testMat.cols << std::endl;

    // 测试Protobuf间接链接:如果链接成功,程序应能正常启动
    std::cout << "All libraries linked successfully! Basic environment is ready." << std::endl;

    return 0;
}

尝试编译并运行。如果成功输出所有信息,恭喜你,最艰难的环境配置部分已经完成。如果出现“无法打开ncnn.lib”或“找不到cv::Mat符号”等链接错误,请回头仔细检查附加库目录和附加依赖项的路径和文件名,一个字符都不能错。

5. 模型转换与部署:从ONNX到NCNN的实操细节

环境搭好了,接下来是把训练好的模型用起来。我们以PyTorch -> ONNX -> NCNN的经典路线为例。

5.1 模型转换流程中的常见“坑点”

1. PyTorch导出ONNX时的动态轴问题: 如果你的模型输入维度是动态的(例如[-1, 3, 224, 224]),在导出ONNX时需要使用dynamic_axes参数明确指定。但NCNN对动态维度的支持有限,尤其是批处理维度(batch size)。一个更稳妥的做法是,在导出时固定所有维度。

import torch
# ... 加载你的模型 model ...
dummy_input = torch.randn(1, 3, 224, 224) # 固定为 batch=1
torch.onnx.export(model, dummy_input, "model_fixed.onnx",
                  input_names=["input"],
                  output_names=["output"],
                  opset_version=11) # 使用较稳定的opset版本

2. ONNX Simplifier不是万能的: 使用onnx-simplifier简化模型是必要步骤,可以消除很多冗余算子。但有时简化后的模型反而会出错。我的经验是:

  • 保存简化前后的两个ONNX文件。
  • 使用Netron可视化工具分别打开,检查结构变化是否合理。
  • 如果简化后出错,尝试不简化直接转换,或者检查原始PyTorch模型是否有不支持的算子。

3. onnx2ncnn转换失败怎么办? 转换工具onnx2ncnn位于你编译的NCNN安装目录的bin文件夹下(如D:\Libs\ncnn\install\bin)。常见的失败原因和解决思路如下表所示:

错误信息/现象可能原因解决方案
Unsupported slice step !ONNX模型中包含了NCNN不支持的Slice操作参数尝试在PyTorch导出ONNX前,用torch.nn.functional.interpolate替换torch.nn.Upsample,或调整切片逻辑
Unsupported schema version!ONNX算子集版本过高在torch.onnx.export中降低opset_version(如从13降到11)
转换成功但推理结果异常输入/输出节点名称不匹配用Netron查看ONNX模型的输入输出层名称,在C++推理代码中确保使用完全相同的名称
直接崩溃或无输出模型中包含NCNN完全不支持的算子(如GridSample)考虑修改模型结构,或用其他算子替代。可查阅NCNN的src/layer目录了解支持的算子列表

5.2 编写健壮的推理代码

拿到转换成功的.param和.bin文件后,编写C++推理代码。除了基本的加载和推理,以下几点能极大提升代码的健壮性:

1. 输入预处理标准化: OpenCV读取的图像数据(cv::Mat)与模型训练时的预处理必须完全一致。这包括颜色通道顺序(BGR vs RGB)、归一化(除以255,减均值,除标准差)、图像尺寸缩放算法(cv::INTER_LINEAR vs cv::INTER_NEAREST)。最好将预处理步骤封装成一个函数。

ncnn::Mat preprocess(const cv::Mat& bgr_img, int target_w, int target_h, const float mean[3], const float norm[3]) {
    cv::Mat resized;
    cv::resize(bgr_img, resized, cv::Size(target_w, target_h));
    // BGR -> RGB 转换
    cv::cvtColor(resized, resized, cv::COLOR_BGR2RGB);
    // 转换为32F并归一化
    resized.convertTo(resized, CV_32FC3, 1.0 / 255.0);
    // 减均值,除标准差
    std::vector<cv::Mat> channels(3);
    cv::split(resized, channels);
    for (int c = 0; c < 3; c++) {
        channels[c] = (channels[c] - mean[c]) * norm[c];
    }
    cv::merge(channels, resized);
    // 转换为NCNN Mat (HWC -> CHW)
    ncnn::Mat in = ncnn::Mat::from_pixels(resized.ptr<float>(), ncnn::Mat::PIXEL_RGB, target_w, target_h);
    // 注意:from_pixels得到的仍是HWC格式,某些模型需要CHW格式,需用permute转换
    // ncnn::Mat in_permuted;
    // ncnn::convert_packing(in, in_permuted, 1); // HWC -> CHW
    // return in_permuted;
    return in;
}

2. 错误处理与日志: 不要假设每一步都能成功。检查文件是否存在、模型加载是否成功、输入输出维度是否匹配。

ncnn::Net net;
int ret_param = net.load_param("model.param");
int ret_bin = net.load_model("model.bin");
if (ret_param != 0 || ret_bin != 0) {
    std::cerr << "Failed to load model. param error: " << ret_param << ", bin error: " << ret_bin << std::endl;
    // 可以在这里尝试加载加密后的 .param.bin 文件
    // net.load_param_bin("model.param.bin");
    return -1;
}

3. 性能调优:

  • 设置线程数:ncnn::Option opt; opt.num_threads = 4; net.opt = opt; 根据你的CPU核心数调整。
  • 使用ncnnoptimize:转换后的模型可以用ncnnoptimize进行图优化和内存优化,通常能提升推理速度。
  • 内存池:对于需要连续处理多帧的场景,可以创建并复用ncnn::Extractor和ncnn::Mat对象,减少内存分配开销。

配置NCNN环境像是一场修行,每一个错误信息都是通往精通的阶梯。我最深的体会是,在Windows上,路径的纯洁性(无空格、无中文)和版本的一致性(编译器、运行时库)是避免玄学问题的基石。当你被一个链接错误折磨得焦头烂额时,不妨新建一个最简单的控制台项目,只链接一个库,从最小化系统开始验证,往往能更快地定位问题根源。

保姆级在windows环境下部署NCNN环境 这篇文章主要是学习了NCNN,成功安装部署成功,也有踩到一些小坑,这里写出来分享给大家一起探讨。 阅读详情

相关推荐

(一)ncnn | Windows(VS2022)编译实战与避坑指南

本文详细介绍了在Windows平台使用VS2022编译ncnn框架的完整流程与避坑指南。从环境配置、依赖项编译到实战操作,特别针对VS2022工具链的兼容性问题提供解决方案,帮助开发者高效完成ncnn部署,提升AI模型推理性能。

weixin_27741699的博客 286

NCNN简介

ncnn是C++开发者做端侧AI的神兵利器,在速度、体积、内存、依赖上全面领先,尤其适合嵌入式、工业、移动端等高要求场景。如果你做嵌入式AI创业,ncnn几乎是必选项。需要我给你一份ncnn C++工程模板(含CMake配置、模型转换脚本、INT8量化示例与Vulkan加速代码)吗?

曾大强博客 725

Windows 10/11下,手把手教你用VS2019编译ncnn并转换ONNX模型(含protobuf配置避坑)

本文详细介绍了在Windows 10/11系统下使用VS2019编译ncnn框架并转换ONNX模型的完整流程,特别针对protobuf配置等常见问题提供解决方案。通过手把手教程,帮助开发者掌握模型转换与部署的关键技术,实现高效的移动端AI应用开发。

weixin_30832143的博客 437

将 ncnn 集成到自有项目:CMake 与手工链接全指南

> 本指南以 [use-ncnn-with-own-project.md](https://link.gitcode.com/i/7053f02635c43f0cf690227f217a4a8b) 为核心,讲解在完成 ncnn 构建后,如何将编译生成的 ncnn 库集成进你自己的 C/C++ 项目。读完本文,你将掌握两种主流集成方式:**通过 `find_package(ncnn)` 的 CMak

gitblog_00936的博客 959

部署yolov10的ncnn模型到android源码+模型+项目说明.zip

部署yolov10的ncnn模型到android源码+模型+项目说明.zip 部署yolov10的ncnn模型到android源码+模型+项目说明.zip 部署yolov10的ncnn模型到android源码+模型+项目说明.zip 部署yolov10的ncnn模型到android源码+模型+项目说明.zip 部署yolov10的ncnn模型到android源码+模型+项目说明.zip

CNN架构设计解析[可运行源码]

本文详细探讨了卷积神经网络(CNN)的架构设计及其在图像分类中的应用。首先介绍了CNN的基本概念,指出其专门用于处理影像数据,并通过图像分类的例子说明如何将三维Tensor作为输入。文章进一步讨论了Neuron Version Story,强调了侦测重要patterns和参数共享的重要性,以减少参数数量并避免过拟合。此外,还介绍了Filter Version Story,讲解了CNN的整体架构,包括卷积层、池化层和全连接层的作用及参数设置。最后,文章提到Pooling操作和CNN对缩放和旋转的不变性,建议通过数据增强来提升模型性能。

从训练到上架:手把手教你用NCNN在安卓上部署YOLOv11(附完整代码与避坑指南)

本文详细介绍了如何使用NCNN框架在安卓设备上部署YOLOv11目标检测模型的全流程,包括环境配置、模型训练、NCNN转换、安卓工程集成及性能优化。特别提供了针对移动端部署的完整代码和常见问题解决方案,帮助开发者高效实现实时目标检测应用。

weixin_33738555的博客 421

YOLOv C推理使用多个frameworks_ncnn、OpenVINO、MNN、ONNXRuntime和OpenCV

YOLOv C推理使用多个frameworks_ncnn、OpenVINO、MNN、ONNXRuntime和OpenCV实现。_YOLOv5 C++ inference implemented using multiple frameworks_ ncnn, OpenVINO, MNN, ONNXRuntime, and OpenCV..zip

CNN - nn.Conv1d使用

CNN - nn.Conv1d使用一、Conv1d 参数设定二、Conv1d 输入输出以及卷积核维度三、Conv1d 计算过程1. 测试一:in_channels=1, out_channels=12. 测试二:in_channels=1, out_channels=23. 测试三:in_channels=8, out_channels=13. 测试三:in_channels=8, out_channels=2四、Conv1d 在文本中的应用 -- TextCNN 一、Conv1d 参数设定 torch

xu624735206的博客 3万+

【SAP-MDG】工作流任务配置实战:从基础配置到代理分配详解

本文详细解析了SAP MDG工作流任务配置的全流程,从基础配置到代理分配的关键操作。通过实战案例和最佳实践,帮助用户掌握Configure Workflow Tasks的核心技巧,包括环境检查、代理分配、SWDD事务码使用及常见问题排查,提升主数据管理效率。

weixin_33738555的博客 249

SAP生产版本导入避坑大全:从‘黄灯’到‘绿灯’,详解CM_FV_MKAL_CONSISTENCY_CHECK检查函数

本文深入解析SAP生产版本导入过程中的常见问题,特别是通过`CM_FV_MKAL_CONSISTENCY_CHECK`检查函数从‘黄灯’异常到‘绿灯’正常的修复方法。涵盖静态与动态校验机制、典型异常场景诊断及批量导入最佳实践,帮助SAP运维人员高效解决生产版本管理难题。

weixin_30568591的博客 387

Windows下ncnn环境配置(VS2019)

一、下载VS2019并安装 1、下载地址:https://visualstudio.microsoft.com/zh-hans/vs/ 2、下载后安装工作负载(安装以下三个即可) 3、如果发现忘记下载某一个工作负载,可以再安装完成之后在重新安装(VS导航栏的工具->获取工具和功能) 二、下载并安装cmake-3.16.5 1...

qq_36890370的博客 3万+

KUKA-外部自动运行模板程序——个人设计模式&思路

用于说明KUKA与西门子PLC外部自动交互模板的设计思路与使用流程

qq_39024187的博客 5613

(一)ncnn | Windows10 + VS2019环境配置

ncnn | Windows10 + VS2019环境配置

Skies_的博客 6895

黑群晖断电后存储池‘已损毁’?别慌,SSH里这几条命令能救急

本文详细解析黑群晖断电后存储池显示‘已损毁’的紧急修复方法。通过SSH命令行工具,提供从诊断到修复的完整流程,包括RAID阵列重新组装、设备重建等关键步骤,帮助用户恢复数据访问。适用于因意外断电导致的存储池异常情况。

weixin_42651748的博客 375

一文读懂无人机AI识别算法,原理、技术、应用

本文详细介绍了无人机识别算法的工作原理、技术优势以及在多个行业的应用前景,展现了其在提升安全监控、资源管理和应急响应中的关键作用。尽管无人机识别算法在多个领域展现出巨大潜力,但仍面临技术挑战,如算法的准确性、数据的实时处理能力以及对复杂环境的适应性。4. 消防与城市管理: 无人机识别算法在消防和城市管理中的应用,为相关部门提供了及时的信息支持,提升了应急处置能力和城市管理水平。1. 公安监控: 无人机识别算法在公安领域的应用,可以实时识别犯罪嫌疑人和违法行为,有效提升城市治安管理的智能化水平。

foiadrone的博客 1849

(一)ncnn | Windows(VS2019)编译

文章目录ncnn | Windows10 环境下ncnn-vs2019编译|yolov5 example运行一、ncnn简介二、Windows10环境下ncnn-vs2019编译1、Visual Studio 2019 安装2、安装Cmake 3.19.23、安装Opencv 3.4.104、编译protobuf 3.4.05、安装VulkanSDK 1.2.148.06、编译ncnn框架-ncnn-full-source三、vs2019运行yolov5 example1、在vs2019上导入vulkan包

qq_40231159的博客 6914

在 SAP 里玩转 FTP:标准程序 RSFTP00x 全景解析与落地实践

摘要:SAP系统通过封装的标准FTP程序(RSFTP001-008)提供便捷的文件传输能力,适用于各类集成场景。关键点包括:1)依赖SAPFTP可执行程序和RFC目的地;2)使用RSFTP005进行前置检查并生成RFC配置;3)标准报表各司其职,如RSFTP002用于命令测试、RSFTP007/008提供参考实现;4)开发时组合FTP_CONNECT/COMMAND/DISCONNECT等函数模块。特别注意前台(SAPFTP)与后台(SAPFTPA)的环境差异,这是常见故障点。该方案通过标准化工具链显著降低

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 210

Windows下NCNN环境配置(VS2019)

Windows下ncnn环境配置(VS2019)

yohnyang的博客 2883

Carla中如何渲染opendrive车道线和车道标识(全网独家,附代码)

carla是可以单独加载opendrive并渲染路面的,但是无法把车道线渲染出来,这是一个大坑,因为没有车道线就无法给感知输入。楼主已经实现,直接渲染车道线或者带PBR贴图的车道标识。实现起来非常简单,但必须对carla源码以及ue的开发足够了解。在carla源码中有一个很重要的类opendrivegenerator,它是关于opendrive渲染的全部方法,但是你是找不到它实例化的地方的,因为它被定义在蓝图关卡中。网上包括carla官方关于carla源码的分析少之又少,楼主将自己的经验写出来供大家参考。

u013998156的博客 1090

SPV1050低功耗微功率太阳能充电管理模块原理图设计,已量产

在物联网应用快速普及的今天,户外低功耗传感器(如土壤温湿度、环境光照、无线节点等)的供电始终是行业痛点 —— 传统锂电池不仅需要定期更换,维护成本高,还难以满足 “终身免维护” 的场景需求。为此,我们设计了一款专为 1V~3V 低电压小型太阳能板优化的微功率太阳能电源管理模块,结合 USB 备用充电路径,实现了低功耗传感器的长期自主供电。

不脱发的程序猿 446

windows上部署NCNN

在”x64 Native Tools Command Prompt for VS 2022“终端cd到ncnn解压后的目标,输入如下命令。NCNN也是下载源码自己构建。git clone最新的可能有编译问题,可以下载release版本的源码。并cd到解压后的protobuf-3.21.12目录下,并输入如下命令完成protobuf的构建。protobuf需要下载源码自己构建,这里选择的是3.21.12版本。在visual studio中编写如下代码,并运行。下载如下红框框选的版本,将源码解压到本地。

xiaozhu_daidai的博客 1437

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

NCNN环境部署及yolov5pt转ncnn模型转换推理

直接下载发行版本的完整代码,然后解压,用以下命令编译,自行替换Protobuf的编译路径,其中DNCNN_VULKAN=ON表示不使用Vunlkan加速。yolov5s v6.2训练的pt模型,直接导tourchscript,然后时候ncnn里面的pnnx工具直接转换为ncnn。1.安装vunlkan 1.2.198.1版本,记得配置环境变量。2.安装Protobuf3.20.0版本。该内容还未完整,笔记内容,后期补充。

小星博博的博客 2693

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

NCNN cmake VS2017 编译

我的电脑配置是windows 10,cmake-3.12.0-win64-x64,VS2017 以下命令行均使用适用于 VS 2017 的 x64 本机工具命令提示 ,可以在开始菜单那搜索到,如下图。 编译安装 protobuf https://github.com/google/protobuf/archive/v3.4.0.zip 下载到 C:/software 解压缩 mk...

图像研究猿的专栏 2449

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Windows 10下NCNN环境部署全攻略:从Vulkan配置到Visual Studio避坑指南

本文详细介绍了在Windows 10系统下部署NCNN环境的完整流程,包括Vulkan配置、Visual Studio项目设置及常见问题解决方案。通过逐步指导,帮助开发者高效完成深度学习模型部署,特别针对NCNN框架在Windows平台下的特殊需求提供了实用技巧和性能优化建议。

weixin_28840591的博客 271

VS2015搭建NCNN开发环境

一、简介 NCNN的编译依赖OpenCV和Protobuf,所以需要总共需要安装三个东西。 二、安装OpenCV 1、下载OpenCVReleases - OpenCV 一般选择最新版,这里以3.4.16为例。 2、选择喜欢的目录安装,这里以E:/soft-setup为例,安装之后生成下面几个文件。 3、添加path(vs2015对应:E:\soft-setup\opencv\build\x64\vc14\bin;vs2017对应:E:\soft-setup\opencv\buil...

xian0710830114的专栏 1357
上一篇: 2023最新版:用夜神模拟器安卓7抓微信小程序数据包(含开发者模式开启教程)
下一篇: 晶闸管控制技巧:单相半波整流电路的相位控制深度剖析
随身带U盘
博客等级 码龄4年 30粉丝 1526原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值