TensorFlow图像分类教程

news/2025/3/22 0:18:58

深度学习算法与计算机硬件性能的发展,使研究人员和企业在图像识别、语音识别、推荐引擎和机器翻译等领域取得了巨大的进步。六年前,视觉模式识别领域取得了第一个超凡的成果。两年前,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数据分析与机器学习实战;

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

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


https://dhexx.cn/news/show-3787636.html

相关文章

《Web性能测试实战》“2006最受读者喜爱”十大开发类技术图书第12名

高兴的是上了榜,遗憾的是差两名没有进入前十。不过中文原创第一名也是不错的安慰,今年要继续努力。详情见:http://book.csdn.net/subject/2006pingxuan/ Java及相关类TOP1 .NET及相关类TOP1 操作系统及相关类TOP1 其他程序设计类TOP1Java2核…

功能测试用例设计

功能测试用例从单元测试开始,经过集成测试、系统测试,一直到最后的验收测试,功能测试始终都会涉及到,而且功能测试几乎是系统测试的核心内容,因此功能测试用例编写的是否成功,决定着最后测试结果的成败。功…

Python工具分析风险数据

1 引入工具–加载数据分析包 启动IPython notebook,加载运行环境: 2 数据准备 俗话说: 巧妇难为无米之炊。小安分析的数据主要是用户使用代理IP访问日志记录信息,要分析的原始数据以CSV的形式存储。这里首先要介绍到pandas.read_csv这个常用…

asp.net mvc脚手架代码生成工具

发现了一个asp.net 脚手架代码生成工具,它是一个免费的工具,自动生成asp.net mvc的CRUD页面,主要特性如下:Uses the LinqToSql data to generate source code.Ruby on Rails like CRUD pages creator with a single button click.Ruby on Rai…

数据分析5大软件Excel、SAS、R、SPSS、Python优势分析

工欲善其事,必先利其器。说起来道理大家都懂,只是到了要学习的时候就开始各种退缩。殊不知一款好的数据分析工具可以让你事半功倍,瞬间提高学习工作效率。 虽然数据分析的工具千万种,综合起来万变不离其宗。无非是数据获取、数据存…

黎怡兰(我的导师)谈2006年软件业自主创新

[实录]黎怡兰谈2006年软件业自主创新 http://fangtan.tom.com 2006年12月28日 13时23分Tom访谈 赵佶欢迎各位TOM网友光临TOM嘉宾访谈室,嘉宾已进入访谈现场,访谈即将开始,请TOM的各位网友稍候! 主持人:各位网友大…

Linux上hadoop和spark搭建记录

因玩票需要,使用三台搭建spark(192.168.1.10,192.168.1.11,192.168.1.12),又因spark构建在hadoop之上,那么就需要先搭建hadoop。历经一个两个下午,终于搭建完成,特记录如下。 点击此处添加图片说明文字 准备工作 1. j…

测试术语和常见问题

2.1 测试术语和常见问题对于测试人员而言,软件测试的一些概念就像算术中的“加、减、乘、除”一样,应该认真学习。本节主要介绍一些软件测试中常见的术语以及测试工作中经常遇到的一些问题,为后面深入地学习后面的内容打好基础。1、 …

java 设计模式 学习笔记(二)观察者模式

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖着都会收到通知并自动更新。 观察者模式,类图: 利用观察者模式,主题是具有状态的对象,并且可以控制这些状态…

2019年了,PHP已不再是当年那个“设计糟糕”的语言

PHP已死?在网上随便一查,你会发现很多人确实是这样认为的,许多开发者还表示已经将项目迁移到Python或者Node,甚至吐槽PHP如何糟糕,很多人看到这些回答,即便想学PHP,也会担心没有前途&#xff0c…