安卓调用onnx模型并计算

安卓平台可以通过调用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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32笔记—USART

课外知识插入&#xff1a;STM32单片机extern全局变量_stm32全局变量-CSDN博客 如果你把temple定义在A中&#xff0c;然后让A.h和B.h包含在includes.h中&#xff0c;然后把includes.h放在A.c和B.c中单个编译是没有问题的&#xff0c;但是链接的时候会出现问题&#xff0c; “S…

【【OpenCV实现图像:用OpenCV进行模板匹配】

文章目录 概要整体架构流程图像灰度化结论 概要 模板匹配是一种在图像处理领域广泛应用的技术&#xff0c;旨在寻找目标模板在源图像中的位置。该算法的核心思想是通过比较模板与源图像的局部区域&#xff0c;逐像素滑动&#xff0c;创建一个相似度图&#xff0c;反映了模板与…

AD9371 AGC

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

MHA:故障切换

MHA&#xff1a; masterhight availabulity&#xff1a;基于主库的高可用环境下&#xff1a;主从复制 故障切换 主从的架构。 MHA&#xff1a;最少要一主两从 mysql的单点故障问题&#xff0c;一旦主库崩溃&#xff0c;MHA可以在0-30秒内自动完成故障切换。 工作原理&#…

警方打击了大规模网络钓鱼提供商BulletProftLink

导语 最近&#xff0c;马来西亚皇家警察宣布成功打击了一个名为BulletProftLink的大规模网络钓鱼提供商。这个提供超过300个钓鱼模板的平台被查封&#xff0c;给全球网络安全带来了巨大的利好消息。本文将带您了解这个引人注目的行动背后的故事&#xff0c;并揭示BulletProftLi…

metinfo 6.0.0 任意文件读取漏洞复现

metinfo 6.0.0 任意文件读取漏洞复现 漏洞环境 环境为mrtinfo 6.0.0 漏洞存在的位置 通过代码审计发现在源代码的/app/system/include/module/old_thumb.class.php这个位置有着任意读取文件漏洞 漏洞点:http://127.0.0.1/metinfo_6.0.0//include/thumb.php 漏洞复现 访…

网工内推 | 网工校招,金融、软件行业,HCIE认证优先,最高15薪

01 长威信息科技 招聘岗位&#xff1a;网络工程师&#xff08;24届校招&#xff09; 职责描述&#xff1a; 1、负责网络类、安全类产品的安装部署、调试和运行维护&#xff0c;以及网络故障分析、定位和处理&#xff1b; 2、负责实施项目各类文档编制工作&#xff0c;包括技术…

R语言爬虫程序自动爬取图片并下载

R语言本身并不适合用来爬取数据&#xff0c;它更适合进行统计分析和数据可视化。而Python的requests&#xff0c;BeautifulSoup&#xff0c;Scrapy等库则更适合用来爬取网页数据。如果你想要在R中获取网页内容&#xff0c;你可以使用rvest包。 以下是一个简单的使用rvest包爬取…

软考架构师学习心得和资料分享

23年11月的软考架构师终于考完了&#xff0c;相信很多朋友都觉得这次考试的内容有点难&#xff0c;我是从9月份报名后才开始准备的&#xff0c;一边工作一边学习确实压力很大&#xff0c;感觉更难了。 报名后还在闲鱼上买了份学习资料&#xff0c;后来又在芝士架构群里找了一些…

【IDEA】IntelliJ IDEA的使用2.0——结合实际场景提升工具使用

前言 IDEA作为一款非常不错的Java开发编辑工具&#xff0c;需要不断学习如何更好地使用IEDA工具&#xff0c;打造成得心应手的斧头。 本篇博客是结合实际场景提升IDEA使用的博客&#xff0c;会陆续收集一些实际使用场景&#xff0c;结合这些场景阐述如何更好地使用IDEA工具。…

软件工程理论与实践 (吕云翔) 第四章 结构化分析课后习题及答案

第四章 结构化分析 知识点&#xff1a; ​ 结构化分析模型的核心为数据字典&#xff0c;它是描述软件使用和产生的所有数据对象。围绕着这个核心有3种不同的图&#xff1a;“数据流图”指出当数据在软件系统中移动时怎样被变换&#xff0c;并描绘变换数据流的功能和子功能&am…

欧拉回路和欧拉路径

目录 欧拉回路基础 欧拉回路的定义 欧拉回路的性质 判断图中是否存在欧拉回路的java代码实现 寻找欧拉回路的三个算法 Hierholzer算法 详细思路 代码实现 欧拉路径 欧拉路径的定义 欧拉路径的性质 欧拉回路基础 欧拉回路的定义 欧拉回路遍历了所有的边&#xff0c;…

C语言从文件 D://test.txt 读取字符串,将字符串中所有的大写字符改为小写字母并写回到源文件中

完整代码&#xff1a; /*从文件 D://test.txt 读取字符串&#xff0c;将字符串中所有的大写字母改为小写字母并写回 到源文件中*/ #include<stdio.h>//将字符串中所有的大写字母改为小写字母 void func(char *buff){while (*buff!\0){if (*buff>A&&*buff<…

Netty Review - 核心组件扫盲

文章目录 PreNetty Reactor 的工作架构图CodePOMServerClient Netty 重要组件taskQueue任务队列scheduleTaskQueue延时任务队列Future异步机制Bootstrap与ServerBootStrapgroup()channel()option()与childOption()ChannelPipelinebind()优雅地关闭EventLoopGroupChannleChannel…

微信昵称后面的“小耳朵”是干什么用的?

微信&#xff0c;一款我们日常使用频繁的社交软件&#xff0c;它的功能远不止于聊天、刷朋友圈、支付和刷视频。其实&#xff0c;微信的许多不常用功能可以解决我们的实际问题。 聊天时&#xff0c;我发现朋友微信昵称后面多了一个神秘的小耳朵图标&#xff0c;引发了我的好奇心…

基于 Redis 实现的分布式锁

获取锁 互斥&#xff1a;确保只有一个线程获得锁 # 添加锁 利用setnx的互斥性 127.0.0.1:6379> setnx lock thread1释放锁 手动释放锁 超时释放&#xff1a;获取锁时设置一个超时时间 #释放锁 删除即可 127.0.0.1:6379> del lock两步合成一步 help setSET key value …

(六)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB

一、七种算法&#xff08;DBO、LO、SWO、COA、LSO、KOA、GRO&#xff09;简介 1、蜣螂优化算法DBO 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁…

达索系统SOLIDWORKS 2024钣金和结构系统新功能

达索系统SOLIDWORKS钣金和结构系统是大家比较熟悉的模块了&#xff0c;在2024版本中钣金和结构系统功能也做了很棒的提升。接下来让我们看看如何使用达索系统SOLIDWORKS 2024钣金和结构系统的一些新功能快速完成相应的设计。 达索系统SOLIDWORKS 2024的钣金提供了槽口延伸功能…

JavaWeb——CSS3的使用

目录 1. CSS概述 2. CSS引入方式 3. CSS颜色显示 4. CSS选择器 4.1. 元素&#xff08;标签&#xff09;选择器 4.2. id选择器 4.3. 类选择器 4.4. 三者优先级 5. 盒子模型 1. CSS概述 CSS&#xff0c;全称为“Cascading Style Sheets”&#xff0c;中文译为“层叠样式…

CM211-1 MC022主板输入刷Armbian

咋一看以为是NAND的存储&#xff0c;经过各方搜索&#xff0c;发现BWCMMQ511G08G存储芯片是狭义的NAND&#xff0c;支持emmc协议&#xff0c;故而做尝试。 烧写步骤 1.下载Armbian镜像 Armbian_23.11.0_amlogic_s905l3-cm211_lunar_6.1.60_server_2023.11.01.img.gz 2.将镜像…