高通骁龙snpe 编译配置运行

本文档详细介绍了在Ubuntu 16.04上配置高通骁龙SNPE SDK的步骤,包括编译Caffe、安装Python 3.5和TensorFlow的miniconda环境,以及解决在编译过程中遇到的各种错误,如找不到cblas.h、lmdb.h、hdf5.h、opencv相关头文件和numpy数组对象等问题。同时提供了SDK下载链接、官方文档和优快云教程等资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请注明出处:https://blog.youkuaiyun.com/qq_27262241/article/details/110930325
I’ll make a Snpe Docker Image to fuck the shit compile process.

硬件准备

  • 笔记本电脑: 安装ubuntu16.04
  • 手机:搭载高通骁龙处理器
  • usb线

安装

不踩坑指南: 要先装caffe, 再装python虚拟环境 最后装 TensorFlow,否则protocol会冲突

1 编译caffe

参考链接

准备

#下载
git clone https://github.com/BVLC/caffe.git
# 安装依赖
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libatlas-base-dev

还要安装:


apt-get install libgflags-dev 
sudo apt-get install libgoogle-glog-dev

修改编译选项

cd <caffe目录>
cp Makefile.config.example Makefile.config

在caffe目录下,修改 Makefile.config

#给INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include添加   /usr/include/hdf5/serial
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial

#给 LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib 添加  /usr/lib/x86_64-linux-gnu/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial


#中把 CPU_ONLY=1行取消注释。
CPU_ONLY=1

修改Makefile

LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5
# 改为
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial

编译运行

make all # 这一步骤会出现很多错误,参考文末,caffe错误总结
make test 
make runtest
make distribute
make pycaffe

2 安装python3.5+tensorflow

安装miniconda

先下载 ubuntu64位 https://repo.anaconda.com/miniconda/Miniconda2-latest-Linux-x86_64.sh

然后运行 bash *.sh

更换conda源

更换清华源

show_channel_urls: true
channel_alias: https://mirrors.tuna.tsinghua.edu.cn/anaconda
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/

安装python3.5虚拟环境

conda create -n py35 python=3.5

激活虚拟环境

co
<think>好的,我现在需要回答用户关于如何使用C++进行DLC模型推理的问题。首先,我需要理解DLC模型是什么。DLC是Deep Learning Container的缩写吗?或者可能是指特定的框架模型格式?比如,高通的SNPE使用DLC(Deep Learning Container)作为模型格式,对吗?根据用户提供的引用[2]中提到SNPE教程,用户可能指的是高通的DLC格式。所以需要围绕SNPE的DLC模型推理来回答。 接下来,用户需要C++的教程或API使用方法。引用[2]中的资料提到了SNPE_Tutorial,其中使用C++进行模型转换、量化和推理。我应该整理使用SNPE的C++ API进行推理的步骤。 第一步,准备DLC模型。用户需要将训练好的模型转换成DLC格式,可能使用SNPE提供的工具,比如snpe-tensorflow-to-dlc或snpe-onnx-to-dlc,这取决于原始模型格式。例如,用户提到的YoloV5S和ONNX模型转换,可能需要相应的转换命令。 第二步,设置开发环境。引用[2]提到正确设置开发环境是关键,需要安装SNPE SDK,并配置C++编译环境,比如设置库路径和头文件路径。可能还需要特定的骁龙平台依赖项。 第三步,加载DLC模型。在C++代码中,使用SNPE的API,如snpeBuilder从文件加载DLC模型。需要创建SNPE实例,设置运行时(CPU、GPU、DSP等)。 第四步,准备输入数据。用户需要将输入数据转换为SNPE接受的格式,比如通过OpenCV读取图像,调整大小,归一化,并转换为SNPE的ITensor或用户内存。 第五步,执行推理。使用SNPE的execute方法,传入输入数据,获取输出结果。注意输入输出张量的名称匹配。 第六步,处理输出结果。根据模型类型,如YOLOv5,进行后处理,如解析边界框、置信度、非极大值抑制等。 第七步,资源释放。确保释放SNPE实例和相关资源,防止内存泄漏。 过程中需要参考SNPE的官方文档,特别是C++ API部分。引用[2]中的教程可能提供了示例代码,但用户需要自己编写和调试。此外,可能遇到的注意事项包括环境配置、模型兼容性、输入输出格式的正确性,以及不同运行时(如DSP)需要的量化步骤。 用户可能还会遇到性能优化的问题,比如使用GPU或DSP加速,模型量化以减少模型大小和提升推理速度。引用[1]提到模型转换和生成C++代码,可能相关,但这里主要关注SNPE的流程。 需要确保步骤清晰,结构合理,并引用提供的参考资料,特别是引用[2]中的SNPE教程。最后生成相关问题,帮助用户深入理解。</think>以下是使用C++进行DLC模型推理的步骤说明(以高通SNPE框架为例): ### 1. 环境准备 - **安装SNPE SDK** 从高通开发者平台下载SNPE SDK,配置环境变量`SNPE_ROOT`指向SDK路径,并确保包含C++库目录(如`$SNPE_ROOT/lib`)[^2]。 - **依赖项安装** 安装OpenCV(用于图像处理)、C++编译工具链(如g++)和骁龙平台驱动(若需使用DSP/GPU加速)。 ### 2. 模型转换至DLC格式 使用SNPE提供的转换工具将预训练模型(如ONNX、TensorFlow)转换为DLC: ```bash snpe-onnx-to-dlc --input_model yolov5s.onnx --output_path yolov5s.dlc ``` 若需量化模型,需添加校准数据: ```bash snpe-dlc-quantize --input_dlc yolov5s.dlc --output_dlc yolov5s_quantized.dlc --input_list calibration_data.txt ``` ### 3. C++推理代码实现 #### 步骤1:加载DLC模型 ```cpp #include "SNPE/SNPE.hpp" #include "DlSystem/ITensorFactory.hpp" zdl::DlSystem::Runtime_t runtime = zdl::DlSystem::Runtime_t::GPU; // 选择运行时 std::unique_ptr<zdl::SNPE::SNPE> snpe; snpe = zdl::SNPE::SNPEBuilder() .setOutputLayers({}) .setRuntimeProcessor(runtime) .setModelFromFile("yolov5s_quantized.dlc") .build(); ``` #### 步骤2:准备输入数据 ```cpp // 使用OpenCV读取图像并预处理 cv::Mat image = cv::imread("input.jpg"); cv::resize(image, image, cv::Size(640, 640)); // YOLOv5输入尺寸 image.convertTo(image, CV_32F, 1.0/255.0); // 归一化 // 转换为SNPE输入格式 auto inputTensor = zdl::SNPE::ITensorFactory::getInstance().createTensor( snpe->getInputDimensions(), image.data ); ``` #### 步骤3:执行推理 ```cpp zdl::DlSystem::TensorMap outputTensorMap; snpe->execute(inputTensor.get(), outputTensorMap); ``` #### 步骤4:解析输出 ```cpp // 获取输出张量 auto outputTensor = outputTensorMap.getTensor("output_layer_name"); float* outputData = reinterpret_cast<float*>(&(*outputTensor->begin())); // YOLOv5后处理(示例) for (int i = 0; i < num_detections; i++) { float confidence = outputData[i*6 + 4]; if (confidence > 0.5) { // 提取边界框坐标和类别 int x1 = outputData[i*6] * image.cols; int y1 = outputData[i*6 + 1] * image.rows; // ... 绘制检测框 } } ``` ### 4. 编译部署 使用CMake链接SNPE库: ```cmake find_package(OpenCV REQUIRED) include_directories(${SNPE_ROOT}/include) target_link_libraries(your_project snpe ${OpenCV_LIBS}) ``` ### 注意事项 1. **运行时选择**:DSP运行时需量化模型,且需签名文件。 2. **内存管理**:SNPE的ITensor需手动释放,避免内存泄漏。 3. **性能优化**:通过`setPerformanceProfile(zdl::DlSystem::PerformanceProfile_t::BURST)`提升实时性。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值