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

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

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

这个怎么运作

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

TensorFlow 图像识别代码 tensorflow图像分类_图像识别

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

训练与分类

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

我们正在重新训练的模型称为Inception v3,最初在2015年12月的论文“ 重新思考计算机视觉的Inception体系结构 ”中指定。

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

安装

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

第一个也是唯一的依赖性是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的系统,请在此后面附加:Z以允许容器访问目录。
  • --rm告诉Docker完成后删除容器。
  • -it附加我们的输入和输出以使容器具有交互性。
  • --name tensorflow给我们的容器名称tensorflow代替sneaky_chowderhead或任何随机名码头工人可能会选择我们。
  • tensorflow/tensorflow:nightly说运行nightly的图像tensorflow/tensorflow从码头工人集线器(公众形象资料库),而不是最新的 (默认情况下,最近建成/可用的图像)。 我们使用每晚而不是最新版本,因为(在撰写本文时) 最新版本包含一个破坏TensorBoard的错误 , 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: OK消息flower_photos.tgz: OK ,则文件不正确。 如果上述curl或sha1sum步骤失败,请在主机的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 
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进行,训练图像会自动分为几批训练,测试和验证数据集 。

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

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

INFO:tensorflow:Final test accuracy = 89.1 % ( N = 340 ) 
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 不 被 终止。

翻译自: https://opensource.com/article/17/12/tensorflow-image-classification-part-1