[AI达人营二期]从0学安卓部署

本部分主要分为四个环节将会手把手教你进行安卓的部署,全文以图像分类为例:

  1. 安卓部署(一)java、xml的简单入门
  2. 安卓部署(二)准备:模型、标签、图片
  3. 安卓部署(三)PaddleLite的使用简介
  4. 安卓部署(四)完整部署并跑通项目

1. java、xml的简单入门

如果只做简单的换壳,进行模型部署,paddlelite的demo已经做得非常好了,对于小白级玩家,连java和xml都不需要去学习,直接就可以跑通代码,但为了让大家可玩性更高一点,对java和xml进行一点简单的普及了解,毕竟一般来说学习深度学习的人普遍只会Python语言,但触类旁通,我相信你很快就可以掌握java。xml其实大致了解一下你就懂了!

java菜鸟教程

Java菜鸟教程https://www.runoob.com/java/java-tutorial.html

xml菜鸟教程

xml菜鸟教程https://www.runoob.com/xml/xml-tutorial.html

1.1 java基础

注意:下面的代码在这里并不能跑通

java的HelloWorld

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World"); //类似于Python的print
    }
}

实例输出结果为:

Hello World

java中的基本数据类型

public class Test {
    static boolean bool;
    static byte by;
    static char ch;
    static double d;
    static float f;
    static int i;
    static long l;
    static short sh;
    static String str;
 
    public static void main(String[] args) {
        System.out.println("Bool :" + bool); // boolean数据类型表示一位的信息; 简单来说就是真假
        System.out.println("Byte :" + by); //byte 数据类型是8位、有符号的,以二进制补码表示的整数;
        System.out.println("Character:" + ch); // char 类型是一个单一的 16 位 Unicode 字符;
        System.out.println("Double :" + d); //double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数;
        System.out.println("Float :" + f); //float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
        System.out.println("Integer :" + i); //int 数据类型是32位、有符号的以二进制补码表示的整数;
        System.out.println("Long :" + l);  //long 数据类型是 64 位、有符号的以二进制补码表示的整数;
        System.out.println("Short :" + sh);  //short 数据类型是 16 位、有符号的以二进制补码表示的整数
        System.out.println("String :" + str);  //字符串(不是基本类型,但常用) 
    }
}

实例输出结果为:

Bool     :false
Byte     :0
Character:
Double   :0.0
Float    :0.0
Integer  :0
Long     :0
Short    :0
String   :null

java中的类定义

public class Puppy{
   int puppyAge;
   public Puppy(String name){
      // 这个构造器仅有一个参数:name
      System.out.println("小狗的名字是 : " + name ); 
   }
 
   public void setAge( int age ){
       puppyAge = age;
   }
 
   public int getAge( ){
       System.out.println("小狗的年龄为 : " + puppyAge ); 
       return puppyAge;
   }
 
   public static void main(String[] args){
      /* 创建对象 */
      Puppy myPuppy = new Puppy( "tommy" );
      /* 通过方法来设定age */
      myPuppy.setAge( 2 );
      /* 调用另一个方法获取age */
      myPuppy.getAge( );
      /*你也可以像下面这样访问成员变量 */
      System.out.println("变量值 : " + myPuppy.puppyAge ); 
   }

编译并运行上面的程序,产生如下结果:

小狗的名字是 : tommy
小狗的年龄为 : 2
变量值 : 2

java中的条件语句

public class Test {
   public static void main(String args[]){
      int x = 30;
 
      if( x == 10 ){
         System.out.print("Value of X is 10");
      }else if( x == 20 ){
         System.out.print("Value of X is 20");
      }else if( x == 30 ){
         System.out.print("Value of X is 30");
      }else{
         System.out.print("这是 else 语句");
      }
   }
}

以上代码编译运行结果如下:

Value of X is 30

java的数组

public class TestArray {
   public static void main(String[] args) {
      double[] myList = {1.9, 2.9, 3.4, 3.5};
 
      // 打印所有数组元素
      for (int i = 0; i < myList.length; i++) {
         System.out.println(myList[i] + " ");
      }
      // 计算所有元素的总和
      double total = 0;
      for (int i = 0; i < myList.length; i++) {
         total += myList[i];
      }
      System.out.println("Total is " + total);
      // 查找最大元素
      double max = myList[0];
      for (int i = 1; i < myList.length; i++) {
         if (myList[i] > max) max = myList[i];
      }
      System.out.println("Max is " + max);
   }
}

以上实例编译运行结果如下:

1.9
2.9
3.4
3.5
Total is 11.7
Max is 3.5

其他就不再细说了,大家触类旁通,感兴趣可以去菜鸟教程自行学习。

1.2 xml基础

这部分不再过多讲述,后面直接部署项目时,告诉你们如何傻瓜式完成xml编写。

2. 准备:模型、标签、图片

模型、标签、图片都取自于下面链接中的项目:

https://aistudio.baidu.com/aistudio/projectdetail/3268458

所有文件都已经放在数据集文件中

// 解压数据集
!unzip /home/aistudio/data/data126187/class_file.zip
Archive:  /home/aistudio/data/data126187/class_file.zip
   creating: class_file/
  inflating: class_file/eval_details.json  
  inflating: class_file/label_list.txt  
  inflating: class_file/model.nb     
  inflating: class_file/model.pdopt  
  inflating: class_file/model.pdparams  
  inflating: class_file/model.yml    
  inflating: class_file/test.png     

可以在左侧看到这些文件

3. PaddleLite的使用简介

3.1 官方简介

Paddle-Lite 是飞桨推出的一套功能完善、易用性强且性能卓越的轻量化推理引擎。 轻量化体现在使用较少比特数用于表示神经网络的权重和激活,能够大大降低模型的体积,解决终端设备存储空间有限的问题,推理性能也整体优于其他框架。 Paddle的套件(如:paddleclas、paddlex)都支持使用 Paddle-Lite 进行了移动端模型的部署。

本项目使用的模型是来自paddlex训练而来的模型文件。故本项目采用paddlx来进行模型的导出演示

参考文档:

PaddleX安卓部署简介

PaddleLite安卓部分

3.2 准备

  • 目的:将基于Paddle-Lite预测库的Android APP 部署到手机,实现图像分类
  • 需要的环境: Android Studio、Android手机(开启USB调试模式)、Paddle-Lite-Demo
  1. 关于Android studio的安装,有需要的去下面的博客

android studio的安装 https://blog.csdn.net/qq_41976613/article/details/104394870

  1. 下载到本地的Paddle-Lite-Demo工程(打不开的下面链接中github换成gitee即可,或者数据集中已经准备的有一份,自行下载到本地也可)

Paddle-Lite-Demo https://github.com/PaddlePaddle/Paddle-Lite-Demo/tree/master/PaddleLite-android-demo

  1. 安卓手机(华为鸿蒙的也是可以的,自己搞去QAQ)
  • 预先要求:如果您的Android Studio尚未配置NDK,请根据Android Studio用户指南中的安装及配置NDK和CMake内容,预先配置好NDK。您可以选择最新的NDK版本,或者与Android编译环境配置中的NDK版本保持一致。(一般都不需要管这个)

demo如图:

3.3 生成.nb文件☆

我在class_file中放置的有model.nb文件,但是,这是一步很关键的操作,下面,教你们如何生成这个文件。

#这里使用paddlex来快速导出模型,所以先安装paddlex
!pip install paddlex==2.0.0
# 模型导出为paddlelite支持的
# 模型文件已经在class_file当中,实际上就是大家在训练时会生成的pdopt、pdparams、yml、json这四个文件
!paddlex --export_inference --model_dir=./class_file --save_dir=./
# 准备PaddleLite
!pip install paddlelite
# 准备PaddleLite部署模型
#--valid_targets中参数(arm)用于传统手机,(npu,arm )用于华为带有npu处理器的手机
!paddle_lite_opt \
    --model_file=inference_model/model.pdmodel \
    --param_file=inference_model/model.pdiparams \
    --optimize_out=inference_model/model \
    --optimize_out_type=naive_buffer \
    --valid_targets=arm 
targets=arm 
    #--valid_targets=npu,arm 

运行后结果如下即为成功了:

Loading topology data from inference_model/model.pdmodel
Loading params data from inference_model/model.pdiparams
1. Model is successfully loaded!
2. Model is optimized and saved into inference_model/model.nb successfully

完成后刷新左边的inference_model文件夹,就可以看到model.nb文件

截止目前为止你应该有的东西

  1. 左侧的class_file文件(.nb已经提前放置,但是正常训练模型是没有的,需要按照上述步骤自己生成)
  2. Android studio开发环境(需要配置好手机模拟器)
  3. Paddlelite-android-Demo的文件

4. 完整部署并跑通项目

至此,想要完成demo的部署,对你而言简直是小菜一碟

按部就班的来就好~

4.1 打开项目

打开项目,根据前面的paddlelite安卓工程文档可以知道,要部署好项目,只需要找到strings.xml,把下图中三个文件进行更改即可

4.2 改文件

1. 打开文件所在位置

2. 换文件

3. 运行!完成!(就是这么简单!)

这里我采用夜神模拟器来运行

4. 自行修改输出格式样式

这里就需要用到前面的java和xml了,在本项目主要是下面的两个文件的修改

感兴趣的可以自行优化,不再过多叙述。

5 项目完成

好了,到此你就完成了整个安卓项目的部署!

加油,自己动手尝试一下吧~

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐