我最早以为 Dense Caption(密集描述)就是把目标检测框出来的物体,挨个写一句描述——区域描述的加强版,仅此而已。直到读完 DenseCap 那篇论文,我才发现自己漏掉了最关键的问题:区域描述的框是别人给的,密集描述的框是模型自己找的;而且它找框的标准,根本不是目标检测。

先把两个任务的差别摆开。区域描述(region captioning)的输入里带着一个框:你圈出图上的某个局部,模型负责把这个局部讲清楚,框外的一切它不用管。Dense Caption 的输入只有整张图:模型自己去发现图上所有值得用语言描述的区域,给每个区域画一个框、配一段短描述,一张图可能输出几十个。
区域描述真正的问题,藏在"框从哪来"里
传统区域描述是一个两阶段流水线:先用目标检测器(比如 Faster R-CNN)找出图中的物体、生成候选框,再把每个框的特征依次送进语言模型生成描述。看起来顺理成章,但它有一个结构性的尴尬:检测器学的是"物体性"(objectness),而语言能描述的东西远远不止物体。
举个例子。一张街拍照片里,你想问路灯下面那团方形光斑是什么。检测器根本不会给你这个框,因为光斑不是物体,但语言完全可以描述它。区域描述的流程在第一步就断了——框没被找到,后面的描述无从谈起。可图像里值得描述的,往往不只是"一整个物体",还有物体的局部、物体和物体的关系、甚至背景里的纹理和光影。
Dense Caption:让网络自己长出"找区域"的能力
DenseCap 的思路是:别再把"找区域"和"写描述"拆成两件事,让它们在一个网络里联合训练。模型结构可以拆成三块:一个全卷积网络(VGG-16 预训练)对整张图只跑一次前向,得到特征图;一个密集局部化层在特征图的每个位置同时预测多个大小、宽高比各异的候选框;然后每个框的特征被送进一个 LSTM,逐字生成描述。整个过程端到端,误差能一路回传到局部化层。
这个局部化层长得很像 Faster R-CNN 的区域提议网络(RPN),但目标完全不同:RPN 学的是"这里大概有一个物体",DenseCap 学的是"这里可以被一句短话讲明白"。训练数据最能说明差异——密集描述用的是 Visual Genome:超过 10 万张图、数百万条区域描述,平均每张图有几十条,而且这些区域经常互相重叠:同一只狗,一个框标"一只金毛",另一个框只标"脖子上的项圈",第三个框标"嘴里叼的球"。标注者的态度很明确:图像理解不应该停在"把物体列全",而要覆盖"所有能用语言表达的视觉内容"。
一张表,把两者的分歧一次说清
| 对比维度 | 区域描述 | 密集描述(Dense Caption) |
|---|---|---|
| 输入 | 图片加上一个给定的框 | 只有整张图片 |
| 区域从哪来 | 外部检测器或人来指定 | 模型自己的局部化层发现 |
| 找区域的标准 | 物体性(objectness) | 语言可描述性 |
| 覆盖范围 | 稀疏,只描述框内 | 稠密,尽量覆盖所有值得说的区域 |
| 训练方式 | 检测与描述分两阶段 | 定位与描述端到端联合 |
| 典型用途 | 指代理解、可控的局部问答 | 整图场景理解、视觉叙事 |
一个值得记住的细节:DenseCap 的池化藏了注意力
DenseCap 里有个细节,我觉得是整篇论文最聪明的地方:它没有用当时区域特征提取的标准做法——RoI 池化(把框内均匀切成网格再池化),而是改用了一种无约束加权池化。
RoI 池化默认框内每个位置的信息同样重要,但这对描述任务很要命:"人骑在马上"这个框里,重要的不是马背和背景,而是人、马头以及它们的关系。DenseCap 给框内的每个特征位置学了一个权重,对框内特征做加权平均——模型自己学会把注意力放在最有信息量的部分,而不是均匀采样。它还顺手加了一个上下文融合模块,把整张图的全局特征也混进来,因为"左边的车"这种说法,离开了"左边"就毫无意义。
它没有过时,只是换了个身份活在大模型里
Dense Caption 现在不算主流任务了,但它的思想到处可见。GPT-4V 时代有个著名的提示词方法叫 Set-of-Mark prompting:把图中每个物体叠一个数字标记,然后让模型"描述 1 号""描述 2 号"。把数字标记换成 DenseCap 的局部化层,把 LSTM 换成大语言模型——本质上是同一件事:让模型自己决定往哪看,然后把每个看点讲一遍。
区别在取舍。区域描述的话,框是确定的,模型不会答非所问,代价是框外的东西一概不知,而且框的质量完全依赖外部检测器。Dense Caption 的好处是全面,一张图的信息被成体系地梳理出来;代价是框不可解释、经常重叠、还带噪声——模型觉得值得说的,未必是你觉得值得说的。
什么时候用谁,以及它先天的毛病
如果你已经有明确的目标区域,老老实实用区域描述;如果你要的是"这张图里到底有什么值得看",Dense Caption 的思路更合适。但你必须接受它三个毛病。第一,评估很麻烦:一个输出既要位置对又要文字像,论文用的指标是 METEOR 和 IoU 的联合——说得好但框画偏了照样算错。第二,区域的主观性极强,标注者觉得有价值的区域,换个人可能完全无感。第三,它的输出是短语级别的短句,不是段落的叙事,直接拿来用还需要后处理。
回到我最早的那个误解:Dense Caption 和区域描述的分歧,不在一个输出长一个输出短,也不在数量的多和少。真正的分歧是控制权在谁手里,以及"该看哪里"这件事是否交给模型决定。这个分歧没有随着 DenseCap 过时而消失,它只是换了一批模型,继续演。
想读原始材料?按这个顺序
- DenseCap 论文(CVPR 2016):arXiv:1511.07571
- Visual Genome 数据集(IJCV 2017):arXiv:1602.07332
- Faster R-CNN(RPN 的设计来源):arXiv:1506.01497
- Set-of-Mark(大模型时代的 Dense Caption):arXiv:2310.11441
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/637.html