专栏名称: FlyAI
目录
相关文章推荐
51好读  ›  专栏  ›  FlyAI

如何用TensorFlow和Swift写个App识别霉霉?

FlyAI  · 掘金  ·  · 2018-05-22 01:54

正文

如何用TensorFlow和Swift写个App识别霉霉?

访问 flyai.club ,一键创建你的人工智能项目


github | https://github.com/sararob/tswift-detection

在很多歌迷眼里,尤其是喜欢乡村音乐的人,“霉霉”Taylor Swift是一位极具辨识度也绝对不能错过的女歌手。在美国硅谷就有一位非常喜欢 Taylor Swift 的程序媛 Sara Robinson,同时她也是位很厉害的 APP 开发者。喜爱之情难以言表,于是利用机器学习技术开发了一款iOS 应用,可以随时随地识别出 Taylor Swift~~~

不卖关子了,妹子开发的这款应用效果如下:


可以说是“捕捉”Taylor Swift 的神器了。

那么她是怎么做出的?她主要用了谷歌的 TensorFlow Object Detection API,机器学习技术以及 Swift 语言。用 Swift 识别 Taylor Swift,没毛病。下面我们就看看妹子是怎么操作的:

TensorFlow Object Detection API 能让我们识别出照片中物体的位置,所以借助它可以开发出很多好玩又酷炫的应用。之前有不少人用它来识别物体,但我(作者Sara Robinson——译者注)还是对人比较感兴趣,正好手头也有不少人物照片,所以就琢磨着搞个能识别人脸的应用。作为“霉霉”的死忠粉,当然是先做一款识别 Taylor Swift 的应用啦!

下面我会分享从收集“霉霉”照片到制作使用预训练模型识别照片的 iOS 应用的大体步骤:

  • 预处理照片:重新调整照片大小并打上标签,然后切分成训练集和测试集,最后将照片转为 Pascal VOC 格式

  • 将照片转为 TFRecords,输入 TensorFlow Object Detection API

  • 使用 MobileNet 在 CLoud ML Engine 上训练模型

  • 用 Swift 开发一个 iOS 前端,能用预训练模型识别照片

下面是整体的架构示意图:

虽然看着有点麻烦,其实也不是很复杂。

在我详细介绍每个步骤前,有必要解释一些后面会提到的技术名词。

TensorFlow Object Detection API:一款基于 TensorFlow 的框架,用于识别图像中的物体。例如,你可以用很多猫咪照片训练它,训练完后如果你给它展示一张有猫咪的照片,它就会在它认为照片有猫咪的地方标出一个矩形框。

不过,训练识别物体的模型需要花费很长时间和很多数据。幸好 TensorFlow Object Detection 上有 5 个预训练模型,可以很方便的用于迁移学习。什么是迁移学习呢?打个比方,小孩子在刚开始学说话时,父母会让他们学习说很多东西的名字,如果说错了,会纠正他们的错误。比如,小孩第一次学习认识猫咪时,他们会看着爸妈指着猫咪说“猫咪”。这个过程不断重复就会加强他们大脑的学习路径。然后当他们学习怎么认出狗狗时,小孩就不需要再从头学习。他们可以利用和认出猫咪相同的识别过程,但是应用在不同的任务上。迁移学习的工作原理也是如此。

我虽然没时间找几千张标记了 Taylor Swift 名字的照片,然后训练一个模型,但是我可以利用从 TensorFlow Object Detection API 中预训练模型里提取出的特征,这些模型都是用几百万张图像训练而成,我只需调整模型的一些层级,就能用它们完成具体的图像识别任务,比如识别 Taylor Swift。

第一步:预处理照片

首先我从谷歌上下载了 200 张 Taylor Swift 的照片,然后将它们分成两个数据集:训练集和测试集。然后给照片添加标签。测试集用于测试模型识别训练中未见过的照片的准确率。为了让训练更省时一些,我写了个脚本重新调整了所有照片的大小,确保全部照片宽度不超过600px。

因为 Object Detection API 会告诉我们物体在照片中的位置,所以不能仅仅把照片和标签作为训练数据输入进去而已。你还需要输入一个边界框,可以识别出物体在照片中的位置,以及和边界框相关的标签(在我们的数据集中,只用到一个标签:tswift,也就是 Taylor Swift)。

为了给我们的照片生成边界框,我用了 Labelling,这是一个 Python 程序,能让你输入标签图像后为每个照片返回一个带边界框和相关标签的 xml 文件(我整个早上都趴在桌子上忙活着用 Labelling 给 Taylor Swift 的照片打标签,搞得从我旁边路过的人都以关爱智障的眼神望着我)。

最后我在每张照片上定义了一个边界框以及标签 tswift,如下所示:

Labelling 生成 xml 文件的过程如下所示:

<annotation>
 <folder>Desktop</folder>
 <filename>tswift.jpg</filename>
 <path>/Desktop/tswift.jpg</path>
 <source>
  <database>Unknown</database>
 </source>
 <size>
  <width>1000</width>
  <height>667</height>
  <depth>3</depth>
 </size>
 <segmented>0</segmented>
 <object>
  <name>tswift</name>
  <pose>Unspecified</pose>
  <truncated>0</truncated>
  <difficult>0</difficult>
  <bndbox>
   <xmin>420</xmin>
   <ymin>80</ymin>
   <xmax>582</xmax>
   <ymax>291</ymax>
  </bndbox>
 </object></annotation>

现在我手中的照片有了边界框和标签,但是还需要把它们转成 TensorFlow 接受的格式—— TFRecord,图像的一种二进制表示形式。我根据 GitHub 上的一个代码库( https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/using_your_own_dataset.md )写了一个脚本完成这个工作。我的脚本代码地址: https://github.com/sararob/tswift-detection/blob/master/convert_to_tfrecord.py

如果你想用我的脚本,你需要克隆 tensorflow/models 代码库到本地( https://github.com/tensorflow/models ),打包Object Detection API:

# From tensorflow/models/research/
python setup.py sdist
(cd slim && python setup.py sdist)

现在我们可以运行 TFRecord 脚本了。运行如下来自 tensorflow/models/research 目录的命令,输入如下标志(运行两次,一次用于训练数据,一次用于测试数据):

python convert_labels_to_tfrecords.py \--output_path=train.record \ 
--images_dir=path/to/your/training/images/ \--labels_dir=path/to/training/label/xml/

第二步:在 Cloud ML Engine 上训练 Taylor Swift 识别器

我其实也可以在自己的笔记本上训练模型,但这会很耗时间。我要是中途用电脑干点别的,训练就得被迫停止。所以,用云端最好!我们可以用云端训练我们的模型,几个小时就能搞定。然后我用了 Cloud ML Engine 训练我的模型,觉得比用自己的 GPU 都快。

设置 Cloud ML Engine

在所有照片都转为 TFRecord 格式后,我们就可以将它们上传到云端,开始训练。首先,我在 Google Cloud 终端上创建一个项目,启动 Cloud ML Engine:







请到「今天看啥」查看全文