机器如何“看见”——从像素到识别
你拍下一张猫的照片,发到朋友圈。对朋友来说,那是一团毛茸茸的可爱;对计算机来说,那是一张由数百万个数字组成的表格。
计算机视觉的第一步,是承认这个略显扫兴的事实:机器并不“看”图像,它读取的是数字。一张数字图像被分割成无数正方形网格,每个网格是一个像素。彩色图像中,每个像素由红、绿、蓝三个亮度值定义,比如79,60,20,取值范围是 0 到 255。整张照片在计算机内存里,就是一个“高度 × 宽度 × 3”的三维数字矩阵。机器“眼中的猫”,不过是一片数字的海洋。
真正让计算机视觉成为可能的,是一套从数字中逐层“榨取”意义的算法,其中最核心的架构叫做卷积神经网络。
卷积神经网络的工作方式,可以想象成一组不断升级的“滤镜”。第一层卷积使用简单的检测器,专门寻找画面中亮度发生突变的地方——也就是边缘。水平边缘、垂直边缘、斜向边缘被分别提取出来,猫咪的轮廓开始浮现。第二层卷积在边缘的基础上寻找纹理:毛发的走向、眼睛的质感、背景中窗帘的褶皱。层数越深,提取的特征越抽象:从边缘到纹理,再到“耳朵的形状”“胡须的弧度”,最后收敛为“这是一只猫”的高层语义表征。经过多层卷积之后,二维特征图被展平为一维向量,送入全连接层,由 Softmax 函数输出各个类别的概率。
这套“逐层抽象”的思路并非一开始就奏效。计算机视觉在 1980 年代由马尔(David Marr)奠定学科基础时,主流方法依赖人工设计的边缘检测算子,比如高斯拉普拉斯算子,先平滑图像,再寻找二阶导数的零交叉点来定位边缘。这些方法精巧,但脆弱:换个光照、换个角度,规则就可能失效。
转折发生在 2012 年。AlexNet 在 ImageNet 图像分类竞赛中,将错误率比第二名拉低了整整 10 个百分点。它做的事情并不神秘:用更深的卷积网络,在 GPU 上从海量数据中自动学习该提取什么特征,而不是由人告诉机器该找什么。2015 年的 ResNet 进一步用“残差连接”解决了网络加深后的退化问题,让上百层的网络成为可能。从此,计算机视觉从“手写规则”的时代,进入了“从数据中学习”的时代。
但“识别”不等于“理解”。机器可以以极高的准确率告诉你画面里有猫,却不知道猫在晒太阳,也不知道猫下一秒会跳下窗台。它学到的是像素与标签之间的统计关联,而非世界的因果结构。这也解释了为什么计算机视觉在标准测试集上早已超越人类,却在自动驾驶、医疗诊断等真实场景中仍然小心翼翼。看见,是第一步;看懂,是另一场远未结束的远征。