tensorflow深度学习实战笔记(三):使用tensorflow lite把训练好的模型移植到手机端,编译成apk文件

2023-05-16

目录

一、准备工作

1.1模型训练

1.2模型固化和pb转tflite

1.3下载tensorflow源码

1.4安装android studio

二、在Android studio中进行开发

2.1修改app的build.gradle文件

2.2导入自己的模型和标签并进行编译


tensorflow深度学习实战笔记(二):把训练好的模型进行固化,讲解了如何固化模型以及把pb模型转换为tflite模型,现在讲解如何用官方的demo把生成的ttlite模型移植到手机端。

一、准备工作

1.1模型训练

参考我的博客:tensorflow深度学习实战笔记(一):使用tensorflow slim自带的模型训练自己的数据

1.2模型固化和pb转tflite

参考我的博客:tensorflow深度学习实战笔记(二):把训练好的模型进行固化

1.3下载tensorflow源码

链接:https://github.com/tensorflow/models/tree/master/research/slim

1.4安装android studio

二、在Android studio中进行开发

在android studio打开tensorflow源码中的官方demo:tensorflow-master/tensorflow/contrib/lite/java

打开后可能会报错,要进行一定的修改

2.1修改app的build.gradle文件

修改后的内容如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion '27.0.3'
    defaultConfig {
        applicationId "android.example.com.tflitecamerademo"
        // Required by Camera2 API.
        minSdkVersion 21
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

        // Remove this block.
        //jackOptions {
         //   enabled true
        //}
    }
    lintOptions {
        abortOnError false
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    aaptOptions {
        noCompress "tflite"
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

repositories {
    maven {
        url 'https://google.bintray.com/tensorflow'
    }
    flatDir{
        dirs "libs"
    }
}

//此处要重点修改,不然会报错
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    //    exclude group: 'com.android.support', module: 'support-annotations'
    //})
    implementation 'com.android.support:appcompat-v7:25.2.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    implementation 'com.android.support:design:25.2.0'
    implementation 'com.android.support:support-annotations:27.1.1'
    implementation 'com.android.support:support-v13:25.2.0'
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'

    //compile(name:'tensorflow-lite-1.10.0', ext:'aar')
    //compile 'org.tensorflow:tensorflow-lite:+'

    testCompile 'junit:junit:4.12'
}

//下面注释掉官方模型下载,因为我们使用自己的模型
/*
def modelDownloadUrl = "https://storage.googleapis.com/download.tensorflow.org/models/tflite/mobilenet_v1_224_android_quant_2017_11_08.zip"
def localCache = "build/intermediates/mobilenet_v1_224_android_quant_2017_11_08.zip"
def targetFolder = "src/main/assets"

task downloadModel(type: DownloadUrlTask) {
    doFirst {
        println "Downloading ${modelDownloadUrl}"
    }
    sourceUrl = "${modelDownloadUrl}"
    target = file("${localCache}")
}

task unzipModel(type: Copy, dependsOn: 'downloadModel') {
    doFirst {
        println "Unzipping ${localCache}"
    }
    from zipTree("${localCache}")
    into "${targetFolder}"
}

// Ensure the model file is downloaded and extracted before every build
preBuild.dependsOn unzipModel

class DownloadUrlTask extends DefaultTask {
    @Input
    String sourceUrl

    @OutputFile
    File target

    @TaskAction
    void download() {
        ant.get(src: sourceUrl, dest: target)
    }

}
*/

2.2导入自己的模型和标签并进行编译

a)导入模型和标签

在assets文家夹下放置自己的pb文件和标签的txt文件

b)修改ImageClassifierFloatInception.java中的内容

案例中提供了两种分类器,一种是“浮点模型”:ImageClassifierFloatInception,另一种是“量化模型”:ImageClassifierQuantizedMobileNet,此处我们使用浮点模型进行移植,因此我们只修改ImageClassifierFloatInception中的内容,量化模型也同理。

修改ImageClassifierFloatInception中的内容(共两处):

//修改一
 //把return "inceptionv3_slim_2016.tflite"修改为return "自己的tflite文件名",示例如下:
//return "inceptionv3_slim_2016.tflite";
    return "frozen_inceptionv3_v3.tflite";

//修改二
//把return "labels_imagenet_slim.txt"修改为return "自己的txt文件名",示例如下:
//return "labels_imagenet_slim.txt";
    return "labels.txt";

如果使用的是其他的模型,如mobilenet等,还得修改图片尺寸的参数:

//如果是mobilenet,修改为224,如果是inceptionv3,用默认的299就可以了
  protected int getImageSizeX() {
    return 224;
  }

  protected int getImageSizeY() {
    return 224;
  }

c)修改分类器的入口(Camera2BasicFragment.java文件中修改,只需修改一处)

//在文件Camera2BasicFragment.java中找到下面这串代码并进行修改
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    try {
      // create either a new ImageClassifierQuantizedMobileNet or an ImageClassifierFloatInception

        //默认的为下面这行
      //classifier = new ImageClassifierQuantizedMobileNet(getActivity());
        //修改为下面这行
      classifier = new ImageClassifierFloatInception(getActivity());

    } catch (IOException e) {
      Log.e(TAG, "Failed to initialize an image classifier.", e);
    }
    startBackgroundThread();
  }

d)至此,基本完成了配置工作,就可以进行编译了。可以点击run直接在手机上进行编译,也可以点击build直接编译成apk文件,然后拷贝到手机端即可进行愉快的玩耍了。

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tensorflow深度学习实战笔记(三):使用tensorflow lite把训练好的模型移植到手机端,编译成apk文件 的相关文章

  • 借助chatGPT强大的源码理解能力,来快速学习elasticsearch 7.11.1整体源码结构(用chatGPT学源码太香了)

    ES阅读学习源码的难处 es的源码非常之多 能够查阅的资料非常少 如果是我们一行一行的去扒着源码看 xff0c 在我看来至少需要2年的时间 xff0c 并且至少要耗费四分之一的头发 源码读起来很枯燥 xff0c 特别是在我们一头雾水的时候
  • ChatGPT 学习 ES & lucene 底层写入原理,源码

    一直有个疑问 学习最新版lucene 数据写入相关的源码 xff0c 应该看哪些源码 xff0c 以什么顺序看 xff08 先看什么 xff0c 后看什么 xff09 xff1f 对于Lucene的数据写入过程 xff0c 可以分为以下几个
  • 想优化ES检索,先了解底层Lucene,Lucene源码结构一览

    Lucene源码结构剖析 前言 有半年没写任何博客了 xff0c 如果不是工作中还是碰到了非常多的挑战 xff0c 我应该不会去花心思研究Lucene源码 xff0c 果然DDL和困难才是第一生产力 xff0c 没错 xff0c 我想写一篇
  • Lucene Query Parser 语法

    lucene的组合条件语法 xff0c 看了网上很多文章 xff0c 真的都太差了 还是官网清晰明了一点 SKIP NAVIGATION LINKS OVERVIEWPACKAGECLASSUSETREEDEPRECATEDHELP PRE
  • 《JAVA并发编程实践JavaConcurrencyinPractice-中文-高清-带书签-完整版(Doug Lea)》

    免责声明 xff1a 全部内容都属于是段友分享 xff0c 我只是属于整理 写在前边 xff0c 个人觉得 弄一个积分下载 xff0c 就是在自掘坟墓 表面上看起来是可以为个人赚积分 xff0c 实际砍掉分享交流的一个途径 对我就是没有积分
  • 《Java核心技术 卷1 基础知识 原书第10版》

    免责声明 xff1a 全部内容都属于是段友分享 xff0c 我只是属于整理 写在前边 xff0c 个人觉得 弄一个积分下载 xff0c 就是在自掘坟墓 表面上看起来是可以为个人赚积分 xff0c 实际砍掉分享交流的一个途径 对我就是没有积分
  • 《高性能mysql第三版》

    免责声明 xff1a 全部内容都属于是段友分享 xff0c 我只是属于整理 写在前边 xff0c 个人觉得 弄一个积分下载 xff0c 就是在自掘坟墓 表面上看起来是可以为个人赚积分 xff0c 实际砍掉分享交流的一个途径 对我就是没有积分
  • idea中maven报错Cannot reconnect

    问题所在 xff1a Maven工程 错误处在pom文件 xff1a 最重要的是学会了怎样在Idea出现错误时 xff0c 发现导致错误的具体原因 xff0c 通过 Helper gt Show Log in Explorer xff0c
  • 用一份JAVA工程师的求职简历来说说求职简历怎么写

    这是一篇我比较想看到的简历指导的文章 但是我比较反对简历造假 我觉得会什么写什么把 可以先看看我的这篇文章 xff1a 刚实习结束 xff0c 就要做面试官 xff0c 谈谈我的想法 自己做过面试官以后 xff0c 自己也总结了一下 xff
  • LiveGBS/LiveNVR等实现安防监控视频Web无插件直播时如何叠加水印文字

    H5直播点播播放器 下载集成入口 xff1a https www liveqing com docs download LivePlayer html 使用说明 xff1a https www liveqing com docs manua
  • OpenMV4开发笔记3-串口通信

    OpenMV4引出了串口3和串口1 xff0c 首先以串口3的收发为例 span class token keyword import span time span class token keyword from span pyb spa
  • FreeRTOS与UCOSIII任务状态对比

    FreeRTOS任务状态 1 运行态 正在运行的任务 xff0c 正在使用处理器的任务 单核处理器中任何时候都有且只有一个任务处于运行态 2 就绪态 已经准备就绪 xff08 非阻塞或挂起 xff09 xff0c 可以立即运行但还没有运行的
  • 白话TCP/IP协议栈

    前言 最近在复习总结计算机基础知识 xff0c 包括操作系统 数据结构 计算机网络等程序员必备的知识 xff0c 这属于程序员的内功 把内功修炼好了 xff0c 外功只是一种形式 xff0c 如果你内功深厚 xff0c 那么无论是用龙抓手还
  • 飞机绕地球问题

    每个飞机只有一个油箱 xff0c 飞机之间可以相互加油 xff08 注意是相互 xff0c 没有加油机 xff09 xff0c 一箱油可以供一架飞机绕地球飞半圈 问 xff1a 为了使至少一架飞机绕地球一圈回到起飞 时候的飞机场 xff0c
  • 【ROS】Gazebo仿真平台安装及问题解决

    Gazebo安装 这里的ROS版本是Melodic xff0c 如果是其他版本的ROS可以修改下面命令的melodic为指定版本 sudo apt get install ros melodic gazebo ros pkgs ros me
  • 激光slam经典开源算法及论文整理

    开源算法 loamLeGO LOAMlio mappingLIO SAMCartographergmappinghector slam 考虑到有些朋友们的网络下载论文可能有问题 xff0c 把论文整理到百度网盘 xff0c 可自行下载 xf
  • Body系下空间平面如何转到World系下

    Body系下空间平面如何转到World系下 题目解法 题目 已知 传感器坐标系 xff08 Body系 xff09 下有一平面P方程为Ax 43 By 43 Cz 43 D 61 0 xff0c 简写为 n
  • cmake: symbol lookup error: cmake: undefined symbol: archive_write_add_filter_zstd 两种解决方法

    centOS8 x86 64 或 aarch64 系统下 yum或dnf 默认安装的 cmake 3 18 2 11 el8版本 xff0c 安装后无法使用 xff0c 出现 xff1a cmake symbol lookup error
  • ROS学习--轻松使用tf

    tf是ROS中建立坐标系 xff0c 并且使用各个坐标间转换关系的一个很好的工具 xff0c 对于非导航专业的同学 xff0c 常常苦恼与各种旋转矩阵的变换 xff0c 自己经常被搞的头大 xff0c 最近由于课题实验的需要 xff0c 尝
  • ROS 下navigation/robot_pose_ekf编译报错

    想要使用navigation下的robot pose ekf做IMU与视觉的融合于是找到了这个包 xff1a https github com ros planning navigation tree indigo devel 但是编译报错

随机推荐

  • 【学习日记】ROS下IMU使用困惑

    最近准备在机器人上测试使用IMU代替机器人的里程计 xff0c 以提高底层的控制周期 由于底层通信的原因 xff0c 使用里程计的话最多能到50HZ xff0c 因为我们的机器人对运动性能要求较高 xff0c 所以无法满足我们的要求 xff
  • ROS学习--如何结合launch文件使用参数服务器

    ROS xff08 Robot Operating System xff09 接触了将近两年了 xff0c 最常用的也就是发布话题与订阅话题 xff0c 前一段时间刚刚把Rviz与 tf搞明白一些 xff0c 都能够多掌握一些东西 xff0
  • 【ROS工具学习】之topic_tools/throttle,改变节点发布频率

    最近老师想做一个实验 xff0c 机器人上搭在Hokuyo单线激光雷达 xff0c Velodyne16线激光雷达 xff0c Kinect2 xff0c Bumblebee xb3等传感器 xff0c 这些传感器做一些实验 xff0c 因
  • 【ROS工具学习】之message_filters:消息同步

    最近实验室老师在做一个多传感器数据采集实验 xff0c 涉及到了消息同步 所以就学习了ROS官网下的消息同步工具message filters http wiki ros org message filters 消息同步有两种方式 xff0
  • ROS中map与costmap的topic数据格式定义

    map与costmap都是以nav msgs OccupancyGrid类型发布其topic 其中整张地图的障碍物信息存放在data数据成员中 xff0c data是一个int8类型的vector向量 xff0c 即一维数组 假设一张pgm
  • Ubuntu 16.04 Qt clang-format 插件安装使用教程

    Ubuntu 16 04 Qt clang format 插件安装使用教程 Qt安装下载安装修改qt环境变量 LLVM安装安装clang format配置qt打开工程文件配置clang format Qt安装 最新的qt5 12支持保存代码
  • HTTP请求首部——Authorization

    前几天的任务需要用到Authorization认证 xff0c 任务比较急 xff0c 就照着给的例子写好了 xff0c 现在任务结束了 xff0c 还是来了解一下这个Authorization Authorization 是一个HTTP安
  • 如何真正理解用户标签体系?

    对用户标签的理解不够透彻 xff1f 用户标签体系创建的方法论总是三头两绪 xff1f 具体业务场景中 xff0c 经常找不到数据分析的思路 xff1f 本文根据神策数据业务咨询师钟秉哲以 构建用户标签体系 xff0c 助力企业精细化运营
  • ubuntu设置tightvncserver自动启动

    vi etc init d vnc bin bash PATH 61 34 PATH usr bin 34 export USER 61 34 root 34 DISPLAY 61 34 1 34 DEPTH 61 34 24 34 GEO
  • 毕业设计小车搭建(1)测试思岚A1雷达数据

    采用的思岚A1型号的雷达 ubuntu系统上采集雷达数据并rviz显示 主要是根据官网给的教程步骤一步一步走下来的 思岚激光雷达 首先下载对应的官方功能包GitHub Slamtec rplidar ros 功能包创建结束后注意环境变量写入
  • 如何关闭docker容器里的进程

    如何关闭docker容器里的进程 1 使用docker exec 容器名 ps ef命令查看进程信息 示例 xff1a 创建名为 34 redis 34 的容器 xff0c 并在容器内部和宿主机中查看容器中的进程信息 xff1a 2 然后进
  • 浅谈嵌入式与互联网(详细)

    纲要 一 什么叫嵌入式 xff0c 以及与人工智能的关系 xff1f 二 嵌入式岗位 三 浅谈嵌入式开发优缺点 四 与互联网 CS相关的 xff0c 如平台服务器 xff0c 前端 APP 软件 对比 五 能力要求和薪资 参考知乎 以下均采
  • 那一年读过的技术经典书

    转载请注明 xff1a http blog csdn net xinzhangyanxiang article details 10199757 大学刚毕业 xff0c 总结起来读过的书并不算多 xff0c 而且主要集中在大四的时期读的 x
  • 关于Ubuntu的串口链接上但接收不了数据问题

    作为开始小白的我 xff0c 一开始链接串口以为按装了CuteCom就能使用 xff0c 不知道使用串口前是需要打开权限的 xff0c 所以我在CuteCom的时候链接上但收不了数据 xff0c 后来才知道打开权限 首先第一步 1 打开你的
  • 进程的调用

    每个进程都有一个非负整数的唯一ID xff0c 用pid t结构表示其ID xff0c 其中ID为0的是调度进程 xff0c 常被称为交换进程 是内核的一部分为系统进程 xff0c ID为1的是init进程 xff0c 他是一个普通用户进程
  • Oracle VM VirtualBox UUID already exists 问题解决

    当我们在VirtualBox下装完系统 xff0c 想拷贝一份备用的时候 xff0c 导入备份的虚拟磁盘的会提示VirtualBox UUID already exists问题 xff0c 其实这个问题在网络上早就有各种不同的解决方案了 x
  • Mac下将文件复制到移动硬盘

    现象分析 xff1a 如果你在使用Mac系统时 xff0c 发现Mac系统和移动硬盘之间无法拷贝数据 xff0c 很有可能你的移动硬盘是NTFS格式的 xff0c 因为目前苹果系统的硬盘格式暂时不兼容这样的格式拷贝 xff0c 只能从NTF
  • Maven打包时报Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war解决方案

    问题现象 xff1a 用Maven打包时 xff0c 报Failed to execute goal org apache maven plugins maven war plugin 2 2 war错误 原因分析 xff1a 打包时在We
  • mac系统中怎么把显示在桌面上的磁盘图标取消掉?

    问题现象 xff1a 安装一些软件时 xff0c 桌面上总会出现外置磁盘图标如图1 下面就简单介绍下怎样取消这种外置图标 图1 解决方案 xff1a finder xff0d 偏好设置 xff0d 通用 xff0d 外置设置 取消前面对话框
  • tensorflow深度学习实战笔记(三):使用tensorflow lite把训练好的模型移植到手机端,编译成apk文件

    目录 一 准备工作 1 1模型训练 1 2模型固化和pb转tflite 1 3下载tensorflow源码 1 4安装android studio 二 在Android studio中进行开发 2 1修改app的build gradle文件