当前位置: 首页 > news >正文

【目标检测】目标检测遇上知识图谱:Object detection meets knowledge graphs论文解读与复现

前言

常规的目标检测往往是根据图像的特征来捕捉出目标信息,那么是否有办法加入一些先验信息来提升目标检测的精准度?

一种可行的思路是在目标检测的输出加入目标之间的关联信息,从而对目标进行干涉。

2017年8月,新加波管理大学的Yuan Fang等人发表了一篇文章《Object Detection Meets Knowledge Graphs》,就按照这个思路做了一些工作。

论文地址:https://www.ijcai.org/proceedings/2017/0230.pdf

文章写得非常通俗易懂,因此本文进行思路解读和代码复现。

工作架构

这篇文章作者提出的是一个通用的知识引入架构,因此对于任何目标检测模型都可以适用。

知识引入的流程图如下图所示:

在这里插入图片描述

原论文作者采用的是Faster R-CNN算法进行检测,正常检测输出结果会是一个P矩阵(即图中的Existing model output),这里的列表示总共的目标数,行表示类别。

图中的这个矩阵意义是:第一个检测目标属于类别1的置信度为0.6,属于类别2的置信度为0.4;第二个检测目标属于类别1的置信度为0.2,属于类别2的置信度为0.8;

在这个输出结果基础上,从先验知识(Knowledge)中提取出类别之间的语义一致性(semantic consistency),从而对输出结果进行干涉,得到最终的输出结果(Knowledge-aware output)。

语义一致性提取

那么这套架构的关键就是如何提取语义一致性,这一点作者给出了两种思路。

思路一:基于频率的知识(Frequency-based knowledge)

基于频率应该是最容易想到的知识关联方式,比如两个目标同时出现的频率高(比如键盘和鼠标经常一起出现),那么检测出其中一个目标时,自然可以考虑增加另一个目标的置信度。

因此,作者提出了一个对阵矩阵S,作为目标类别之间的语义一致性矩阵,计算公式如下:

在这里插入图片描述

  • n(l,l’):类别l和类别l‘一起出现的次数
  • n(l):类别l出现的次数
  • n(l’):类别l’出现的次数
  • N:所有类别出现的总次数

思路二:基于知识图谱的知识(Graph-based knowledge)

思路一的方式比较直观,不过存在的缺陷是无法表征两个没有同时出现过的类别之间的关系。比如,车和游艇没有在一个场景中同时出现,但不能“粗暴”的认为这两者毫无关联吧,肯定需要一个微弱的权值来表示两者之间的关系。

因此,作者想到了用知识图谱的方式来提取语义一致性。

首先,通过对一些公开的大型知识图谱进行过滤,提取出需要检测的类别信息和关系。

在这里插入图片描述

之后,通过重启随机游走算法(random walk with restart)来得到该关系图的收敛状态。重启随机游走算法是经典的随机游走算法的一个变种,相当于在随机游走算法的基础上,添加了一个重启概率,触发重启后会回到原点。

在这里插入图片描述
收敛之后,会得到一个R矩阵,这个矩阵表征了当算子处于某个状态类别时,向另一状态类别转移的概率。由于语义一致性矩阵是对称矩阵,因此作者采用了一个状态相乘再开方的操作。

在这里插入图片描述

干涉检测输出

有了语义一致性矩阵S之后,就可以对输出结果进行干涉。论文中,对于如何进行干涉并没有说明。
通过后面阅读源码可知,干涉的思路主要是选取某目标类别最邻近的5个类别,然后对其一致性矩阵数值求和得到关联性特征向量。再将该向量和原始检测结果进行加权相加。

核心代码:

num = torch.sum(torch.mm(S_highest, torch.transpose(p_hat_temp[box_nearest[b]], 0, 1)), 1)
denom = torch.sum(S_highest, dim=1) * bk
p_hat[b] = (1 - epsilon) * torch.squeeze(torch.div(num, denom)) + epsilon * p

这里的epsilon代表权重,复现时取0.75,表示75%保留原始结果,25%进行知识干涉。

后面一部分就是损失函数以及网络更新部分了。
下面是损失函数的计算公式,相当于将知识嵌入的结果纳入到网络的更新之中。
在这里插入图片描述

实验结果

作者在Coco和VOC数据集上进行了实验,下表是coco的实验结果:

在这里插入图片描述

  • FRCNN:原始检测网络输出结果
  • KF-500:通过思路一来获得一致性矩阵,选择500张训练集图片
  • KF-All:通过思路一来获得一致性矩阵,选择所有训练集图片
  • KG-CNet:通过思路二来获得一致性矩阵

从表中数据可知,该思路的改进对检测输出的mAP并没有起到提升作用,不过有效提升了召回率。相当于降低了网络的误检率。

结果可视化

最后是结果的可视化,作者选取了一幅图来演示:左图是直接检测结果,右图是添加知识图谱之后的检测结果。

紫框表示模型的检测输出,红框表示实际的标签。
在这里插入图片描述

由图可知,原始的FRCNN没有检测出键盘(keyboard),添加知识图谱后,通过鼠标、笔记本等目标的关联信息,成功将键盘检测出来。

实验复现

原论文发布时间较早,使用Caffe框架进行实验,目前已无法找到。
后面有人使用Pytorch对其进行复现。
代码地址:https://github.com/tue-mps/rescience-ijcai2017-230

复现结论

复现作者提到:

对于所描述的任何一种方法,作者的主张都无法得到证实。结果要么显示以 mAP 降低为代价的召回率增加,要么显示 mAP 保持不变,召回率没有改善。三种不同的骨干模型在重新优化后表现出相似的行为,结论是知识感知的重新优化对目标检测算法没有好处。

不清楚是否是超参数的影响,总之论文的效果无法实现。

代码运行

该代码写得比较清晰,并且作者提供了处理好的数据集和语义一致性矩阵。
下载好之后,放置路径如下即可:
在这里插入图片描述

之后修改Utils/testing.py里面这三行内容,我测试的时候遇到的小bug:

# 原始
# boxes_temp = prediction[1][0]['boxes']
# labels_temp = prediction[1][0]['labels']
# scores_temp = prediction[1][0]['scores']
# 修改为
boxes_temp = prediction[0]['boxes']
labels_temp = prediction[0]['labels']
scores_temp = prediction[0]['scores']

最后运行Results/results_coco.py即可进行单轮测试。

实验结果

由于原论文作者使用的是VGG16作为backbone,因此这里model_type我设置为coco-FRCNN-vgg16,下面是在我RTX2060下用Coco数据集的实验结果:

模型mAP @ 100Recall @ 100 all classes
FRCNN0.2470.477
KF-All-COCO0.2450.432
KG-CNet-55-COCO0.2430.436
KG-CNet-57-COCO0.2430.437
  • FRCNN:Fast-RCNN直接检测
  • KF-ALL-COCO:思路一获取语义一致性矩阵
  • KG-CNet-55-COCO:思路二通过大型常识知识库ConceptNet-assertions55提取一致性矩阵
  • KG-CNet-57-COCO:思路二通过大型常识知识库ConceptNet-assertions57提取一致性矩阵

从结果来看,的确没什么卵用,mAP和Recall均下降了。。

在这里插入图片描述

相关文章:

【目标检测】目标检测遇上知识图谱:Object detection meets knowledge graphs论文解读与复现

前言 常规的目标检测往往是根据图像的特征来捕捉出目标信息,那么是否有办法加入一些先验信息来提升目标检测的精准度? 一种可行的思路是在目标检测的输出加入目标之间的关联信息,从而对目标进行干涉。 2017年8月,新加波管理大学…...

IDEA重复下载SNAPSHOT包问题

问题现象 reimport 之后 状态栏显示resolving dependencies… 遇到某个比较大的快照包(33M),同一天的第2个版本时 1.0-xxx-SNAPSHOT.时间戳-2 idea importer 会先分片下载 x.jar.part文件中,然后复制为x.jar吧 如图中所示,其实已经下载完了&…...

【Unity入门】12.MonoBehaviour事件函数

【Unity入门】MonoBehaviour事件函数 大家好,我是Lampard~~ 欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (一)常用的事件函数 (1)start和update方法 之前我们写的脚本,会默认帮助…...

1.3 Docker Compose-详细介绍

Docker Compose是一个用于定义和运行多个Docker容器的工具。它可以让用户轻松地定义和管理多个容器的配置,并且可以通过简单的命令来启动、停止和重启这些容器。在本文中,我们将详细介绍Docker Compose的使用和功能。 一、Docker Compose的安装 Docker…...

数据分析:麦当劳食品营养数据探索并可视化

系列文章目录 作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒关注…...

ES6标准

ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准 前端es6是模块化开发;es6模块化规范就是浏览器端与服务器端通用的模块化开发规范,其中定义了每一个JavaScript文件都是一个独立的模块,导入其他模块成员…...

ASP一个物流商品运输系统的设计与实现

物流运输行业的今天正朝着追求高效、低成本、稳定可靠的方向发展。本文详细介绍了网上物流管理系统,涉及到客户端运输线路设计、过程跟踪等功能模块以及管理员端的相应模块的具体实现,分析了整个系统的架构、工作原理、实现功能等。系统采用ASPMS SQL以B…...

肖 sir_就业课__009ui自动化讲解

ui自动化讲解 1、你做过自动化测试吗?做过 ui自动化测试、接口自动化、app自动化 2、你讲下你做的ui接口自动化? (1)第一种:按照线性流程讲解 :pythonselenium 库做ui自动化 (2)第二…...

「线性DP」花店橱窗

花店橱窗 https://ac.nowcoder.com/acm/contest/24213/1005 题目描述 ​ 小q和他的老婆小z最近开了一家花店,他们准备把店里最好看的花都摆在橱窗里。 ​ 但是他们有很多花瓶,每个花瓶都具有各自的特点,因此,当各个花瓶中放入不同…...

数组的去重方法

1、ES6的Set方法去重 new Set是ES6新推出的一种类型。它和数组的区别在于,Set类型中的数据不可以有重复的值。当然,数组的一些方法Set也无法调用。 使用方法:将一个数组转化为Set数据,再转化回来,就完成了去重。 cons…...

ESP32-LORA通信

文章目录好久没更新博客了,今天清明节,写个LORA通信。在此记念在天堂的外婆。祝她安好LORA通信简介一、模块二、使用步骤1.电脑通过USB串口模块联接LORA模块2.ESP32连接LORA通信进行收发通信3.电脑运行调试助手,ESP32运行代码。实现LORA通信测…...

博客首页效果

学习来自风宇blog的博客首页效果 全部用的基本上都是原生的html,css,js特别是flex布局的使用,主轴方向可以是横轴,也可以是纵轴,弹性项还可可以使用百分比sticky粘性布局,作为侧边栏,它不会超出…...

【LeetCode】剑指 Offer(29)

目录 题目:剑指 Offer 56 - II. 数组中数字出现的次数 II - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 57. 和为s的两个数…...

自然语言处理(八):Lexical Semantics

目录 1. Sentiment Analysis 2. Lexical Database 2.1 What is Lexical Database 2.2 Definitions 2.3 Meaning Through Dictionary 2.4 WordNet 2.5 Synsets 2.6 Hypernymy Chain 3. Word Similarity 3.1 Word Similarity with Paths 3.2 超越路径长度 3.3 Abstra…...

推荐一款 AI 脑图软件,助你神速提高知识体系搭建

觅得一款神器,接近我理想中,搭建知识体系的方法,先来看视频作为数据库开发或管理者,知识体系搭建尤为重要。来看看近些年缺乏足够数据库知识面造成的危害:a/ 数据安全风险:例如,2017年Equifax数…...

掌握这些“学习方法和工具”,让你事半功倍!

在中国这个高竞争的社会环境下,学习成为了每个人都需要掌握的技能。然而,学习并不仅仅是读书和听课,更是需要一系列高效的方法和习惯来提高效率。本文将介绍一些实用的学习经验和方法,以及推荐一些国内好的学习工具和平台&#xf…...

MyBatis 源码解析 面试题总结

MyBatis源码学习环境下载 文章目录1、工作原理1.1 初始化1.1.1 系统启动的时候,加载解析全局配置文件和相应的映射文件1.1.2 建造者模式帮助我们解决复杂对象的创建:1.2 处理SQL请求的流程1.2.1 通过sqlSession中提供的API方法来操作数据库1.2.2 获取接口…...

「业务架构」需求工程—需求规范(第3部分)

将用户和系统需求记录到文档中。需求规范它是将用户和系统需求写入文档的过程。需求应该是清晰的、容易理解的、完整的和一致的。在实践中,这是很难实现的,因为涉众以不同的方式解释需求,并且在需求中经常存在固有的冲突和不一致。正如我们之…...

chapter-1数据管理技术的发展

以下课程来源于MOOC学习—原课程请见:数据库原理与应用 数据管理技术的发展 发展三阶段 人工管理【1950前】 采用批处理;主要用于科学计算;外部设备只有磁带,卡片,纸带等 特点:1.数据面向应用2.数据不保…...

23.Spring练习(spring、springMVC)

目录 一、Spring练习环境搭建。 (1)设置服务器启动的展示页面。 (2)创建工程步骤。 (3)applicationContext.xml配置文件。 (4)spring-mvc.xml配置文件。 (5&#x…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

HTML 列表、表格、表单

1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

【Oracle】分区表

个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: ​onCreate()​​ ​调用时机​:Activity 首次创建时调用。​…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...