小工具知识网

当前位置: 首页 > 行业知识 > 安卓调用onnx模型并计算

行业知识

安卓调用onnx模型并计算

2026-11-03 12:43:26 来源:互联网转载

安卓平台可以通过调用onnx模型来进行计算,这为移动设备提供了更多的计算能力和应用场景。通过使用onnx模型,安卓设备可以进行复杂的计算任务,例如图像识别、语音识别等。这为移动应用的功能和性能提升提供了新的可能性。同时,开发者可以利用onnx模型来开发更加智能和高效的安卓应用,为用户提供更好的体验。总的来说,安卓调用onnx模型并进行计算的能力为移动设备的发展带来了新的机遇和挑战。

 

依赖

build.gradle

plugins {    id 'com.android.application'}repositories {    jcenter()    maven {        url "https://oss.sonatype.org/content/repositories/snapshots"    }}android {    signingConfigs {        release {            storeFile file('myapp.keystore')            storePassword '123456'            keyAlias 'myapp'            keyPassword '123456'        }    }    packagingOptions {        pickFirst 'lib/arm64-v8a/libc++_shared.so'    }    configurations {        extractForNativeBuild    }    compileSdkVersion 28    buildToolsVersion "30.0.3"    defaultConfig {        applicationId "com.mobvoi.myapp"        minSdkVersion 21        targetSdkVersion 28        versionCode 1        versionName "1.0"        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"        externalNativeBuild {            cmake {                targets "myapp", "decoder_main"                cppFlags "-std=c++11", "-DC10_USE_GLOG", "-DC10_USE_MINIMAL_GLOG", "-DANDROID", "-Wno-c++11-narrowing", "-fexceptions"            }        }        ndkVersion '21.3.6528147'        ndk {            abiFilters 'arm64-v8a'        }    }    buildTypes {        release {            minifyEnabled false            signingConfig signingConfigs.release            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'        }    }    externalNativeBuild {        cmake {            path "src/main/cpp/CMakeLists.txt"        }    }    compileOptions {        sourceCompatibility JavaVersion.VERSION_1_8        targetCompatibility JavaVersion.VERSION_1_8    }    ndkVersion '21.3.6528147'}dependencies {    implementation 'androidx.appcompat:appcompat:1.2.0'    implementation 'com.google.android.material:material:1.2.1'    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'    testImplementation 'junit:junit:4.+'    androidTestImplementation 'androidx.test.ext:junit:1.1.2'    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'    implementation 'org.pytorch:pytorch_android:1.10.0'    extractForNativeBuild 'org.pytorch:pytorch_android:1.10.0'    implementation group: 'com.microsoft.onnxruntime', name: 'onnxruntime-android', version: '1.15.1'}task extractAARForNativeBuild {    doLast {        configurations.extractForNativeBuild.files.each {            def file = it.absoluteFile            copy {                from zipTree(file)                into "$buildDir/$file.name"                include "headers/**"                include "jni/**"            }        }    }}tasks.whenTaskAdded { task ->    if (task.name.contains('externalNativeBuild')) {        task.dependsOn(extractAARForNativeBuild)    }}

准备好onnx放在assert目录下

api介绍

地址

api文档https://javadoc.io/doc/com.microsoft.onnxruntime/onnxruntime/latest/index.html

常用的api

api作用
OrtEnvironment.getEnvironment()
创建onnx上下文的运行环境
new OrtSession.SessionOptions()
创建会话(配置)
environment.createSession(bytes, options)
创建会话,第一个参数是模型数据,第二个是配置的参数
LongBuffer.wrap(inputValues)
将输入转换成onnx识别的输入,输入是模型识别的数据
OnnxTensor.createTensor(environment, wrap, new long[]{1, inputValues.length})
创建tensor,第一个参数是上面定义的环境,第二个参数是输入转换成模型的格式,第三个根据实际设置,为入参的矩阵格式
session.run(map)
推理,map是整合起来的数据
(long[][]) output.get(1).getValue()
获取推理结果,这里以二维数组为例

使用案例

private String getOnnx(String text) {        OrtEnvironment environment = OrtEnvironment.getEnvironment();        AssetManager assetManager = getAssets();        try {            // 创建会话            OrtSession.SessionOptions options = new OrtSession.SessionOptions();            // 读取模型            InputStream stream = assetManager.open("youonnx.onnx");            ByteArrayOutputStream byteStream = new ByteArrayOutputStream();            byte[] buffer = new byte[4096];            int bytesRead;            while ((bytesRead = stream.read(buffer)) != -1) {                byteStream.write(buffer, 0, bytesRead);            }            byteStream.flush();            byte[] bytes = byteStream.toByteArray();            OrtSession session = environment.createSession(bytes, options);            String vocab = "vocab";            String puncVocab = "punc_vocab";            Map vocabMap = getFormFile(vocab, new String[]{"", ""});            Map puncVocabMap = getFormFile(vocab, new String[]{" "});            DataSet.NoPuncTextDataset dataset = new DataSet.NoPuncTextDataset(vocabMap, puncVocabMap);            List list = dataset.word2seq(text);            // 准备输入数据            long[] inputValues = new long[list.size()];            for (int i = 0; i  

通过调用此函数,可以实现安卓调用onnx

上一篇:卡崩服务器怎么用?

下一篇:黑马程序员前端 Vue3 小兔鲜电商项目——(一)初始化项目