如何使用TensorFlow追踪千年隼号

翻译 2017年11月09日 16:39:53

原文:Tracking the Millenium Falcon with Tensorflow
作者:Nick Bourdakos
译者:雁惊寒

摘要:本文以星球大战中的千年隼号为例,介绍了如何使用强大的PowerAI来进行对象检测。

1.png
活动中的自定义对象检测(完整视频地址

当前,大多数的大型科技公司(如IBM、Google、Microsoft和Amazon)都有自己的视觉识别产品。一些小公司也提供了类似的产品,如Clarifai。但是他们都没有提供对象检测API。

下面两张图片都使用了相同的Watson Visual Recognition默认分类器进行标记。不过,第一张图片首先通过了一个对象检测模型。

2.png

对象检测比视觉识别先进得多。但是如果想要进行对象检测,你就不得不自己动手了。

根据不同的使用情况,可能并不需要自定义对象检测模型。 TensorFlow的对象检测API提供了一些基于COCO数据集的不同速度和准确度的模型。

这是COCO模型可检测对象的完整列表:

3.png

如果想要检测不在此列表中的东西,则必须构建自己的自定义对象检测器。

标注图片

训练自己的模型需要做很多工作。需要收集大量的图像,并标注它们。标注包括指定对象坐标和相应的标签。对于包含两个钛战机的图像,标注的结果是这样的:

<annotation>
    <folder>images</folder>
    <filename>image1.jpg</filename>
    <size>
        <width>1000</width>
        <height>563</height>
    </size>
    <segmented>0</segmented>
    <object>
        <name>Tie Fighter</name>
        <bndbox>
            <xmin>112</xmin>
            <ymin>281</ymin>
            <xmax>122</xmax>
            <ymax>291</ymax>
        </bndbox>
    </object>
    <object>
        <name>Tie Fighter</name>
        <bndbox>
            <xmin>87</xmin>
            <ymin>260</ymin>
            <xmax>95</xmax>
            <ymax>268</ymax>
        </bndbox>
    </object>
</annotation>

针对星球大战模型,我收集了308个图片,每张图片包含了两到三个对象。我建议针对每个对象找出的200-300个样本图片。

我们是否需要为这几百张图片写一大推的xml呢?

当然不用!有很多标注工具,比如labelImgRectLabel。我使用的是RectLabel,但它只能在macOS上使用。不过,还是有很多工作要做的。我花了大约三四个小时的时间来标注整个数据集。创建标注时,请将其导出为PASCAL VOC格式。

在运行脚本准备数据之前,还需要做一些设置工作。

克隆代码库

这里克隆代码库。目录结构如下所示:

models
|-- annotations
|   |-- label_map.pbtxt
|   |-- trainval.txt
|   `-- xmls
|       |-- 1.xml
|       |-- 2.xml
|       |-- 3.xml
|       `-- ...
|-- images
|   |-- 1.jpg
|   |-- 2.jpg
|   |-- 3.jpg
|   `-- ...
|-- object_detection
|   `-- ...
`-- ...

这里已经包含了所有的训练数据,开箱即用。但是如果要用自己的数据创建模型,那么需要将你自己的训练图像添加到images目录中,将XML标注添加到annotations/xmls目录中,然后更新trainval.txtlabel_map.pbtxt

trainval.txt是一个文件名列表,用于查找和关联JPG和XML文件。下面的trainval.txt列表让我们可以找到abc.jpgabc.xml123.jpg123.xmlxyz.jpgxyz.xml

abc
123
xyz

注意:请确保JPG和XML文件的文件名除了扩展名之外是一样的。

label_map.pbtxt是我们要检测的对象列表。内容是这样的:

item {
  id: 1
  name: 'Millennium Falcon'
}

item {
  id: 2
  name: 'Tie Fighter'
}

运行脚本

首先,安装Python和pip,并安装脚本需要的组件:

pip install -r requirements.txt

PYTHONPATH中加入modelsmodels/slim

export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

重要提示:每次打开终端后都要运行一遍,或者添加到~/.bashrc文件中。

运行脚本:

python object_detection/create_tf_record.py

脚本运行结束之后,将会得到train.recordval.record文件。我们将用这两个文件来训练模型。

下载模型

即使使用多个GPU,从头开始训练对象检测器也可能需要数天的时间。为了加速训练,我们将采用一个在不同数据集上训练过的对象检测器,并重新设置它的一些参数来初始化我们的新模型。

你可以从这个模型集市上下载模型。每个模型的准确性和速度都不一样。我使用的是faster_rcnn_resnet101_coco

把所有的model.ckpt文件提取出来并复制到代码库的根目录。

faster_rcnn_resnet101.configfaster_rcnn_resnet101_coco模型的配置文件。如果使用另一个模型,则可以在这里找到相对应的配置文件。

准备训练

运行下面的脚本,训练开始了!

python object_detection/train.py \
        --logtostderr \
        --train_dir=train \
        --pipeline_config_path=faster_rcnn_resnet101.config

注意:pipeline_config_path替换为配置文件实际的路径。

global step 1:
global step 2:
global step 3:
global step 4:
...

好极了!开始运行了!

10分钟后。

global step 41:
global step 42:
global step 43:
global step 44:
...

电脑开始冒烟了

global step 71:
global step 72:
global step 73:
global step 74:
...

这东西要运行多久呢? 视频中使用的模型要运行22000步。如果使用的是MacBook Pro,假设每15秒左右完成一步,以这样的速度,大约需要三到四天的时间才能获得一个差不多的模型。太费时间了!!!

救世主PowerAI强势出击!

PowerAI

PowerAI让用户可以在配置了P100 GPU的IBM Power Systems上快速训练模型!

大概只用了一个小时的时间就训练了一万步。不过,这只用了一个GPU。 PowerAI的真正威力是能够以高达95%的效率在数百个GPU上进行分布式的深度学习。

在PowerAI的帮助下,IBM创造了在7个小时内识别一张新图像达到33.8%准确率的记录。它超过了微软以前的行业纪录,在10天内达到29.9%的准确率。

太快了!

创建一个Nimbix账号

Nimbix为开发者提供了在PowerAI平台上免费处理十个小时的试用帐户。你可以在这里进行注册。

注意:这个过程不是自动的,所以可能需要24小时才能审批通过。

申请通过后,你将收到一封电子邮件,其中包含有关确认和创建帐户的说明。

现在,你可以在这里登录了。

部署PowerAI Notebooks应用

首先搜索PowerAI Notebooks

4.png

点击,然后选择 TensorFlow

5.png

选择机器类型:32 thread POWER8, 128GB RAM, 1x P100 GPU w/NVLink (np8g1)

6.png

服务器开启,将显示以下仪表板面板。当服务器的Status变为Processing时,就可以访问服务器了。

点击(click to show)获取密码。

然后点击Click here to connect启动Notebook。

7.png

使用用户名nimbix和先前提供的密码进行登录。

8.png

开始训练

点击New下拉菜单并选择Terminal,打开一个新的终端窗口。

9.png

跳出一个熟悉的界面:

10.png

注意:该终端可能不能在Safari中运行。

训练的步骤与我们在本地进行训练的步骤相同。如果你使用我的训练数据,那么可以克隆我的代码库:

git clone [https://github.com/bourdakos1/Custom-Object-Detection.git](https://github.com/bourdakos1/Custom-Object-Detection.git)

然后cd进入根目录:

cd Custom-Object-Detection

运行下面这个命令,下载我们之前提到的预先训练好的faster_rcnn_resnet101_coco模型。

wget [http://storage.googleapis.com/download.tensorflow.org/models/object_detection/faster_rcnn_resnet101_coco_11_06_2017.tar.gz](http://storage.googleapis.com/download.tensorflow.org/models/object_detection/faster_rcnn_resnet101_coco_11_06_2017.tar.gz)
tar -xvf faster_rcnn_resnet101_coco_11_06_2017.tar.gz
mv faster_rcnn_resnet101_coco_11_06_2017/model.ckpt.* .

然后,再次设置PYTHONPATH,因为这是一个新的终端:

export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

最后运行训练命令:

python object_detection/train.py \
        --logtostderr \
        --train_dir=train \
        --pipeline_config_path=faster_rcnn_resnet101.config

下载模型

数据越多,则需要的步骤也越多。我的模型在接近4500步的时候非常稳定。然后,在大约20000步时达到峰值。我甚至做了20万步的训练,但是效果并不理想。

我建议每5000步左右下载一次模型,对其进行评估,以确保你的方向是正确的。

点击左上角的Jupyter徽标,打开Custom-Object-Detection/train

下载编号最大的model.ckpt文件。

  • model.ckpt-STEP_NUMBER.data-00000-of-00001
  • model.ckpt-STEP_NUMBER.index
  • model.ckpt-STEP_NUMBER.meta

注意:一次只能下载一个文件。

11.png

注意:完成后,请务必点击机器上的红色电源按钮。否则,记时不会停止,时间会继续走下去。

导出推理图

要在代码中使用模型,需要将检查点文件(model.ckpt-STEP_NUMBER.*)转换为推理图

将刚刚下载的检查点文件复制到代码库的根目录中。

然后运行这个命令:

python object_detection/export_inference_graph.py \
        --input_type image_tensor \
        --pipeline_config_path faster_rcnn_resnet101.config \
        --trained_checkpoint_prefix model.ckpt-STEP_NUMBER \
        --output_directory output_inference_graph

记住执行:

export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

这时,应该可以看到一个新的output_inference_graph目录和frozen_inference_graph.pb文件。这就是我们需要的文件。

测试模型

现在运行以下命令:

python object_detection/object_detection_runner.py

它会在test_images目录中的所有图像上运行output_inference_graph/frozen_inference_graph.pb中的对象检测模型,并将结果输出到output/test_images目录中。

结果

点击此处查看在“星球大战:原力觉醒”某个片段上运行模型后得到的结果。

相关文章推荐

机器学习的Hello Word——Softmax Regression识别手写数字

TensorFlow 核心概念: 计算表示为一个有向图(directed graph),或计算图(computation graph) 其中每一步运算操作(operation)作为一个节点(node)...
  • Suo_ivy
  • Suo_ivy
  • 2017年04月06日 20:43
  • 235

web 使网站在浏览器中全屏显示 fullscreen=yes

关于全屏(FullScreen)   很久以前,浏览器就已经有全屏的概念的了。IE的open方法中可以配置上FullScreen参数来让打开的页面全屏化。但是这不太好用,所以没成为主流。而且,全屏这...
  • unionz
  • unionz
  • 2016年07月29日 10:58
  • 2406

关于TensorFlow使用的ipython代码

  • 2017年11月06日 00:31
  • 385KB
  • 下载

福州茉莉花茶千年工艺传承

福州茉莉花茶千里挑一 千年工艺传承面临断档 2010-12-24 03:13:40 来源: 东南快报(福州)   (国家质检总局发布2009年第87号公告, 批准对“福州茉莉花茶”实施地理标志产品保护...

TensorFlow DNNRegressor的简单使用

  • 2017年06月02日 22:05
  • 300KB
  • 下载

OCP OCM 千年等到一回

再一次声明 【.】各位不要问这个可不可靠,也不要问我的公司是什么【.】 +++++++++++++++++++++++++++++++++++++++++++ 首先:为什么不要问可不可靠! 这是我们...

使用tensorflow实现线性支持向量机

  • 2017年11月11日 09:28
  • 1.22MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何使用TensorFlow追踪千年隼号
举报原因:
原因补充:

(最多只允许输入30个字)