从像素到语义,快速实现遥感影像AI搜索

科技   2024-09-20 09:25   新加坡  

近期在LLM方面,AI搜索热度居高不下,遥感业务也能做AI搜索。


最近关注到国外开发者完成了几个基于文本检索遥感影像的demo,尝试对其进行进一步解读,将从技术角度详细解析该过程的实现逻辑,读者可以自己尝试复现。


直接通过自然语言对图像进行查询是一项具有挑战性的任务。

传统方法往往依赖于图像的元数据或标签,而更先进的方法则利用 向量嵌入(vector embeddings) 技术,将图像和文本表示映射到同一向量空间,以实现高效的查询和匹配。

0. 影像搜索Demo

> Aerial Image Search Demo

这个demo的前端页面很简单,预置了几个关键词,当我们输入tennis court时,图上会有多个框选结果,放大细节查看,确实是网球场。


> bluesight.ai

第二个应用稍微有点花样,当我们手动搜索solar panel时,列出了可检出的所有关键图像信息,并且对图上内容还以热力图进行反馈。



下面以Aerial Image Search Demo为例,给出实现过程

1. 核心概念:向量嵌入

首先,理解向量嵌入对于整个系统至关重要。向量嵌入的基本原理是将多种类型的数据(如图像、文本)转化为固定维度的向量。在这个向量空间中,语义相似的对象会被映射到相近的位置。

例如,两个描述相似内容的文本(如“网球场”“运动场”)会生成相似的向量,这使得它们可以在相同的向量空间中比较相似度。

向量嵌入的实际应用: 在已完成的影像查询系统中,使用了SkyCLIP模型,它是一个结合了图像和文本配对的嵌入模型,能够将图像和文本嵌入到相同的768维向量空间中。这意味着每个输入,无论是图像还是文本,都可以转化为一个长度为768的向量,表示其语义信息。

Wangzhecheng等提出的SkyCLIP模型简介。

SkyScript是一个为遥感图像设计的大规模语义多样化的图像-文本数据集,包含520万对图像-文本对,覆盖超过29K个不同的语义标签。该数据集旨在帮助开发适用于遥感图像的任务无关视觉语言模型(VLMs),并已在AAAI 2024会议上发表。数据集通过连接OpenStreetMap(OSM)和多源、多分辨率遥感图像,提供了丰富的语义多样性。此外,还提供了模型实现、下载链接和使用指南。

SkyScript数据集的语义多样性比现有的遥感图像文本数据集高出两个数量级

2. 图像片段的处理与嵌入生成

在进行图像查询时,首先需要对整个遥感影像进行处理。为了保证模型可以处理大幅图像,将其分割为多个小片段是必要的步骤。这些小片段被称为图像片段(image chips),每个片段经过模型处理后生成对应的嵌入向量。

使用RasterVision库来完成图像的分块操作。

Raster Vision是一个开源的Python库和框架,用于构建针对卫星、航空和其他大型图像集(包括倾斜无人机图像)的计算机视觉模型。它支持使用PyTorch后端进行芯片分类、目标检测和语义分割。作为一个低代码框架,它允许用户快速配置实验,执行机器学习管道,包括分析训练数据、创建训练芯片、训练模型、创建预测、评估模型和打包模型文件及配置以便于部署。Raster Vision还支持在云中使用AWS Batch和AWS Sagemaker运行实验。

分块的过程通过滑动窗口技术实现,定义每个图像片段的大小以及相邻片段的重叠区域。例如,将图像片段定义为200×200像素,并设定100像素的重叠区域,保证每个图像部分都有足够的细节被处理。

下面的代码展示了如何配置并生成滑动窗口的数据集:

ds = SemanticSegmentationSlidingWindowGeoDataset.from_uris(
        image_uri=uri,
        image_raster_source_kw=dict(channel_order=[012]),
        size=200,
        stride=100,
        out_size=224,
    )

生成的图像片段随后会被调整为224×224像素,这是SkyCLIP模型所需要的输入尺寸。模型会将每个图像片段转化为768维的向量表示,供后续查询匹配使用。

通过以下代码可以对图像片段进行遍历,并计算每个片段的嵌入向量:

dl = DataLoader(ds, batch_size=24)

EMBEDDING_DIM_SIZE = 768
embs = torch.zeros(len(ds), EMBEDDING_DIM_SIZE)

with torch.inference_mode(), tqdm(dl, desc='Creating chip embeddings'as bar:
    i = 0
    for x, _ in bar:
        x = x.to(DEVICE)
        emb = model.encode_image(x)
        embs[i:i + len(x)] = emb.cpu()
        i += len(x)

# normalize the embeddings
embs /= embs.norm(dim=-1, keepdim=True)

这段代码使用PyTorch进行批量处理,并将生成的嵌入结果存储为矩阵。在此过程中,通过torch.inference_mode()提升了推理速度,并确保内存占用最小化。

3. 文本查询的嵌入生成

当用户输入查询文本(例如“网球场”)时,需要将文本嵌入同一向量空间中。这是文本-图像查询的关键步骤。文本查询同样可以被转化为768维的向量,并且该向量可以直接与图像嵌入向量进行比较。

以下代码展示了如何对文本进行嵌入计算:

text = tokenizer(text_queries)
with torch.inference_mode():
        text_features = model.encode_text(text.to(DEVICE))
        text_features /= text_features.norm(dim=-1, keepdim=True)
        text_features = text_features.cpu()

与图像嵌入类似,文本嵌入也需要进行归一化处理,确保不同数据类型的向量能够在相同的尺度下进行相似度计算。

4. 相似度计算与检索

在获得图像片段和文本的嵌入向量后,接下来的任务是通过计算它们的相似度,找到最符合查询要求的图像片段。这里使用的是余弦相似度,其结果范围在-1到1之间,值越接近1表示向量越相似。

为了加速检索过程,利用了向量数据库技术。向量数据库可以高效存储大规模向量,并通过快速搜索返回与查询向量最接近的结果。

示例项目中使用了Pinecone,一个云原生向量数据库,用于存储图像片段的嵌入向量及其对应的位置信息。这样,每当用户输入查询文本时,系统会通过Pinecone数据库快速找到相应的图像片段。

通过结合先进的遥感大模型、Embedding等技术,实现了基于文本检索遥感影像的技术,展示了如何将自然语言与遥感图像相结合,为用户提供了一种简洁、直观的图像查询方式。

欢迎交流

笔者长期从事人工智能、遥感、大模型等业务

欢迎添加微信交流

空天感知
专注商业航天、人工智能、气象水文等交叉学科,精选行业资讯,深耕AI业务落地
 最新文章