博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
了解如何使用TensorFlow对图像进行分类
阅读量:2529 次
发布时间:2019-05-11

本文共 7028 字,大约阅读时间需要 23 分钟。

算法和硬件性能方面的最新进展使研究人员和公司在图像识别,语音识别,推荐引擎和机器翻译等领域取得了长足的进步。 六年前, 中获得了首个 。 两年前,Google Brain团队发布了 ,巧妙地将深度学习应用于大众。 TensorFlow超越了许多用于深度学习的复杂工具。

借助TensorFlow,您将以强大的功能访问复杂的功能。 其强大的功能是TensorFlow的易用性。

在一个分为两部分的系列文章中,我将解释如何快速创建用于实际图像识别的 。 计算步骤是 和可部署执行帧一帧的视频分析和延长时间感知的视频分析。

这个怎么运作

我们在本教程中的目标是获取属于我们训练过的类别的新颖图像,并通过命令运行该图像,该命令将告诉我们该图像适合哪个类别。 我们将按照以下步骤操作:

  1. 标签是整理训练数据的过程。 对于花朵,将雏菊的图像拖到“雏菊”文件夹中,将玫瑰拖到“玫瑰”文件夹中,依此类推,以获取所需的多种不同花朵。 如果我们从不标记蕨类,则分类器将永远不会返回“蕨类”。 这需要每种类型的许多示例,因此这是一个重要且耗时的过程。 (我们将使用预先标记的数据开始,这将使速度更快。)
  2. 训练是当我们将标记的数据(图像)提供给模型时。 工具将获取随机的一批图像,使用该模型猜测每种图像中的花朵类型,测试猜测的准确性,然后重复进行直到使用大多数训练数据为止。 最后一批未使用的图像用于训练模型 。
  3. 是在新颖图像上使用该模型。 例如,输入: IMG207.JPG ,输出: daisies 。 这是最快,最简单的步骤,而且扩展规模小。

训练与分类

在本教程中,我们将训练图像分类器来识别不同类型的花朵。 深度学习需要大量的训练数据,因此我们需要大量的分类花朵图像。 值得庆幸的是,另一个善良的人在收集和排序图像方面做得非常出色,因此我们将使用经过排序的数据集和一个聪明的脚本,该脚本将采用现有的,经过充分训练的图像分类模型,并重新训练模型的最后一层正是我们想要的。 这种技术称为转移学习

我们正在重新训练的模型称为Inception v3,最初在2015年12月的论文“ ”中指定。

直到我们进行此培训(大约需要20分钟),Inception才知道如何讲雏菊。 这是深度学习的“学习”部分。

安装

提升机器感知力的第一步:在您选择的平台上 。

第一个也是唯一的依赖性是Docker。 许多TensorFlow教程就是这种情况(应该表明这是一种合理的开始方式)。 我也更喜欢这种安装TensorFlow的方法,因为它通过不安装大量依赖项来保持主机(笔记本电脑或台式机)干净。

引导TensorFlow

安装Docker后,我们准备启动TensorFlow容器进行培训和分类。 创建具有2 GB可用空间的硬盘驱动器上的工作目录。 创建一个名为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的系统,请在此以允许容器访问目录。
  • --rm告诉Docker完成后删除容器。
  • -it附加我们的输入和输出以使容器具有交互性。
  • --name tensorflow给我们的容器名称tensorflow代替sneaky_chowderhead或任何随机名码头工人可能会选择我们。
  • tensorflow/tensorflow:nightly说运行nightly的图像tensorflow/tensorflow从码头工人集线器(公众形象资料库),而不是最新的 (默认情况下,最近建成/可用的图像)。 我们使用每晚而不是最新版本,因为(在撰写本文时) 最新版本包含一个破坏的 , 是一个数据可视化工具,稍后我们会发现它很方便。
  • /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: OK消息flower_photos.tgz: OK ,则文件不正确。 如果上述curlsha1sum步骤失败,请在主机的local目录中手动下载并爆炸 ( SHA-1 checksum: db6b71d5d3afff90302ee17fd1fefc11d57f243f )。

现在将训练数据放置到位,然后下载并检查再训练脚本。

mv flower_photos.tgz local      
/
cd
local
curl
-O https:
// raw.githubusercontent.com
/ tensorflow
/ tensorflow
/ 10cf65b48e1b2f16eaa826d2793cb67207a085d0
/ 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
TypeError: not all arguments converted during string formatting Logged from file
tf_logging.py, line 82

随着retrain.py进行,训练图像会自动分为几批 。

在输出中,我们希望获得较高的“训练精度”和“验证精度”,以及较低的“交叉熵”。 有关这些术语的详细说明,请参见 。 预计培训将花费约30分钟,以了解现代硬件。

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

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

这表示我们有一个模型,可以在10个图像中有9个正确猜出给定图像中显示了5种可能的花朵类型中的哪一种。 您的准确性可能会因培训过程中的随机性而有所不同。

分类

使用另一个小脚本,我们可以将新的花朵图像提供给模型,并输出其猜测。 这是图像分类。

将以下内容另存为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%。 分数越高表示匹配的可能性越高。 请注意, 匹配项。 多标签分类 。

有关更多详细信息,请查看classify.py详细 。

的图形加载代码已损坏,因此我应用了graph_def = tf.GraphDef()等 。

借助零火箭科学和少量代码,我们创建了一个体面的花卉图像分类器,可以在现成的便携式计算机上每秒处理约五张图像。

在下周发布的本系列的第二部分中,我们将使用此信息来训练不同的图像分类器,然后使用TensorBoard进行深入研究。 如果您想尝试TensorBoard,保持这个容器通过确保运行 docker run 终止。

翻译自:

转载地址:http://dunzd.baihongyu.com/

你可能感兴趣的文章
ABAP CDS ON HANA-(10)項目結合して一つ項目として表示
查看>>
网站地址信息
查看>>
产品经理 - 登录 注册
查看>>
阶段3 2.Spring_01.Spring框架简介_03.spring概述
查看>>
阶段3 2.Spring_02.程序间耦合_1 编写jdbc的工程代码用于分析程序的耦合
查看>>
阶段3 2.Spring_01.Spring框架简介_04.spring发展历程
查看>>
阶段3 2.Spring_02.程序间耦合_3 程序的耦合和解耦的思路分析1
查看>>
阶段3 2.Spring_02.程序间耦合_5 编写工厂类和配置文件
查看>>
阶段3 2.Spring_01.Spring框架简介_05.spring的优势
查看>>
阶段3 2.Spring_02.程序间耦合_7 分析工厂模式中的问题并改造
查看>>
阶段3 2.Spring_02.程序间耦合_4 曾经代码中的问题分析
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_2 spring中的Ioc前期准备
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_4 ApplicationContext的三个实现类
查看>>
阶段3 2.Spring_02.程序间耦合_8 工厂模式解耦的升级版
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_6 spring中bean的细节之三种创建Bean对象的方式
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_3 spring基于XML的IOC环境搭建和入门
查看>>
阶段3 2.Spring_04.Spring的常用注解_3 用于创建的Component注解
查看>>
阶段3 2.Spring_04.Spring的常用注解_2 常用IOC注解按照作用分类
查看>>
阶段3 2.Spring_04.Spring的常用注解_5 自动按照类型注入
查看>>
阶段3 2.Spring_04.Spring的常用注解_7 改变作用范围以及和生命周期相关的注解
查看>>