Dense Captioning:不只描述整张图,还要给每个区域写说明——结合了检测和描述

你给一个多模态模型看一张照片,问它:"这幅图里发生了什么?" 它回答:"一个女人在沙滩上散步。" 很好。你接着问:"她戴的帽子是什么颜色的?" 模型沉默了。不是因为它笨,而是因为传统的图像描述只允许它说一句话,而且这句话来自全图编码,细节早就丢了。Dense Captioning 想解决的就是这个问题:与其给整张图一句宽泛的描述,不如把图拆成一堆区域,每个区域都配一句话,把 "这是什么" 升级成 "这里正在发生什么"。

AI technology illustration

为什么需要这种任务?因为图像描述和物体检测各自都有明显的短板。图像描述擅长提炼全局主题,但会丢掉空间细节;物体检测擅长定位物体,但只能输出硬编码的类别标签。一张婚礼照片上,检测器给你的是 "person、person、cake、table",caption 模型给你的是 "a couple cutting the cake",而你真正想知道的可能是 "新娘的手指紧张地绞在一起"。没有任何一个全局标签能捕捉到这种局部细节,但人类的视觉注意力能。

Dense Captioning 的名字很直白:dense 意味着每个角落都被覆盖,caption 是描述。一个训练好的 Dense Caption 模型,输入一张街景图,输出会是一串带坐标框的描述:"黄色出租车停在路边","一个行人正在过马路","交通信号灯亮着红灯"。这里不仅包含物体,还包括动作、状态、场景元素。就像给图片加了一层弹幕字幕,每一个弹幕都钉在某个具体的位置。

任务 输入 输出 核心挑战
图像描述 整张图 一句话 全局语义 + 语言生成
物体检测 整张图 框 + 类别标签 定位准确率
Dense Captioning 整张图 一组 (框 + 描述) 区域提议 + 描述生成 + 对齐

我最早对 Dense Captioning 有个误解,以为它就是物体检测加图像描述:先用 Faster R-CNN 找出所有物体框,再对每个框跑一遍图像字幕模型。后来读了 Johnson 等人的 DenseCap 论文,才发现这条路根本走不通。检测器只对预先定义的类别感兴趣,而图像里值得用一句话描述的区域,往往不是物体。一张公园照片里,"树荫下的长椅" 是物体吗?是。那 "湖面上泛起的涟漪" 呢?不是。"远处正在跑步的人",检测器会给你一个 "人" 框,但不会告诉你他正在跑步。如果先用检测器切一块,那些没有被框住的语义片断在上游就被砍掉了。

DenseCap 的解决办法是端到端训练一个全卷积网络,把区域提议和描述生成放在同一个模型里,让网络自己学会 "哪里值得描述"。整个过程可以拆成五步:

  1. 用预训练的 VGG-16 卷积层提取整张图像的共享特征。
  2. 一个 Region Proposal Network(RPN)在特征图上滑动,输出大量候选框,并给每个框一个 "可描述性"(describability)分数,表示这个区域有多大可能被写成一句自然语言。
  3. 对候选框做非极大值抑制,保留得分最高的一批。
  4. 对每个保留框使用 RoI Pooling 提取固定尺寸的特征。
  5. 将区域特征输入一个 LSTM,逐词生成该区域的描述。

这里有一个容易忽略的细节:所有候选区域共享同一套卷积特征,RoI Pooling 直接在全图特征图上裁剪并归一化,而不是把每个区域单独送进网络。这让模型可以在一次前向中处理几十个区域,反向传播时区域之间的梯度还能相互影响。这个设计在 2016 年算得上超前,后来的 Faster R-CNN、Mask R-CNN 都走了同一条路。

第 5 步里的 LSTM 也值得多说一句。它输入的不只是区域特征,还要在每一步预测下一个词,遇到 <End> 标记才停止。所以模型输出的描述不是固定长度,短区域可能只有三个词,而复杂区域会生成一整套句子。我在论文附录的可视化里看到过类似对比:同一个场景里,"一辆黄色的车" 只有五个字,而 "一群人在阳光下的商店前面站着聊天" 要长得多。这种动态长度能力,比固定类别标签要灵活太多。

注意第 2 步的 RPN:它和 Faster R-CNN 里的 RPN 名字相同,目标却不同。Faster R-CNN 的 RPN 学习的是 "这个框里有没有物体",而 DenseCap 的 RPN 学习的是 "这个框能不能被描述"。这是 Dense Captioning 最精妙的地方——它把检测从 "物体本体论" 中解放了出来,让区域的大小和形状不再受限于物体的边界。

关于几个容易混淆的名词,可以对照下面的解释:

Region Proposal Network (RPN)
一种轻量卷积网络,在特征图上生成大量矩形候选框,并输出每个框的置信度。
RoI Pooling
把大小不同的候选框特征缩放到同一尺寸,供后续 LSTM 使用。
Describability
区域被自然语言描述的可能性。DenseCap 在 Visual Genome 数据上训练,每个真实区域都有人工写的描述,所以模型学到的是标注人员心中的 "可描述性"。

说到训练数据,DenseCap 用的是 Visual Genome 数据集。它包含超过 10 万张图像,每张平均带有几十条区域级人工描述。我第一次翻看这些标注时有点震撼:一张普通客厅照片,标出了壁炉上方的画、茶几上散落的杂志、灯光洒在沙发上的影子。这种粒度让我意识到,人的视觉注意力本身就是一种密集叙事。

评估 Dense Captioning 模型也不容易。论文采用了类似物体检测的 mAP 指标:把模型生成的框及其描述与人工标注做匹配,用文本相似度(比如 METEOR)衡量描述质量,然后计算不同 IoU 阈值下的平均精度。一句话,既要框得准,也要说得像,两个任务同时考核。

不过,DenseCap 的局限也同样明显。最直接的一点:如果 RPN 漏掉了一个区域,后续的 LSTM 再强大也看不到它。检测器固有的毛病它都有——小目标容易漏,遮挡场景容易错,对边缘区域的定位不稳定。另一个让我印象深刻的缺陷是描述风格的单一化。因为训练数据里大量出现 "a man standing next to a car" 这样的平铺直叙,模型生成的描述往往带有同一股腔调,缺少人类描述中的主观视角和情绪。

更深一层,Dense Captioning 其实提出了一个哲学问题:什么值得描述?这没有客观答案。标注人员会偏爱显著物体,忽略光影和氛围;模型学到的只是这种统计偏好,谈不上真正的 "全面"。所谓 dense,也只是相对 dense 而已。这也是为什么后来的多模态大模型不再执着于固定框,而是让模型根据问题动态地决定关注哪里。

这些局限不影响 Dense Captioning 的启发意义。它让我想通了一个事:视觉理解不只是 "认得出物体",还需要知道 "话要对着哪里说"。今天的大语言模型可以流畅描述整张图片,但你要是指着照片的某个角落问 "这个区域在干嘛",它往往给不出明确的边界。Dense Captioning 提前撞开了这扇门——它给出了一个端到端的框架,把区域定位和语言生成焊在了一起。即便 DenseCap 这个名字已经有些时过境迁,"区域 + 描述 + 可学习的区域选择方式" 仍然是很多多模态模型的基础打法。

如果你有空,可以随便拿一张街景图,在纸上手动框出你认为值得描述的区域,再去对比这类模型的输出。你会发现,你和它的注意力偏差往往很大。这不一定是模型的缺点——它只是提醒我们,视觉注意力和语言描述从来都不是绝对客观的操作。Dense Captioning 最大的贡献,也许是逼着我们去直面这个事实。

原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/565.html

(0)
上一篇 2天前
下一篇 2天前

相关推荐