当前位置 博文首页 > 技术杂谈:TensorFlow on Android:物体识别

    技术杂谈:TensorFlow on Android:物体识别

    作者:[db:作者] 时间:2021-06-03 08:54

    [运营专题]零预算引爆个人和企业品牌【原文链接】
    Selenium 自动化测试从零实战【原文链接】
    原来这样做,才能向架构师靠近【原文链接】
    Cordova App 打包全揭秘【原文链接】
    TensorFlow on Android:物体识别【原文链接】
    图解敏捷教练和 ScrumMaster【原文链接】

    说在前面:达人课是GitChat的一款轻阅读产品,由特约讲师独家发布。每一个课程你都可获得6-12篇的深度文章,同时可在读者圈与讲师互动交流。GitChat达人课,让技术分享更简单。进入我的GitChat

    这里写图片描述

    作者介绍

    付强,十余年从业经验,从 C 语言到 Web 开发,从微服务架构到移动端开发,涉猎范围很广。曾就职于趋势科技、诺基亚,在德国和硅谷的 Startups 工作过,现在从事物联网方向的创业。

    课程介绍

    本课程讲解如何在 Android 上面运行 TensorFlow,并利用基于 TensorFlow 的 Object Detection API 来实现一个可以识别静态图片中的物体的应用,并通过该过程让没有任何机器学习基础的读者了解机器学习在移动端的使用场景和流程,包括如何加载模型、如何准备输入数据、如何解析推理结果。完成本课程以后,还可以学习其他应用的课程。查看原文

    第01课:机器学习在移动应用现状

    深度学习、神经网络、人工智能应该是当下最火爆的字眼了,随着 AlphaGo 的一炮走红,仿佛人人都谈论着人工智能,说话不带 DL、CNN 这些字眼的就落伍了。

    各大巨头也纷纷在 AI 领域布局,目前比较流行的深度学习框架有:

    • 谷歌的开源深度学习框架 TensorFlow
    • Facebook 的开源深度学习框架 Torchnet
    • 百度的开源深度学习框架 Paddle
    • 源自伯克利的 Caffe
    • 基于 Theano/TensorFlow 的 Keras
    • ……

    当大家还在讨论人工智能、机器学习前景的时候,有几件有趣的事情发生了:

    1. Facebook 在 2016 年的时候发布了 Caffe2go,移动端的深度学习库;
    2. 2017年 Google IO 上面发布了 TensorFlow Lite,移动端的神经网络库;
    3. 腾讯优图开源了 ncnn,实现深度神经网络在移动端的落地。

    等一下,读者可能会感觉到有个问题:什么, 在移动端进行机器学习?机器学习不是应该需要海量的数据和计算资源吗(CPU/GPU)?移动设备的存储和计算能力能满足要求吗?在回答这个问题之前,来看看下面这一个场景:你需要完成一个人脸检测的 App 应用,但是你们公司没有机器学习的专家,怎么办?

    当然,这个难不倒大家,在这个时代最不缺的就是轮子了,各大平台都有开放的 API 共大家调用,比如:

    • Google Vision API
    • 腾讯优图
    • 百度人脸识别 API
    • Face++
    • 讯飞云平台人脸相关 API
    • ….

    使用开放的 API 有很多优点,比如:

    1. 不需要任何机器的学习的基础,对于小团队来说能够快速实现产品;
    2. 使用简单,只需要通过 HTTP 接口将图片和相关参数上送到服务器,就能马上得到结果;
    3. 能够及时的享受到大平台的海量数据和计算资源对识别模型的优化和修正。

    但是也有明显的缺点:

    1. 需要移动端能访问互联网,上传图片需要消耗流量较大,在弱网络环境下,特别是对一些物联网设备的限制比较大;
    2. API 调用需要付费,特别是为了实现 SLA 更需要付出额外的成本;
    3. 数据安全存在隐患,特别是人脸这样的敏感数据;
    4. 虽然云平台有海量计算资源,但是对于单独的 API 调用来讲,仍然存在一定时延,没法做到实时检测。

    现在让我们换一种思路来解决这个问题,以目前移动设备的存储和计算能力,是不可能实现在移动端进行模型训练的,当然也没有这个必要。 但是如果在服务端利用海量的数据和计算资源训练好模型,然后将训练好的模型部署到移动端,只利用移动端的计算能力来进行推理(Inference,记住这个术语,当和机器学习专家讨论的时候用到这个词,他们就会认为你是懂行的),可行吗?

    答案是当然可行了, 而且随着移动端计算能力的提升,这个将是机器学习在移动端落地的趋势,这也是各大巨头正在做的事情。


    开始学习

    坦白地说,机器学习的学习曲线是比较陡的,首先需要有一些编程知识和线性代数的基础;然后要学习一些算法并推导它们,SVM、线性回归、聚类算法等,学会如何评估学习结果、学会梯度下降的推导、学会各种提取特征的方法、PCA等;接着再去学习神经网络的概念、学会各种网络、如卷积神经网络等;开始准备数据,训练你自己的模型,最后再调上非常长时间的各种参数….

    机器学习是一个工具,一个可以用来解决现实问题的工具。如果想成为一个机器学习专家/科学家,上面的过程是必须的,因为你要成为一个制作工具的人。 但是等等,假设只是一个想使用机器学习这个工具来解决现实问题的普通工程师,该怎么办?

    回想一下当时是怎么从零学会 Web 编程的:

    1. 选一个框架,如 SSH、Rails、Django 等,照着模板依葫芦画瓢做一个项目;

    2. 有了整体的概念以后再去优化一下代码,学会一些 best practice;

    3. 研究框架,如读读实现代码;

    4. 研究 HTTP 协议,寻找可以调优的地方;

    5. 尝试写一个框架或者插件;

    6. 最后成为 Web 编程的专家。

    本课程正是遵循上述的流程,首先我们提一个现实问题,然后用开源的框架和模型来解决它,在这个过程中会了解机器学习的一些基本概念和流程(这样就可以在喝咖啡的时候和机器学习专家谈笑风声了),然后学会如何使用这种工具。在本系列课程的后面,还将学习如何从头训练一个属于你的独一无二的模型,将学习如何优化这个工具。最后再倒过头来去研究和推导神经网络的算法,剩下的就看你的了!

    要解决的问题

    先看一张图:

    enter image description here

    这个监控是不是很厉害?但是它的实现原理很简单的(过程依然很复杂):

    1. 用大量的带标记(图片上的是什么物体、处于什么位置)的图片数据来训练一个模型;
    2. 用这个模型来识别视频每一帧中的物体(人、汽车等);
    3. 将识别结果可视化(在物体周围画上边框和标签)。
      我们要做的是这个功能的第一步,在 Android 上面选取一张图片,识别图片中有哪些物体,并将识别结果可视化。完成了静态图片的识别,再扩展到实时识别视频中的每一帧就是非常简单的了。

    接下来我们就撸起袖子开始吧~

    下一篇

    课程内容

    第01课:机器学习在移动应用现状

    第02课:选择工具和资源

    第03课:Demo 展示和准备工作

    第04课:输入数据预处理和 Inference

    第05课:可视化推理结果

    第06课:看起来像个机器学习专家

    下一篇:没有了