使用TensorFlow一步步进行目标检测(1)

目标检测(Object Detection)是人工智能最基础的应用,不论是我们常见的人脸识别,还是高大上的自动驾驶,都离不开目标检测。要从一幅复杂的画面中识别出物体或人物,需要复杂的算法,想想就觉得深奥,不过好在有TensorFlow这样的框架,具有强大的目标检测API,让没有机器学习背景的人也可以快速构建和部署功能强大的图像识别软件。

image

本系列文章就是来探讨如何借助TensorFlow深度学习框架来构建目标检测软件。

回顾我之前写的系列文章<<一步步提高手写数字的识别率>>,Tensorflow实现机器学习算法的一般流程为:

  1. 加载数据集
  2. 定义算法公式,也就是前向计算的计算图
  3. 定义损失函数(loss function),选定优化器,并指定优化器优化损失函数
  4. 对数据进行迭代训练
  5. 在测试集或交叉验证数据集上进行准确率评估。

不过在实际项目中,我们可能会走一些捷径,其原因在于:

  1. 训练模型需要大量数据,通常情况下我们没有那么多有效的数据,特别是标注好的数据。
  2. 训练模型需要耗费大量的时间进行调参,为了获得一个满意的参数,可能需要反复尝试。

回想之前提到的迁移学习(transfer learning),我们可以采用一种策略:在预训练模型的基础上,使用自有数据对模型进行训练和调优。TensorFlow也支持这种流程,具体说来,有一个TensorFlow模型集市,上面有各种各样预训练的机器学习模型,用来解决各种各样的共性问题。开发者可以根据自身需要,下载模型。如果自身的问题域和模型问题域匹配度非常高,就可以直接使用模型。如果不完全一致,可以在下载模型的基础上,使用自己的数据改进模型,这比自己从头训练要高效得多。

将思维发散一点,将来一定会出现机器学习模型商店,大的公司和研究机构可以将预训练模型放到商店中,开发者可以根据需要购买模型,将精力集中在业务上,从而形成一个良性的生态。

回到文章主题,本文将创建一个交通信号灯分类器,它将尝试确定灯是绿色、黄色还是红色。内容包括选择模型、适配数据集、创建和标注你自己的数据集、修改模型配置文件、训练模型、保存模型,以及最后在软件中部署模型。

因为我的主要工作环境是Ubuntu,所以文章中都是以Ubuntu 16.04为例进行说明,不过TensorFlow和Python都具有良好的移植性,如果你使用的是Windows或MacOS,理论上只需稍作修改,即可工作。

选择模型

github上有TensorFlow模型集合,可以通过简单的命令获得这些预训练的模型:

git clone https://github.com/tensorflow/models.git

该仓库中包含多个TensorFlow模型,主要分为如下几大类:

  1. 官方模型(official目录)是使用TensorFlow的高级API的示例模型的集合,它们得到良好的维护,支持最新稳定API,经过了充分的测试,并进行过优化,是TensorFlow用户的首选。 我们特别推荐新的TensorFlow用户从这里开始。

  2. 研究模型(research目录)是研究人员在TensorFlow中实施的模型,它们没有得到官方支持,也不能保证在后续的TensorFlow发布版本中工作,带有一些研究性质。考虑到深度学习的快速发展,一些最新的研究成果不会出现在官方模型中,经常来这里找找,说不定有惊喜。

  3. samples文件夹包含代码片段和较小的模型,用于演示TensorFlow的功能,包括各种博客文章中提供的代码。

  4. tutorials文件夹是TensorFlow教程中描述的模型集合。

每个模型下面都有README,其中包含安装说明。我们先浏览一下official下的模型,并没有我们所需要的,再来看research目录,里面有一个object_detection子目录,这里面有我们所需的目标检测模型。

object_detections目录下的内容相当多,有数据集、模型文件、测试代码、示例等等,模型文件位于models子目录下,里面的模型也真不少:

image

查看下表,选择所需的与需求匹配的模型,这里只列出了一小部分模型。其中mAP代表平均精度,表示模型在COCO数据集上的执行情况。通常,计算时间更长的模型表现更好。然而,这些模型也有许多细微差别(例如小物体的性能),如果你想了解它们的优点和缺点,你需要阅读对应的论文。

image

详细的模型评估还可以参考research/object_detection/g3doc/detection_model_zoo.md文档。你如果想要认真评估模型在你的数据集上的效果,还可以使用测试代码测试模型。

测试模型

在research/objection_detection/ 文件夹中,打开 object_detection_tutorial.ipynb并运行之(具体方法请Google搜索Jupyter Notebook)。

此时,你应该有一些要分类的样本图像。将它们放在tests_images文件夹中,并将它们命名为image3.jpg、image4.jpg、imageN.jpg等。修改notebook中的如下代码行:

TEST_IMAGE_PATHS = [ os.path.join(PATH_TO_TEST_IMAGES_DIR, 'image{}.jpg'.format(i)) for i in range(1, N+1) ]

其中N是文件夹中的图像的最后一个数字。当我用3个样本交通灯图像测试时,我得到了以下结果:

image

正如上图所示,模型能够对第一张图像中的信号灯进行识别,但无法识别第二张图像中的信号灯。

示例中的默认模型是TensorFlow提供的最简单(也是最快)的预训练模型。要测试新模型,只需将jupyter notebook中的MODEL_NAME替换为指定模型。我最终选择了R-FCN模型,该模型在我的样本图像上产生了以下结果。

image

下一篇文章将展示如何将现有数据库转换为TensorFlow记录文件,这样可以使用它来重新训练模型。

参考
  1. Step by Step TensorFlow Object Detection API Tutorial — Part 1: Selecting a Model

image

  • 6
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云水木石

但行好事,莫问前程

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值