android + tflite 分类APP开发-2

APP开发

build.gradle导入库

    //implementation 'org.tensorflow:tensorflow-android:+'
    implementation 'org.tensorflow:tensorflow-lite:2.4.0'
    implementation 'org.tensorflow:tensorflow-lite-support:0.3.1
    implementation 'org.tensorflow:tensorflow-lite-metadata:0.3.1'

加载模型

      try {
            tfLiteClassificationUtil = new TFLiteClassificationUtil(CONST.downPath + "/zjym.tflite");
            Toast.makeText(MainActTflite.this, "模型加载成功!", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            Toast.makeText(MainActTflite.this, "模型加载失败!", Toast.LENGTH_SHORT).show();
            e.printStackTrace();
            finish();
        }

模型一般在assets目录下,在编译时会集成到APP中,不利于模型的迭代,这里模型保存在内部存储目录下。

分类预测

                try {      // 预测图像
                    FileInputStream fis = new FileInputStream(image_path);
                    imageView.setImageBitmap(BitmapFactory.decodeStream(fis));
                    long start = System.currentTimeMillis();
                    int[][] res2Arr = tfLiteClassificationUtil.predictImage(image_path);
                    long end = System.currentTimeMillis();
                    String show_text = "预测结果标签:" + (int) res2Arr[res2Arr.length-1][0] +
                            "\n名称:" +  classNames.get((int) res2Arr[res2Arr.length-1][0]) +"概率:" + (float) res2Arr[res2Arr.length - 1][1] / 256 +
                            "\n名称:" +  classNames.get((int) res2Arr[res2Arr.length-2][0]) +"概率:" + (float) res2Arr[res2Arr.length - 2][1] / 256 +
                            "\n名称:" +  classNames.get((int) res2Arr[res2Arr.length-3][0]) +"概率:" + (float) res2Arr[res2Arr.length - 3][1] / 256 +
                            "\n时间:" + (end - start) + "ms";
                    textView.setText(show_text);
                } catch (Exception e) {
                    e.printStackTrace();
                }

res2Arr[res2Arr.length - 1][1] / 256,两个整数相除显示为0,添加(float)显示字符串

TFLiteClassificationUtil类功能模块

public TFLiteClassificationUtil(String modelPath) throws Exception {

        File file = new File(modelPath);
        if (!file.exists()) {
            throw new Exception("model file is not exists!");
        }

        try {
            Interpreter.Options options = new Interpreter.Options();

            options.setNumThreads(NUM_THREADS);// 使用多线程预测
            NnApiDelegate delegate = new NnApiDelegate();// 使用Android自带的API或者GPU加速
//            GpuDelegate delegate = new GpuDelegate();
            options.addDelegate(delegate);
            tflite = new Interpreter(file, options);
            // 获取输入,shape为{1, height, width, 3}
            int[] imageShape = tflite.getInputTensor(tflite.getInputIndex("input_1")).shape();
            DataType imageDataType = tflite.getInputTensor(tflite.getInputIndex("input_1")).dataType();
            inputImageBuffer = new TensorImage(imageDataType);
            // 获取输入,shape为{1, NUM_CLASSES}
            int[] probabilityShape = tflite.getOutputTensor(tflite.getOutputIndex("Identity")).shape();
            DataType probabilityDataType = tflite.getOutputTensor(tflite.getOutputIndex("Identity")).dataType();
            //outputProbabilityBuffer = TensorBuffer.createFixedSize(probabilityShape, probabilityDataType);
            outputProbabilityBuffer = TensorBuffer.createFixedSize(tflite.getOutputTensor(0).shape(), DataType.UINT8);

            // 添加图像预处理方式
            imageProcessor = new ImageProcessor.Builder()
                    .add(new ResizeOp(224, 224, ResizeOp.ResizeMethod.NEAREST_NEIGHBOR))
                    .add(new NormalizeOp(new float[] {0.0f}, new float[] {255.0f}))
                    .add(new QuantizeOp(0f, 0.003921569f))
                    .add(new CastOp(DataType.UINT8))
                    .build();

            TensorProcessor probabilityPostProcessor = new TensorProcessor.Builder()
                    .add(new DequantizeOp((float) 0, (float) 0.00390625))
                    .add(new NormalizeOp(new float[]{0.0f}, new float[]{1.0f}))
                    .build();
        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception("load model fail!");
        }
    }

    public int[][] predictImage(String image_path) throws Exception {
        if (!new File(image_path).exists()) {
            throw new Exception("image file is not exists!");
        }
        FileInputStream fis = new FileInputStream(image_path);
        Bitmap bitmap = BitmapFactory.decodeStream(fis);
        int[][] result = predictImage(bitmap);
        if (bitmap.isRecycled()) {
            bitmap.recycle();
        }
        return result;
    }

    // 重载方法,直接使用Bitmap预测
    public int[][] predictImage(Bitmap bitmap) throws Exception {
        return predict(bitmap);
    }

    private int[][] predict(Bitmap bmp) throws Exception {
        inputImageBuffer = loadImage(bmp);

        try {
            tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind());
        } catch (Exception e) {
            throw new Exception("predict image fail! log:" + e);
        }
        int[] results = outputProbabilityBuffer.getIntArray();
        Log.d("results", Arrays.toString(results));
        int[][] arr = new int[results.length][2];
        for (int i=0;i<results.length;i++) {
            arr[i][0] = i;
            arr[i][1] = results[i];
        }
        Arrays.sort(arr, Comparator.comparingInt(e -> e[1]));
        //int l = getMaxResult(results);
        return arr;//new float[]{l, results[l]};
    }

tflite默认保存格式为UINT8,如果不加add(new CastOp(DataType.UINT8))可能显示

Cannot copy to a TensorFlowLite tensor (input_1) with 150528 bytes from a Java Buffer with 602112 bytes

默认的预训练模型是 EfficientNet-Lite0,如果为其他模型,其输入参数等也要修改。可通过下述方法查看。

Android Studio ->File ->open ->other ->tflite,打开tflite模型,build ->Make Project 会自动生成模型接口类,并移动模型到ml目录,查看类中模型参数。

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

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

相关文章

GO网络编程(三):海量用户通信系统1:登录功能初步

一、准备工作 需求分析 1)用户注册 2)用户登录 3)显示在线用户列表 4)群聊(广播) 5)点对点聊天 6)离线留言 主界面 首先&#xff0c;在项目根目录下初始化mod&#xff0c;然后按照如下结构设计目录&#xff1a; 海量用户通信系统/ ├── go.mod ├── client/ │ ├──…

【阅读笔记】水果轻微损伤的无损检测技术应用

一、水果轻微损伤检测技术以及应用 无损检测技术顾名思义就是指在不破坏水果样品完整性的情况下对样品进行品质鉴定。目前比较常用的农产品水果类无损检测法有&#xff1a;基于红外热成像、机器视觉技术的图像处理方法、光谱检测技术、介电特性技术检测法等。 1.1 基于红外热…

【C++】基于红黑树封装set和map

&#x1f680;个人主页&#xff1a;小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言一、更高维度的泛型二、模版参数三、比较逻辑的重写四、迭代器4.1 const迭代器4.2 重载4.3 - -重载 五、完整代…

在深度学习中,Epoch、迭代次数、批次大小(Batch Size)和学习速率(Learning Rate)是影响模型训练效果的重要超参数。

1. Epoch 定义&#xff1a;Epoch是指整个训练数据集被完整地用来训练一次。影响&#xff1a;增加Epoch的数量可以使模型更充分地学习数据。然而&#xff0c;过高的Epoch可能导致过拟合&#xff0c;即模型在训练集上表现良好&#xff0c;但在测试集上表现不佳。设置&#xff1a…

【C++设计模式】行为型模式:中介者模式

行为型模式&#xff1a;中介者模式 中介者模式通过引入一个中介者对象来集中控制对象之间的交互。这样可以解耦多个对象之间的复杂交互关系&#xff0c;使系统更易于维护和扩展。 假设我们有一个简单的聊天室应用&#xff0c;其中有每个用户可以发送群聊消息给其他用户&#…

阿里P8面试官推荐学习的11大专题:java面试精讲框架文档

本篇文章给大家分享一波&#xff0c;阿里P8面试官推荐学习的11大专题&#xff1a;java面试精讲框架文档&#xff0c;主要包含11大块的内容&#xff1a;spring、springcloud、netty、zookeeper、kafka、Hadoop、HBASE、Cassandra、elasticsearch、spark、flink&#xff1b;希望大…

【C++入门篇 - 3】:从C到C++第二篇

文章目录 从C到C第二篇new和delete命名空间命名空间的访问 cin和coutstring的基本使用 从C到C第二篇 new和delete 在C中用来向系统申请堆区的内存空间 New的作用相当于C语言中的malloc Delete的作用相当于C语言中的free 注意&#xff1a;在C语言中&#xff0c;如果内存不够…

stm32定时器中断和外部中断

一&#xff0c;中断系统的介绍 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行 中…

Github 优质项目推荐(第七期):涵盖免费服务、API、低代码、安卓root、深度学习

文章目录 Github优质项目推荐 - 第七期一、【LangGPT】&#xff0c;5.7k stars - 让每个人都成为提示专家二、【awesome-selfhosted】&#xff0c;198k stars - 免费软件网络服务和 Web 应用程序列表三、【public-apis】&#xff0c;315k stars - 免费 API四、【JeecgBoot】&am…

mysql游标的使用

说明&#xff1a; 虽然我们也可以通过筛选条件 WHERE 和 HAVING&#xff0c;或者是限定返回记录的关键字 LIMIT 返回一条记录&#xff0c;但是&#xff0c;却无法在结果集中像指针一样&#xff0c;向前定位一条记录、向后定位一条记录&#xff0c;或者是 随意定位到某一条记录 …

No.3 笔记 | Web安全基础:Web1.0 - 3.0 发展史

大家好&#xff01;作为一个喜欢探索本质的INTP&#xff0c;我整理了一份简明易懂的Web安全笔记。希望能帮助你轻松掌握这个领域的核心知识。 这份笔记涵盖了Web发展的历程&#xff0c;从静态的Web 1.0到智能化的Web 3.0。我们将探讨URL和HTTP协议&#xff0c;揭示它们在网络中…

新书速览|你好,C++

《你好&#xff0c;C》 本书内容 《你好&#xff0c;C》主要介绍C开发环境的搭建、基础语法知识、面向对象编程思想以及标准模板库的应用&#xff0c;特别针对初学者在学习C过程中可能遇到的难点提供了解决方案。全书共分13章&#xff0c;以一个工资程序的不断优化和完善为线索…

pds 开发流程(pango design suite)使用方法

author: hjjdebug date: 2024年 10月 12日 星期六 13:24:55 CST pds 开发流程(pango design suite)使用方法 基于 Pango Design Suite&#xff08;PDS&#xff09; 的FPGA开发流程 盘古设计开发包, 是一个集成开发环境&#xff0c; 就是说把很多功能就集中在了一起的意思. 我…

Windows 下 cocos2d-x-3.17.2 VS2017开发环境搭建

1.下载cocos2d-x-3.17.2 源码: Cocos2d-x - 成熟、轻量、开放的跨平台解决方案 2.下载Python2 Python 2.7.0 Release | Python.org 加入环境变量: 测试版本

Flutter 第二篇

1、第一步 async: 2.4.0 audio_recorder: 1.0.2 2、点击右上角 更新 大部分红线没有了 卡在 3、运行在模拟器里面 Running Gradle task assembleDebug... 报错一&#xff1a; * Where: Build file /Users/guoxingdeng/AndroidStudioProjects/fltteraistock/android/app/b…

构建高效作业管理平台:Spring Boot师生协作评审系统

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

sql的调优指南及高级sql技巧

SQL调优是优化数据库性能的重要手段&#xff0c;涉及编写高效的SQL查询、合理设计索引、优化数据库结构等。以下是一些SQL调优指南和高级技巧&#xff1a; SQL调优指南 选择合适的查询方式&#xff1a; **避免使用SELECT ***&#xff1a;仅选择所需的列&#xff0c;减少数据传…

Zigbee2MQTT多控网关开发专题:【第一篇】系统配置与初始化

01 前言 本文章原文发表于我的微信公众号&#xff0c;请大家关注阅读&#xff0c;涉及的源代码等都在公众号&#xff0c;请搜索公众号&#xff1a; 智能家居NodeRed和HomeAssistant 即可关注。 02 概述 基于NodeRed的Zigbee2MQTT多功能多控网关开发专题正式开贴&#xff0c;…

Linux shellcheck工具

安装工具 通过linux yum源下载&#xff0c;可能因为yum源的问题找不到软件包&#xff0c;或者下载的软件包版本太旧。 ShellCheck的源代码托管在GitHub上(推荐下载方式)&#xff1a; GitHub - koalaman/shellcheck: ShellCheck, a static analysis tool for shell scripts 对下…

关于不建议使用北京新网数码信息技术公司的服务器和虚拟机的说明(重要说明)

尊敬的用户们&#xff0c; 我们注意到了关于北京新网数码信息技术有限公司服务器和虚拟机服务的一些用户反馈&#xff0c;特别是关于虚拟机不支持根目录设置、免费查杀以及WAF防护效果的问题。此外&#xff0c;还有用户提到云主机的保护措施不到位&#xff0c;并且实际提供的防…