很多初学者刚接触深度学习和计算机视觉时,都会遇到这样一种困惑:

明明都是“让模型看图”,为什么一会儿叫分类,一会儿叫检测,一会儿又叫分割、生成、检索?

看起来它们都和图像有关,也都可能会用到 CNNTransformer 之类的模型,所以很容易让人误以为:

它们只是名字不同,或者只是难度不同。

但实际上,它们最本质的区别,不在于用了什么模型,而在于:

它们要解决的不是同一种问题,输出形式也完全不一样。

这篇文章,我想专门把这件事讲清楚。

你不需要先懂复杂模型,也不需要先会读论文。
你只需要先建立一个最重要的意识:

判断一个任务是什么,先看输入是什么、输出是什么、想解决什么问题。


一、为什么这些任务总会被混在一起

初学者之所以容易把这些任务混在一起,通常有几个原因:

  • 它们都属于深度学习或计算机视觉的常见任务
  • 它们都可能处理图像
  • 它们背后都可能用到相似的模型结构
  • 很多教程上来就讲模型,却没有先讲清任务边界

于是大家很容易形成一种模糊印象:

“反正都是看图,区别应该不大。”

但真正的问题是:

同样都是输入一张图,不同任务关心的输出完全不一样。

有的任务想知道这张图属于什么类;
有的任务想知道图里有什么,并且它们在哪里;
有的任务想知道每个像素属于谁;
有的任务想直接生成新的内容;
还有的任务不是给标签,而是从库里找最相似的结果。

所以,与其说这些任务都在“看图”,不如说它们都在用图像做输入,但问的问题不一样。


二、区分任务最简单的方法:看输入、看输出、看粒度

以后你看到一个新任务,先别急着看模型名字,先问下面 3 个问题:

1. 输入是什么

是整张图?
是一张图加一句文本?
还是一张查询图像?

2. 输出是什么

是一个类别标签?
是边界框?
是像素级掩码?
是一张新生成的图?
还是一组按相似度排序的结果?

3. 粒度是什么

它关注的是:

  • 整张图级别
  • 单个目标级别
  • 像素级别
  • 生成结果级别
  • 检索排序级别

只要你先把这 3 个问题问清楚,很多任务就不会混。


三、分类:回答“这张图主要是什么”

我们先看最基础的一类任务:分类

分类任务的核心目标是:

判断这张图属于哪个类别。

分类任务的基本形式

  • 输入:一张图
  • 输出:一个或多个类别标签
  • 粒度:整图级

比如:

  • 这张图是猫还是狗
  • 这张胸片是正常还是肺炎
  • 这个水果是苹果、香蕉还是橙子

分类任务通常只关心整张图的整体语义。
也就是说,模型在回答的是:

“这张图主要是什么?”

如果结合分类示意图来看,你可以把分类直观理解成:

  • 先输入一张完整图像
  • 模型读取整张图的整体信息
  • 最后输出一个类别判断结果

也就是说,分类最典型的形式不是“画框”,而是:

直接给整张图下一个类别结论。

分类里最常见的两种情况

1. 二分类

二分类的意思是:

只在两个候选类别之间做判断。

在这里插入图片描述

比如上面这张图,输入一张狗的图片后,模型最后要在两种结果里选一个:

  • positive
  • negative

这类任务很常见,比如:

  • 是猫还是不是猫
  • 是正常还是异常
  • 是良性还是恶性
  • 是否包含目标

所以二分类最核心的特点就是:

输出只有两个候选结果。

2. 多分类

多分类的意思是:

在多个候选类别中选出最可能的那个。

在这里插入图片描述

比如手写数字识别任务中,每一张图都对应一个标签:

  • 0
  • 1
  • 2
  • 3
  • 9

这就是一个很典型的多分类任务。
模型面对的是很多可能类别,最后要判断:

“这张图更像 5,还是 0,还是 4,还是 9?”

所以多分类最核心的特点就是:

输出不再只是两个选项,而是多个类别中的一个。

从这两张图你也能更容易看出分类任务的共同点:

  • 输入都是整张图
  • 输出都是一个标签结果
  • 它不负责告诉你目标在哪,只负责判断“属于哪一类”

但它通常不会告诉你:

  • 目标具体在哪里
  • 目标占了多大区域
  • 图里是不是有多个目标同时存在

所以你可以把分类理解成:

分类关心“是什么”,但通常不负责告诉你“在哪里”。


四、检测:回答“图里有什么,它们在哪里”

检测比分类更进一步。

检测任务不只想知道图像里有什么,还想知道这些目标在图中的位置。

检测任务的基本形式

  • 输入:一张图
  • 输出:目标类别 + 边界框
  • 粒度:目标级

比如:

  • 一张街景图里有几辆车、几个人
  • 一张超声图里病灶大概在什么位置
  • 一张安防图像中有没有安全帽、有没有车辆

如果结合检测示意图来看,这个过程通常可以直观理解成:

  • 先输入一张完整图像
  • 模型会在图上很多位置、很多尺度上尝试“找目标”
  • 中间往往会产生大量候选框,绝大多数其实都不是真正的最终答案
  • 最后再保留少数高置信度、位置也更合理的框

所以你看到的检测结果,往往不是“模型一上来就只看见 3 个框”,而是:

它先提出很多种可能,再从里面筛出真正靠谱的目标位置。

和分类相比,检测多回答了一个关键问题:

它不仅告诉你“是什么”,还告诉你“在哪里”。

所以,如果分类像是在回答:

“这张图里主要是猫。”

但是如果是检测任务,如图:

在这里插入图片描述

那么模型回答的会是:

“图里有一只狗,它在左下角;有一辆自行车,在中间;右上角还有一辆车。”

检测的输出通常会表现为:

  • 一个个矩形框
  • 每个框对应一个类别
  • 有时还有置信度分数

如果贴合示意图来说,你可以把检测理解成下面这个过程:

  1. 把整张图送进模型
  2. 模型在很多位置上尝试预测“这里有没有目标”
  3. 为可能的目标生成很多候选框
  4. 再根据类别分数、位置重叠情况等规则,筛掉大量无效框
  5. 最后留下少数结果,比如“狗”“自行车”“汽车”这些最终框

所以检测和分类的差别,不只是“检测多了一个框”,而是:

检测面对的是图中可能存在的多个目标,它既要判断类别,还要从许多候选位置里找出真正的目标。

因此你可以记住一句最核心的话:

检测 = 识别目标 + 定位目标。


五、分割:回答“哪些像素属于哪个目标”

如果说检测已经能告诉你“目标大概在哪”,那么分割会更进一步:

它想知道图中哪些像素真正属于目标。

分割任务的基本形式

  • 输入:一张图
  • 输出:像素级掩码
  • 粒度:像素级

比如:

  • 把道路区域完整分出来
  • 把肿瘤区域精确勾出来
  • 把人、车、天空、树分别分开

如果结合分割示意图来看,这个过程可以直观理解成:

  • 左边先输入原始图像
  • 右边不再只是画一个框,而是把目标真正对应的区域“涂出来”
  • 也就是说,模型要判断图中每一个像素到底属不属于目标

比如那张趴着的小狗图,分割结果不是只告诉你“小狗在这里”,而是直接给出:

哪些像素属于这只狗,哪些像素不属于它。

而在摩托车那张图里,右侧结果更能体现分割的精细度:

  • 车身区域被完整标出来
  • 骑手区域也被单独标出来
  • 背景则被排除在外

这说明分割关心的,不是一个大概框,而是目标真实占据的区域边界。

分割和检测最关键的区别在于:

  • 检测通常给你一个框
  • 分割通常给你一块更精确的区域

也就是说,检测只告诉你目标的大致位置,分割则更在意目标的真实边界。

如果贴合图片来理解:

  • 检测更像是在说:“狗在这个矩形框里”“车在这个矩形框里”
  • 分割更像是在说:“这块具体区域才是真正的狗”“这块具体区域才是真正的车”

所以分割比检测更细,因为它不满足于“圈住目标”,而是想把目标真正从背景中分离出来。

分割里常见的两种情况

1. 语义分割

语义分割关心的是:

同一类像素都归为同一类。

比如:

  • 所有道路像素都标成“道路”
  • 所有树的像素都标成“树”

它不强调同类目标之间彼此是否是不同个体。

如果图里有两辆车,语义分割更关心的是:

它们都属于“车”这一类。

2. 实例分割

实例分割在语义分割的基础上更进一步:

即使同样都是“人”,也要区分这是第 1 个人、这是第 2 个人、这是第 3 个人。

放到这张摩托车图上,也可以这样理解:

在这里插入图片描述

  • 如果只是语义分割,模型更关注“哪些像素属于人,哪些像素属于摩托车”
  • 如果是实例分割,它会进一步把每个独立目标作为一个实例单独分开

也就是说,它不仅知道“这是一类什么东西”,还知道“这是一个独立的个体”。

所以你可以把分割简单记成一句话:

分割不是只给框,而是给更精细的像素级区域。


六、生成:回答“让模型创造新内容”

前面的分类、检测、分割,本质上大多都属于“识别已有内容”。

而生成任务的方向完全不同。

生成任务的核心是:

让模型产出新的内容。

生成任务的基本形式

  • 输入:可以是随机噪声、文本条件、图像条件等
  • 输出:新生成的图像、文本、视频或其他内容
  • 粒度:生成结果级

比如:

  • 输入一句文字,生成一张图
  • 输入一张模糊图,生成更清晰的图
  • 输入图像缺失区域,补全完整图像
  • 输入低分辨率图像,生成高分辨率版本

如果结合你给的扩散模型示意图来看,会更好理解生成任务中的一种典型路线。

这张图更适合从“去噪生成”的角度来理解:

  • 一开始输入的是几乎纯噪声
  • 模型执行一次去噪,图像里会出现一点模糊轮廓
  • 再继续去噪,目标形状会越来越清楚
  • 经过很多步之后,最终得到一张可以看懂的猫图

也就是说,这张图最想表达的不是“怎么加噪”,而是:

模型怎样从一团噪声开始,一步步生成出有结构、有语义的图像。

如图所示:

在这里插入图片描述

  • Step 1000 附近,图像几乎还是噪声
  • 越往后走,噪声越少,轮廓越明显
  • 到最后几步时,图像已经越来越接近真实结果

所以扩散模型在生成时,可以被直观理解成一个反复执行的过程:

  1. 从噪声出发
  2. 预测当前这一步应该去掉多少噪声
  3. 得到一个更干净一点的中间结果
  4. 重复很多次
  5. 最后生成一张新的图像

因此,如果只贴合这张图来讲,你完全可以把扩散模型先简单理解成:

一种“从噪声慢慢去噪,最终生成清晰图像”的方法。

生成和前面识别类任务最大的不同在于:

  • 分类、检测、分割主要是在“判断”
  • 生成主要是在“创造”

也就是说,前面几类任务通常是在回答:

“这是什么?”
“它在哪里?”
“哪些像素属于它?”

而生成任务更像是在回答:

“请你直接给我造一个结果出来。”

所以你可以把生成任务记成:

生成不是识别已有内容,而是构造新的内容。


七、检索:回答“从库里找最像或最相关的内容”

检索也是很容易被初学者混淆的一类任务。

很多人会把检索和分类混在一起,因为它们都可能输入一张图。
但实际上,它们的输出逻辑完全不同。

检索任务的基本形式

  • 输入:一张查询图像,或者一句文本
  • 输出:一组按相似度排序的结果
  • 粒度:集合/排序级

比如:

  • 以图搜图:给一张鞋子的图,找图库中最像的鞋
  • 文搜图:输入一句文字,找最相关的图片
  • 医学场景里,输入一张病例图,找最相似的历史病例

在这里插入图片描述

用人脸检索图举例,检索的过程可以很直观地理解成:

  • 先给系统一张“查询人脸”
  • 系统到图库里去找
  • 最后返回一组和它最相似的人脸结果

所以检索的输出通常不是一个单独标签,而是一组候选结果。

换句话说,它不是在回答:

“这张脸属于哪一类?”

而是在回答:

“数据库里哪几张脸和它最像?”

检索任务通常不是直接输出一个固定标签,而是从一个已有库中返回:

  • 最相似的若干结果
  • 相关性排序

像你这张图里展示的,就是一种很典型的视觉检索结果:

  • 系统不会只给一个答案
  • 它会返回很多候选图片
  • 越靠前的结果,通常表示相似度越高

所以检索更像是在“找邻居”或“找最像的样本”,而不是像分类那样直接拍板给一个类别名。

所以分类和检索的一个核心差别是:

  • 分类:直接预测“它是什么类”
  • 检索:返回“和它最像、最相关的是哪些”

因此你可以把检索记成:

检索不是直接给结论,而是从库里把最相关的内容找出来。


八、五类任务放在一起,到底怎么区分

如果把这 5 类任务放在一起,对比会更清楚。

任务 输入 输出 粒度 核心问题 常见指标
分类 一张图 类别标签 整图级 这张图主要是什么? Accuracy、Precision、Recall、F1
检测 一张图 边界框 + 类别 目标级 图里有什么,它们在哪里? mAP、IoU
分割 一张图 像素级掩码 像素级 哪些像素属于哪个目标? IoU、Dice
生成 噪声/文本/图像条件 新生成内容 生成结果级 能否产出新的内容? FID、IS,或任务相关指标
检索 查询图像/文本 相似结果列表 排序级 库里哪些内容最相关? Recall@K、mAP

这张表最值得你记住的不是指标,而是中间那两列:

输出形式不同,任务本质就不同。


九、最容易混淆的几组任务,到底差在哪

这一部分我建议你认真看,因为它最接近初学者真正会卡住的地方。

1. 分类 vs 检测

它们都可能输入一张图,也都可能输出“猫”“狗”“车”这种类别词。

但它们的区别是:

  • 分类:判断整张图主要属于什么类
  • 检测:找出图里有哪些目标,并给出位置

所以一句话区分:

分类只回答“是什么”,检测还要回答“在哪里”。

2. 检测 vs 分割

它们都在做定位,但定位精度不同。

  • 检测:通常给一个框
  • 分割:给更精细的区域掩码

所以一句话区分:

检测给大致位置,分割给精确区域。

3. 分类 vs 检索

它们都可能输入一张图片,但输出目标不同。

  • 分类:输出标签
  • 检索:输出相似样本列表

所以一句话区分:

分类是在做“判别”,检索是在做“匹配与排序”。

4. 识别类任务 vs 生成任务

分类、检测、分割、检索,大多都和“理解已有数据”有关。
而生成任务则更强调“产出新内容”。

所以一句话区分:

识别类任务在理解已有内容,生成任务在创造新的结果。


十、一定要记住:任务不是模型

这一点非常重要。

很多初学者会不自觉地把任务和模型混在一起,比如:

  • Transformer 当成一种任务
  • UNet 当成“分割的同义词”
  • Diffusion 当成“图像任务”的名字

但其实:

  • 分类、检测、分割、生成、检索 是任务
  • CNN、Transformer、UNet、Diffusion 是模型或方法

任务在回答的是:

我到底要解决什么问题?

模型在回答的是:

我准备用什么结构或方法去解决它?

同一个任务,可以用不同模型来做。
同一个模型,也可能服务不同任务。

比如:

  • 分类可以用 CNN,也可以用 Transformer
  • 检测可以在 CNN 主干上做,也可以在 Transformer 架构上做
  • 分割可以用 UNet,也可以用其他 encoder-decoder 结构

所以以后你看到一个名词,先别急着问“这个厉不厉害”,先问:

它是在说任务,还是在说模型?

这一步想清楚,很多混乱会直接少一半。


十一、以后怎么看一篇论文到底属于什么任务

其实判断一篇论文做什么任务,也可以用同一套方法。

你只需要先问这几个问题:

1. 输入是什么

是图像?文本?图像加文本?还是查询样本?

2. 输出是什么

是:

  • 标签
  • 掩码
  • 新生成内容
  • 相似结果列表

3. 它主要在解决什么问题

是:

  • 识别类别
  • 找目标位置
  • 分精细区域
  • 生成新内容
  • 做相似匹配

只要你先抓住输入和输出,很多论文的任务属性其实一眼就能判断出来。


十二、结语:先分清任务,再去看模型,学习会顺很多

回到最开始的问题:

分类、检测、分割、生成、检索,到底有什么区别?

我觉得最核心的答案不是一句“定义不同”就结束,而是:

  • 它们问的问题不同
  • 它们输出的结果不同
  • 它们关注的粒度不同

所以以后再遇到一个任务,不要先被模型名字带跑。
先看:

  • 输入是什么
  • 输出是什么
  • 它到底想解决什么问题

只要这三步清楚了,你就会发现:

原来很多任务并不难分,难的是过去总把它们混成一个模糊的“大类”。

真正学深度学习,不是先记住一堆模型名,而是先把问题定义理顺。

下一篇文章,我们继续往下走,把“任务层”后面那块补上:

什么是数据集、标签、样本、特征?

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐