深度学习算法与计算机硬件性能的发展,使研究人员和企业在图像识别、语音识别、推荐引擎和机器翻译等领域取得了巨大的进步。六年前,视觉模式识别领域取得了第一个超凡的成果。两年前,Google大脑团队开发了TensorFlow,并将深度学习巧妙的应用于各个领域。现在,TensorFlow则超越了很多用于深度学习的复杂工具。

利用TensorFlow,你可以获得具有强大能力的复杂功能,其强大的基石来自于TensorFlow的易用性。

在这个由两部分组成的系列中,我将讲述如何快速的创建一个应用于图像识别的卷积神经网络。

TensorFlow计算步骤是并行的,可对其配置进行逐帧视频分析,也可对其扩展进行时间感知视频分析。

本系列文章直接切入关键的部分,只需要对命令行和Python有最基本的了解,就可以在家快速地创建一些令你激动不已的项目。本文不会深入探讨TensorFlow的工作原理,如果你想了解更多,我会提供大量额外的参考资料。本系列所有的库和工具都是免费开源的软件。

工作原理

本教程旨在把一个事先被放到训练过的类别里的图片,通过运行一个命令以识别该图像具体属于哪个类别。步骤如下图所示:

标注:管理训练数据。例如花卉,将雏菊的图像放到“雏菊”目录下,将玫瑰放到“玫瑰”目录下等等,将尽可能多的不同种类的花朵按照类别不同放在不同的目录下。如果我们不标注“蕨类植物”,那么分类器永远也不会返回“蕨类植物”。这需要每个类型的很多样本,因此这一步很重要,并且很耗时。(本文使用预先标记好的数据以提高效率)

训练:将标记好的数据(图像)提供给模型。有一个工具将随机抓取一批图像,使用模型猜测每种花的类型,测试猜测的准确性,重复执行,直到使用了大部分训练数据为止。最后一批未被使用的图像用于计算该训练模型的准确性。

分类:在新的图像上使用模型。例如,输入:IMG207.JPG,输出:雏菊。这个步骤快速简单,且衡量的代价小。

训练和分类

本教程将训练一个用于识别不同类型花朵的图像分类器。深度学习需要大量的训练数据,因此,我们需要大量已分类的花朵图像。值得庆幸的是,另外一个模型在图像收集和分类这方面做得非常出色,所以我们使用这个带有脚本的已分类数据集,它有现成且完全训练过的图像分类模型,重新训练模型的最后几层以达到我们想要的结果,这种技术称为迁移学习。

我们重新训练的模型是Inception v3,最初是在2015年12月发表的论文“重新思考计算机视觉的Inception架构”中有做论述。

直到我们做了这个约20分钟的训练,Inception才知道如何识别雏菊和郁金香,这就是深度学习中的“学习”部分。

安装

首先,在所选的平台上安装Docker。

在很多TensorFlow教程中最先且唯一依赖的就是Docker(应该表明这是个合理的开始)。我也更喜欢这种安装TensorFlow的方法,因为不需要安装一系列的依赖项,这可以保持主机(笔记本或桌面)比较干净。

Bootstrap TensorFlow

安装Docker后,我们准备启动一个训练和分类的TensorFlow容器。在硬盘上创建一个2GB空闲空间的工作目录,创建一个名为local的子目录,并记录完整路径。

docker run -v /path/to/local:/notebooks/local --rm -it --name tensorflow 
tensorflow/tensorflow:nightly /bin/bash

下面是命令解析:

-v /path/to/local:/notebooks/local将刚创建的local目录挂载到容器中适当的位置。如果使用RHEL、Fedora或其他支持SELinux的系统,添加:Z允许容器访问目录。

--rm 退出时令docker删除容器

-it 连接输入输出,实现交互。

--name tensorflow将容器命名为tensorflow,而不是sneaky_chowderhead或任何Docker定义的随机名字。

tensorflow/tensorflow:nightly从Docker Hub (公共图像存储库)运行tensorflow/tensorflow的nightly 图像,而不是最新的图像(默认为最近建立/可用图像)。使用nightly图像而不是latest图像,是因为(在写入时)latest包含的一个bug会破坏TensorBoard,这是我们稍后需要的一个数据可视化工具。

/bin/bash指定运行Bash shell,而不运行系统默认命令。

训练模型

在容器中运行下述命令,对训练数据进行下载和完整性检查。

curl -O http://download.tensorflow.org/example_images/flower_photos.tgz
echo 'db6b71d5d3afff90302ee17fd1fefc11d57f243f  flower_photos.tgz' | sha1sum -c

如果没有看到“flower_photos.tgz”信息:说明文件不正确。如果上诉curl 或sha1sum步骤失败,请手动下载训练数据包并解压(SHA-1 校验码:db6b71d5d3afff90302ee17fd1fefc11d57f243f)到本地主机的local目录下。

现在把训练数据放好,然后对再训练脚本进行下载和完整性检查。

mv flower_photos.tgz local/
cd local
curl -O https://raw.githubusercontent.com/tensorflow/tensorflow/10cf65b48e1b2f16eaa82
6d2793cb67207a085d0/tensorflow/examples/image_retraining/retrain.py
echo 'a74361beb4f763dc2d0101cfe87b672ceae6e2f5  retrain.py' | sha1sum -c

确认retrain.py有正确的内容,你应该看到retrain.py: OK.。

最后,开始学习!运行再训练脚本。

python retrain.py --image_dir flower_photos --output_graph output_graph.pb 
--output_labels output_labels.txt

如果遇到如下错误,忽略它:

TypeError: not all arguments converted during string formatting Logged from file
tf_logging.py, line 82.

随着retrain.py 的运行,训练图像会自动的分批次训练、测试和验证数据集。

在输出上,我们希望有较高的“训练精度”和“验证精度”,以及较低的“交叉熵”。有关这些术语的详细解释,请参照“如何就新图片类型再训练Inception的最后一层”。在当前的硬件上的训练约30分钟。

请注意控制台输出的最后一行:

INFO:tensorflow:Final test accuracy = 89.1% (N=340)

这说明我们已经得到了一个模型:给定一张图像,10次中有9次可正确猜出是五种花朵类型中的哪一种。由于提供给训练过程的随机数不同,分类的精确度也会有所不同。

分类

再添加一个小脚本,就可以将新的花朵图像添加到模型中,并输出测试结果。这就是图像分类。

将下述脚本命名为 classify.py保存在本地local目录:

import tensorflow as tf, sys
 
image_path = sys.argv[1]
graph_path = 'output_graph.pb'
labels_path = 'output_labels.txt'
 
# Read in the image_data
image_data = tf.gfile.FastGFile(image_path, 'rb').read()
 
# Loads label file, strips off carriage return
label_lines = [line.rstrip() for line
    in tf.gfile.GFile(labels_path)]
 
# Unpersists graph from file
with tf.gfile.FastGFile(graph_path, 'rb') as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())
    _ = tf.import_graph_def(graph_def, name='')
 
# Feed the image_data as input to the graph and get first prediction
with tf.Session() as sess:
    softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')
    predictions = sess.run(softmax_tensor, 
    {'DecodeJpeg/contents:0': image_data})
    # Sort to show labels of first prediction in order of confidence
    top_k = predictions[0].argsort()[-len(predictions[0]):][::-1]
    for node_id in top_k:
         human_string = label_lines[node_id]
         score = predictions[0][node_id]
         print('%s (score = %.5f)' % (human_string, score))

为了测试你自己的图像,保存在local目录下并命名为test.jpg,运行(在容器内) python classify.py test.jpg。输出结果如下:

sunflowers (score = 0.78311)
daisy (score = 0.20722)
dandelion (score = 0.00605)
tulips (score = 0.00289)
roses (score = 0.00073)

数据说明了一切!模型确定图像中的花朵是向日葵的准确度为78.311%。数值越高表明匹配度越高。请注意,只能有一个匹配类型。多标签分类则需要另外一个不同的方法。

分类脚本中的图表加载代码已经被破坏,在这里,我用graph_def = tf.GraphDef()等作为图表加载代码。

利用零基础知识和一些代码,我们建了一个相当好的花卉图像分类器,在现有的笔记本电脑上每秒大约可以处理5张图像。

END

碧茂课堂精彩课程推荐:

1.Cloudera数据分析课;

2.Spark和Hadoop开发员培训;

3.大数据机器学习之推荐系统;

4.Python数据分析与机器学习实战;

详情请关注我们公众号:碧茂大数据-课程产品-碧茂课堂

现在注册互动得海量学币,大量精品课程免费送!

TensorFlow图像分类教程相关推荐

  1. GPU运行Tensorflow详细教程及错误解决

    GPU运行Tensorflow详细教程及错误解决 前提条件 配置GPU运行 确认是否成功配置 出现的错误及解决方案 前提条件 最重要的一点:CUDA与tensorflow的版本一点要对应,不然用不了! ...

  2. TensorFlow图像分类:如何构建分类器

    导言 图像分类对于我们来说是一件非常容易的事情,但是对于一台机器来说,在人工智能和深度学习广泛使用之前,这是一项艰巨的任务.自动驾驶汽车能够实时检测物体并采取相应必要的行动,并且由于TensorFlo ...

  3. Tensorflow快餐教程(12) - 用机器写莎士比亚的戏剧

    高层框架:TFLearn和Keras 上一节我们学习了Tensorflow的高层API封装,可以通过简单的几步就生成一个DNN分类器来解决MNIST手写识别问题. 尽管Tensorflow也在不断推进 ...

  4. tensorflow官方文档_开源分享:最好的TensorFlow入门教程

    如果一门技术的学习曲线过于陡峭,那么我们在入门时的场景往往是,一鼓作气,没入门,再而衰,三而竭.演绎一出从入门到放弃的败走麦城. 今天发现一个入门TensorFlow的宝藏,迫不及待的分享给大家.这个 ...

  5. 【tensorflow速成】Tensorflow图像分类从模型自定义到测试

    文章首发于微信公众号<与有三学AI> [tensorflow速成]Tensorflow图像分类从模型自定义到测试 这是给大家准备的tensorflow速成例子 上一篇介绍了 Caffe , ...

  6. tensorflow安装教程 win10环境

    tensorflow安装教程 win10环境 安装tensorflow花了一整个晚上的时间,几乎想放弃了,找了好几篇博客才找到成功安装的方法,下面跟大家分享一下. 一.查看是否安装过tensorflo ...

  7. windows下用pycharm安装tensorflow简易教程

    https://blog.csdn.net/heros_never_die/article/details/79760616 最近开始学习深度学习的相关知识,准备实战一下,看了一些关于tensorfl ...

  8. Tensorflow 入门教程

    Tensorflow 入门教程  http://tensornews.cn/ 深度学习发展史 特征工程 深度学习之激活函数 损失函数 反向传播算法 [上] 反向传播算法 [下] Tensorflow ...

  9. python3.7安装keras教程_Python3.7安装keras和TensorFlow的教程图解

    win10 Python3.7安装keras深度学习集成包 TensorFlow 和Ubuntu下安装keras 在win10下安装 安装时必须检查你的python是否为64位,32位不支持!!! 3 ...

最新文章

  1. 20135234mqy 实验四
  2. Kafka 顺序消费方案
  3. 使用思科路由器防御DDOS
  4. libtorch Tensor cannot be used as a tuple
  5. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 同时注入普通方法、静态方法、构造方法 )
  6. unity3d 大地图接壤_架空世界地图制作指南(六)气候带
  7. es6 --- 异步迭代生成器 Promise
  8. ip地址合不合法怎么看_到底醇基燃料合不合法呢?
  9. 性能调优从哪方面入手?
  10. 05-02 docker 安装与配置-CentOS
  11. Spring2.5事务配置的5种方法
  12. 教授先生带你学习链表:链表节点的删除与增添2
  13. 硬盘数据恢复——误删除卷数据恢复
  14. 华为模拟器eNSP配置DHCP自动分配IP地址
  15. 【Matplotlib】(二)图例legend
  16. Vue将HTML内容用打印机打印出来
  17. 网站维护需要做些什么?
  18. swagger换新UI
  19. docker 设备共享
  20. 经纬度差和米单位的换算

热门文章

  1. ovn 通过localnet端口连接外部网络
  2. android 分享到twitter,如何在android中直接分享http图片到twitter?
  3. Linux之文件切割
  4. c语言编译器下载 天天,简单C语言编译器(编译原理)
  5. 一文教你写出高效的软件测试用例!微信朋友圈动态发送为例
  6. 诺基亚6303c格式设置
  7. 湖南研几科技陈总受邀参观伊宅购集团考察交流
  8. 新手提问 请给为大哥指点迷津
  9. 2010南非世界杯小结贴
  10. 解决外部引用的js文件不能获取服务端组件的ClientID问题(c#)