安卓调用onnx模型并计算

news2024/11/27 2:47:55

安卓平台可以通过调用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文档icon-default.png?t=N7T8https://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<String, Integer> vocabMap = getFormFile(vocab, new String[]{"<UNK>", "<END>"});
            Map<String, Integer> puncVocabMap = getFormFile(vocab, new String[]{" "});

            DataSet.NoPuncTextDataset dataset = new DataSet.NoPuncTextDataset(vocabMap, puncVocabMap);

            List<Integer> list = dataset.word2seq(text);

            // 准备输入数据
            long[] inputValues = new long[list.size()];
            for (int i = 0; i < list.size(); i++) {
                inputValues[i] = list.get(i);
            }

            LongBuffer wrap = LongBuffer.wrap(inputValues);
            OnnxTensor inputTensor = OnnxTensor.createTensor(environment, wrap, new long[]{1, inputValues.length});

            long[] len = new long[]{inputValues.length};
            LongBuffer wrap2 = LongBuffer.wrap(len);
            OnnxTensor inputTensor_len = OnnxTensor.createTensor(environment, wrap2, new long[]{1});
            // 准备数据
            Map<String, OnnxTensor> map = new HashMap<>();
            map.put("inputs", inputTensor);
            map.put("inputs_len", inputTensor_len);

            // 运行推理
            OrtSession.Result output = session.run(map);

            // 获取输出结果
            long[][] value = (long[][]) output.get(1).getValue();
            // 处理输出结果
            // todo
            session.close();
            return "you_answer"
        } catch (IOException | OrtException e) {
            throw new RuntimeException(e);
        }
    }

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1216758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】吴恩达课程笔记(五)——超参数调试、batch norm、Softmax 回归

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 【吴恩达课程笔记专栏】 【深度学习】吴恩达课程笔记(一)——深度学习概论、神经网络基础 【深度学习】吴恩达课程笔记(二)——浅层神经网络、深层神经网络 【深度学习】吴恩达课程笔记(三)——参数VS超参数、深度…

AI技术如何融合应用于工业物联网

人工智能技术在近年来得到飞跃性地发展&#xff0c;在自主识别、分析、判断、规划等功能方面都进步显著&#xff0c;也已经应用于越来越多的行业产业。 在工业物联网领域&#xff0c;人工智能也将成为一大助力&#xff0c;通过与工业物联网系统集成融合&#xff0c;能够为工业…

探索arkui(2)--- 布局(列表)--- 1(列表数据的展示)

前端开发布局是指前端开发人员宣布他们开发的新网站或应用程序正式上线的活动。在前端开发布局中&#xff0c;开发人员通常会展示新网站或应用程序的设计、功能和用户体验&#xff0c;并向公众宣传新产品的特点和优势。前端开发布局通常是前端开发领域的重要事件&#xff0c;吸…

JS-项目实战-批量删除水果库存记录

1、fruit.js function $(name) {if (name) {//假设name是 #fruit_tblif (name.startsWith("#")) {name name.substring(1); //fruit_tblreturn document.getElementById(name);} else {return document.getElementsByName(name);}} }//当页面加载完成后执行后面的…

Linux_包管理_apt相关命令的使用

以思维导图的形式整理了下apt相关的命令&#xff0c;便于查阅&#xff0c;主要分为软件源、安装卸载升级、查看&#xff1b; 1、软件源 2、安装、卸载、升级 3、查看 参考链接&#xff1a; Using apt Commands in Linux [Ultimate Guide] 6. apt更新软件源 — 快速使用手册—…

Kettle工具使用小结1

1.背景 客户数据库限定为tidb数据库&#xff0c;相关业务数据均存储在内。因为tidb数据库是分布式的&#xff0c;且不支持存储过程、job等功能&#xff0c;需要通过外部工具进行脚本批量处理&#xff0c;所以这里引入kettle进行脚本批量执行和作业调度。 2.环境信息 &#xf…

电影《惊奇队长2》观后感

上周看完了电影《惊奇队长2》&#xff0c;可能是最近国片看多了&#xff0c;看看国外电影还是感觉非常不错的&#xff0c;其中就有特效部分。目前来说&#xff0c;国内特效和国外还是有一定差距的&#xff0c;在过年时&#xff0c;备受好评的《流浪地球2》据说也是用的国外特效…

【Linux】安全审计-audit

文章目录 一、audit简介二、启auditd服务三、相关文件四、审计规则五、审计日志查询及分析 参考文章&#xff1a; 1、【安全】linux audit审计使用入门 2、audit详细使用配置 写在前面&#xff1a; 1.写博客&#xff0c;做日常工作记录&#xff0c;好记性不如烂笔头嘛&#x…

【AI视野·今日Sound 声学论文速览 第三十三期】Wed, 25 Oct 2023

AI视野今日CS.Sound 声学论文速览 Wed, 25 Oct 2023 Totally 8 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers CDSD: Chinese Dysarthria Speech Database Authors Mengyi Sun, Ming Gao, Xinchen Kang, Shiru Wang, Jun Du, Dengfeng Yao, Su Jing W…

Notepad++ 和正则表达式 只保留自己想要的内容

一、需求 如下文本&#xff0c;三段相同结构的数据&#xff0c;想要获取每段结构中‘重复的Ids ’后面的数字 2023-10-26 18:49:49 重复的Ids 26443,26575 要删除的Ids 4174,4199,4200,55502023-10-26 18:49:49 重复的Ids 26436,26443,26575 要删除的Ids 4166,4199,4200,5550…

WEB 自动化神器 TestCafe(一)—安装和入门篇

今天小编给大家带来WEB 自动化神器 TestCafe(一) —安装和入门篇 一、TestCafe 介绍&#xff1a; TestCafe 是一款基于 Node.js 的端到端 Web 自动化测试框架&#xff0c;支持 TypeScript 或 JavaScript 来编写测试用例&#xff0c;运行用例&#xff0c;并生成自动化测试报告。…

软件外包开发文档工具

有许多工具可用于生成和管理软件开发文档。这些工具可以帮助团队更有效地协作、记录和维护文档。以下是一些常用的软件开发文档生成工具&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 Javadoc&#…

ESP8266跟ESP-01S区别

看到了吧&#xff1a;ESP8266是一个芯片&#xff1b;ESP8266芯片是由外国的乐鑫公司生产的 ESP8266 Wi-Fi SoC | Espressif Systems ESP-01包含了ESP8266芯片&#xff0c;并且有一些外围电路&#xff0c;这个模块&#xff08;不是芯片&#xff09;是由中国的安可信公司生产的。…

2023最新软件测试20个基础面试题及答案

什么是软件测试&#xff1f; 答案&#xff1a;软件测试是指在预定的环境中运行程序&#xff0c;为了发现软件存在的错误、缺陷以及其他不符合要求的行为的过程。 软件测试的目的是什么&#xff1f; 答案&#xff1a;软件测试的主要目的是保证软件的质量&#xff0c;并尽可能大…

【深度学习实验】网络优化与正则化(六):逐层归一化方法——批量归一化、层归一化、权重归一化、局部响应归一化

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、优化算法0. 导入必要的库1. 随机梯度下降SGD算法a. PyTorch中的SGD优化器b. 使用SGD优化器的前馈神经网络 2.随机梯度下降的改进方法a. 学习率调整b. 梯度估计修正 3. 梯度估计修正&#xff1a;动量法Momen…

linux进程间通信之管道通信

Linux 进程间通信机制分三类&#xff1a;数据交互&#xff0c;同步&#xff0c;信号。理解了这些机制才能灵活运用操作系统提供的 IPC 工具。 一.管道 管道是一种文件形式&#xff0c;是内核的一块缓冲区。匿名管道只能用于具有亲缘关系的进程间通信&#xff0c;命名管道可以用…

C语言对10个数进行排序,使用快速排序算法

完整代码&#xff1a; // 对10个数进行排序&#xff0c;使用快速排序算法 #include<stdio.h>//用第一个元素将待排序序列划分成左右两个部分&#xff0c;返回排序后low的位置&#xff0c;即枢轴的位置 int partition(int arr[],int low,int high){//让待排序序列中的第一…

操作系统OS/存储管理/内存管理/内存管理的主要功能_基本原理_要求

基本概念 内存管理的主要功能/基本原理/要求 **内存管理的主要功能&#xff1a; ** 内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理&#xff0c;使程序员摆脱存储分配的麻烦&#xff0c;提高编程效率。地址转换。在多道程序环境下&#xff0c;程序中的逻辑地…

【Git 全功能解析: 探索版本控制的强大工具】

文章目录 概要集中式版本管理和分布式版本管理Git 基础命令基本流程开发管理 概要 “Git 的历史与现状” Git是Linux的创始人Linus Torvalds的又一力作。在2002年&#xff0c;他在Linux内核的版本控制中使用Bitkeeper&#xff0c;但由于Bitkeeper是一款受版权保护的软件&…

什么是脏读、不可重复读、幻读讲解

数据库隔离级别是数据库管理系统中一个重要的概念&#xff0c;它定义了事务之间的可见性和影响。在多用户并发访问数据库时&#xff0c;隔离级别能够确保事务之间的相互独立性&#xff0c;避免数据不一致的问题。本文将深入探讨三种常见的并发问题&#xff1a;脏读、不可重复读…