文 / Zhicheng Wang 和 Genzhi Ye,MediaPipe 团队

使用 KNIFT 匹配图像特征

许多计算机视觉应用都包含一个关键的构成要素:在物体或场景的不同视角之间建立可靠的对应关系,该对应关系为模板配准、图像检索和运动推断结构 (Structure from Motion, SfM) 等方法奠定基础。我们通常会通过从图像中提取独特的视角不变特征(如 SIFT 或 ORB)来计算对应关系。有了能够稳固建立这类对应关系的能力,我们即可利用图像拼接等应用来创建全景图或进行模板匹配,从而识别视频中的物体(见图 1)。

  • ORB
    https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_orb/py_orb.html#orb-in-opencv

今天,我们宣布推出 KNIFT(Keypoint Neural Invariant Feature Transform, 基于神经网络的关键点不变特征转换),一种类似于 SIFT 或 ORB 的通用局部特征描述符。同样地,KNIFT 还是代表局部图块的紧凑型向量,对均匀的缩放、方向和照明变化方面均保持恒定。然而,与采用启发式算法的 SIFT 或 ORB 不同,KNIFT 是一种嵌入向量,根据周围视频帧中提取的大量局部对应图块直接进行学习。这种数据驱动方法会以隐式方式对嵌入向量中遇到的复杂的真实空间转换和照明变化作出编码。因此,KNIFT 特征描述符看起来会更加稳定,其不仅能在消除仿射失真方面表现良好,还可在某种程度上减轻透视失真等问题。

  • SIFT
    https://www.cs.ubc.ca/~lowe/papers/ijcv04.pdf

  • 局部图块
    https://www.quora.com/What-is-a-patch-in-image-processing

下一节中,我们将展示 MediaPipe 中的一个 KNIFT 实现实例以及基于 KNIFT 的模板匹配演示,以帮助您入门。

图 1 使用 KNIFT 将实际的停车标志与停车标志模板进行匹配

训练方法

大致来说,机器学习中的训练嵌入向量等同于寻找可将高维向量(如图块)转变成较低维向量(如特征描述符)的映射。在理想情况下,这种映射应具备:在实际图像点周围的图块在不同的视角或照明变化中应具有相同或非常相似的描述符的属性。我们发现,真实生活中的视频是此类对应图块的理想来源。我们以这类图块为训练数据(见图 3 和图 4),并使用完善的 Triplet Loss 函数(见图 2)来训练这类嵌入向量。每个三元组均包含从对应图块中提取的锚点(用 a 表示)、正例(用 p 表示)和负例(用 n 表示)特征向量,d() 则表示特征空间中的欧氏距离。

图 2 Triplet Loss 函数

训练数据

训练用的三元组取自约 1500 个视频剪辑片段,所有片段均来自于可公开获取的 YouTube UGC 数据集 (https://media.withyoutube.com/)。

我们首先使用现有的启发式局部特征检测器来检测关键点,并以较高的准确率计算两帧之间的仿射变换(见图 4)。然后,我们利用此对应关系找到关键点对,并提取这些关键点周围的图块。请注意,新识别的关键点可在第一步检测出,但却未通过几何验证的那些点。对于每对已匹配的图块,我们随机应用某种数据增强方法(如随机旋转或亮度调节)来构造正样本对。最后,我们从另一段视频中随机选择一个任意图块作为负例,以完成此三元组的构建(见图 5)。

图 3 我们从中提取训练三元组的视频剪辑示例

图 4 使用现有的局部特征找到帧对应关系

图 5 (从上到下)锚点、正例图块和负例图块

挖掘困难负例三元组

为提升模型质量,我们使用 FaceNet 训练所用的相同方法来挖掘困难负例三元组 (Hard-negative Triplet)。首先,我们使用随机选择的三元组来训练基础模型。然后,我们执行一条流水线,以使用此基础模型找到每个正样本对的半难负例样本 (Semi-hard-negative samples, d(a,p) < d(a,n) < d(a,p)+margin)(见图 6)。在将随机选择的三元组与困难负例三元组混合后,我们使用优化数据重新训练模型。

  • FaceNet
    https://arxiv.org/pdf/1503.03832.pdf

  • 半难负例样本
    https://omoindrot.github.io/triplet-loss#triplet-mining

图 6 (从上到下)锚点、正例图块和半难负例图块

模型架构

在探索模型架构的过程中,我们发现相对较小的架构便足以取得良好的质量,因此我们选用轻量级 Inception 架构来作为 KNIFT 模型的主干。由此得到的 KNIFT 描述符是一个 40 维浮点向量。如需了解更多模型详情,请参阅 KNIFT 模型卡。

  • Inception 架构
    https://arxiv.org/pdf/1512.00567.pdf

  • KNIFT 模型卡
    https://mediapipe.page.link/knift-mc

基准

我们在不同设备上对 KNIFT 模型的推理速度进行了基准测试(计算 200 个特征),并在表 1 中列出了测试结果:

表 1 KNIFT 性能基准

在质量方面,我们在内部基准测试中比较了分别由 KNIFT 和 ORB(OpenCV 实现)匹配的关键点的平均数量(表 2)。可公开获取的图像匹配基准数不胜数(如 2020 年图像匹配基准),但其中多数基准都专注于在分辨率相对较高的图像中通过较大的视角变化来匹配地标,并且这类任务通常需要计算数千个关键点。与此相反,由于我们已经通过设计 KNIFT 在大型(即数十亿张图像)在线图像检索任务中匹配物体,因此我们将基准设计为专注于低成本和高精度驱动的用例,即在每个图像中计算 100 至 200 个关键点,并且只需匹配 10 个左右的关键点即可测定出可靠的匹配结果。此外,为了说明特征描述符的详细性能特性,我们按物体类型(例如 2D 平面)和图像对关系(例如大尺寸差异)对基准集进行了划分和分类。在表 2 中,我们根据 oFast 检测器(随附于 OpenCV 中的 ORB 实现)在每个图像中检测到的 200 个相同关键点位置,比较了每个类别中分别由 KNIFT 和 ORB 匹配的关键点的平均数量。

  • OpenCV 实现
    https://docs.opencv.org/master/db/d95/classcv_1_1ORB.html

表 2 KNIFT 与 ORB 匹配的关键点平均数量对比

表 2 中显示,在每个类别中,KNIFT 匹配的关键点数量始终大幅超过 ORB。坦白来说,KNIFT(40 维浮点)比 ORB(32 维字符)大得多,这可能会影响匹配质量。尽管如此,大多数局部特征基准并未考虑描述符的大小,因此我们会在这方面遵循惯例。

为便于开发者在 MediaPipe 中轻松尝试 KNIFT,我们已构建基于局部特征的模板匹配解决方案(请参阅下节中有关使用 MediaPipe 实现 KNIFT 的详情)。另外,我们可以通过横向比较(如图 7 和图 9)直观展示 KNIFT 和 ORB 之间的匹配质量。

图 7 “2D 平面匹配”示例:(左)KNIFT 183/240,(右)ORB 133/240

图 7 中,我们以 Google 图像搜索中选用常见的美国停车标志图作为模板,并尝试将其与本视频中的停车标志进行匹配。此示例属于表 2 中的“2D 平面匹配”类别。在使用 oFast 检测到的 200 个相同关键点位置和同样的 RANSAC 设置时,我们可以看到,KNIFT 能够从所有的 240 帧停车标志图像中成功匹配 183 帧。相比之下,ORB 仅能匹配 133 帧。

图 8 “3D 无纹理物体匹配”示例:不同视角下的两张模板图像

图 9 “3D 无纹理物体匹配”示例:(左)KNIFT 89/150,(右)ORB 37/150

图 9 展示了表 2 中“3D 无纹理物体匹配”类别下的另一组匹配性能比较示例。由于此示例是以变化较大的视角来观察无纹理表面,这为局部特征描述符带来了一定挑战,因此我们使用两个不同视角下的模板图像(如图 8 所示)来提升匹配性能。同样地,我们再次使用相同的关键点位置和 RANSAC 设置。最终结果表明,KNIFT 能够从所有的 150 帧图像中成功匹配 89 帧,而 ORB 仅能匹配 37 帧。

MediaPipe 中基于 KNIFT 的模板匹配

我们将发布 MediaPipe (https://mediapipe.dev/) 中基于 KNIFT 的模板匹配解决方案(如上所述),以帮助开发者识别预定义的图像模板,并在相机图像上精确定位所识别出的模板。模板匹配 MediaPipe 计算图中包含 3 个主要组件,如下所示:

  • FeatureDetectorCalculator:一种计算器,可使用图像帧并通过 OpenCV oFast 检测器检测输入图像,然后输出关键点位置。此外,该计算器还负责裁剪每个关键点周围的图块(附带旋转和缩放信息),然后会将这些图块堆叠到向量中,以供下游计算器进行处理。

  • 与 KNIFT 模型搭配使用的 TfLiteInferenceCalculator:一种计算器,可加载 KNIFT tflite 模型,并执行模型推理。输入张量的形状为 (200, 32, 32, 1),表示 200 个 32x32 局部图块。输出张量的形状为 (200, 40),表示 200 个 40 维的特征描述符。此计算器会默认运行 TFLite XNNPACK delegate,但用户也可选择以较低速度运行常规 CPU delegate。

  • BoxDetectorCalculator:一种计算器,可采用预先计算好的关键点位置和 KNIFT 描述符,并在当前帧和多个模板图像之间执行特征匹配。此计算器的输出结果为 TimedBoxProto 列表,包含每个方框的唯一 ID 和位置信息,且每个方框均以四边形标注于图像上。除了经典的单应 RANSAC 算法外,我们还应用透视变换验证步骤来确保输出的四边形不会产生过多倾斜或怪异形状。

  • 模板匹配解决方案
    https://github.com/google/mediapipe/tree/master/mediapipe/docs/template_matching_mobile_cpu.md

  • XNNPACK
    https://github.com/google/XNNPACK

图 10 MediaPipe 计算图演示

演示

在这段演示中,我们选用三种不同面额的美钞(1 美元、5 美元和 20 美元)作为模板,并尝试将其与视频中出现的各种真实美钞进行匹配。我们将每个输入帧的大小调整为 640x480 像素,并运行 oFast 检测器来检测 200 个关键点,然后使用 KNIFT 从这些关键点周围的各个 32x32 局部图块中提取特征描述符。之后,我们在这些视频帧和提取自美钞模板的 KNIFT 特征之间执行模板匹配。我们在 Pixel 2 手机 CPU(搭载 XNNPACK)上以 20 FPS 的帧率运行了这段演示。

图 11 使用 KNIFT 匹配不同的美钞

构建自己的模板

我们已在演示中提供了一组内置的平面模板。为便于用户轻松尝试自己的模板,我们还会提供相关工具,协助用户为生成的模板建立索引。index_building.pbtxt 是一个 MediaPipe 计算图,可支持输入包含一组模板图像的目录路径。用户可通过如下两种方法,并使用此计算图计算所有模板图像的 KNIFT 描述符(将存储于单个文件中):

  1. 替换主计算图和 BUILD 文件中的 index_proto_filename

  2. 重新构建 APK 文件。如需分步说明,并了解如何创建上文所示的美钞演示,请参阅此文档。

  • index_building.pbtxt
    https://github.com/google/mediapipe/tree/master/mediapipe/graphs/template_matching/index_building.pbtxt

  • 文档

    https://github.com/google/mediapipe/tree/master/mediapipe/docs/template_matching_mobile_cpu.md

致谢

我们在此感谢 Jiuqiang Tang、Chuo-Ling Chang、Dan Gnanapragasam、Howard Zhou、Jianing Wei 和 Ming Guang Yong 为本篇博文所作的贡献。

了解更多,请访问 MediaPipe 官方网站 (https://mediapipe.dev/)。

MediaPipe KNIFT:基于模板的特征配准相关推荐

  1. 一种基于模板匹配的图像配准方法

    01 前言 如下图所示,有时候参考图像与浮动图像的灰度区别很大,但是它们又有某一个小区域比较相似,这种情况下直接通过特征点匹配或形变优化来配准的效果并不理想. 这个时候我们可以尝试使用模板匹配的方法来 ...

  2. 时序分析:DTW算法(基于模板)

    对时序对象进行分析,使用KMP算法可以分析速率不变的模式,参考时序分析:欧式空间轨迹模式识别.使用基于模板匹配的方法,对于速率发生变化的模式,需要用新的对速率要求松散的方法,DTW方法为一种广泛使用的 ...

  3. 基于模板的文字识别结果结构化处理技术

    原文链接:https://cloud.tencent.com/developer/article/1425800 嘉宾 | 向宇波 编辑 | suiling 来源 | AI科技大本营在线公开课 出品 ...

  4. 基于模板匹配的知识图谱问答系统

    基于模板匹配的知识图谱问答系统 一,什么是基于知识图谱的问答(KBQA)? KBQA–knowledge base question answering,通过对问题进行语义理解及解析,通过知识库进行查 ...

  5. 基于模板的文字识别结果结构化处理技术 | 公开课速记

    嘉宾 | 向宇波 编辑 | suiling 来源 | AI科技大本营在线公开课 出品 | AI科技大本营(ID:rgznai100) 随着行业的发展和技术的成熟,文字识别(OCR)目前已经应用到了多个 ...

  6. 图像配准融合(一)——基于互信息的图像配准方法(c++)

    1.内容简介 图像配准方法按照其算法原理可以分为:基于灰度信息的配准.基于变换域信息的配准.基于特征信息的配准 (本人实验主要集中在基于灰度信息的配准以及基于特征信息的配准两类方法,对基于变换域信息的 ...

  7. 基于模板匹配和遗传算法的人眼定位

    基于模板匹配和遗传算法的人眼定位 余甜甜,唐普英(电子科技大学光电信息学院,四川成都6l0054) 摘要:文中提出了一种利用模板匹配与遗传算法相结合的人眼定位算法.根据人脸几何特征将人脸分为几个特征区 ...

  8. 基于模板配置的数据可视化平台

    导读:在大数据智能时代,数据分析的价值越来越重要,而数据分析可视化平台的能力要求也越来越高.本文从百度数据中心的数据可视化平台出发,介绍了配置化的数据可视化平台的应用价值,并对数据可视化平台的整体处理 ...

  9. 基于模板匹配的数字识别

    基于模板匹配的数字识别,将标准的8*16像素的数字0123456789读取,二值化,对每个数字进行等分区域分割,统计每个区域内的黑色像素点的个数,即为特征初值.采用欧式距离的模板匹配法. z//基于模 ...

最新文章

  1. $.post把表单对象传递过去_第二章 第三节 Request请求对象详解
  2. Linux系统二进制bin文件操作的10种方法
  3. 【Leetcode | 49】230. 二叉搜索树中第K小的元素
  4. c语言wpf99乘法表,使用JSP输出九九乘法表
  5. 洛谷试炼场-简单数学问题-二分查找
  6. java设计模式懒汉_JAVA设计模式之懒汉式
  7. Unknown entity (Hibernate的findById方法参数必须加上包名)
  8. php中is_scalar判断是否是标量
  9. Python的web小游戏启动心得
  10. 虚拟机中windows镜像下载与安装
  11. 一窥朝鲜的计算机技术发展,操作系统,平板,杀毒软件,都有!
  12. 信使广告终结者 绿色
  13. 随便写了个猪八戒网的任务小助手“小八戒”,需要的拿去
  14. 华为网络设备调试命令(日常总结)
  15. php上传504,nginx+php设置大文件请求上传(502及504问题处理)
  16. 空间划分的数据结构(网格/四叉树/八叉树/BSP树/k-d树/BVH/自定义划分)
  17. Mac系统查看端口占用的进程
  18. 2021福州金桥学校高考成绩查询,2021年福建高考成绩排名及成绩公布时间什么时候出来...
  19. 天津市高中计算机会考,天津高中会考科目有哪些
  20. win10 安装硕正

热门文章

  1. 基于bootstrap的现代浏览器博物馆
  2. id自动编号 php,php根据数据id自动生成编号的实现方法
  3. Oracle数据库新增时---违反唯一约束条件
  4. 电脑重启很久一直在转_win10重启一直转圈的解决方法
  5. idea 调节背景护眼_我的护眼神器:电子墨水显示器_原创
  6. 破、立、行,网贷雷潮背后的消亡与新生 | 一点财经
  7. 健身增肌补剂有什么?
  8. 海思NB-IOT芯片,Hi2115处理器介绍
  9. 攻防世界,如来十三掌的writeup
  10. 如何下载Android源码(window和Linux)