本文共 7028 字,大约阅读时间需要 23 分钟。
算法和硬件性能方面的最新进展使研究人员和公司在图像识别,语音识别,推荐引擎和机器翻译等领域取得了长足的进步。 六年前, 中获得了首个 。 两年前,Google Brain团队发布了 ,巧妙地将深度学习应用于大众。 TensorFlow超越了许多用于深度学习的复杂工具。
借助TensorFlow,您将以强大的功能访问复杂的功能。 其强大的功能是TensorFlow的易用性。
在一个分为两部分的系列文章中,我将解释如何快速创建用于实际图像识别的 。 计算步骤是 和可部署执行帧一帧的视频分析和延长时间感知的视频分析。
我们在本教程中的目标是获取属于我们训练过的类别的新颖图像,并通过命令运行该图像,该命令将告诉我们该图像适合哪个类别。 我们将按照以下步骤操作:
IMG207.JPG
,输出: daisies
。 这是最快,最简单的步骤,而且扩展规模小。 在本教程中,我们将训练图像分类器来识别不同类型的花朵。 深度学习需要大量的训练数据,因此我们需要大量的分类花朵图像。 值得庆幸的是,另一个善良的人在收集和排序图像方面做得非常出色,因此我们将使用经过排序的数据集和一个聪明的脚本,该脚本将采用现有的,经过充分训练的图像分类模型,并重新训练模型的最后一层正是我们想要的。 这种技术称为转移学习 。
我们正在重新训练的模型称为Inception v3,最初在2015年12月的论文“ ”中指定。
直到我们进行此培训(大约需要20分钟),Inception才知道如何讲雏菊。 这是深度学习的“学习”部分。
提升机器感知力的第一步:在您选择的平台上 。
第一个也是唯一的依赖性是Docker。 许多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
,则文件不正确。 如果上述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
如果遇到此错误,请忽略它:
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/