当我们需要AI模型理解图像时,我们需要超越原始的像素值。想想一张数码照片。它由被称为像素的微小点组成,每个像素都有颜色信息,通常用数字表示(比如红、绿、蓝值)。一张1000x1000像素的图像有一百万个像素,如果每个像素有3个颜色值,那就是3百万个数字!直接处理这些数据对于许多AI模型来说可能负担过重且效率低下,特别是在试图辨别图像中有什么时。取而代之,我们尝试从图像中提取“特征”。图像特征是从图像中获得的有区别的、信息丰富的,且通常更紧凑的数值描述。它们旨在捕捉图像内容的核心,例如其颜色、纹理或其中物体的形状。通过使用这些特征,AI模型可以更容易地学习执行像识别物体或理解场景这样的任务。图像特征的简单提取方法在复杂的神经网络普及之前,并且对于某些任务或作为学习工具仍然有用,人们开发了几种手动定义如何从图像中提取特征的方法。这些通常被称为“手工制作”的特征,因为工程师根据他们认为有用的东西来设计算法。颜色直方图 颜色直方图是一种简单但有效的表示图像中颜色分布的方法。想象你有一组预定义的颜色区间(例如,“深红色”、“亮蓝色”、“浅绿色”)。颜色直方图计算图像中有多少像素属于这些区间中的每一个。工作原理: 对于每个像素,确定其颜色并增加相应颜色区间的计数。提供信息: 它提供了图像中存在的颜色及其比例的总体概括。例如,一张海滩的图像可能会有很高的蓝色(天空、水)和米色(沙子)计数。一张森林的图像会有更多的绿色和棕色。表示: 直方图本身(每个区间的计数列表)成为特征向量。局限性: 颜色直方图告诉你有什么颜色以及多少,但不能告诉你它们在图像的哪里。两张非常不同的图像如果使用相同的颜色,即使排列不同,也可能具有相似的颜色直方图。digraph G { rankdir=LR; node [shape=box, style="rounded,filled", fontname="Helvetica"]; edge [fontname="Helvetica"]; img_beach [label="图像:海滩场景\n(许多蓝色和米色像素)", fillcolor="#a5d8ff", shape=rect]; img_forest [label="图像:森林场景\n(许多绿色和棕色像素)", fillcolor="#96f2d7", shape=rect]; hist_beach [label="颜色直方图 (海滩)\n蓝色:高\n米色:高\n绿色:低", fillcolor="#ffe066", shape=note]; hist_forest [label="颜色直方图 (森林)\n蓝色:低\n米色:低\n绿色:高", fillcolor="#ffe066", shape=note]; img_beach -> hist_beach [label="计数颜色"]; img_forest -> hist_forest [label="计数颜色"]; }颜色直方图概括了颜色的分布。海滩场景的直方图会根据主要颜色与森林场景的直方图有很大不同。边缘和形状特征 边缘是图像中亮度或颜色的显著变化,通常对应于物体的边界。检测这些边缘可以提供有关存在的形状的信息。边缘检测: 像Sobel或Canny边缘检测器这样的算法会扫描图像并识别形成边缘的像素。输出通常是“边缘图”,它就像图像的线条画。从边缘提取特征: 从边缘图中,可以进一步提取像边缘方向、边缘数量这样的特征,或者尝试识别基本形状(直线、圆形)。这些技术很快变得更复杂。就我们而言,理解边缘本身可以是一种特征是一个好的起点。这些传统方法为理解“特征”的含义提供了根基。它们旨在以一种比原始像素值更有意义的方式来概括图像。学习到的特征:神经网络的能力虽然手工制作的特征很有用,但它们有局限性。设计好的特征需要专业知识,并且可能无法捕捉所有相关信息。现代多模态AI经常依赖“学习到的特征”,特别是使用**卷积神经网络(CNN)**提取的特征。CNN是一种特别适合处理网格状数据(如图像)的神经网络。你可以将它们视为一系列从大量数据中自动学习到的过滤器和转换。CNN如何学习特征: 当CNN被训练时(例如,将图像分类为“猫”、“狗”、“汽车”等类别),它会学习识别模式。早期层: CNN的初始层倾向于学习检测简单的模式,如边缘、角点和颜色斑点。更深层: 随着信息通过更多层,这些简单的模式被组合起来以检测更复杂的结构,如纹理、物体的一部分(一个轮子、一只耳朵),最终是整个物体。使用预训练CNN作为特征提取器: 一种非常常见且有效的方法是使用已在海量图像数据集(如ImageNet,包含数百万张带标签的图像)上训练过的CNN。流行的预训练模型包括ResNet、VGG和EfficientNet。 你不一定需要自己训练这些网络。你可以使用这些强大的预训练模型之一,将你的图像输入其中,然后从其某个中间层(通常是最终分类输出之前的层)提取激活值(输出)。digraph G { rankdir=TB; node [shape=box, style="rounded,filled", fillcolor="#e9ecef", fontname="Helvetica"]; edge [fontname="Helvetica"]; img [label="输入图像\n(例如,代表猫的像素)", fillcolor="#a5d8ff"]; subgraph cluster_cnn { label = "预训练CNN (例如,ResNet)"; style="rounded"; bgcolor="#f8f9fa"; color="#495057"; conv1 [label="早期层\n(检测边缘、角点、颜色)", fillcolor="#bac8ff"]; conv2 [label="中间层\n(检测纹理、物体部分)", fillcolor="#91a7ff"]; conv3 [label="深层\n(检测物体形状、复杂模式)", fillcolor="#748ffc"]; conv1 -> conv2 [label="组合\n特征"]; conv2 -> conv3 [label="组合\n特征"]; } embedding [label="图像嵌入 / 特征向量\n(密集的数字列表,例如,[0.7, -0.2, 1.5...])", shape=parallelogram, fillcolor="#ffec99"]; to_fusion [label="到模态集成模块\n(准备与文本/音频特征结合)", shape=ellipse, fillcolor="#fcc2d7"]; img -> conv1 [label="输入"]; conv3 -> embedding [label="来自\n中间层的输出"]; embedding -> to_fusion; }预训练的卷积神经网络(CNN)通过多个层处理输入图像。早期层捕捉基本的视觉元素,而更深层则学习更抽象和复杂的模式。中间层的输出作为丰富的数值特征向量,通常称为图像嵌入。图像嵌入: 从CNN获得的特征向量通常被称为“图像嵌入”。它是一个密集的数字列表(例如,512、1024或2048个数字长),在高维空间中表示图像。这些嵌入的显著之处在于,具有相似语义内容的图像(例如,两张不同的猫的图片)在这个空间中往往会“接近”彼此。特征向量:一种通用语言无论你使用颜色直方图、边缘检测统计数据,还是复杂的CNN,目标通常都是将图像提炼成一个特征向量。这个向量只是一个有序的数字列表。对于一个有256个区间的颜色直方图,特征向量将有256个数字。对于CNN嵌入,它可能有几千个数字。这种数值向量是AI系统其他部分(特别是在多模态环境中)将要处理的。它比原始像素更能管理且信息丰富的图像表示。这些图像特征向量随后可以与从文本或音频中提取的特征向量结合,我们将在其他部分讨论这些,从而使AI能够同时推断来自不同来源的信息。总而言之,从图像数据中提取特征包括将原始像素信息转换为更结构化的数值格式,以突出重要的视觉特性。无论是通过更简单、直接的方法,还是通过像CNN这样复杂的学习方法,所得的特征向量都是构建多模态AI模型的根本组成部分。它们提供了“图像理解”组件,然后可以与对其他类型数据的理解进行集成。