@amitiitbhu: 图像嵌入是如何工作的?阅读此处: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 模型也可以将“海滩”这样的单词转换为嵌入。因此,我们可以将单词嵌入与图像嵌入进行比较,这正是通过输入单词来搜索照片的工作原理。
将文本和图像连接到同一个嵌入空间的模型称为多模态模型。我们有一篇详细博客介绍了多模态模型。
相似文章
@techNmak: 30题详解嵌入、向量搜索与检索的实际工作原理 - 相似度度量、对比学习…
一个30题详解,阐述嵌入、向量搜索和检索系统的工作原理,涵盖相似度度量、训练方法、索引技术和评估。
介绍文本和代码嵌入
OpenAI 推出了新的嵌入 API 端点,可以将文本和代码转换为数值向量表示,用于语义搜索、聚类和分类任务。这些模型在标准基准测试上取得了最先进的效果,包括代码搜索性能相比之下提升了 20%。
@amitiitbhu: 最新发布:CUDA 内核如何工作?阅读此处:
本文解释了 CUDA 内核在 GPU 上如何工作,涵盖了 CUDA、GPU 架构、线程、块的基础知识,以及它们在人工智能和机器学习中的角色。
@v0xium: LLM推理工程:嵌入模型详解 1. 嵌入模型将一段文本或任何其他……
本文解释了嵌入模型及其在LLM推理中的作用,涵盖架构、流量特征和量化等优化技术。
@amitiitbhu: GPU如何为深度学习工作?在此阅读:https://outcomeschool.com/blog/how-does-a-gpu-work-for-deep-learning…
本文解释了GPU如何为深度学习工作,涵盖了它们为何适合并行矩阵计算、CPU与GPU的区别,以及VRAM和张量核心等关键概念。