CountingDINO
论文链接
代码链接
核心目标
- 让计算机能数清楚一张图片里任意类别物体的数量,无需:
- 为这个特定类别进行模型训练。
- 依赖人工标注好的大量数据来训练模型。
- 依赖预训练好的目标检测或分割模型(虽然它用了自监督的骨干网络)。
核心思想
- “按图索骥”:用户提供“示例”框 (Few-shot Exemplars)
- “特征匹配”:利用自监督特征 (Self-Supervised Features - DINO)
- “归一化计数”:从相似图到密度图 (Similarity -> Density)
关键创新点
按图索骥
用户只需在图片上框出几个(通常1-5个)想要计数的物体(比如,框出3只鸟)。
- 意义:这些框告诉模型:“我要数的东西,长这个样子”。这取代了传统方法中需要大量标注数据来“教会”模型某个类别长什么样子的过程。
特征匹配
使用强大的自监督视觉模型 DINO-ViT 作为骨干网络。
- DINO 通过无标签数据训练,学会了提取图像中通用、有意义的视觉特征(理解物体部件、纹理、形状等)。
- 将要计数的整个图片输入DINO,得到其特征图 (Feature Map),可以理解成图片被分解成很多小格,每个小格包含该区域的视觉信息编码。
- 将用户提供的示例框也通过DINO提取特征 (Exemplar Features)。
核心操作:
- 把每个示例框的特征当作一个“探测器”或“模板”。
- 在整张图片的特征图上,用这些“探测器”进行滑动计算相似度 (Similarity)。
- 比如你拿着一个鸟的“特征模板”在整张图片的特征地图上一点点滑动。模板与地图上某个区域的特征越相似(比如都有翅膀、喙、羽毛纹理),计算出来的相似度值就越高。
- 对每个示例框进行滑动匹配,就会得到一张相似性热力图 (Similarity Map)。
归一化计数
核心问题:
- 直接对相似图所有像素的值求和,并不能得到准确的物体数量!因为:
- 一个目标物体可能被多个示例框匹配到(重复计数)。
- 相似度值本身没有经过标定,总和没有直接的数量意义。
CountingDINO的巧妙解法:
- 它假设:每个用户提供的示例框所代表的“物体原型”,应该且仅应该“贡献”一个计数单位(1)。
- 具体操作:
- 对于每一个用户提供的示例框(比如第一只示例鸟):
- 计算它在整张相似图上所有位置的响应值的总和 (Sum)。
- 将整个相似图除以这个总和。
- 这样处理后的新图称为 “密度图” (Density Map)。
- 关键性质:该示例框对应的密度图上所有像素值的总和恰好等于1。
- 对所有用户提供的示例框重复上述操作,得到多个密度图。
- 将所有示例框对应的密度图加起来,就得到最终的总密度图 (Final Density Map)。
- 最终计数:对该总密度图上所有像素值求和 (Sum),得到的结果就是图片中目标物体的估计数量。
- 对于每一个用户提供的示例框(比如第一只示例鸟):
为什么有效?
- 理想情况下,如果一个物体被且仅被一个示例框完美匹配,那么它的响应在最终密度图上的贡献就是1。
- 如果一个物体被多个示例框匹配(比如它和示例鸟A、B都很像),那么它在多个密度图上都有贡献,但这些贡献值加起来也会是1(因为在每个密度图上都被归一化了)。
- 如果一个区域和任何示例都不像,它在密度图上值就很低。
- 因此,最终密度图的总和就代表了“有效物体实例”的数量。
应对小目标:多尺度处理
问题:
- DINO-ViT 的输出特征图分辨率较低(例如14x14),对于非常小的物体(可能只占几个像素),特征可能不够精细,导致匹配不准确。
解法:
- 将原始图像分割成4个不重叠的象限(左上、右上、左下、右下)。
- 对每个象限图片单独应用上述的“特征提取 -> 匹配 -> 归一化 -> 密度图求和”流程。
- 最后,将4个象限得到的计数结果加总,得到最终数量。
- 这相当于在小区域(象限)内进行更高分辨率的特征匹配。
总结 CountingDINO 的核心流程
- 输入:一张图片 + 用户框出的几个目标示例框。
- 特征提取:用预训练好的自监督 DINO-ViT 提取整张图片的特征图。
- 示例特征:从特征图中裁剪出用户示例框对应的特征。
- 滑动匹配:把每个示例特征当作卷积核,在整图特征图上滑动计算,生成相似图。
- 归一化密度:对每个示例的相似图进行总和归一化 (除以该图自身所有值的和),得到该示例对应的密度图。
- 融合密度图:将所有示例对应的密度图相加,得到总密度图。
- 计数:对总密度图所有像素值求和,即为估计数量。
- (可选) 小目标处理:若目标很小,将图片分象限处理,再合并计数结果。
核心价值与突破
- 免训练 (Training-Free):模型本身不需要针对特定任务或类别进行训练。DINO 骨干是预训练好的通用模型,拿来即用。
- 类无关 (Class-Agnostic):能数任何用户指定的东西,只要用户能提供几个示例框即可。不再局限于模型训练时见过的类别。
- 示例驱动 (Exemplar-Based):用户意图通过提供示例框来清晰定义,模型只需“按图索骥”。
- 自监督基础 (Self-Supervised Foundation):利用了 DINO 强大的通用视觉特征表示能力,避免了依赖监督学习的标注数据。
- 开箱即用 (Out-of-the-Box):用户拿到模型和代码,准备好示例框,就能直接对图片计数,无需任何额外训练或调参。
通俗总结
你指着图片上的几只鸟对 CountingDINO 说:“帮我数数这图片里像这样的鸟有多少只”。
它内部用强大的自学习视觉模型(DINO)分析图片,把你指出的鸟当作“模板”,在全图扫描找相似的“鸟”特征,用一种聪明的数学方法避免重复计数,最后告诉你总数是多少。
整个过程不需要它事先专门学过“什么是鸟”或者见过大量标注好的鸟图片。