mace编译小结(linux)

2024-02-16 02:58
文章标签 编译 linux 小结 mace

本文主要是介绍mace编译小结(linux),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

mace官网:https://mace.readthedocs.io/en/latest/
mace官方github:https://github.com/XiaoMi/mace

1、环境创建

conda create -n mace python=2 && source activate mace

2、编译mace library

0)环境配置
pip install jinja2==2.10

安装bazel
下载:https://github.com/bazelbuild/bazel/releases, 0.13.0版本的

chmod +x bazel-0.13.0-installer-linux-x86_64.sh
bash bazel-0.13.0-installer-linux-x86_64.sh --user
1)下载mace
git clone https://github.com/XiaoMi/mace.git
cd mace
2)修改build-standalone-lib.shconverter.py,去掉opencl加速部分
  • 打开tools/build-standalone-lib.sh文件,注释掉47-59和75-87行,这里只编译arm结构的,然后将所有的opencl=true改成opencl=false(也就是先不启用gpu加速)
  • 打开converter.py文件,注释掉181-182行
# if RuntimeType.gpu in runtime_list or RuntimeType.cpu_gpu in runtime_list:
#    return True
3)编译mace
bash tools/build-standalone-lib.sh

编译的结果在/builds里,/lib/include两个新文件夹里面都是所需要的mace文件,/lib里包括各种平台下的静态库和动态库,例如/armeabi-v7a/arm64-v8a等。

3、环境配置

1)下载sdk

网站:http://tools.android-studio.org/index.php/sdk/
直接在上述网址中下载android-sdk_r24.4.1-linux.tgz,解压到系统里

2)下载jdk

网站:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
在网址中下载jdk-8u191-linux-x64.tar.gz,解压到系统里

3)下载ndk

网站:https://developer.android.google.cn/ndk/downloads/older_releases#ndk-12b-downloads
在网址中下载android-ndk-r16b-linux-x86_64.zip,解压到系统(版本大于r12即可)

4)环境变量设置

.bashrc里面添加:

export ANDROID_NDK_VERSION=r16b
export ANDROID_NDK=ndk/android-ndk-r16b
export ANDROID_NDK_HOME=${ANDROID_NDK}
export PATH="ndk/android-ndk-r16b:$PATH"
export JAVA_HOME=~/software/jdk1.8.0_191
export JRE_HOME=~/software/jdk1.8.0_191/jre
export CLASSPATH=".:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH"
export PATH="$JAVA_HOME/bin:$JRE_HOME/bin:$PATH"
export ANDROID_HOME=~/software/sdk/android-sdk-linux 

执行

source ~/.bashrc

更新环境变量。

4、生成.apk

1)环境配置
cd mace/mace/examples/android/
pip install pyyaml
pip install enum34
pip install six
pip install numpy
pip install tensorflow==1.6.0
2)gradle版本修改

gradle/wrapper/gradle-wrapper.properties里的

distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip

改成

distributionUrl=https\://services.gradle.org/distributions/gradle-5.0-all.zip

否则报错:

Error occurred while communicating with CMake server.

或者

Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
3)build.gradle修改

将mace/mace/examples/android/build.gradle里的第10行:

classpath 'com.android.tools.build:gradle:3.0.1'

改成

classpath 'com.android.tools.build:gradle:3.1.1'

否则报错:

Error:Failed to notify project evaluation listener.

或者

Error:(28, 0) Could not find method implementation() for arguments [directory 'libs'] on 
object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
4)生成.apk
./build.sh dynamic

这里的dynamic指的是选择converter模型时调用动态的mace库,而不是生成mobilenet的.so文件,只能生成.a。.apk文件在/mace/mace/examples/android/app/build/outputs/apk/app文件夹下,新版本的mace里有debug和release版本:app-app-debug.apkapp-app-release.apk。然后直接把.apk文件通过数据线传到android手机上,安装就可以使用了。/mace/builds/文件夹下也会生成一个新的文件夹/mobilenet,这是调用converter.pymobilenet.yml转换成mace格式的结果,里面包含/include文件夹和/model文件夹(含有.a文件)。

4、编译mobilenet-v2

1)下载mace models
git clone https://github.com/XiaoMi/mace-models.git
2)修改.yml文件(可做可不做,可以为了保护模型不被盗用,通过转化静态库时将模型转化为C++代码)

修改mace_test/mace-models/mobilenet-v2/路径下的mobilenet-v2.ymlmobilenet-v2-host.yml,将两个文件里面的

model_graph_format: file
model_data_format: file

都改成

model_graph_format: code
model_data_format: code
3)模型转换
python tools/converter.py convert --config=mace-models/mobilenet-v2/mobilenet-v2.yml

mace/builds/文件夹下会生成/mobilenet-v2文件夹,里面包含对mobilenet-v2的模型转换结果。

5、其他错误

TypeError: __init__() got an unexpected keyword argument 'serialized_options'

或者

no module named markupsafe

solution: 修改环境变量并且执行完source .bashrc后,重新打开终端

com.android.builder.testing.api.DeviceException: No connected devices!

solution:不用管了,.apk已经生成,报错是adb找不到设备的问题

CMake was unable to find a build program corresponding to \"Ninja\"

solution:

conda install ninja

这篇关于mace编译小结(linux)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/713298

相关文章

mybatis映射器配置小结

《mybatis映射器配置小结》本文详解MyBatis映射器配置,重点讲解字段映射的三种解决方案(别名、自动驼峰映射、resultMap),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定... 目录select中字段的映射问题使用SQL语句中的别名功能使用mapUnderscoreToCame

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Java Stream 并行流简介、使用与注意事项小结

《JavaStream并行流简介、使用与注意事项小结》Java8并行流基于StreamAPI,利用多核CPU提升计算密集型任务效率,但需注意线程安全、顺序不确定及线程池管理,可通过自定义线程池与C... 目录1. 并行流简介​特点:​2. 并行流的简单使用​示例:并行流的基本使用​3. 配合自定义线程池​示

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.