@amitiitbhu: 图像嵌入是如何工作的?阅读此处:https://outcomeschool.com/blog/how-do-image-embeddings-work…

X AI KOLs Timeline 新闻

摘要

一篇博客文章,解释了什么是图像嵌入、为什么需要它们以及它们是如何工作的,包含示例和代码演练。

图像嵌入是如何工作的?阅读此处:https://outcomeschool.com/blog/how-do-image-embeddings-work…
查看原文
查看缓存全文

缓存时间: 2026/06/26 22:17

图像嵌入是如何工作的?

来源:https://outcomeschool.com/blog/how-do-image-embeddings-work

图像嵌入是如何工作的?

在这篇博客中,我们将学习图像嵌入是如何工作的。我们还会了解为什么需要图像嵌入,计算机如何将图片转换为数字,如何衡量两个图像嵌入的相似度,以及它们在现实世界中的应用场景。

我们将涵盖以下内容:

  • 什么是嵌入?
  • 什么是图像嵌入?
  • 为什么需要图像嵌入?
  • 计算机如何“看”图像?
  • 图像嵌入是如何创建的?
  • 一个简单的数值示例
  • 如何衡量两个嵌入的相似度?
  • 代码示例
  • 图像嵌入在哪些场景中使用?
  • 总结

我是 Amit Shekhar,Outcome School (https://outcomeschool.com/) 的创始人。我曾教授和指导许多开发者,帮助他们获得高薪技术岗位,也帮助多家科技公司解决独特问题,并创建了许多被顶尖公司使用的开源库。我热衷于通过开源、博客和视频分享知识。

我在 Outcome School 教授 人工智能与机器学习 (https://outcomeschool.com/program/ai-and-machine-learning)。

让我们开始吧。

什么是嵌入?

嵌入是一个数字列表,用于表示某个事物的含义。

简单来说,嵌入将现实世界中的事物转换为一组数字。这些数字捕捉了该事物的实际含义。

假设我们有一个单词、一个句子或一张图片。计算机无法直接理解这些内容,它只理解数字。因此,我们将事物转换成一个数字列表。这个数字列表就称为嵌入。

这个数字列表也称为向量。向量只是一个固定大小的数字列表,例如 [0.21, 0.87, 0.05, 0.64]。

所以,核心思想很简单:

嵌入是一个数字列表,它捕捉了某个事物的含义。

现在我们已经理解了什么是嵌入。接下来学习什么是图像嵌入。

什么是图像嵌入?

图像嵌入是一个数字列表,用于表示一张图像的含义。

简单来说,我们拿一张图像,将其转换成一个数字列表。这个数字列表捕捉了图像中的内容。

假设我们有一张猫的照片。我们将这张照片输入一个特殊模型。模型返回给我们一个数字列表,类似 [0.91, 0.12, 0.77, 0.03, ...]。这个数字列表就是猫照片的图像嵌入。

最重要的一点是:

两张含义相似的图像,其嵌入会彼此接近。

因此,一张猫照片的嵌入会接近另一张猫照片的嵌入。而猫照片的嵌入则会远离汽车照片的嵌入。

这就是图像嵌入的全部魔力:相似的图像产生相似的数字,不同的图像产生不同的数字。

以上就是关于图像嵌入是什么的内容。那么问题来了,我们为什么需要它?

为什么需要图像嵌入?

假设我们正在构建一个类似 Google Photos 的应用。我们存储了一百万张照片。现在,用户在搜索框中输入“海滩”。我们必须展示所有海滩照片。

但问题来了:照片没有任何标签。没有人给每张照片标注“海滩”。那么,我们如何找到海滩照片?

我们无法逐像素比较原始照片。这样做既慢,也无法理解含义。两张在不同角度拍摄的海滩照片在像素级别看起来完全不同,但它们的含义是相同的。

于是,图像嵌入登场了。

我们将每张照片转换为嵌入。也将单词“海滩”转换为嵌入。然后,我们找到与“海滩”嵌入最接近的那些照片嵌入。这些就是我们要的海滩照片。

通过这种方式,我们可以利用图像嵌入来解决按含义(而非精确像素)搜索图像的有趣问题。

快速在数百万张照片中找到最接近的嵌入,正是向量数据库的用武之地。我们有一篇详细博客介绍了向量数据库是如何工作的 (https://outcomeschool.com/blog/how-does-a-vector-database-work),从端到端进行了解释。

现在,下一个大问题是:计算机最初是如何“看”图像的?

计算机如何“看”图像?

在深入嵌入之前,我们必须了解计算机如何读取图像。

图像由称为像素的微小点构成。像素是图像中最小的颜色点。当我们把任何照片放大很多倍时,就会看到这些小方点。每个点就是一个像素。

每个像素以数字形式存储。对于彩色图像,每个像素有三个数字:一个代表红色,一个代表绿色,一个代表蓝色。每个数字通常取值范围是 0 到 255。

为了便于理解,一张 100x100 像素的小图像有 100 乘以 100,即 10,000 个像素。每个像素有 3 个颜色数字。所以整张图像就是 10,000 乘以 3,即 30,000 个数字。

我们可以将单个像素想象如下:

        一个像素
           |
           v
      +---------+
      |  像素    |
      +---------+
       /   |   \
      v    v    v
     红   绿   蓝
     210  180   90
   (每个值范围 0 到 255)

如上所示,一个像素存储为三个数字,分别对应红、绿、蓝。图像中的每个像素都以相同方式存储,所以整张图像就变成了一个非常大的颜色数字列表。

这就是原始图像。它只是一个很大的颜色数字列表。

但问题来了:这些原始数字只告诉我们每个点的颜色,并不告诉我们含义。它们不会告诉我们“这是一只猫”。两张猫照片可能由于光照、角度和背景而有完全不同的原始数字。

因此,我们需要将这些原始颜色数字转换为有意义的数字。这些有意义的数字就是图像嵌入。

注意: 原始像素告诉我们图像看起来什么样。嵌入告诉我们图像的含义是什么。这个区别是整篇文章的核心。

既然我们理解了原始像素,现在该学习嵌入是如何实际创建的了。

图像嵌入是如何创建的?

图像嵌入是通过神经网络创建的。

简单来说,神经网络是一种从示例中学习模式的模型。我们不需要手动编写规则;相反,我们给它展示大量示例,它自己学习。

对于图像,我们使用一种特殊类型的神经网络,称为CNN,即卷积神经网络。也可以使用较新类型的视觉 Transformer (ViT) (https://outcomeschool.com/blog/decoding-vision-transformer-vit)。不用担心具体名称,两者的核心思想是相同的。

让我们用一个简单的类比来理解这个思想。

假设一个孩子从未见过猫。我们给孩子展示数千张猫的照片。慢慢地,孩子学会了模式:猫有尖耳朵、胡须、皮毛和尾巴。现在,即使看到一张全新的照片,孩子也能认出猫。

神经网络以相同的方式学习。我们给它展示数百万张照片。它慢慢学习模式:边缘、形状、耳朵、眼睛和纹理。

以下是它的分步工作原理。

第 1 步: 原始图像(一个很大的颜色数字列表)进入神经网络。

第 2 步: 网络的前几层寻找非常简单的模式,例如边缘和角落。

第 3 步: 接下来的几层将这些简单模式组合成更大的模式,例如眼睛、耳朵或轮子。

第 4 步: 更深层将这些组合成完整的物体,例如完整的猫脸或完整的汽车。

第 5 步: 接近末尾时,网络生成一个简短的数字列表,汇总它在图像中找到的所有内容。这个短数字列表就是图像嵌入。

让我们将这个流程可视化如下:

原始图像
 (颜色数字)
       |
       v
+-----------------+
|   浅层网络       |  查找边缘和角落
+-----------------+
       |
       v
+-----------------+
|   中层网络       |  查找部件(眼睛、耳朵、轮子)
+-----------------+
       |
       v
+-----------------+
|   深层网络       |  查找完整物体(猫、汽车)
+-----------------+
       |
       v
+-----------------+
|   最终层         |  汇总所有发现
+-----------------+
       |
       v
    嵌入
[0.91, 0.12, 0.77, ...]

如上所示,原始图像从顶部进入,网络的每一层都比前一层理解得更多一些。浅层只看到简单的边缘,中层看到部件,深层看到完整的物体。在最末尾,网络将所有理解转换为一个简短的数字列表,即图像嵌入。

因此,嵌入是网络对图像含义的总结。

让我们将这个流程映射到孩子类比,以便你更好理解:

在神经网络中在孩子类比中
原始图像(颜色数字)用眼睛看照片
浅层查找边缘注意简单的线条和角落
中层查找部件注意到耳朵、眼睛和胡须
深层查找物体识别出完整的猫
最终嵌入“这是一只猫”的理解

最棒的是:网络经过数百万张图像训练后,会自动学会将相似图像在数字空间中放置在一起。这在训练过程中自动发生,而且无需我们编写任何规则。

要学习嵌入是如何创建的,以及对比学习如何将相似项放置在一起,我们在 Outcome School 的人工智能与机器学习课程 (https://outcomeschool.com/program/ai-and-machine-learning) 中从头构建了一个神经网络。

现在,我们已经理解了嵌入是如何创建的。进一步学习的最佳方式是通过一个简单的数值示例。

一个简单的数值示例

假设(仅为了便于理解)我们的嵌入只有 3 个数字。现实中,嵌入有几百甚至几千个数字,但用 3 个数字足以理解思想。

假设我们有三张照片。将每张照片通过神经网络,得到以下嵌入:

  • 猫照片 A:[0.90, 0.10, 0.05]
  • 猫照片 B:[0.88, 0.12, 0.07]
  • 汽车照片 C:[0.10, 0.95, 0.85]

这里,我们可以注意到非常重要的一点:两张猫照片 A 和 B 的数字非常相似,而汽车照片 C 的数字则完全不同。

我们可以想象这些嵌入在数字空间中的位置如下:

数字空间

  猫A   猫B
  (.)   (.)            <-- 彼此接近

                          (.) 汽车C    <-- 远离

如上所示,猫照片 A 和猫照片 B 的嵌入彼此非常接近,因为它们含义相同。汽车照片 C 的嵌入则远离,因为它含义不同。这正是计算机仅通过数字将相似图像保持在一起、不同图像分开的方式。

这正是我们想要的:相似的语义产生相似的数字,不同的语义产生不同的数字。

给你一个小提示

无论你在哪个技术领域工作,都应该熟悉以下主题:

  • LLM
  • RAG
  • MCP
  • Agent
  • 微调
  • 量化

我们将其整合在一个视频中:

AI 工程解读:LLM、RAG、MCP、Agent、微调和量化 (https://www.youtube.com/watch?v=lnfWvX66FUk)

不必中断阅读——可以先收藏,等有时间再看。未来的你会感谢你。

现在,回到正题。

因此,如果我们问计算机“哪张照片与猫照片 A 最相似?”,计算机会比较数字并回答“猫照片 B”。它不会选择汽车照片,因为其数字相差很远。

这就是计算机仅通过数字理解图像含义的方式。

现在的问题是,计算机具体如何衡量两个数字列表是接近还是遥远?我们来理解这一点。

如何衡量两个嵌入的相似度?

要找出两个嵌入的相似程度,我们测量它们之间的距离。

简单来说,如果两个数字列表彼此接近,则图像相似;如果相隔很远,则图像不同。

最常用的测量方法是余弦相似度。

简单来说,余弦相似度检查两个数字列表是否指向同一个方向。如果指向同一方向,相似度就高;如果指向不同方向,相似度就低。

余弦相似度的值范围从 -1 到 1。

  • 接近 1 的值表示两幅图像非常相似。
  • 接近 0 的值表示它们无关。
  • 接近 -1 的值表示它们相反。

以我们之前的例子为例。猫照片 A 是 [0.90, 0.10, 0.05],猫照片 B 是 [0.88, 0.12, 0.07]。这两个向量指向几乎相同的方向,所以余弦相似度会非常接近 1。这说明它们非常相似。

这就是我们通过嵌入来查找相似图像的方法。

要掌握嵌入以及多模态搜索系统背后的相似性搜索,请查看我们在 Outcome School 的人工智能与机器学习课程 (https://outcomeschool.com/program/ai-and-machine-learning)。

现在我们已经学习了理论,是时候看一个小的代码示例了。

代码示例

我们来看一下创建图像嵌入并比较两张图像的代码。我们将使用 Python,这是机器学习中最常用的语言。

首先,我们加载一个现成的模型,并为两张图像创建嵌入,如下所示:

from sentence_transformers import SentenceTransformer
from PIL import Image

# 加载一个可以创建图像嵌入的现成模型
model = SentenceTransformer("clip-ViT-B-32")

# 从电脑中打开两张图像
cat_image = Image.open("cat.jpg")
dog_image = Image.open("dog.jpg")

# 将每张图像转换为嵌入(一个数字列表)
cat_embedding = model.encode(cat_image)
dog_embedding = model.encode(dog_image)

print(cat_embedding.shape)

这里,我们做了几件简单的事情:

  • 我们加载了一个名为 clip-ViT-B-32 的现成模型。这个模型已经知道如何将图像转换为嵌入,所以我们不需要自己训练任何东西。
  • 我们打开了两个图像文件,一张猫和一张狗。
  • 我们对每张图像调用了 model.encode()。这返回了嵌入,即数字列表。

这将打印出如下内容:

(512,)

可以看到,每个嵌入是一个包含 512 个数字的列表。因此,该模型将整张图像总结为 512 个有意义的数字。

现在,我们比较这两个嵌入,看看图像有多相似,如下所示:

from sentence_transformers import util

# 测量两个嵌入之间的相似度
similarity = util.cos_sim(cat_embedding, dog_embedding)

print(similarity)

这里,我们使用了 cos_sim,它计算两个嵌入之间的余弦相似度。它告诉我们两幅图像在语义上的接近程度。

猫和狗都是动物,所以该值会比较高。如果我们比较猫和汽车,值会低得多,因为猫和汽车的含义非常不同。

这就是如何仅用几行代码将图像转换为数字并比较其语义。效果非常好。

注意: 同一个 clip-ViT-B-32 模型也可以将“海滩”这样的单词转换为嵌入。因此,我们可以将单词嵌入与图像嵌入进行比较,这正是通过输入单词来搜索照片的工作原理。

将文本和图像连接到同一个嵌入空间的模型称为多模态模型。我们有一篇详细博客介绍了多模态模型。

相似文章

介绍文本和代码嵌入

OpenAI Blog

OpenAI 推出了新的嵌入 API 端点,可以将文本和代码转换为数值向量表示,用于语义搜索、聚类和分类任务。这些模型在标准基准测试上取得了最先进的效果,包括代码搜索性能相比之下提升了 20%。