美国高通 Snapdragon Neural Processing Engine SDK (SNPE) 系列 (1):用户自定义层JNI实现

本文介绍了如何利用高通Snapdragon Neural Processing Engine (SNPE) SDK进行深度学习模型的转换和执行。在遇到SNPE原生不支持的自定义层时,通过用户定义层(UDL)功能和JNI技术,可以在Android平台上实现自定义神经网络算子。文章提供了一个JNI骨架代码示例,帮助开发者理解和应用这一技术。
摘要由CSDN通过智能技术生成

            Snapdragon Neural Processing Engine SDK是美国高通公司出品的神经网络处理引擎(SNPE),可运行于搭载了高通Zeroth机器智能平台的820芯片处理器,开发者可以在SNPE上搭建自己的深度学习网络模型。更详细的介绍可以登录高通SNPE相关网页了解:https://developer.qualcomm.com/software/snapdragon-neural-processing-engine 。介绍到此为止。

        最近在用snpe做一个项目,将tensorflow的pb模型转为snpe的dlc模型,并利用snpe将模型运行在骁龙GPU上。但不得不说,snpe目前做的还不是非常完美,有些需要定制化的神经网络层可能在原生snpe中没有提供。但还好高通提供了用户定义层(UDL)功能,通过回调函数可以自定义算子,并通过重编译C++代码将自定义文件编译到可执行文件中。如果开发就是使用的C++,那比较容易实现用户定义层,但如果是运行在Android上就比较麻烦了,上层java代码需要通过JNI来调用snpe原生的C++编译好的.so文件,因为用户定义层的代码是不可能预先编译到snpe原生.so文件中的,所以用snpe提供的Java API是无法获得用户定义层的功能的,所以,必须重新开发SNPE的JNI。

        出于涉密考虑,用户定义层的代码我不会展示,只展示JNI的骨架代码,关于用户定义层(UDL)的实现可以参阅SNPE的相关文档。

       Java层的代码

public class SnpeController {

    public enum Runtime {
        CPU,
        GPU,
        DSP
    }

    private int height = 0;  
    private int width = 0;  
    private int channel = 0;  
    private Runtime runtimeMode = Runtime.GPU;  
    private String loggerDir = "";  
    private String modelFilePath = "";  
    private long containerPointer = 0; 
    private long snpePointer = 0; 
    private float[] inputData = null;  
    private int inputLength = 0;  
    private float[] outputData = null;  

    public SnpeController(int imageHeight,
                          int imageWidth,
                          int imageChannel,
                          String modelPath) {
        this(imageHeight, imageWidth, imageChannel, modelPath, Runtime.CPU, "/home/mi/snpe_log_dir/");
    }

    public SnpeController(int imageHeight,
                          int imageWidth,
                          int imageChannel,
                          String modelPath,
                          Runtime runtimeMode,
                          String loggerDir) {
        setImageShape(imageHeight, imageWidth, imageChannel);
        setModelPath(modelPath);
        setRuntime(runtimeMode);
        setLoggerDir(loggerDir);
    }

    public void setImageShape(int height,
                              int width,
                              int channel){
        this.height = height;
        this.width = width;
        this.channel = channel;
    }

    public void setModelPath(String modelPath){
        modelFilePath = modelPath;
    }

    public void setRuntime(Runtime runtime){
        runtimeMode &
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值