在 TensorFlow 众多功能和工具中,有一个名为 TensorFlow 目标检测 API 的组件。这个库的功能正如它的名字,是用来训练神经网络检测视频帧中目标的能力,比如,一副图像。

需要查看我之前的工作的话,点击这里,我解释了在安卓设备上采用 TensorFlow 识别皮卡丘的整个过程。此外,我也介绍了这个库和它的不同架构及其各自特点,以及演示如何使用 TensorBoard 评估训练过程。

数月之后,我开始着手优化我之前训练的检测比卡丘的模型,目的是直接使用 Python、OpenCV、以及 TensorFlow 来检测视频中的目标。源代码可以从我的 GitHub 中获取。

比卡丘

这篇文章就是解释我所使用的步骤。首先,我会描述我在最初的模型中发现的问题,以及我是如何优化的。然后,我会讲解如何使用这个新的经过优化的模型,我组建了一个视频检测系统。最后,你将会看到两段检测多个比卡丘的视频。

但开始之前,这里有一个简短的 gif,显示了一些快速检测。

比卡丘被检测到

这就是比卡丘

模型优化

如上面所述,在以前的工作中,我对比卡丘检测模型做了初始的训练,这个模型的目的是在安卓设备或 Python notebook 上进行皮卡丘检测。然而,我对这个模型的性能并不安全满意,这促使我优化这个系统,因此,写下了这篇文章。

我当时主要关心的是用于构建这个系统的比卡丘数量,230 个。其中 70% 用于训练,而剩余 30% 用于测试。所以,用于训练的数量不多,虽然这在技术上不是问题(因为模型是在执行「okayish」),但我在训练集里增加了 70 张图片(总数依然不是很多,不过总比没有要好)。

结果是,由于我现在拥有更多的图片,我不得不扩展这个模型的训练,而不是从零开始。我使用了早期模型的训练检查点,然后从检查点开始继续进行;前者训练了 15000 次,而新的则训练了 20000 次。下面两幅图表显示了总体的损失和精度 (从 TensorBoard 中获得);很明显,从 15000 次到 20000 次没有太多改变(特别是在损失方面)。

损失

精度

我做的最后一个(也是小的)修正是修改了 Android 应用的检测阈值。默认值是 0.6,增加到 0.85。

这个优化改变了什么吗? 即使将我的确认偏差放在一边,我也会说,是的。我注意到了一个细小的优化。我注意到的最大变化是,Android 应用中误报的数量有所减少,因为那些物体看起来像黄色的斑点;当然,这可能也是因为阈值增加了。

现在,使用最新的和优化后的模型,在视频中检测比卡丘。继续之前,我需要说明,我将忽略模型冻结和导入的整个过程,因为我之前的工作中已做了解答。

从视频中检测

从视频中进行目标检测并不像听到的那么困难或奇特。从外行角度,我们可以讲视频是一组按顺序排列的图像,所以从视频中进行目标检测和在正常图像中进行检测是非常相似的。为什么非常相似?好吧,由于视频的性质,在将视频输入检测模型之前,视频帧的处理和准备需要多个步骤。我将在下面的章节中将对此做出解释,另外在解释下检测过程,以及如何创建一个新的视频来显示它们。

我的大部分代码都是基于 TensorFlow 目标检测 repo 提供的 Python notebook 实现的。这些代码完成了大部分困难的工作,因为它包括很多功能,可以简化检测过程。我建议你可以看下我的 Script,并作为你阅读下面这几个段落的指导。

从高层视角看,这段代码包括三个主要任务:

加载资源

首先,必须加载冻结的模型、数据标签和视频。为简单起见,我推荐了一个简短、中等大小的视频,因为处理完整部电影需要很多时间。

遍历视频

这个脚本的主要功能是基于一个循环,遍历视频的每一帧。每次遍历过程中,读取帧,并改变其色彩空间。接着,执行实际检测过程,就是寻找所有那些漂亮的黄色皮卡丘。结果是,返回皮卡丘所在位置的边界坐标(如果找到的话)和检测结果的置信度。随后,只要置信度高于给定的阈值,将会创建一个视频帧的副本,其中包含了皮卡丘位置的边界框。对于这个项目,我设置的置信度阈值非常低,20%,因为我发现检测误报数很低,所以决定冒性能的风险来检测到更多的皮卡丘。

创建新的视频

在前面的步骤中,使用新创建的帧副本重新组成一个新的视频,这些帧携带了检测的边界框。为创建这个视频,需要用到 VideoWriter 对象,每次遍历时,帧的副本都会被写入这个对象(不含声音)。

结果和讨论

这两个视频显示了模型的运行过程:

第一个视频的检测非常好。尽管皮卡丘在整个视频中一直举着番茄酱瓶子,在大多数场景中这个模型都能探测到。另一方面,在时间 0:22 时有一个没有被检测到,此外,「大镰刀」(绿螳螂的样子)打碎了番茄酱瓶的镜头(0:40 到 0:44)是误报。

在第二个视频上,这个模型的性能并没有在第一个视频上表现的那么好,主要问题是视频中出现了两个皮卡丘的场景。这种情况下,模型貌似将两个皮卡丘作为一个来检测,而不是分别检测。一个明显的例子是在 0:13 的时候,两个皮卡丘在互相拍打 (悲伤的场景 :(,我知道)。

总结与回顾

在这篇文章中,我介绍了如何使用 TensorFlow 目标检测库在视频中检测比卡丘。文章开头,介绍了一些我之前的工作,使用模型的早期版本在安卓设备上进行目标检测。至于模型,尽管它做了该做的工作,但也有一些我想要解决的问题;这些优化使我完成了这个项目并建立了一个用于视频的检测模型。

新的模型如预想的那样工作。当然,或多或少也有一些不足之处,导致误判,或者没有检测到比卡丘,但模型还是完成了它应该做的工作。作为以后的工作方向,我会为训练集合增加更多不同角度的比卡丘图像。例如,侧视和后视图像,增加数据的多样性,以获得优异的性能。

感谢阅读。我希望这篇指导文章对你能有所帮助。

原文发布时间为:2018-06-5

本文来自云栖社区合作伙伴“雷锋网”,了解相关信息可以关注“雷锋网”。

用 TensorFlow 目标检测 API 发现皮卡丘!相关推荐

  1. 谷歌更新TensorFlow目标检测API

    去年谷歌发布了TensorFlow目标检测API[7],从那以后陆续添加了很多新特性,比如Neural Architecture Search[1]的模型学习,支持实例分割[8],在谷歌的超大数据集O ...

  2. tensorflow目标检测API实现

    tensorflow目标检测API实现(windows环境) 1下载Anaconda(https://repo.continuum.io/archive/Anaconda3-4.2.0-Windows ...

  3. tensorflow 目标检测API及jupyter notebook 虚拟环境配置

    环境 tensorflow == 2.8.0 win10 or linux 概要 目标检测项目的主要步骤如下: 搭建虚拟环境 采集图像并打标 训练 预测 模型的保存和转换 调优 项目部署 1. 搭建虚 ...

  4. Python 数据科学入门教程:TensorFlow 目标检测

    TensorFlow 目标检测 原文:TensorFlow Object Detection 译者:飞龙 协议:CC BY-NC-SA 4.0 一.引言 你好,欢迎阅读 TensorFlow 目标检测 ...

  5. 深度学习实战(七)——目标检测API训练自己的数据集(R-FCN数据集制作+训练+测试)

    TensorFlow提供的网络结构的预训练权重:https://cloud.tencent.com/developer/article/1006123 将voc数据集转换成.tfrecord格式供te ...

  6. TF2目标检测API

    作者|Ivan Ralašić 编译|VK 来源|Analytics Vidhya Tensorflow目标检测API(TF OD API)刚刚变得更好.最近,Google发布了tf od api的新 ...

  7. 【小应用】使用TensorFlow目标检测模型和OpenCV分析足球比赛

    文章目录 一.引言 二.步骤概述 三.深入探讨主要步骤 四.结论和参考   本文是翻墙阅读其他博客的翻译 一.引言   作为数据科学家,我们有机会对足球视频剪辑做一些分析,使用深度学习和opencv可 ...

  8. 实践操作:六步教你如何用开源框架Tensorflow对象检测API构建一个玩具检测器

    TensorFlow对象检测API是一个建立在TensorFlow之上的开源框架,可以轻松构建,训练和部署对象检测模型. 到目前为止,API的性能给我留下了深刻的印象.在这篇文章中,我将API的对象设 ...

  9. 如何使用TensorFlow对象检测API播放Quidditch

    by Bharath Raj 巴拉斯·拉吉(Bharath Raj) 如何使用TensorFlow对象检测API播放Quidditch (How to play Quidditch using the ...

最新文章

  1. javascript删除,添加元素
  2. Infinispan 10.0.0.Beta2 和 9.4.8 发布,分布式集群缓存系统
  3. python语言基础与应用章节七_专技天下Python语言基础与应用章节测试答案
  4. oracle - emctl start dbconsole
  5. Android root概念
  6. matlab基本矩阵运算,matlab的矩阵基本运算问题已知A=[a,b,c;d,e,f;h,I,j],B=[l,m,n;x,y,z;q,o,p]...
  7. c语言将链表写入二进制文件_通过逐级遍历将二进制树转换为单链表的C程序
  8. 机器学习算法 随机森林学习 之决策树
  9. MySQL性能调优与架构设计——第11章 常用存储引擎优化
  10. python a和b字符串和占位符输出_python格式化输出
  11. 力扣-409 最长回文串
  12. 通用各类数据库密码字典
  13. python概率分析_请问如何通过Python做R*C列表的Fisher确切概率分析?
  14. TrueNAS静态IP设置
  15. YOLOv3在Intel Realsense上的Python实现(未实现)
  16. 【jdk1.8特性】之Optional
  17. Qemu gdb 调试 Liteos realview-pbx-a9 工程
  18. 怎么查看自己的电脑是几位操作系统?
  19. java图形化Swing教程(一)
  20. 安全篇 ━━ 整改php和IIS(根据安全等级保护评估、渗透测试报告)

热门文章

  1. [C#] Delegate, Multicase delegate, Event
  2. Object类型转换为long或者Long
  3. 0x01 念念Python,必有回响
  4. struts2.1.6教程七、国际化
  5. TotoiseSVN的基本使用方法
  6. 利用nginx-status监控nginx服务器状态
  7. ASP.NET中前台javascript与后台代码调用
  8. DNS枚举工具DNSenum
  9. Unity 2D游戏开发教程之精灵的死亡和重生
  10. 服务器文件数量监控,服务器监控指标有哪些?好文章一定要收藏