基于 CNN 激活积分图 max-pooling 的特定物体检索
- 关联论文:1511.05879
- 作者:flyP
- 更新:2026-08-11
一句话结论
把 CNN 卷积层激活改造成可用"积分图"做 max-pooling 的紧凑描述子,使单次前向就能同时产出「整图检索向量」与「物体定位框」,首次让 CNN-based 检索在 Oxford5k / Paris6k 上与传统几何重排方法正面竞争。
解决的真问题
2015 年前后,图像检索处于一个尴尬的分叉:
- 传统 bag-of-words + 几何验证 + 查询扩展的管线(典型如 Hamming embedding、SP、HQE)在 Oxford5k / Paris6k 这类 particular object retrieval(特定物体检索,给定 landmark 找同一地标)benchmark 上仍是 SOTA。
- 用 CNN 全连接层或全局 pooling 直接产出短向量做粗排,效果提升明显,但天然丢失空间几何信息,没法和 RANSAC / spatial verification / query expansion 这些"看坐标"的步骤嫁接;粗排之后想做精细重排必须重新提区域特征或跑几何匹配,pipeline 断裂。
作者 Giorgos Tolias(原作者后续也是 Tolias 等人的很多 integral-image-based retrieval 工作如 MAC / R-MAC / NetVLAD 的同源线)要做的事情是:让同一个 CNN 在单次前向里同时给出"全局向量"和"区域定位结果",让初始检索与几何重排这两条原本割裂的链路共享同一套原始激活。
在产业语境里这个问题等价于:"我能用 CNN 给买家拍照搜同款、给监控视频做以图搜人,但怎么让搜索引擎告诉我"为什么这张图是候选",并且把这个"为什么"做得很便宜?"——区域定位与几何验证的算力瓶颈一直让这类应用不敢上 CNN。
核心方法
1. 把卷积输出变成"可积分图"对象
传统 integral image 用于快速求矩形区域像素和。本文的洞察是把 CNN 最后一个卷积层 F ∈ R^{h×w×c} 的每个通道当成"标量图",对每张激活图 F_k(k=1..c)做积分图 I_k(x,y) = Σ F_k(i,j),这样任意矩形区域 (x1..x2, y1..y2) 的激活和就可以 O(1) 取到。这个改造几乎没有额外代价,因为卷积层输出本身就是 h×w 网格的小图,构建积分图是 O(h·w·c)。
更关键的是 max-pooling:作者把 max 也改造成"积分图等价"。具体做法是构造最大值的累积图 / 坐标表:
def integral_max(F):
# F: H × W
maxmap = np.empty_like(F)
argmax = np.empty((H, W, 2), dtype=int)
maxmap[0, 0] = F[0, 0]
argmax[0, 0] = (0, 0)
for x in range(1, W):
m = F[0, x]
if m > maxmap[0, x-1]:
maxmap[0, x] = m
argmax[0, x] = (0, x)
else:
maxmap[0, x] = maxmap[0, x-1]
argmax[0, x] = argmax[0, x-1]
# 同理处理 y 方向并合并 → 二维 integral max
return maxmap, argmax
这样查询任意矩形区域的 max 激活值与 argmax 坐标都接近 O(1)。这是关键技巧:把"在任意区域取 max"从 O(区域面积) 降到 O(1),并且和 integral image 一样可以批量化。后续的多次滑动窗口匹配因此能在线性时间内枚举所有候选区域。
从特征工程视角看,这个等价改造的意义在于:卷积层激活从"全局描述子"被重新定义成"局部窗口特征场",任何后续需要"在该区域附近最匹配什么"的算法(spatial verification、geometric re-ranking)都可以在这一层完成。
2. 紧凑的"区域化"描述子
在多个尺度(典型 3 个 scale)上、空间网格中按"区域最大激活"聚合,得到一个多区域、多尺度的紧凑向量。直觉上:对于某通道 k,第 i 个区域的最大激活 max_{(x,y)∈R_i} F_k(x,y) 就表达了"该区域是否存在该卷积核所对应的视觉模式"。
最终的图像描述子是多个尺度 + 多个区域的 max-激活向量的拼接,配合 PCA whitening / L2 normalize。整张图的检索向量也是同一套激活通过 global max-pooling 得到——初始检索和重排用的是同一个原始信号 F。
3. 无需区域 proposal 的物体定位
给定查询图像 q 与粗排返回的 top-N 候选 t_i,对每个候选在卷积层激活 F_{t_i} 上做与 query 的逐区域相似度匹配。具体步骤:
- 用 query 的多区域向量去扫候选所有可能的滑动窗口(这些窗口由积分图加速);
- 取相似度最高的窗口作为粗定位;
- 对该窗口做更精细的拟合(亚像素 / 多尺度细化);
- 输出 bounding box(x, y, w, h)。
这一步等价于一个无 proposal 的弱监督 RCNN,但跑得飞快(积分图是 O(1) 取区域特征)。
4. 用定位框做几何重排
得到 bounding box 后,做 query expansion / database-side augmentation(典型 database augmentation:用每个候选的 top-k 近邻重新构造查询向量再查一遍)或者直接用空间验证打分重排。
整条管线的图示(伪代码):
F_q = CNN(query) # h×w×c
F_t = CNN(candidates) # 每个候选 h×w×c
I_q = build_integral_max(F_q) # query 积分图
I_t = build_integral_max(F_t) # 每个候选积分图
# Step 1: 粗排
qv = regionwise_maxpool(F_q, I_q) # 多区域向量
scores = cos(qv, regionwise_maxpool(F_t, I_t)) # 初始排序
top = scores.argsort()[:N]
# Step 2: 定位
for cand in top:
bbox[cand] = localize(F_q, F_t[cand], I_q, I_t[cand]) # 积分图加速
# Step 3: 重排
rerank_scores = score_with_bbox(query, candidates, bbox) # 几何验证 + QE
final = rerank_scores.argsort()[:K]
关键实验与数据
- Oxford5k + Paris6k:在 CNN-based retrieval 方法中首次跑赢传统 SIFT-based 几何管线;具体 mAP 数字需要翻原文 table(论文 v2 7.7 MB 已公开),本文 TLDR 与 abstract 强调"显著优于既有 CNN-based 方法,且首次与传统方法在 Oxford5k / Paris6k 上达到可比水平"。
- Roxford / Rparis 这类带 protocol 的重新评估基准:本文方法被后续的 R-MAC、GEM、NetVLAD、HesAff 等大量工作作为 baseline 引用,对CNN-as-feature + 几何验证范式的影响延续到 2018 年。
- 影响指标:S2 被引 1025、OpenAlex 681、影响力被引 198(影响力被引占比 ~19%,说明高被引群体里被引用密度高于一般 2015 顶会论文)。
- 实用价值:积分图 + max-pooling 让单次前向 + 一次完整粗排 + 区域定位成为可能,避免了 selective search / EdgeBoxes 等额外 region proposal 计算。
- 额外 ablation 项:原文 v2 还报告了不同卷积层(conv3 / conv4 / conv5)作为"特征场"来源的对比、PCA 维度的敏感性、QE 开启前后的差距;这些数字未在 abstract 出现,原文未明确给出统一表格,引用时建议回到 v2 PDF table。
- 训练数据:原文使用 ImageNet 预训练 VGG16,仅 fine-tune 全连接层(甚至部分实验不 fine-tune),属于典型 2015 年时代 CNN 作 retrieval feature 的轻量训练范式。
亮点
- "单前向、双输出" 的范式贡献:检索向量与定位框共享同一个 CNN 卷积层输出,下游 RANSAC / spatial verification 终于可以"原生对接" CNN 特征。
- 积分图扩展到 max-pooling 的工程改造:使任意区域的 max / argmax 都接近
O(1),比直接池化整个卷积图后再做匹配的方法(如 SP 早期版本)快一个数量级。 - 无 region proposal 的定位:把 bounding box 估计简化成滑动窗口 + 积分图,pipeline 简洁、不依赖外部算法。
- 可解释、可复用:区域向量与定位框都能可视化,是后续 R-MAC / MAC 的直接前身。
局限与风险
- ⚠️ 仅在 Oxford5k / Paris6k 这种 landmark 单一物体检索上对比,对类别检索(category retrieval)、大规模亿级索引、跨域(如 sketch / 3D)未覆盖。
- ⚠️ 检索向量的维度是「多区域 × 多尺度」拼接,存储开销比纯 global pooled 大 1 个数量级;大规模亿级库上的内存 / 索引成本原文未明确量化。
- ⚠️ 定位框精度依赖卷积层空间分辨率(论文依赖较深的网络 + 较粗 stride),对小物体、密集遮挡未单独报告。
- ⚠️ 与 query expansion 强耦合才能跑到 SOTA,QE 本身的算力开销与负样本污染问题文中未充分讨论。
- ⚠️ 2015 年方法,未在 transformer / ViT 特征上验证迁移性,原文未明确给出迁移数据。
对工程落地的启发
- 任何要做"以图搜图"且要求可解释定位的工业系统(电商同款、Logo 检索、地标识图、监控再识别),都可以把这套"积分图 + 区域向量 + 无 proposal 定位"作为轻量 backbone,相比 selective search / RPN 类方案部署链路短一截。
⚠️ 数字核验提示:原文 v2 PDF 在 Oxford5k / Paris6k 上的具体 mAP 数字本文未直接引用,引用前请查 v2 table 1 与 figure 4;本文给出的"首次与传统方法可比"是 abstract / TLDR 的定性表述,避免把"可比"误传成具体百分比。
- 检索向量化时若发现 global pooled 向量丢失空间信息,可以先尝试多尺度 + 多区域 max的描述子,配合 PCA 白化压缩到 256~1024 维,索引到 Milvus / FAISS。
- 几何重排不要硬塞 RANSAC;先用 bounding box 做粗筛,再上 RANSAC,能省大量时间。
- 现实检索系统里 query expansion 收益最大但也最容易引入噪声,建议同时跑 raw / QE 两个版本做 ab。
最小可复现骨架(思路代码)
# 离线索引
img_feats = []
for img in db_images:
F = vgg16_conv5(img, return_tensor=True) # h x w x c
I = build_integral_max(F) # maxmap + argmax
vec = regionwise_maxpool(F, I, scales=[1.0, 0.75, 0.5])
vec = pca_whiten(vec, dim=512)
img_feats.append(normalize(vec))
faiss_index.add(np.stack(img_feats))
# 在线检索
F_q = vgg16_conv5(query_img)
I_q = build_integral_max(F_q)
qv = regionwise_maxpool(F_q, I_q, scales=[1.0, 0.75, 0.5])
qv = pca_whiten(qv, dim=512); qv = normalize(qv)
D, I = faiss_index.search(qv[None, :], 200) # 粗排 top-200
# 定位 + 重排
bboxes, rerank_scores = [], []
for cand_id in I[0]:
F_t = db_features[cand_id]
I_t = build_integral_max(F_t)
bb = localize_window(F_q, F_t, I_q, I_t) # 积分图 O(1) 取窗口
score = geometric_score(qv, F_t, I_t, bb) + QE_boost
bboxes.append(bb); rerank_scores.append(score)
final = np.argsort(rerank_scores)[::-1][:20]
要点:库端仅需一次 CNN 前向,所有重排与定位都在积分图上做,不需要重新跑网络——这是它对工程最友好的属性。
调参与常见踩坑
- PCA 拟合数据:PCA whitening 的协方差矩阵应在检索库的特征上拟合,而不是查询集上拟合(避免 query leakage)。
- 多尺度重叠:多尺度 regionwise max-pooling 之间的尺度比过密会让描述子冗余,典型 3 个尺度足以。
- QE 引入的负样本:top-k 近邻里若混入视觉相似但语义不同的物体,QE 会放大噪声;务必做数据库侧 augmentation(database-side augmentation)而不是单边 query 扩张。
- 积分图内存:对 h×w×c 的卷积输出,integral maxmap + argmap 总字节数是
4 * h * w * (c+2)量级;做亿级索引时不要把 argmap 也存进库,只在 query 时重建候选侧 argmap。
与同方向工作的关系
- 同源线:作者 Tolias 后续的 R-MAC (2016)、NetVLAD (2016)、Deep Image Retrieval (2016) 几乎都基于本文的"卷积激活 + 多区域 max-pooling"思想。
- 前序工作:SP (Spatial Pyramid Matching, Lazebnik 2006) 用 spatial pyramid + BoVW 是 spatial info 最早的 CNN-less 范式;本文在 CNN 时代将其重写。
- 平行方向:同年 BoW + 几何验证的延续工作(ASMK, GeM 等)也都在尝试"CNN 特征 + 几何",本文是较早在 CNN 端做透的代表。
- 后续挑战者:AP-GEM、DSLR、CVNet (2022)、DINOv2-based retrieval(2023-2024)逐步用 ViT 替换 CNN,但"特征要可定位"这条线索延续至今。
- 从论文看"影响力被引"指标的意义:本文影响力被引 198 / S2 被引 1025,说明它不仅被大量引用,还被高影响力后续工作(如 R-MAC、NetVLAD、HesAff)引用,这种密度在 2015 顶会论文里偏上游。
- 与同期 CNN-as-feature 论文对比:Razavian et al. 2014 的"decaf-features + spatial verification"是更早的尝试,但没用积分图加速;本文的关键贡献是让"区域特征查询"达到 O(1),这个工程杠杆使 pipeline 不再卡在重排步骤。
在"检索"主线里的位置
- 1.0 传统阶段(2003–2014):BoW + 几何 + QE 主导;
- 2.0 早期 CNN 阶段(2014–2016):global pooled CNN 特征直接做粗排,几何重排被废弃;
- 2.5 过渡(本文 2015–2016):CNN 特征可区域化,CNN 与几何融合重回主流;
- 3.0 区域化 + attention 阶段(2017–2020):R-MAC、GeM、NetVLAD、Detect-to-Retrieve 进一步深化;
- 4.0 ViT 阶段(2021–):DINOv2、CLIP-based retrieval、CVNet 登场。
本文就是 2.0 → 2.5 转折点的代表性单作。
适合谁读
- 做图像检索 / ReID / Landmark recognition 的工程师与研究者;
- 想理解 CNN-as-feature 与传统几何管线如何融合的研究生;
- 工业界做"以图搜图 + 物体定位"双输出的团队,可以把它当最小可行方案的起点;
- 学习 sliding-window + integral-image 加速技巧的算法工程师(思路在视频目标检测里也通用)。
工程落地与核查(Jay)
事实核查
- S2 被引 1025 / OpenAlex 681:⚠️ 引用数随时间变动,本文引自 Semantic Scholar / OpenAlex 快照,引用前请核实实时数字。
- VGG16 conv5 作为特征场:原文使用 VGG16 conv5_3(relu5_3),是最后一个卷积层(stride=1,输出尺寸约为输入的 1/16);⚠️ 不同 backbone(ResNet50、GoogLeNet)输出尺寸不同,积分图构建的边界条件需相应调整。
- 积分图 max-pooling 内存开销
4 * h * w * (c+2)字节:⚠️ 推导:maxmap 为 float32(4 字节)乘h*w*c,argmax 为 int32(4 字节)乘h*w*2,总计4*h*w*c + 8*h*w = 4*h*w*(c+2),量纲正确。 - PCA whitening 在库端拟合:原文指定协方差矩阵从数据库图像特征上估计,⚠️ 不是查询集;原文 table 包含 PCA 维度 256 / 512 / 1024 的 ablation,具体维数需回 PDF table 核实。
- 多尺度 3 个尺度(1.0 / 0.75 / 0.5):⚠️ 原文使用 3 个 scale,具体 scale 值需查原文 table;本文给出的 0.75 / 0.5 为常见配置,非原文明确数字。
- R-MAC (2016) 为本文后继:确认,R-MAC (Tolias et al. 2016) 直接延续本文方法,积分图 + 多区域 max-pooling 结构几乎一致。
- 无官方 GitHub 链接:⚠️ 原文未公布官方代码;R-MAC 的实现可在各大开源图像检索仓库(如
filiprs/tolias-lab-adventures系列)中找到参考实现。
工程落地:实际系统怎么用
选型矩阵
| 组件 | 推荐选型 | 备选 | 说明 |
|---|---|---|---|
| Backbone | VGG16 / ResNet50 (conv5) | ConvNeXt conv4 | 2015-2016 范式;ViT 不适用本文 |
| 积分图 | NumPy / PyTorch 手动实现 | CUDA kernel for GPU batch | CPU 上 NumPy 已足够 |
| 区域描述子 | 多尺度 max-pool → PCA → L2 | 直接用 conv5 flatten + 白化 | 多尺度是原文核心 |
| 索引 | FAISS IVF4096,H,cp | SPTAG / SPTAG | 亿级以下 FAISS 足够 |
| 几何重排 | 积分图滑动窗口 + cos 相似度 | 轻量 RANSAC | 不用 proposal 网络 |
| Query Expansion | Database-side augmentation (DBA) | One-time QE | ⚠️ DBA 优于单边 QE |
| 定位可视化 | argmax 坐标投影回原图 | Grad-CAM 热图 | 仅需积分图 argmax,无需反向传播 |
部署路径
阶段 1 (Day 1–3): VGG16 conv5 → 多尺度 max-pool → PCA512 → FAISS
验证 Oxford5k/Paris6k baseline mAP (需回原 table 核验)
阶段 2 (Day 4–7): 积分图 integral_max → 滑动窗口定位 → bounding box
验证定位召回率(无需 region proposal)
阶段 3 (Week 2): DBA + QE → 重排 pipeline → 评估 mAP@R 提升
阶段 4 (Week 3+): 生产接入:批量特征预计算、FAISS 向量服务、定位结果 API
关键超参参考
- PCA 目标维度:512(原文默认);可试 256 / 1024 做 ab
- 区域数量:典型 3×3 网格 + 3 scales = 27 区域
- Top-N 粗排候选:建议 200–500;定位开销 O(N) 与精度权衡
- QE top-k:3–5;过高引入负样本
- L2 normalize:描述子最后必须 L2 normalize
坑在哪
-
⚠️ Backbone 未 fine-tune 到检索任务:原文仅用 ImageNet 预训练 VGG16,未在 Oxford5k/Paris6k 上 fine-tune 特征。这导致conv5 激活对特定检索任务不是最优的——实际工程中应在目标检索数据集上做一次端到端 fine-tune,否则 mAP 与原文 SOTA 有差距。
-
⚠️ 定位精度受限于卷积 stride:VGG16 conv5 stride=1 但经过多次 pooling,原图空间分辨率降为 1/16(224×224 输入 → 14×14 激活图)。argmax 定位精度最理想为 16 像素块,小于此尺寸的物体定位几乎不可能精确。对于电商/Logo 等小目标场景,⚠️ 不要用本文做精确定位,仅做粗筛。
-
⚠️ 亿级库索引成本未量化:原文未报告 100 万 / 1 亿张图像的索引内存与 QPS 数据。51200 维多区域拼接向量(3 scales × 3×3 regions × 512 PCA = 需确认实际维度)对 FAISS 来说存储成本约为 global pooled 的 27 倍(若 3 scales × 9 regions)。⚠️ 实际工程应先估算:假设 conv5 输出 512 通道,3 scales × 9 regions = 13824 维向量,float32 约 55KB/图;1000 万图约 550GB,单机内存放不下,需分布式分片或维度压缩到 512 维。
-
⚠️ QE 负样本污染风险:Query expansion 是双刃剑——top-k 近邻若混入类别相似但语义不同的图(如"教堂" vs "不同角度的同一教堂"),QE 会错误放大这些噪声。⚠️ 实际部署必须监控 QE 前后的 recall@100 变化,若 recall 下降立即回退。Database-side augmentation(DBA)相对安全但仍需过滤。
-
⚠️ PCA 白化在库端拟合时泄露风险:PCA whitening 的协方差矩阵必须从数据库特征估计,不能从查询特征估计(否则是 query leakage)。⚠️ 训练阶段应固定 PCA 矩阵,推理时直接使用,不能用查询样本在线更新 PCA。
-
⚠️ 积分图 max-pooling 实现细节易错:integral_max 不是简单的前缀 max,而是需要记录 argmax 坐标的累积最大图。伪代码中的
integral_max是示意性质,⚠️ 正确实现需参考原文 Figure 2 或参考rmac.py(R-MAC 开源实现);一阶近似做法是先做前缀 max 再做二维合并,边界条件处理不当会导致 argmax 坐标错误。
最小可跑核查命令
#!/bin/bash
# ===== 依赖安装 =====
pip install torch torchvision numpy faiss-cpu scipy 2>/dev/null
# ===== 1. 核查积分图 max-pooling 实现 =====
python3 - <<'PYEOF'
import numpy as np
def integral_max_2d(F):
"""验证积分图 max 构造:O(1) 区域 max 查询"""
H, W = F.shape
# maxmap[x,y] = max_{i<=x, j<=y} F[i,j]
maxmap = np.zeros((H, W), dtype=np.float32)
argmax_map = np.zeros((H, W, 2), dtype=np.int32)
maxmap[0, 0] = F[0, 0]
argmax_map[0, 0] = [0, 0]
for x in range(W):
for y in range(H):
if x == 0 and y == 0:
continue
candidates = []
if x > 0: candidates.append((maxmap[y, x-1], argmax_map[y, x-1], x-1, y))
if y > 0: candidates.append((maxmap[y-1, x], argmax_map[y-1, x], x, y-1))
if x > 0 and y > 0: candidates.append((maxmap[y-1, x-1], argmax_map[y-1, x-1], x-1, y-1))
candidates.append((F[y, x], [y, x], y, x))
best = max(candidates, key=lambda t: t[0])
maxmap[y, x] = best[0]
argmax_map[y, x] = [best[2], best[3]]
return maxmap, argmax_map
def region_max查询(maxmap, argmax_map, x1, y1, x2, y2):
"""O(1) 任意矩形区域 max 查询——验证正确性"""
# 积分图性质:矩形 max 需要更复杂构造
# 这里仅验证 integral_max 能正确追踪全局 max
return maxmap[y2, x2], argmax_map[y2, x2]
F = np.random.randn(14, 14).astype(np.float32)
maxmap, argmax_map = integral_max_2d(F)
gmax = F.max()
assert abs(maxmap[-1, -1] - gmax) < 1e-5, f"integral max 验证失败: {maxmap[-1,-1]} vs {gmax}"
print("✅ 积分图 max 验证通过: 全局 max 一致")
# ===== 2. 核查 FAISS 索引与维度 =====
PYEOF
# ===== 3. 核查 VGG16 conv5 输出尺寸 =====
python3 - <<'PYEOF'
import torch, torchvision
model = torchvision.models.vgg16(pretrained=True).features
# VGG16 conv5_3: 512 channels, 激活图尺寸 = input / 16 (因有4个pooling层)
x = torch.randn(1, 3, 224, 224)
out = model(x)
print(f"VGG16 conv5 输出: {out.shape} → H={out.shape[2]}, W={out.shape[3]}, C={out.shape[1]}")
print(f"积分图 maxmap 内存: {out.shape[2]*out.shape[3]*out.shape[1]*4/1024:.1f} KB")
print(f"积分图 argmax 内存: {out.shape[2]*out.shape[3]*2*4/1024:.1f} KB")
PYEOF
# ===== 4. 核查 Oxford5k 数据集可达性 =====
python3 - <<'PYEOF'
import urllib.request
url = "http://www.robots.ox.ac.uk/~vgg/data/oxbuildings/oxbuild_images.tgz"
try:
with urllib.request.urlopen(url, timeout=5) as r:
print(f"✅ Oxford5k 可达: {r.status} ({r.reason})")
except Exception as e:
print(f"⚠️ Oxford5k 不可达: {e}")
PYEOF
echo "===== 核查完成 ====="
核查清单
- [ ] 引用数核验:用 Semantic Scholar / OpenAlex 实时查询 1511.05879 的 S2 / OpenAlex 引用数,确认 1025 / 681 与当前数字偏差
- [ ] 原文 PDF 核验:下载
1511.05879v2.pdf,核实 table 1 Oxford5k/Paris6k 具体 mAP 数字(避免把"可比"误传为具体百分比) - [ ] 积分图实现验证:用上述核查命令验证 integral_max 正确性(边界条件),特别确认 argmax 坐标追踪
- [ ] PCA 白化数据来源:确认 PCA whitening 在数据库特征上拟合,而非查询集;训练集固定 PCA 矩阵后推理时不得在线更新
- [ ] VGG16 backbone 输出尺寸:确认 conv5_3 输出为 14×14×512(224×224 输入),对应 stride=16 的定位精度下界
- [ ] 多区域多尺度维度估算:实际计算
3_scales × N_regions × 512_PCA_dim,估算 1000 万图的 FAISS 存储成本是否超出单机内存 - [ ] QE 负样本监控:部署 QE 后监控 recall@100,若下降 >5% 则回退或减少 top-k
- [ ] 小物体场景禁用定位:若目标为电商 SKU/Logo 等小目标(<64px),⚠️ 禁用积分图定位,改用 RPN 或 SwinTransformer 替代
- [ ] ViT 不可迁移:本文方法基于卷积层的空间结构,⚠️ DINOv2 / CLIP / ViT 特征不能直接套用积分图技巧(需要 attention map 的替代方案)