# 5.2 计算机视觉 (Computer Vision)

> “Just like to hear is the not the same as to listen.To take pictures is not the same as to see.” by computer vision professor Fei-Fei Li
>
> 「听到不等于听懂，看到不等于看懂」——李飞飞，计算机视觉教授

## 5.2.1 颜色跟踪算法

参见 [3.3.1 节位图的相关说明](https://cccs.viyi.cc/3-cao-zuo-xi-tong/3.3-wen-jian-xi-tong-files-file-systems#wei-tu-bitmap)，我们知道单个像素是由 “红、绿、蓝” 三原色组成的，三种颜色的组合 RGB 值可以定义一个像素的颜色。而最简单的计算机视觉算法是一种 “颜色跟踪算法” (color marker tracking and similar algorithms)。

首先记录单色物体的最中心像素 RGB 值，如粉球中心点像素。为使得程序找到输入图片中最接近该 RGB 值颜色的像素，算法会按序 (如左上始) 逐个检查像素计算于目标颜色的差异。遍历后最接近目标值的像素位置，可能就是所要找的物品 (粉球)。

根据这个思路，可以为视频的每一帧图片都跑一次算法，从而跟踪粉球的位置。其缺陷在于因为光线、阴影等干扰会使得粉球的颜色有所变化，而与所存储的原始粉球 RGB 值不一致。再加上环境中可能存在其他颜色相近的物品，也会对该算法的识别准确率产生影响。

因此颜色跟踪算法的使用环境的控制要求较高，且只适用于单个像素的搜索而无法匹配占有多个像素的特征。

## 5.2.2 核 (kernel)

当我们需要识别类似于物体边缘 (由多个像素组成) 时，需要采用能够按块处理像素的算法。简化颜色以灰度图片为例进行说明，易得边缘处存在垂直变化，故设定 “某像素是垂直边缘的可能性，取决于左右两边像素的颜色差异程度” 的判断规则。

算法在本例中不仅处理单个像素，而是处理某像素和左右两边的像素这一小区域 (small regions) ，称该区域为「块」(patches)。

判断规则——色差越大越可能是边缘——的数学表达，称为「核」(kernel) 或是「过滤器」(filter) 。

![核](https://275040345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FycDQGvckh16RY095vh62%2Fuploads%2FLOdXKYGNWWfN9yaxmMfu%2F0.png?alt=media)

“核” 内的值 (数字) 用于对块做像素乘法，其总和用于存储更新中心像素的值。这种将 “核” 用于像素块的操作方式，称为「卷积」(convolution)。

![](https://275040345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FycDQGvckh16RY095vh62%2Fuploads%2F6VPKGAgwcnTH8Jz2FaZ5%2F1.png?alt=media)

将这个 “核” 用于照片中的每个像素，处理后的结果会突出垂直边缘的像素值，如下图所示。若想突出水平边缘的特征，则需要使用不同的 “核” 再做进一步的处理。

![垂直边缘敏感核处理效果](https://275040345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FycDQGvckh16RY095vh62%2Fuploads%2FvLEGTE3aZrfGyi7w2j23%2F2.png?alt=media)

这两个用于边缘增强的 “核” 称为「Prewitt 算子」(Prewitt Operators)，以发明者的名字命名。

<figure><img src="https://275040345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FycDQGvckh16RY095vh62%2Fuploads%2FMRPJlWQiDV9Ykno02M3L%2Fimage.png?alt=media&#x26;token=3554971d-1c58-436a-ae86-8d76bc9ed837" alt=""><figcaption><p>Prewitt 算子</p></figcaption></figure>

各类不同的 “核” 可以用于不同的图像转换，也可以制作对不同模式敏感的 “核”，用于匹配特定形状。

![各类不同核](https://275040345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FycDQGvckh16RY095vh62%2Fuploads%2FydvCy44sTztL8UEJNjIU%2F3.png?alt=media)

多个 “核” 组合在一起识别效率与准确率均会提升，比如用线段敏感的核判断鼻子、用像素岛核来判断眼睛等组合识别人脸。

不是脸但又有一堆脸的特征在正确的位置，这种情况不太可能。这种组合 “核” 是一个早期很有影响力的算法的基础，称为「维奥拉·琼斯 人脸检测算法」(Viola-Jones Face Detection)。

## 5.2.3 卷积神经网络

5.1.2 节中介绍的人工神经网络，通过最基本的单位 “神经元” 来对多个输入进行处理，乘权求和后得到一个输出。当我们为神经元输入二维像素 (2D pixel data)，则会得到「卷积神经网络」 (Convolutional Neural Networks)。

<figure><img src="https://275040345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FycDQGvckh16RY095vh62%2Fuploads%2FswUXYu5ciPppKntPmBlC%2Fimage.png?alt=media&#x26;token=e250ca1a-936b-4dc5-a1e6-0c4c509de7a1" alt=""><figcaption><p>卷积神经网络</p></figcaption></figure>

与 5.2.2 小节中预先设定好的 “核” 不同，卷积神经网络中的 “核” 可以自行学习，卷积神经网络可以选择有利于识别图片中特征的核作为某层神经元的处理方式，再将处理好的图像传给下一层进行别的特征识别。

![卷积神经网络](https://275040345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FycDQGvckh16RY095vh62%2Fuploads%2FntRjlMFn7hdNQf7O0GMT%2F4.png?alt=media)

“卷积神经网络” 不是非要很多很多层，但一般会有很多层，来识别复杂物体和场景，所以算是 “深度学习” 的一种。

## 5.2.4 情感识别算法

识别出人脸后，还可以进一步使用更专用的计算机视觉算法——像是 “情感识别算法”(emotion recognition algorithms) 来定位面部标志，进而判断人类的情绪。

比如定位了鼻尖和嘴角的标志点，可以通过计算点之间的举例来判断是否张嘴或微笑；跟踪眉毛相对于眼睛的位置，可以判断是否表示喜悦或是惊喜；通过这些信息来让电脑知道你的情绪，从而做出合适的行为。这只是计算机通过视觉感知周围的一个例子，你在不同环境会有不同行为，计算机在足够聪明的情况下也应如此。

面部标记点也可以捕捉脸的形状，进行生物识别，可以用于手机解锁或是让政府用摄像头跟踪人。跟踪手臂和全身的标记点，可以让计算机理解用户的身体语言，比如用户给联网微波炉的手势。

抽象是构建复杂系统的关键，计算机视觉也是一样。硬件层面，有工程师在造更好的摄像头，让计算机有越来越好的视力；有了用来自摄像头的数据，可以用视觉算法找出脸和手，用其他算法接着处理来解释图片中的东西；有这些基本信息后，人们可以做出新的交互体验，比如智能电视和智能辅导系统会根据用户的手势和表情来回应。
