[AI达人创造营二期]从0学安卓部署
[AI达人营二期]从0学安卓部署-以CV分类为例进行演示
[AI达人营二期]从0学安卓部署
本部分主要分为四个环节将会手把手教你进行安卓的部署,全文以图像分类为例:
- 安卓部署(一)java、xml的简单入门
- 安卓部署(二)准备:模型、标签、图片
- 安卓部署(三)PaddleLite的使用简介
- 安卓部署(四)完整部署并跑通项目
1. java、xml的简单入门
如果只做简单的换壳,进行模型部署,paddlelite的demo已经做得非常好了,对于小白级玩家,连java和xml都不需要去学习,直接就可以跑通代码,但为了让大家可玩性更高一点,对java和xml进行一点简单的普及了解,毕竟一般来说学习深度学习的人普遍只会Python语言,但触类旁通,我相信你很快就可以掌握java。xml其实大致了解一下你就懂了!
java菜鸟教程
xml菜鸟教程
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. 准备:模型、标签、图片
模型、标签、图片都取自于下面链接中的项目:
所有文件都已经放在数据集文件中
// 解压数据集
!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来进行模型的导出演示
参考文档:
3.2 准备
- 目的:将基于Paddle-Lite预测库的Android APP 部署到手机,实现图像分类
- 需要的环境: Android Studio、Android手机(开启USB调试模式)、Paddle-Lite-Demo
- 关于Android studio的安装,有需要的去下面的博客
android studio的安装 https://blog.csdn.net/qq_41976613/article/details/104394870
- 下载到本地的Paddle-Lite-Demo工程(打不开的下面链接中github换成gitee即可,或者数据集中已经准备的有一份,自行下载到本地也可)
- 安卓手机(华为鸿蒙的也是可以的,自己搞去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文件
截止目前为止你应该有的东西
- 左侧的class_file文件(.nb已经提前放置,但是正常训练模型是没有的,需要按照上述步骤自己生成)
- Android studio开发环境(需要配置好手机模拟器)
- Paddlelite-android-Demo的文件
4. 完整部署并跑通项目
至此,想要完成demo的部署,对你而言简直是小菜一碟
按部就班的来就好~
4.1 打开项目
打开项目,根据前面的paddlelite安卓工程文档可以知道,要部署好项目,只需要找到strings.xml,把下图中三个文件进行更改即可
4.2 改文件
1. 打开文件所在位置
2. 换文件
3. 运行!完成!(就是这么简单!)
这里我采用夜神模拟器来运行
4. 自行修改输出格式样式
这里就需要用到前面的java和xml了,在本项目主要是下面的两个文件的修改
感兴趣的可以自行优化,不再过多叙述。
5 项目完成
好了,到此你就完成了整个安卓项目的部署!
加油,自己动手尝试一下吧~
更多推荐
所有评论(0)