让机器认出物体:分类、检测与分割
前情提要:上篇《图像如何变成数字:像素与卷积的直觉》里,我们把一张照片拆成了像素矩阵,再用卷积核刷出了一道道边缘、一块块纹理。这一篇我们接着往前走一步:机器怎么从这些边缘和纹理里,认出"这是猫",又怎么知道"猫在画面的左下角"?
认出"这是猫"和框出"猫在哪",其实是两件事。如果你只给机器看一张图,问它"图里有什么",它也许会信心满满地答"猫"。可要是你接着问"猫在哪儿",它却答不上来——因为刚才那个答案里,根本没有位置信息。
这正是计算机视觉里三个最基础、也最容易被人混为一谈的任务:分类、检测、分割。它们都回答"这是什么",但精度和要求差得挺远。今天我们就把它们摆在一起,看清楚层级关系,再回头聊一个让这一切成为可能的神奇结构:卷积神经网络,也就是 CNN。
一、从"是什么"到"在哪"再到"每一个像素"
最朴素的任务叫分类(Classification)。你给它一张图,它从一堆预设的类别里挑一个最像的,比如"猫""狗""车"。它的输出就是一个标签,外加一个"我有多确定"的置信度。它不关心猫在图的左边还是右边,也不关心图里到底是几只猫——只要图里主体是一只猫,它就判你"猫"。所以分类回答的是一句话:这张图整体上是什么。
但现实生活里,一张图常常同时出现好几个东西。你想让机器人从餐桌上区分"杯子、盘子、苹果",或者让自动驾驶汽车同时看到"行人、红绿灯、前车",光给一个总标签就不够用了。这时候需要检测(Detection)。
检测干两件事:先找出"东西在哪儿",再判断"那是什么"。它的标准输出是一堆方框(我们叫它边界框,bounding box),每个框旁边贴一个标签和置信度。所以同一张图里,检测可以说:"左下角有一个猫,框起来;右上角有一只狗,也框起来。"它把"位置"和"身份"绑在了一起。
那检测就到顶了吗?还差一点。方框是方方正正的矩形,可猫的轮廓是弯的,苹果的边缘是圆的。如果你做的是医学影像、需要精确切除肿瘤,或者让机器人稳稳夹起一颗不规则零件,一个粗框往往太"糙"。于是有了分割(Segmentation)。
分割是三个任务里最精细的:它给图里的每一个像素都判一个类别。属于猫的像素标成蓝,属于背景的标成灰,属于狗的标成橙。这样猫的轮廓是沿着真正的毛发边缘描出来的,而不是被一个矩形草草圈住。我们常听到的"语义分割",说的就是这种"逐像素分类"。
把三者排个队,你大概能感到一条越来越细的"刻度尺":
分类只问"是什么",检测加上了"在哪",分割则精确到"每个像素是什么"。难度和精细度,一级比一级高。
你可能会问:机器是怎么做到这些的?早期靠人手工设计特征——比如专门写规则找边缘、找角点,再交给一个分类器。这条路很费力,换个场景常常就失灵。真正的转折,是让机器自己从数据里"学"出特征,而这个学习的核心引擎,就是我们下面要聊的 CNN。
二、CNN 怎么把像素变成"物体"
卷积神经网络(CNN)的思路,和我们前一篇讲的卷积一脉相承。还记得吗?卷积核像一把小刷子,滑过整张图,刷出边缘、纹理这类底层信号。CNN 最妙的地方,是它把这种"刷"层层叠起来。
第一层卷积,往往只认最简单的东西:某几个方向的边缘、一小块颜色变化。你几乎看不出它在"认猫",它只是在说"这里有条竖线""那里有个亮点"。
可当这些第一层的输出,再被第二层卷积去刷,事情就变了。第二层不再看单个像素,而是看"第一层刷出来的那些边缘组合"——它开始认出"一个角""一段弧""一种纹理块"。再往深层走,第三层、第四层逐渐把弧拼成"耳朵的形状",把纹理块拼成"毛皮的质感",把几个部件拼成"一张猫脸"。
你可以把这个过程想象成搭积木:底层积木是最原始的小零件(点、线、边),中层积木是部件(眼、耳、爪),高层积木才是完整的"物体"。CNN 的厉害之处,在于这些积木不是人设计的,而是从成千上万张标注好的图里,自己一层层"练"出来的——数据越多、练得越好,它抽出的特征就越靠谱。
这里其实有一个很妙的呼应,可以回看我们的数学系列第 7 篇《特征值与特征向量:矩阵到底在做什么》。那篇文章里我们说,特征提取就像在一团复杂的数据里,找到最能代表它的那几个"主方向"。CNN 做的事几乎同构:它一层层把冗余的像素信息压缩、提炼,最终留下最能区分"猫"和"狗"的那些关键特征。只不过数学里的"特征"是算出来的向量,CNN 的"特征"是一组从数据里学来的卷积核——本质都是"抓住要害,丢掉噪声"。
等到了网络最后几层,这些高层特征会被拉平、送进一个普通的分类器(通常是全连接层加一个 softmax),由它给出"这是猫,概率 0.93"这样的结论。检测与分割,则是在这个"认出物体"的能力之上,再补一套"定位"或"逐像素判类"的机制——比如让网络顺带预测框的坐标,或对每个像素都做一次小分类。根子上的"认物"能力,依然来自 CNN 这一套层层抽取。
所以回过头看开头的钩子就清楚了:认出"这是猫",靠的是 CNN 把像素一路抽成物体特征的本事,它产出的是分类标签;而框出"猫在哪",是在这个本事之上叠加的位置信息,属于检测甚至分割的范畴。两者同源,却解决的是不同精度的问题。
这也就解释了为什么机器人"看见"远比我们以为的复杂:它要先会分类,才谈得上检测,再进一步才做得到精细分割。下一关,我们要让它不止看见"有什么、在哪儿",还要知道"离我多远"——这就要请三维和深度出场了。
读后小测
3 句话复述
1. 分类只回答"这张图整体是什么",检测在分类基础上加上"东西在哪儿"的方框,分割则给每个像素都判一个类别,三者精度逐级变细。 2. CNN 通过一层层卷积,把边缘、纹理这类底层特征逐渐拼成部件乃至完整物体,特征是从数据里自己练出来的而非人工设计。 3. 认出"这是猫"与框出"猫在哪"同源但不同任务,前者是分类、后者依赖检测或分割的定位能力。
1 件动手小事
打开手机相册的搜索或"按物体找图"功能,搜一个词(比如"猫"或"食物"),看看它给你的是整张图的标签、带框的结果还是按轮廓抠出的图;再找一张含多个物体的图,观察它是只给一个总标签,还是把每个物体都分别框了出来——这正是分类与检测在真实产品里的差别。
---
下一篇《深度与三维:机器人怎么知道"多远"》:你会看到,当机器已经能认出"这是猫、在左下角",我们还需要额外的深度信息,才能知道它离镜头半米还是五米,从而真正伸手去够、去抓、去避让。