我们大多知道SQL是一种查询语言,它可以帮助我们从几乎所有的数据库中查询关系数据,但是当涉及到为计算机视觉相关的任务收集数据时,我们不得不依赖那些明显的数据集,如ImageNet、COCO等。最近研究人员提出了一个名为VisionKG的框架,它可以无缝地整合这些数据集。因此,在这篇文章中,我们将详细讨论VisionKG,并将看到它如何查询COCO和ImageNet等数据集。以下是本文要讨论的主要内容。
内容表
- VisionKG的总体思路
- 它是如何查询数据的?
- 实例
我们先来讨论一下这个框架带来了什么。
VisionKG的总体思路
这是一个以数据为中心的人工智能的统一的数据集框架。不仅来自一个人工智能领域的不同的数据集在这个框架中被整合和联系在一起,而且来自多个人工智能领域的数据集也是如此。
现有的资源,如ConceptNet和Wikidata,都有类似的目的,即整合各种来源的数据并将其公开,但它们反而专注于某些应用领域,而且都没有与其他领域的数据库相联系,如计算机视觉。另一方面,场景图是在计算机视觉领域引入的,用于模拟照片中识别的项目之间的关系。
然而,它们缺乏跨领域的兼容性,不能用普通的查询语言进行查询。因此,目前的资源应该被精简,而新的资源应该容易被纳入。这是相当有利的,例如,它可以帮助防止分布转移,并为训练和测试开发出更强大的模型。
此外,从模型修补过渡到对数据的深入了解,必须对数据集进行更好的组织。此外,"数据 "一词应该被这种方法扩大,不仅包括训练数据,还包括抽象的信息,如常识或因果关系。
简而言之,它是各种数据集的单一框架,允许它们随时合并和查询,例如使用标准查询语言。
它是如何查询数据的?
为了实现上述概念,研究人员创建了VisionKG,一个用于CV数据集(如COCO)的统一知识图谱。VisionKG是一个基于资源描述框架(RDF)的知识图,它包含描述图片元数据及其注释语义的RDF语句。
万维网联盟(W3C)推荐RDF作为语义数据整合的标准化数据模型,并作为人机共享理解的正式表示。因此,RDF可以用来表示突出的标签分类法的众多语义结构,如Wordnet、ConceptNet和Freebase,这些分类法被用于各种CV数据集,包括Imagenet和OpenImage。

创建VisionKG的过程如上图所示。它首先收集CV数据集并从中提取注释标签。1.它遵循关联数据的原则,使用RDF数据模型,为注释标签和视觉特征创建一个统一的数据模型。统一资源标识符(URI)被用来命名数据实体(比如图像、盒子和标签)。RDF数据模型允许使用三要素的形式来表达数据。 <主语、谓语、宾语>。
为了在COCO数据集中描述 "一幅图像包含一个人的边界框",我们必须首先为图像和边界框分配唯一的URI,例如,vision.semkg.org/img01和vision.semkg.org/box01,以创建以下三要素。 <img01, hasBox, box01>,<box01, hasObject, obj01>, <obj01, rdf: type, Person>。
预定义的谓词包括 hasBox, hasObject,和 rdf:类型,其中rdf:type表示一个对象/图像属于知识库中的特定类别/类型,如Person。我们还可以为图片添加元数据和语义注释,比如图片来自哪里,或者图片中的盒子之间的关系(如上图第二步所示)。
数据集和分析,特别是可以使用丰富的语义查询语言,如SPARQL。SPARQL查询语言允许用户使用类似于SQL语句的RDF语句来描述查询。第一个应用是使用VisionKG以一种优雅的方式获得混合数据集。
例如,与涵盖所有可能情况的复杂查询(如下图片段3所示)相比,人们可以用一个简单的查询(如下图片段4所示)来查询COCO、KITTI和Visual Genome中的人物图像。

上图描述了COCO、KITTI和Visual Genome中的标签映射到知识库类(在1节中描述)的一个例子。标签被扩展以反映类的层次结构(在第2节中描述)。还有两个等效的查询,用于从COCO、KITTI和Visual Genome数据集中检索包含人物的图像(在第3、4节中描述)。
实例
在这一节中,我们将看一下VisionKG的一些查询样本,通过这些样本,我们可以用Python在空中提取数据。
让我们快速建立环境和导入依赖:
from google.colab import output
# install our vision api
from google.colab import output
# install our vision api
!python -m pip install git+https://github.com/cqels/vision.git --force
output.clear()
# import SemkgAPI
from vision_utils import semkg_api, data
from skimage import io
import matplotlib.pyplot as plt
接下来,我们可以定义一个叫做query的变量,用来存放查询语句。这里我们的查询是关于获取汽车和卡车的图片:
# Query string
query_='''#Give me 100 images containing car and truck
prefix cv:<http://vision.semkg.org/onto/v0.1/>
SELECT DISTINCT ?image
WHERE {
?ann1 a cv:Annotation.
?ann1 cv:isAnnotationOfImage ?image.
?ann1 cv:hasAnnotatedObject ?obj1.
?obj1 cv:hasLabel "car".
?ann2 a cv:Annotation.
?ann2 cv:isAnnotationOfImage ?image.
?ann2 cv:hasAnnotatedObject ?obj2.
?obj2 cv:hasLabel "truck".
?image cv:hasLocalPath ?localPath.
}
LIMIT 100'''
接下来,上述定义的查询需要被传递到VisionKG的API中,如下图:
#query and return result
result=semkg_api.query(query_)
所有的查询结果都存储在结果变量中,这是一个关于被查询图像的元数据的字典。现在我们来绘制一些被查询图像的样本:
#display sample images
rows=3
cols=4
f, ax_arr = plt.subplots(rows, cols, figsize=(16,8))
for j, row in enumerate(ax_arr):
for i, ax in enumerate(row):
if j*cols+i < len(result['images']):
image = io.imread(semkg_api.SEMKG_IMAGES_HOST + result['images'][j*cols+i]['image_path'])
ax.imshow(image)
ax.axis('off')
f.suptitle("Sample images from the query result", fontsize=16)
plt.show()
结果看起来是这样的:

最后的话
通过这篇文章,我们看到了一个基于python的框架,通过使用SPARQL来调用计算机视觉相关的数据,SPARQL是一种语义查询语言,用于检索和操作数据,正如我们上面所看到的。你可以在vision.semkg.org/,对这种语言进行实验。进一步利用这些数据,我们可以执行诸如物体检测、图像分类等任务。人们可以在官方资料库中查看更多的例子。
参考资料
- 奇妙的数据和如何查询它们
- [SPARQL](en.wikipedia.org/wiki/SPARQL….)
- 官方资源库
- 上述代码的链接