客户端码农学习ML —— 工具框架Tensorflow及Android、iOS上初步实验

简介: 与其上来就学习相对枯燥易让人放弃的数学,不如先做几个例子并在Android、iOS上熟悉下整个操作流程,通过实战激发下兴趣。 开发环境准备 首先安装Python,推荐Python3,装好后别忘了设置下载源镜像,不然安装各种包的时候下载速度很感人。

与其上来就学习相对枯燥易让人放弃的数学,不如先做几个例子并在Android、iOS上初步实验熟悉下整个操作流程,通过实战激发下兴趣。

开发环境准备

首先安装Python,推荐Python3,装好后别忘了设置下载源镜像,不然安装各种包的时候下载速度很感人。

新建文件:~/.pip/pip.conf

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
use-mirrors = true
mirrors = https://pypi.tuna.tsinghua.edu.cn/simple

再安装Numpy、SciPy、Pandas、Matplotlib、Pil、TensorFlow 、scikit-learn等库,都是深度学习不可缺少的。

pip3 install --user numpy scipy matplotlib ipython jupyter pandas sympy nose

更多安装介绍可参考底部参考链接。

TensorFlow的安装,官方推荐在Linux系统里安装gpu版,但我们学习阶段在mac上安装cpu版即可,官方从1.2版本后就不再编译gpu版的mac安装包,需要自己从源码编译,由于深知cpu版训练很慢,我自己尝试编译了gpu版,在10.13系统上遇到不少坑,各种修改耗费大半天后终于编译成功,完整一次性编译成功在2014款15寸mbp高配上大约需要近1个小时,具体可参考底部参考资料。

但由于不明原因,在使用gpu训练时系统会卡住,甚至花屏,直到训练完成才能陆续恢复,因此在mac上学习推荐直接用官方编译的cpu版即可。

pip3 install tensorflow

Python IDE个人看习惯随意选择,TensorFlow安装后先来个Hello world脚本试试各组件是否完备:

import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
sess.run(hello)
# 应该输出'Hello, TensorFlow!'
a = tf.constant(10)
b = tf.constant(32)
sess.run(a + b)
# 应该输出42
sess.close()

对于客户端程序员来说,Android、iOS的环境现成的。

AI在iOS上的应用:

在CoreML的帮助下,使用.mlmodel模型文件可以在XCode中自动生成调用模型的代码文件。

https://developer.apple.com/machine-learning/

https://github.com/apple/coremltools

.mlmodel文件可从上面Apple官方网页资料里下载回来,也可以用Python库coremltools将各种学习框架生成的文件转成.mlmodel,目前支持对Keras、Caffe、scikit-learn、libsvm、XGBoost生成的模型文件转换。

Coremltools当前还只支持python2,执行pip install -U coremltools,通用会有依赖库的冲突,可选择pipenv等python上的虚拟环境进行安装。

自己训练模型并将.pkl转成.mlmodel可参考:https://antscript.com/post/2017-12-28-step-by-step-machine-learning/
后续使用线性回归算法训练模型自己转一转,这里先下载苹果官方模型MobileNet回来试试效果:

ai_mobile_net_at_xcode

从中可以看出,输入是一个224*224的图片像素二维数组,输出有两个,classLabel表示最可能的结果文本,还有一个dictionary表示所有的识别结果及概率。

下面写个从摄像头捕获图片进行识别的app,也可以从相册里选择一张图,核心代码如下:

CVPixelBufferRef buffer = [UIImage pixelBufferFromCGImage:scaledImage.CGImage];
MobileNetInput *input = [[MobileNetInput alloc] initWithImage:buffer];
NSError *error = nil;
MobileNetOutput *output = [self.mobileNet predictionFromFeatures:input error:&error];
CVPixelBufferRelease(buffer);
if (error) {
    return error.localizedDescription;
} else {
    return output.classLabel;
}    

其中有三个方法比较耗时,在iPhone7上大概如下:

  1. 将摄像头拍摄的图片裁剪成224*224大小,约75ms
  2. [[MobileNet alloc] init] 约90ms,但是它可以只初始化一次
  3. predictionFromFeatures 识别图像内容 35ms

App实际效果:

ai_ios_remote

背景大图是摄像头捕获的完整画面,将中间一块方形缩小到224*224,左下角即模型接受的实际图片,底部橙色背景白色文字的的即结果,对于训练到的图片还是识别准确的。

AI在Android上的应用

Android上使用训练好的模型需要依赖TensorFlow的jar和so库,可通过配置gradle:compile ‘org.tensorflow:tensorflow-android:1.2.0’,也可以从https://github.com/tensorflow/tensorflow下载源码自己根据资料编译,可参考https://www.jianshu.com/p/6a2a98ad5c5b

方便之处在于都是google的产品,TensorFlow训练的模型可保存成.pb文件直接供TensorFlowInferenceInterface使用, 使用起来基本3个方法就可以了: feed、,run、fetch,分别是提供输入、执行、获取结果。

以下是一个简单的线性回归算法生成的kai_linear_only_mul.pb模型文件, 核心试验代码如下:

mTensorFlowInterface = new TensorFlowInferenceInterface(getActivity().getAssets()
    , "file:///android_asset/kai_linear_only_mul.pb");
    
mTensorFlowInterface.feed("input", new float[]{input});

mTensorFlowInterface.run(new String[]{"k", "b", "calcY"}, false);

float[] result = new float[1];
mTensorFlowInterface.fetch("calcY", result);
float calcY = result[0];
mTensorFlowInterface.fetch("k", result);
float k = result[0];
mTensorFlowInterface.fetch("b", result);
float b = result[0];
String result = String.format(Locale.getDefault()
  , "y = %.4fx + %.2f \ninput = %.2f \nresult = %.4f"
  , k, b, input, calcY);

试验效果如下图:

android_linear_snapshot

参考:

http://qianhk.com/2018/02/客户端码农学习ML-工具框架Tensorflow/

https://www.python.org/

https://www.scipy.org/install.html

https://www.tensorflow.org/install/install_mac

https://github.com/fendouai/Awesome-TensorFlow-Chinese

gpu版TensorFlow需要的cuda资料:

cuda: https://developer.nvidia.com/cuda-toolkit

cuDNN: https://developer.nvidia.com/developer-program

mac上源码编译常见问题及解决方案:

http://www.jianshu.com/p/5df0c2f48b21

https://github.com/JimmyKon/tensorflow_build_issue_fix/tree/master

https://stackoverflow.com/questions/43113508/math-functions-hpp-not-found-when-using-cuda-with-eigen

https://gist.github.com/smitshilu/53cf9ff0fd6cdb64cca69a7e2827ed0f

https://github.com/nteract/nteract/issues/1523

LD_LIBRARY_PATH and DYLD_LIBRARY_PATH not imported on OS X
rather than disable SIP, I've resorted to linking the .dylib objects into /usr/local/lib. E.g., ln -s $ORACLE_HOME/.dylib /usr/local/lib

https://devtalk.nvidia.com/default/topic/1025945/mac-cuda-9-0-driver-fully-compatible-with-macos-high-sierra-10-13-error-quot-update-required-quot-solved-/

本文首发于钱凯凯的博客

 

相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
目录
相关文章
|
JavaScript 前端开发 Android开发
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
443 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
4月前
|
机器学习/深度学习 PyTorch TensorFlow
66_框架选择:PyTorch vs TensorFlow
在2025年的大语言模型(LLM)开发领域,框架选择已成为项目成功的关键决定因素。随着模型规模的不断扩大和应用场景的日益复杂,选择一个既适合研究探索又能支持高效部署的框架变得尤为重要。PyTorch和TensorFlow作为目前市场上最主流的两大深度学习框架,各自拥有独特的优势和生态系统,也因此成为开发者面临的经典选择难题。
|
7月前
|
存储 Android开发 数据安全/隐私保护
Thanox安卓系统增加工具下载,管理、阻止、限制后台每个APP运行情况
Thanox是一款Android系统管理工具,专注于权限、后台启动及运行管理。支持应用冻结、系统优化、UI自定义和模块管理,基于Xposed框架开发,安全可靠且开源免费,兼容Android 6.0及以上版本。
872 4
|
8月前
|
Android开发
安卓硬改一键新机工具,一键修改手机型号,串号网卡Imei、sn码【仅供学习参考】
声明部分:仅供学习参考使用,基于Xposed框架实现的设备信息伪装模块的完整代码,包含多个功能模块:
|
8月前
|
编解码 自然语言处理 Java
安卓改机工具免root,一键过设备检测,串号SN码【jar即可实现】
本项目通过Hook系统API实现设备信息的拦截与修改,主要功能包括动态更改IMEI/SN等设备标识。核心技术基于Xposed框架(免Root可用VirtualXposed)
|
7月前
|
监控 Android开发 数据安全/隐私保护
批量发送短信的平台,安卓群发短信工具插件脚本,批量群发短信软件【autojs版】
这个Auto.js脚本实现了完整的批量短信发送功能,包含联系人管理、短信内容编辑、发送状态监控等功能
|
7月前
|
API 开发工具 Android开发
qq虚拟视频插件下载安装手机版, 安卓虚拟视频插件,替换摄像头工具
Xposed入口模块:拦截目标应用的相机调用‌23 Camera1 API处理:通过PreviewCallback替换视频流‌1 Camera2 API适
|
8月前
|
存储 JSON API
安卓ck提取工具,可提取手机cookie插件,AUTOJS即可实现
怎么用autojs提取手机端的CK?其实autojs是支持提取ck的但是他提取的不是浏览器的CK,二十他自身浏览器环境的c
|
8月前
|
Java Android开发
安卓手机硬改工具, 设备型号修改神器, 安卓硬改一键新机
通过Java创建可执行JAR来修改安卓设备信息。核心功能包括读取系统属性
|
12月前
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
1748 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了

热门文章

最新文章