初始计算机视觉

计算机视觉,简单说就是让计算机也能像人一样 “ 看 “ 懂世界。它的系统一般由摄像头和计算机构成,摄像头负责 “ 看 “(获取图像),计算机负责 “ 想 “(分析图像)。比如手机的美图秀秀,用摄像头拍人脸,计算机就能美化;火车站刷脸进站,摄像头拍人脸,计算机比对确认是不是本人。

计算机视觉的应用

在现实生活中,可能需要计算机视觉系统完成下面的一项或者几项任务。

  • 物体确认: 确认图像里的东西是啥,比如确认照片里的建筑是不是清华大学大礼堂。
  • 物体分类: 给图像里的物体或场景分分类,比如把图片区域分为人、建筑等,或者把整张图分为室外、校园等场景,方便整理照片。
  • 物体检测和定位: 在图像里找到物体并确定位置,比如找人脸,还要标出人脸在哪里(用框框住)。
  • 图像深度信息计算: 算出图像里物体离摄像头有多远。这对自动驾驶汽车很有用,能判断是否该刹车、转弯。
  • 图像生成: 生成新图像,比如把普通图变成水彩画,或者根据一些元素做张海报。
  • 信息补全: 把黑白图变彩色,或者还原被挡住、涂掉的部分,也算图像生成的一种。
  • 物体跟踪: 在视频里追踪某个物体,比如足球比赛里一直跟着某个运动员,看他的动作。
  • 动作和事件分类: 分辨视频里的动作(如投篮)或事件(如搀扶老人过马路),方便分析视频内容、做摘要。

这些任务让计算机视觉在生活中用处多多,从手机应用到交通出行,都有它的身影。

计算机视觉的统计方法

在计算机视觉研究中,有两类方法影响较大:统计方法和深度学习方法。

深度学习方法当前应用广泛且有效,但在一些简单的计算机视觉任务中,统计方法更简单且有效,学习统计方法也有助于理解重要概念和深度学习方法。

计算机视觉中的统计方法因任务而异,物体分类和识别任务最典型,研究也最多。在统计方法中,输入图像(或视频),经特征提取和分类两个阶段,输出图像分类结果。以小丑鱼图像识别流程为例,下面分别讨论特征提取和分类阶段。

特征提取

一般来说,图像主要由边缘、颜色、纹理等特征构成。例如,小丑鱼主要由橙色、白色、黑色构成,颜色间有平缓弯曲的边缘,每类颜色内部有渐变纹理。而三色神仙鱼也由这三色构成,但颜色间边缘较直,弯曲少,每类颜色内部也有渐变纹理。

虽然两种鱼颜色构成相似,但颜色取值不同(如小丑鱼橙色占比约 60%,三色神仙鱼约 20%),还可计算颜色间边缘的平均曲率值等,且鱼的头、尾、身体、鱼鳍部分差异也大(如三色神仙鱼身体更宽,小丑鱼更细长)。

“ 特征提取 “ 在统计方法中根据人的观察、经验设计完成。 研究人员观察要分类的物体,总结经验规律,设计算法提取特征。例如,Canny 算子提取边缘特征,方向梯度直方图(HOG)特征、尺度不变特征变换(SIFT)特征等。使用 Canny 算子可计算图像边缘位置,确定物体部分(如鱼头、尾、身体),之后进入分类阶段。

分类

以小丑鱼和三色神仙鱼分类为例。假设有三张小丑鱼图像,橙色占比分别为 58%,60%,62%;三张三色神仙鱼图像,橙色占比分别为 18%,20%,22%。

  1. 第一步,计算两类图中橙色占比的平均值 P

    • 小丑鱼:

$$
P_1 = (58% + 60% + 62%) / 3 = 60%
$$

- 三色神仙鱼:

$$
P_2 = (18% + 20% + 22%) / 3 = 20%
$$

  1. 第二步,计算:

$$
P_1、P_2 的平均值 P_t = (60% + 20%) / 2 = 40%) 作为阈值。
$$

  1. 第三步,对新图像计算橙色占比 P, 若

$$
P < P_t
$$

,则判断为三色神仙鱼,否则为小丑鱼。

就如下图所示,图中的这条竖线能够把小绿点代表的三色神仙鱼和小红点代表的小丑鱼分开。

对小丑鱼和三色神仙鱼分类过程的计算图示

该阈值

$$
P_t
$$

由计算过程自动得出,从给定数据中学习,此过程称为学习(learning) 过程。

  • 在早期研究中,阈值等数值人为确定,无需计算前两步,但人为确定参数在复杂任务中困难,需算法人员深入了解分类问题,如知道橙色占比可区分两种鱼并估计

$$
P_t
$$

。其好处是无需大量图像,但缺点是实际应用中图像分类任务复杂,算法人员难以估计每个参数,且如果任务改变(如变成小丑鱼和金鱼分类),则需重新确定数值。

  • **在统计方法中,阈值

$$
P_t
$$

通过学习得到**,好处是特征(如橙色占比)确定后,计算过程可用于多种分类(如鱼、建筑分类等),与具体应用问题无关,但需获取两类物体图像数据并计算特征,复杂图像识别任务需收集和标注大量图像。

Tips: 人为确定参数需大量经验,适合简单问题;学习方法对人依赖减少,但对数据依赖增加。

前面例子只用橙色占比特征,很多图像识别问题需多个特征。给每个特征一个 “ 权重 “(权重绝对值越大越重要),加权求和得新特征,再确定阈值。例如识别多种鱼,需提取每种颜色占比、边缘多少、曲率、纹理等,加权求和,每个特征的权重及综合特征的阈值都需确定。

假设小丑鱼平均橙色占比

$$
P_1 = 0.6
$$

平均边缘弯曲程度

$$
Q_1 = 0.3
$$

三色神仙鱼

$$
P_2 = 0.2 , Q_2 = 0.1
$$

计算组合特征:

$$
S_1 = 2P_1 + 1Q_1 = 1.5
$$$$

S_2 = 2P_2 + 1Q_2 = 0.5

$$$$
组合特征 S 的阈值: S_t = (S_1 + S_2) / 2 = 1.0

$$
其中,橙色占比权重 2,边缘弯曲程度权重 1,权重及阈值都可通过学习得到。

使用学习参数需从提供的数据中学习,称为训练(training)过程、训练模型或训练分类器。在小丑鱼和三色神仙鱼分类中,第一步到第二步是用 6 张图像特征值训练分类器(classifier)。特征组合例子中,权重参数及
$$

S_t

$$
也是训练结果。图像分类时,只需将实际图像特征与阈值比较,此过程为测试(test)。

通过大量数据测试评价分类器性能(如测试 100 张图像,识别率 99%),若满足需求,即可实际使用该分类器识别图像。

计算机视觉的深度学习方法

统计方法中人工提取图像特征存在困难,如特征不明显时难以设计算法提取,且分类任务变化需重新设计特征提取方法。

深度学习就不一样了,它让计算机自己从数据里学特征,灵活又适应各种任务,不过得先有大量标注好的图像数据才行。现在图像识别大多用多层的神经网络,这种学习深度神经网络的方法就叫深度学习。

Tips: 深度学习是指对深度模型进行学习,神经网络层数多所以叫深度神经网络,深度是指模型的结构有很多层。

下面介绍一个简单的深度神经网络模型: LeNet 不过再串讲这个模型之前,我们先介绍一些基础的概念。

LeNet:图像识别深度神经网络模型

计算机中的图像

黑白图像

在计算机里,黑白图像由二维矩阵表示,矩阵里的每个值在 0 到 255 之间,这个值叫做灰度。一般来说,灰度值越小,对应的图像上的像素就越黑。 比如人的眼睛、头发、胡子,在表格里对应位置的数就比较小。

彩色图像

彩色图像由 3 个矩阵表示,分别对应红、绿、蓝 3 个通道,每个通道类似一张黑白图像。例如,红色通道像素取值为 255 时,红色成分达最大;取值为 0 时,无红色成分。

基础操作

卷积

卷积是深度神经网络的基本操作。我们需要用到卷积模板(template),也叫做卷积核(convolutional kernel),将其在图像上滑动,然后将对应像素值相乘后求和。

我们以 3 x 3 的卷积核以及 4 x 4 的图像块为例,卷积核从左上角开始,依次右移、下移做卷积运算,得到的新图像(特征图)比原图像小(上下各少一行,左右各少一列)。

上面这个 3 x 3 的卷积核比较特殊,用它在图像中某个位置做卷积就等价于用图像中该像素右侧相邻的 3 个像素的灰度值分别减去左侧相邻的 3 个对应像素的灰度值,然后把 3 个差求和。

用这个模板就可以提取图像竖直方向的边缘,例如我用它和下图左侧的图像做卷积,最终会得到右侧的图像。

因此,可以通过设计不同的卷积核,提取横向 45 度、135 度等方向边缘特征。当然大小也不限于 3 x 3,设计不同模板就可以得到不同类型的边缘特征。

而通过卷积操作后得到的新图像,就叫做特征图(feature map)。例如,下面左图经过特定卷积核的卷积运算后,就能得到右面的垂直边缘特征图和水平边缘特征图。

边缘是图像的一种特征,前面的卷积核是在对图像提取边缘特征。纹理也是图像的特征,例如一小块图像灰度从深到浅的过渡就是一种特征,可以使用别的卷积核提取这样的特征。这些特征都可以通过卷积来实现,只是卷积核不同罢了。

在 2012 年前,卷积核多由人工设计(早期图像处理研究内容)。而在深度学习时代,这些特征可以通过学习方法自动得到。在人工神经网络模型中,卷积相当于给图像的特征提取确定了基本操作,然后通过学习过程中得到具体的特征数值。

激活函数

在深度学习的神经网络世界里,激活函数扮演着极为重要的角色。当我们对图像进行卷积操作后,得到的数值结果可能或大或小。如果这个值很大,说明这一小片图像与卷积核很匹配,非常 “符合” 模板对应的特征;如果值很小,则表明不匹配。但卷积后的结果还不能直接用于后续处理,这就需要激活函数来发挥作用了。

常见的激活函数有几种:

  • 阶跃函数(图 a)就像一个简单的开关,卷积后数值大,对应的神经元就激活,输出为 1;否则就不激活,输出为 0。这很像动物神经元,受到刺激才会激活。不过它的输出比较生硬,会丢失很多细节。
  • Sigmoid 函数(S 型函数)(图 b),就高级一些了,它可以输出神经元被激活的程度,能更好地传递图像 “符合” 模板特征的程度。但它也有缺点,就是计算起来比较复杂,涉及指数函数的计算。
  • 还有一种是 Sigmoid 函数的分段线性近似(图 c),把曲线分成三段,用直线近似,这样计算就简单多了。
  • 而 ReLU 函数(图 d)则更为简单,在深度神经网络中应用广泛。

之所以需要激活函数,是因为现实中的问题大多是非线性的。如果没有非线性激活函数,神经网络模型就会过于简单,无法处理复杂的实际问题。激活函数通过对输入值在不同区间进行放大、缩小或抑制,让神经网络具备了处理非线性问题的能力。

池化(降采样)

池化,也叫降采样,简单来说就是把图像缩小。在处理图像时,我们常常会用到 2×2 图像小块的池化操作,主要有两种方式:平均池化(average pooling)和最大池化(max pooling)。

  • 平均池化是对 2×2 的 4 个像素的灰度值求平均,将这个平均值作为缩小后图的像素的灰度值。
  • 而最大池化则是取这 4 个像素中的最大值,作为缩小后像素的灰度值。

对左下图进行平均池化操作,就能得到右下图:

这两种方式各有优劣:

  • 当卷积操作抽取到某个明显特征(比如猫耳朵的尖)时,最大池化能很好地保留这个特征,而平均池化可能会让这个特征变得不明显。
  • 但当图像因为噪声(如雨、雪等干扰)出现不该有的大特征取值时,平均池化能把噪声 “平均” 掉,最大池化却会留下噪声。

所以在实际应用中,我们需要根据具体情况人工选择合适的池化方式。

另外,池化操作的意义还在于去除图像中冗余的信息。通常情况下,图像里很多像素包含的信息是重复的,比如一片树叶图像,一个像素是绿色,周边像素也基本是绿色。池化就像是让人从远距离观察图像,降低了图像分辨率,去除了细节,却不会影响对图像整体特征的把握。

对图像进行 “池化”

全连接层:神经元的协作网络

全连接层是神经网络中神经元紧密协作的区域。以一个三层的全连接网络为例,从左到右依次是输入层、隐含层和输出层,每个圆圈代表一个神经元。

人工神经元其实就是对人神经元工作机制的计算抽象和模拟。人的神经元通过树突接收来自外界或其他神经元的信号,这些信号对神经元产生刺激的强弱取决于信号本身的强弱,以及接收信号的神经元树突的 “敏感” 程度。

在人工神经元中,我们通过对不同信号进行加权求和,来模拟这个过程。然后使用激活函数,模拟生物体中输入信号对细胞核刺激程度不同导致激活程度不同的过程,最后被激活的神经元把信号传递出去。

当多个神经元构成全连接网络后,它的功能就强大起来了。

  • 一方面,它可以把输入的各个信号组合成新特征,并对这些特征进行 “耦合”,从而达到分类的目的。比如在识别小丑鱼时,会综合 “长宽比”、”橙色占比”、”边缘弯曲度” 等特征来判断。
  • 另一方面,它还能把 “耦合” 的信号 “解耦”,分离出各个单独的特征,这对于分析图像的特征非常重要。通过特征的 “耦合” 与 “解耦”,全连接网络能够更好地处理图像信息,解决实际问题。

特征的解耦和物体的分离

LeNet 模型结构:经典的图像识别架构

LeNet 模型是深度学习中一个经典的图像识别模型。我们以输入一张 32×32 的图像为例,来看看它的工作过程。

  • 首先,使用 6 个 5×5 的卷积核对图像进行卷积,卷积后的结果经过激活函数,得到 6 个 28×28 的特征图。这里的卷积核就像是一个个小探测器,在图像中寻找特定的特征。
  • 接着,对这 6 个特征图分别做 2×2 的池化操作,图像在长宽方向上都缩小到原来的一半,得到 6 个 14×14 的特征图。池化操作去除了一些冗余信息,让图像变得更精简。
  • 然后,再用 16 个 5×5×6 的卷积核对这 6 个特征图进行卷积,经过激活函数后,得到 16 个 10×10 的特征图,这一步进一步提取了更复杂的特征。
  • 之后又进行一次池化操作,得到 16 个 5×5 的特征图。
  • 再用 120 个 5×5×16 的卷积核做卷积,得到 120 个 1×1 的特征,最后把这些特征输入一个全连接网络进行处理。

在 LeNet 模型中,每一层卷积核的大小、数目,各层节点个数,以及卷积层、池化层、全连接层的先后顺序等结构参数都是预先设定好的。而卷积核的取值、全连接层中权重系数的取值,则是在训练阶段通过大量的数据学习得到的。

LeNet 模型的卷积层负责提取特征,从底层的横向或竖向边、灰度渐变等局部特征,到经过多次卷积和池化后更综合、更抽象的特征。池化层不断对图像进行抽象和概括,去除冗余。

最终,全连接层根据提取到的特征对图像进行分类。比如对于手写数字 “3” 的图像,从最初提取的小线段,经过层层处理连接成弧线、圆圈,这些特征就能帮助模型准确地识别出这是数字 “3”。

人工神经网络从局部到整体,逐层提取特征,根据特征特异性识别物体。不同物体特征不同,神经网络能提取差异性特征。算法学习到的特征有的很复杂,对图像识别有用。

原始图像像素灰度和特征都是对图像的表示,好的表示利于数据分析,特征可学习时,表示学习(representative learning) 受到广泛重视。2013 年创建表示学习国际会议,已成为人工智能、机器学习领域重要会议。

其他神经网络模型

LeNet 是 20 世纪 90 年代提出的模型。2012 年后,研究人员还提出了 AlexNet、VGG、Inception、ResNet、DenseNet、U - Net 等模型。

除 ViT 外,这些模型基本操作都是卷积、池化、全连接,只是操作的先后顺序、连接方式因视觉任务多样性和特殊性而有差别。2017 年提出的 Transformer 模型针对自然语言处理,后被用于计算机视觉,如 ViT 就是基于 Transformer 的视觉模型。

目标函数与优化

前面我们已经介绍过,神经网络的卷积核的取值和神经元的连接权重是通过学习得到的。那这是怎么实现的呢?

目标函数及误差

对于给定的神经网络,通常先随机给出一组参数,再逐步调整以优化网络性能。而评价神经网络性能就需要借助目标函数(objective function),例如使用 LeNet 网络识别小丑鱼和三色神仙鱼时,规定输出节点 [1,0] 对应小丑鱼,[0,1] 对应三色神仙鱼。

若输入小丑鱼图像,网络输出 [0.8,0.2],则误差为
$$

(1 - 0.8)^2 + (0 - 0.2)^2 = 0.08

$$
所有图像误差的平均值即为目标函数值,这些值可以作为反映网络性能的一个指标。

梯度下降算法

确定目标函数后,可以通过反向传播算法(BP 算法) 优化神经网络参数。该算法基于梯度下降法思想;如求函数
$$

f(x) 极小值,计算自变量 x_i 处切线斜率 k(即导数 f^\prime(x_i) ), x_i - k 会往极小值方向移动。

$$
$$

当 x_i 在极小值左侧,斜率 k 为负,x_i - k 会变大;$$$$ 当 x_i 在右侧,斜率 k 为正,x_i - k 会变小。
$$

重复此过程,自变量逐渐靠近极小值。但梯度下降法可能只能到达局部极值,研究人员不断设计新算法以追求更好性能。在人工智能中,常将问题建模成目标函数的优化问题,通过迭代优化寻找次优解。

在神经网络参数学习中,“端到端”(end - to - end)学习 可对网络从输入到输出的所有参数进行调整优化。

  • 统计方法中特征提取和分类器设计分离,常由不同团队完成,难以联合设计。
  • 而端到端优化能将特征提取和分类器设计联合,每次调整参数都旨在提升网络性能,应用问题或数据集变化时更简单灵活。

实现端到端训练的前提是模型在输出端能将误差信号传递到所有要调整的参数,深度卷积神经网络可实现误差函数对每个参数求偏导数,解决了分类错误如何指导特征提取阶段参数调整的难题。

计算机视觉成功应用案例

2012 年以后,随着计算机视觉研究的深入和广泛,图像识别算法性能越来越好,一些计算机视觉产品也在实际中发挥作用,例如:火车站刷脸进站、刷脸打开手机、微信中检测并识别图像中的文字、二维码扫码识别、视觉工业产品检测等。下面再举几个例子。

  • 视网膜病变筛查: 这是谷歌完成的一个图像识别系统。该系统可以识别视网膜图像是不是病变图像,以及是哪类病变图像。评测结果表明,该系统已达到眼科医生的判断水平。
  • 皮肤癌识别: 这是斯坦福大学完成的一个图像识别系统。该系统识别皮肤癌图像,输出的是该图像对应的是哪一种皮肤癌。报告说,在最常见和最致命的皮肤癌的诊断上,该算法能达到皮肤科医生水平。
  • 围棋: DeepMind 完成的围棋程序 AlphaGo 在 2016 年战胜了韩国名将李世石。在这个系统中,研发人员采用深度卷积神经网络来 “感知” 围棋棋盘 “图像”。这一感知模块在 AlphaGo 中发挥了重要作用。

之前体检出的 AI 视网膜检测报告

深度神经网络方法成功的原因

一句话总结:大数据、大模型、大算力

深度神经网络在图像识别等任务中取得突破,原因如下:

  • 大量数据: 如识别文字 “清”,需提供不同字体、倾斜、背景噪声等图像训练,数据并且要有足够的量和变化。而如今图像采集设备(如相机、智能手机)普及及互联网发达,便于我们收集大量图像用于训练。
  • 模型特别大: 复杂图像识别任务中,性能好的神经网络层数深且每层宽,有足够 “能力” 解决复杂任务。20 世纪 90 年代神经网络一般不超过 4 层,中间隐含层节点数 100 - 200;2012 年图像识别冠军模型有 7 层,前面几层节点数达几十万,此后模型越来越深、宽。
  • 学习特征: 图像识别中很多特征难以人工设计或设计不好,如 “这名学生很阳光””这个人满面春风” 的图像特征,深度神经网络可自动学习特征。
  • 计算机的能力: 20 世纪 90 年代计算机硬件水平无法支持当前神经网络模型计算,深度神经网络时代,计算机硬件水平大幅提高,特别是 GPU 的高性能为图像识别性能突破起关键作用。

计算机视觉任务的困难

实现高识别率的图像识别系统需大量标注数据,实际中存在不同程度困难:

  • 数据标注耗时、耗力、耗费用,如高识别率人脸识别系统的图像标注。
  • 部分数据收集使用受限,如医院的医学图像(CT、癌症病理、磁共振图像等)受隐私等因素限制,未经批准不得使用或移出。
  • 有些任务缺乏大量数据,如医学罕见病图像数据、科学研究中的少量实验图像,世界范围内病例和图像极少,新研究的图像也有限。

在计算机视觉任务中,图像确认、分类和识别都已经有了比较多的应用产品。但是,还有很多视觉任务做的不好。根据计算机视觉的问题性质来看,其困难主要来源于下面几个方面:

  • 三维: 图像是三维物体在二维空间的投影,信息大量丢失,图像识别需根据二维图像识别三维物体。如人对立方体判断是因日常生活中该类图像多为立方体投影,大脑建立简单映射,但此映射也会出错。

  • 姿态: 物体姿态多样,如人不同动作(站立、坐、奔跑、舞蹈)姿态差异大,计算机视觉模型识别图像本身(物体外观),同一物体不同姿态给动作识别等任务带来困难,如篮球赛投篮动作识别,涉及运动员、拍摄角度、光线等多因素,需大量数据收集标注。

  • 光照: 物体在不同光照下呈现不同样子,图像识别要求训练数据包含实际使用的不同光照情况。工业产品检测和车站刷脸进站可控制光照以满足要求,但自然场景光照千差万别,特殊光照条件少,数据收集困难。

  • 遮挡: 三维世界物体无叠加,但二维图像存在遮挡,图像识别需根据未遮挡部分识别物体,遮挡部分多则识别困难,这是计算机视觉与听觉、自然语言处理相比的特点和难点。

实际需求中,这些因素可能同时存在,如自然场景下人体动作识别涉及三维、遮挡、光照、姿态等,增加了任务难度。

计算机视觉系统适合哪类任务

人类视觉和计算机视觉存在差异,各有所长。人看物体是感知过程,加入生活经验;计算机 “看” 图像是测量过程,计算数值。计算机视觉系统适合的任务特点如下:

  • 观察图像中的细节: 如指纹识别(寻找纹线端点判定图像是否相同)、虹膜识别(提取细小纹理判定图像归属),这些依赖图像细节差异的任务,人难以看清纹线或寻找端点,适合计算机完成。
  • 重复做同一件事: 如工业产品质量检测、视频监控,人做这类任务易疲劳且 “熟视无睹”,计算机存储量大、计算快,不知疲倦,可机械执行重复性任务。
  • 需要精细计算和操作的任务: 如不同角度拍摄的图像拼接,或图像中动物剪贴、工业产品检测时物体大小测量等,这类精细计算和操作任务适合计算机。