android中的深度学习——快速风格迁移

简介: 本文首发于简书——何时夕,搬运转载请注明出处,否则将追究版权责任。被处理的图片最近学了近一个月半月的深度学习,所以想检验一下学习成果。正好毕设是图像处理APP的实现,所以就把快速风格迁移的前馈神经网络通过Tensorflow for Android移植到了APP上面,作为滤镜快速风格迁移的效果还挺不错,就是速度有点慢。

本文首发于简书——何时夕,搬运转载请注明出处,否则将追究版权责任。

被处理的图片

最近学了近一个月半月的深度学习,所以想检验一下学习成果。正好毕设是图像处理APP的实现,所以就把快速风格迁移前馈神经网络通过Tensorflow for Android移植到了APP上面,作为滤镜快速风格迁移的效果还挺不错,就是速度有点慢。可能和现在Android端的深度学习还不支持gpu有关吧。

1.关于MyPhotoShop

这是一个图片处理APP,里面使用了Opencv、深度学习、MVVM、Databinding、RxJava、各种设计模式等等,在后面一段时间我会写一系列博客来一步步剖析这个项目,希望大家能多多关注。

1.效果

素描风格

梵高星夜风格

2.项目相关

3.缺点

  • 1.没有组件化
  • 2.没有混淆
  • 3.有些地方抽象不够

2.深度学习和神经网络的基本概念

1.什么是深度学习

  • 1.AI--》机器学习--》深度学习,前面三个概念是递进的,简单来说深度学习是机器学习的一种,深度学习就是利用机器来学习很多数据,而机器学习又是实现AI的一种方式。
  • 2.在深度学习中有两个重要的东西:数据和神经网络。在深度学习中有两个重要的过程:训练和测试
    • 1.数据和网络:
      • 1.数据:我们想象一个简单的图片分类场景,我们有10000张已经被人工分好类的图片,每张图片都有一个正确的分类,比如猫、狗等等。
      • 2.网络:这里的神经网络我们可以想象成一个函数,我们的输入是一张图片,输出则是这张图片在每个分类下面的分数。也就是一个分数的数组。
    • 2.训练和测试:
      • 1.训练:在训练的时候我们会将图片集中的图片一次次的输入到神经网络里面去,然后会一次次得到该图片在每个分类下的分数,每当我们得出了一个分数数组之后我们可以计算当前的神经网络损失值(当前的网络准确率越高损失值越低),有了损失值,我们的目标就是降低损失值。了解导数的同学都知道我们可以通过求导损失值函数得到让损失值降低的梯度方向,然后反馈到神经网络中。就这样一次次的循环,让损失值降到最低。
      • 2.测试:当我们将神经网络训练到了一个最佳的状态,我们就可以将我们需要进行分类的图片,输入到神经网络中,得到最终神经网络对该图片分类的结果。
    • 3.总结:深度学习到底是怎么学习的呢?我们可以看见我们的训练数据是经过人的处理的,那么深度学习的过程就是将人的处理过程固化到我们的神经网络中,最终让神经网络来代替人工处理的过程。
    • 4.上面只是介绍深度学习的基本流程,如果要更深入的了解可以看这篇博客

2.什么是神经网络

我们在上一节中说到了,最终人处理数据的过程通过我们的训练被固化到神经网络中去了。下面我会简单介绍一下前面说到的神经网络

  • 1.还是在简单的图片分类场景:
    • 1.我们假设图片为x的大小为100 * 100(我们把图片平铺成为1 * 10000的矩阵),图片一共有10个分类。
    • 2.那么一个两层的神经网络就是这样的:y = x * w1 * w2(w1为 10000 * a的矩阵,w2为a * 10的矩阵),这里最终y就是一张图片在各个分类下的分数,式子中的乘法是矩阵乘法。
    • 3.当然层数更多的神经网络就是有更多的w,我们w1 和 w2中的a可以自己定义。
  • 2.解释一下y = x * w1 * w2:
    • 1.研究表明我们在看x这张图片的时候,我们会先看图片的轮廓,这里我们大脑中看图片轮廓的神经元就相当于w1
    • 2.看完轮廓之后我们会对这个图片中的东西有基本感觉,判断这张图片属于哪些类别,这里的类别就是x * w1的结果
    • 3.2中的结果会被输入大脑中下一层神经元,这里的神经元就相当于w2,经过w2之后我们就会输出一个结果这里就是y。
    • 4.当然人的神经元层数远比上面说到的多
  • 3.训练y = x * w1 * w2的过程以人做对比就相当于:我们有一堆图片给一个啥也不懂的小孩看,刚开始他肯定输出的结果都是错的,但是我们只要每次纠正一下他的错误,那么他脑袋中的神经元(w)就会不断的修改然后识别的准确率不断提高。

3.Android中的Tensorflow

这一节将会介绍如何在Android中使用已经训练好的神经网络

1.开始

本篇文章中,我只会以一个demo为例子进行讲解,前面提到的MyPhotoShop项目会另起一个专题进行剖析。

  • 1.demo地址:github地址
  • 2.引入Tensorflow:compile 'org.tensorflow:tensorflow-android:+'

2.Tensorflow中的概念

  • 1.图(graph):我们在前面讲解了一个神经网络是什么样子的,在Tensorflow中神经网络的每个神经元w都属于图中的一个节点,神经网络全部的节点就构成了一个有向无环图也就是Tensorflow的图的一部分。当然Tensorflow的图中除了神经网络的节点外,还有其他辅助的操作:比如图片解码、图片编码、图片预处理操作等等。我们举一个图的例子就是:图片a--》解码图片产生b--》处理b产生图片数据矩阵c(1 * 10000)--》c与w1(10000 * x)矩阵相乘产生d(1 * x)--》d与w2(x * 10)矩阵相乘产生e(1 * 10)--》选出e中值最大的分类,神经网络就判断图片a是这种分类的图片。
  • 2.节点(node):每个节点都是图的一部分,每个节点有:入参、出参、具体操作函数(比如矩阵乘法)、可能有神经元值w。
  • 3.TensorFlowInferenceInterface:一个Tensorflow中训练的上下文,在不同语言中名字不同。内部包含了一个训练中需要的全部实例。

3.demo代码讲解

我们本次demo中只涉及Tensorflow在Android中神经网络模型的使用,并不涉及训练的过程。原因有两个:1.移动端并不适合训练神经网络 2.Tensorflow for Android没有训练的API。

  • 1.我这次使用的神经网络是已经训练好的快速风格迁移网络
  • 2.对于模型我们的输入是:一张图片转化为的float类型的张量,大小为(1 * 800 * 600 * 3),输入节点的名字是padsss:0,这里的名字是在训练过程中定义的。
  • 3.对于这个模型我们的输出是:大小为(1 * 780 * 680 * 3)的float类型张量。输出节点的名字是squeezesss:0,名字也是在训练过程中定义的。
代码片段1
  • 4.我们看代码,先用RxPermission获取了一下权限,获取成功之后将assets中需要处理的图片写入到sd卡中一遍后面使用,进入make()方法
代码片段2
  • 5.将4中的图片读取到内存中
  • 6.以ARGB为例我们知道Bitmap中每个像素是以int十六进制储存像素的,类似这种形式FFFFFFFF,那么每两位就是一个通道的数值,上限是256。所以接下来就是将Bitmap中的像素值,转化为float类型的数组,数组大小是(800 * 600 * 3)。
  • 7.创建了一个TensorFlowInferenceInterface对象,入参是AssetManager和模型文件,这里就表示将神经网络在内存中建立起来
  • 8.输出一下每个节点的名字
  • 9.向神经网络中传入输入节点的名字、输入节点的数据、数据张量的维度
  • 10.运行神经网络,入参是输出节点的名字
  • 11.神经网络的运行时阻塞的,所以运行好了之后,就能获取数据了,这里将数据存入(780 * 580 * 3)的float数组中。
  • 12.将float数组重新整合成Bitmap的像素值,然后写入Bitmap中。

4.注意点

  • 1.demo运行的时候速度会比较慢,耐心等待一下
  • 2.我运行的设备是:小米mix2、Android8.0。其他设备可能会有问题,要么就是速度非常慢,还可能是cpu或者系统版本不支持。

4.总结

在Android中运行一个已经训练好的神经网络还是比较简单的,只要知道了输入输出,就像运行一个普通的函数那么简单。至于如何去训练一个神经网络,那就是另外的故事了,可以关注我的我学机器学习文集!里面会持续更新我学习机器学习的心得和体会。

相关文章
|
2月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
深度学习中的图像风格迁移
【9月更文挑战第26天】本文将探讨如何利用深度学习技术,实现图像风格的转换。我们将从基础的理论出发,然后逐步深入到具体的实现过程,最后通过代码实例来展示这一技术的实际应用。无论你是初学者还是有经验的开发者,都能在这篇文章中找到有价值的信息。让我们一起探索深度学习的奥秘吧!
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的迁移学习:从理论到实践
科技进步不断推动人工智能的发展,其中深度学习已成为最炙手可热的领域。然而,训练深度学习模型通常需要大量的数据和计算资源,这对于许多实际应用来说是一个显著的障碍。迁移学习作为一种有效的方法,通过利用已有模型在新任务上的再训练,大大减少了数据和计算资源的需求。本文将详细探讨迁移学习的理论基础、各种实现方法以及其在实际应用中的优势和挑战。
|
1月前
|
机器学习/深度学习 人工智能 TensorFlow
利用深度学习实现图像风格迁移
【8月更文挑战第73天】本文通过深入浅出的方式,介绍了一种使用深度学习技术进行图像风格迁移的方法。我们将探讨如何将一张普通照片转化为具有著名画作风格的艺术作品。文章不仅解释了背后的技术原理,还提供了一个实际的代码示例,帮助读者理解如何实现这一过程。
|
1月前
|
机器学习/深度学习 自然语言处理 计算机视觉
深度学习中的迁移学习技术
【10月更文挑战第11天】 本文探讨了深度学习中的迁移学习技术,并深入分析了其原理、应用场景及实现方法。通过实例解析,展示了迁移学习如何有效提升模型性能和开发效率。同时,文章也讨论了迁移学习面临的挑战及其未来发展方向。
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的迁移学习技术
本文探讨了深度学习中的迁移学习技术,分析了其在提高模型训练效率和效果方面的优势。通过对迁移学习的定义、原理和应用案例的详细阐述,展示了如何有效利用预训练模型解决实际问题。
80 6
|
2月前
|
机器学习/深度学习 算法 搜索推荐
利用深度学习实现图像风格迁移
【9月更文挑战第21天】本文将介绍一种使用深度学习技术,特别是卷积神经网络(CNN)和生成对抗网络(GAN)来实现图像风格迁移的方法。我们将探索如何将这些技术应用于艺术创作,以及它们如何影响现代视觉艺术的发展。
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
【机器学习】机器学习、深度学习、强化学习和迁移学习简介、相互对比、区别与联系。
机器学习、深度学习、强化学习和迁移学习都是人工智能领域的子领域,它们之间有一定的联系和区别。下面分别对这四个概念进行解析,并给出相互对比、区别与联系以及应用场景案例分析。
87 1
|
3月前
|
编译器 Android开发 开发者
Android经典实战之Kotlin 2.0 迁移指南:全方位优化与新特性解析
本文首发于公众号“AntDream”。Kotlin 2.0 已经到来,带来了 K2 编译器、多平台项目支持、智能转换等重大改进。本文提供全面迁移指南,涵盖编译器升级、多平台配置、Jetpack Compose 整合、性能优化等多个方面,帮助开发者顺利过渡到 Kotlin 2.0,开启高效开发新时代。
161 0
|
4月前
|
机器学习/深度学习 自然语言处理 算法
深度学习中的迁移学习应用与挑战
在现代深度学习应用中,迁移学习作为一种有效的模型训练技术,逐渐成为研究和实践中的热门话题。本文探讨了迁移学习的基本原理、常见应用领域以及面临的挑战。通过详细分析现有文献和实例,揭示了在不同领域应用迁移学习的潜力与限制,并探讨了未来可能的发展方向。 【7月更文挑战第15天】
120 4
|
4月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
使用Python实现深度学习模型:图像风格迁移与生成
【7月更文挑战第13天】 使用Python实现深度学习模型:图像风格迁移与生成
54 2