1.准备部署文件

需要准备的部署文件包括头文件(.h), mace库文件(.),转化后的模型(.a),这里以resnet18v1-opt.onnx模型为例

1.1. 优化onnx模型

# Optimize your model
$python MACE_ROOT/tools/onnx_optimizer.py resnet18v1.onnx resnet18v1-opt.onnx

1.2. 准备部署文件(.yml)

可以参考官方的例子:https://mace.readthedocs.io/en/latest/user_guide/basic_usage.html
TensorFlow,Caffe,ONNX这三个模型的部署文件有点差别,根据自己的平台修改。下面是我的文件内容

library_name: resnet18v1                                                        
  target_abis: [arm64-v8a]                                                        
  model_graph_format: code                                                        
  model_data_format: code                                                         
  models:                                                                         
    resnet18v1:                                                                   
      platform: onnx                                                              
      model_file_path: /MACE/mace-models/onnx-models/resnet18v1-opt.onnx          
      model_sha256_checksum: 96e3b832f63db6a9647b63c9a6f7561a75a74463b15e13a3e2a7d48b774242ef
      subgraphs:                                                                  
        - input_tensors: data                                                     
          output_tensors: resnetv15_dense0_fwd                                    
          input_shapes: 1,224,224,3                                               
          output_shapes: 1,1,1,1000                                               
          backend: pytorch                                                        
      runtime: cpu+gpu                                                            
      limit_opencl_kernel_time: 0                                                 
      nnlib_graph_mode: 0                                                         
      obfuscate: 1

注意这几个参数:

model_graph_format
model_data_format
input_tensors 
output_tensors 
input_shapes 
output_shapes

这几个参数可以使用Netron可视化工具读出

1.3. 使用MACE转换工具来转换模型

$python tools/converter.py convert --config=/MACE/mace-models/onnx-models/onnx-resnet18v1.yml

生成的文件结构如下所示:

builds
  ├── include
  │   └── mace
  │       └── public
  │           ├── mace_engine_factory.h
  │           └── resnet18v1.h
  └── model
      └── arm64-v8a
            └── resnet18v1.a

1.4. 拷贝转换后的文件到Android工项目

  • 在examples下的android模板工程中的macelibrary/src/main/cpp 文件夹下

-- 新建include/mace/public 文件夹     
-- 新建lib 文件夹     
-- 新建model 文件夹

  • 复制mace.h和刚才生成的 mace_engine_factory.hresnet18v1.h 三个文件

builds/include/mace/public/mace.h                                              拷贝到 macelibrary/src/main/cpp/include/mace/public builds/resnet18v1/include/mace/public/mace_engine_factory.h  拷贝到 macelibrary/src/main/cpp/include/mace/public builds/resnet18v1/include/mace/public/resnet18v1.h                  拷贝到 macelibrary/src/main/cpp/include/mace/public

  • 复制模型文件

builds/resnet18v1/model/arm64-v8a/resnet18v1.a                     拷贝到 macelibrary/src/main/cpp/model/arm64-v8a

  • 复制mace库文件

builds/lib/arm64-v8a/ 下所有文件夹 拷贝到 macelibrary/src/main/cpp/lib/arm64-v8a/ 目录下

2.导入Android项目

打开AndroidStudio导入项目

2.1. 修改 CMakeLists.txt 文件

macelibrary/CMakeLists.txt 文件中找到

set(mobilenet_lib ${CMAKE_SOURCE_DIR}/src/main/cpp/model/arm64-v8a/mobilenet.a)
改为:
set(mobilenet_lib ${CMAKE_SOURCE_DIR}/src/main/cpp/model/arm64-v8a/resnet18v1.a)

2.2. 修改 .cc 文件

macelibrary/src/main/cpp/image_classify.cc 文件找到代码

struct MaceContext {std::shared_ptr<mace::GPUContext> gpu_context;std::shared_ptr<mace::MaceEngine> engine;std::string model_name;mace::DeviceType device_type = mace::DeviceType::CPU;std::map<std::string, ModelInfo> model_infos = {{"mobilenet_v1", {"input", "MobilenetV1/Predictions/Reshape_1",{1, 224, 224, 3}, {1, 1001}}},{"mobilenet_v2", {"input", "MobilenetV2/Predictions/Reshape_1",{1, 224, 224, 3}, {1, 1001}}},{"mobilenet_v1_quant", {"input", "MobilenetV1/Predictions/Softmax:0",{1, 224, 224, 3}, {1, 1001}}},{"mobilenet_v2_quant", {"input", "output",{1, 224, 224, 3}, {1, 1001}}}};
}

并添加代码:

{"resnet18v1", {"data", "resnetv15_dense0_fwd", {1, 224, 224, 3}, {1, 1001}}} 

这个文件要和自己的部署文件对得上

2.3. 修改初始文件

  • 在com.xiaomi.mace.demo.result下的InitData.java文件,添加自己的模型名称
public static final String[] MODELS = new String[]{"onnx_mobilenet-v2_1_0", "mobilenet_v2", "mobilenet_v1_quant", "mobilenet_v2_quant"};

修改

public InitData() { model = MODELS[0];
}

里面的model = MODELS[0]; 这个对应(a)中的索引顺序,并将其作为默认模型

3. 编译Android项目

以上修改完成,直接编译android项目就可以生成 .apk文件。

小米AI平台MACE的构建和部署相关推荐

  1. cloud 部署_使用Google Cloud AI平台开发,训练和部署TensorFlow模型

    cloud 部署 实用指南 (A Practical Guide) The TensorFlow ecosystem has become very popular for developing ap ...

  2. 小米开源框架MACE 如何构建和使用

    转载自https://www.jianshu.com/p/3be518027ac2 文章内容翻译自 MACE 官方手册,记录本人阅读与开发过程,力求不失原意,但推荐阅读原文. https://medi ...

  3. 小米开源AI框架mace编译构建

    目录 简介 环境要求 1 安装 Bazel 2 安装Android NDK 3 在Ubuntu16.04下安装Docker(17.09) 构建并运行示例模型 1 拉取MACE项目 2 拉取MACE M ...

  4. 小米开源框架MACE 源码阅读笔记 1

    转载自 https://www.jianshu.com/p/7061fd67d419 前扯 在前不久的某高峰论坛上,小米开源了其移动端的深度学习框架Mobile AI Compute Engine(M ...

  5. 小米开源框架MACE 源码阅读笔记

    转载自 https://www.jianshu.com/p/7061fd67d419 前扯 在前不久的某高峰论坛上,小米开源了其移动端的深度学习框架Mobile AI Compute Engine(M ...

  6. 小米AI 连接智能生活

    近年来,人工智能(AI)技术在多个领域落地并不断取得发展与突破.在互联网的推动下,AI语音助理.智能家居.眼镜相机等产品相继推出,打造了更加便捷的生活体验. 秉承着"技术为本"的理 ...

  7. 专访小米欧阳辰:深度揭秘小米广告平台的构建、底层模块和坑

    专访小米欧阳辰:深度揭秘小米广告平台的构建.底层模块和坑 专访小米架构欧阳辰架构师广告平台数据库 width="22" height="16" src=&quo ...

  8. 腾讯云AI平台张文杰:构建一站式机器学习服务平台

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 5月24日,以"无界数据无限智能"为主题的腾讯"云+未来"峰会AI大数据分论坛在广州拉开帷幕.此次分 ...

  9. dash使用_使用Dash和SHAP构建和部署可解释的AI仪表盘

    dash使用 In recent years, we have seen an explosion in the usage of Machine Learning (ML) algorithms f ...

最新文章

  1. 哆啦a梦简单图画python编程_[python]画哆啦A梦,Python,绘制
  2. Iaas、Caas、Paas、Faas!选择正确的平台!
  3. mysql 分页测试,
  4. 科学计算机eq7,科学计算器HiEdu 580 Scientific Calculator
  5. 消息中间件--RabbitMQ ---高级特性之消费端ACK与重回队列
  6. PVS中TFTP的隐藏配置
  7. php 写博客教程,最近写了一个博客程序: QuickBlog PHP 开源的一文多发系统
  8. 最棒的SpringCloud微服务后台管理系统
  9. html英文期刊参考文献,英文参考文献标准格式
  10. 线性表的链式存储结构(C语言实现)
  11. srm 592 div 2
  12. 3dmax和python做3d动画_3D动画和影视建模,用什么软件或者多个什么软件结合做比较好?...
  13. MATLAB算数运算符(算术乘,点乘,算术左除,算术右除,点左除,点右除,算术乘方,点乘方)
  14. j2ee上机任务汇总(中)
  15. DoS的SYN泛洪攻击,原理及解决方案,学到就是赚到!
  16. 从数学到密码学(十八)
  17. PhysX物理引擎(编程入门)
  18. [RK3288][Android6.0] 调试笔记 --- 伪电池驱动添加
  19. html个人签到送一句话,一句话签到语录
  20. mysql基本语法DDL语句的总结 (笔记)

热门文章

  1. python if for 多种写法
  2. SQL审核平台-Yearning部署与使用
  3. 使用Android Studio发布私有库到仓库中心
  4. python是什么软件-python是什么软件(为何python不好找工作)
  5. kali2020识别不到网卡_kali无法识别BCM43XX系列无线网卡
  6. 恶意软件如何被用来创建虚假的过期证书警报
  7. python 正则匹配png_正则表达式筛选出jpg、png的图片url
  8. RUNOOB.COM的Java学习网
  9. 1070: 小汽车的位置
  10. welcome-file 不能配置action的解决方法