一次查询到底发生了什么
五个步骤,全部在浏览器里完成。没有一个后端,也没有一次网络请求带着你的图片走出这台设备。
-
取图与合成
粘贴、拖入或点选一个图标。透明背景会先合成到白底上——否则透明通道在张量里会变成一块黑。
-
归一化
检测墨迹的包围盒。只有墨迹覆盖不到画面 60% 时(真正的设计稿截图)才裁边;已经是裁好的图标就保持原样。然后等比缩放、居中留白成方形,不拉伸。
为什么不无条件裁边:留白本身是图标语义的一部分(搜索的柄、加号的边距)。实测无条件裁边 Top-1 从 0.494 掉到 0.447。
-
编码成向量
两个塔并联。SigLIP ViT-B/16 吃 224×224、
(x−0.5)/0.5,输出 768 维;微调 ResNet18 吃 96×96、原始[0,1],输出 256 维。融合v = normalize( [ √0.7 · vsiglip , √0.3 · vresnet ] )按
√w缩放再归一化,点积就恰好等于0.7·cossiglip + 0.3·cosresnet,不必在代码里算两遍。 -
算余弦、排序
查询向量和库里每个图标向量做一次点积,降序取前 8 个。索引里的向量离线算好,存成 float16。
相似度sim(q, g) = q · g / (‖q‖ ‖g‖) ∈ [−1, 1]归一化之后就是纯点积。它只看方向不看长度,所以线宽、画布大小、导出尺寸都不会影响打分;在单位球面上按余弦排序与按欧氏距离排序完全等价。
-
开集判定
拿 Top-1 的分数和阈值比:
s₁ ≥ τ就返回这个图标,否则返回"库里没有"。这一步才是论文的题目——不是"能不能找到最像的",而是"最像的那个够不够格被当成答案"。