☰
SuperGlue框架图可修改docx:Word画布与SVG转形状
2026/11/3 14:03:14 网站建设 项目流程

简介:面向计算机视觉毕业设计与Superglue、Superpoint算法学习者的论文框图素材,聚焦图像配准与特征匹配流程的可视化表达,适合需要快速理解算法结构、撰写论文或制作答辩示意图的读者。压缩包内共1个docx文件,约390KB,核心为三幅可编辑算法框架图:Superpoint编解码与特征描述流程、单应性自适应处理示意,以及Superglue关键点编码、自注意力与交叉注意力、最优匹配层结构。图中标注了特征点解码器、描述子解码器、得分矩阵、垃圾桶得分与最优特征分配矩阵等关键模块,便于按论文版式调整文字、箭头与配色。已有590人学习下载,可作为毕业设计中算法章节配图、原理讲解和PPT复用的参考,帮助读者把抽象匹配过程落实为清晰框图,提升论文表达与方案说明的完成度。

1. 一张改不动的框架图,值得花半天重做

A同学把稿子改到第 6 版,其他图都过了,只有 SuperGlue 那张算法框架图被打回来:请提供可修改的矢量文件。他手里只有从 PDF 里截出来的位图,放大就模糊,改一个模块名就得整张重画,连"L×"那个层叠括号都要重新描一遍。这类返工特别消耗时间,而且完全没有技术含量。

这篇笔记只解决一件事:把 SuperGlue 论文里那张算法框架图,做成一个在 Word 里双击就能改字、拖动就能挪框、放大到 A0 也不模糊的可修改 docx 版本。适合三类人:要交学位论文或期刊插图的、要给组内做汇报但是必须改中文标注的、以及想把这张图做成模板反复复用的。前提只有一个:你得先把这张图"读懂",知道每个框代表什么,否则改出来的图只是好看,讲不通。

2. 先读懂再动笔:SuperGlue 框架图上的四个模块与三条连线

从 PDF 里截一张图再描,是最省事也最容易出错的做法。描图的人往往不知道哪两个框之间该不该连线,结果画出来的图"形态正确、逻辑错误",导师一眼就能看出问题。所以这一章先把 SuperGlue 的算法流程拆成"图上必须出现的元素",再谈怎么画。

SuperGlue 干的是一件很明确的事:给定同一场景的两张图,各自已经提好了关键点位置和描述子,它负责判断"左图的第 i 个点和右图的第 j 个点是不是同一个物理点"。整张框架图本质上就是这个判断过程的数据流,从左到右依次是:输入的关键点、编码、若干层注意力交互、相似度打分、最优传输归一化、输出匹配。

2.1 输入侧与关键点编码器:图左边那两个小方块

输入不是原始图像,而是前端网络(SuperPoint 那一类)已经提好的关键点集合。每个关键点带两样东西:位置 p(通常是归一化的 x、y 和一个置信度)和高维描述子 d(常见是 256 维)。图上如果只写"Image A / Image B",会让人误以为 SuperGlue 自己在提特征,这是个高频误解,画的时候最好在图注里补一句"输入为已提取的关键点及其描述子"。

关键点编码器的作用是把位置和描述子融成一个统一维度的向量:把 p 和 d 拼起来,过一个小 MLP(常见做法是三层、输出 256 维),得到后续注意力层要用的特征 f。这一步有两张图共享同一个编码器,所以图上左右两边的 Encoder 方块必须体现"参数共享"——常见画法是两块同色方块加一个虚线框把它们圈在一起,或者中间拉一条标注"共享权重"的虚线。这条虚线是整张图里最容易被漏掉的一根线,漏了,读者会以为是两个独立网络。

落到画布上,这一段的元素是:两个输入节点(关键点+描述子的短标签)、两个 Encoder 方块、一条共享标注线。位置编码那一路如果要画,可以在 Encoder 前面加一个细长的小块标"位置编码",用不同填充色区分,别用太花的颜色,期刊黑白印刷会糊成一片。

2.2 中间的注意力 GNN:交叉箭头怎么画才不乱

这是整张图的主体,也是最容易画错的地方。图上通常画成左右两列、中间若干层方块、两列之间有交叉箭头。它表达的是:每一层里先做图像内的自注意力(同一张图的关键点互相看),再做图像间的交叉注意力(左图的关键点去看右图的),然后过一个小前馈和残差归一化。层数在论文实现里常见是 9 层、4 个头,具体以你手上那版为准,图上一律标成"L ×"更稳妥。

画法上有个细节值得说清楚:自注意力的箭头应该在同一列内部上下走,交叉注意力的箭头要在两列之间横向走、并且成对出现(左看右、右看左)。只画一根从左到右的箭头,会让人误以为是单向依赖。我用过的一个编排方式是:把每一层的两个方块横向对齐,层与层之间用一个大括号标"L ×",交叉箭头的起点和终点分别落在同一水平高度的方框侧边中点,这样无论图缩放多少,视觉上都不会歪。

提示:交叉箭头如果太多导致糊成一团,可以只画前三层和最后一层的箭头,中间用省略号和"L ×"表示,图注里写明省略了中间层的连接。这是学术插图里被广泛接受的做法,不算偷懒。

2.3 输出侧:打分矩阵、Sinkhorn 与那个带阴影的垃圾桶行列

注意力层输出的特征两两做内积,得到一张相似度矩阵 S,尺寸是"左图关键点数 × 右图关键点数"。这个矩阵不能直接取最大值当匹配,因为会互相冲突(两个左图点抢同一个右图点)。所以 SuperGlue 把它当成一个最优传输问题,用 Sinkhorn 在 log 空间里迭代,让行、列各自归一化,迭代次数常见取 100。

图上这一段通常画成一个带网格的小矩阵,右边多出一列、下边多出一行,用斜线或灰底标出来,那叫"垃圾桶"(dustbin),专门承接"这个点没有匹配"的情况。这个多出来的行列是 SuperGlue 和早期方法的本质区别之一,画的时候不能省,缩略图里至少要用两条灰带示意出来,否则整张图就丢掉了最有信息量的部分。

最后一步是指派:用一个匹配算法(常见是匈牙利算法或带阈值的新近邻贪心)从归一化后的矩阵里取出最终匹配对,画成两条图之间连起来的细线。到这儿,整张图的数据流就闭环了。

2.4 把模块换算成画布:一张开工前必填的模块卡

动笔之前我会先填一张表,把"图上有什么"从算法概念翻译成画布对象。这一步花十分钟,能省掉后面两小时的返工。

图上元素形状建议尺寸(宽×高,mm)字号位置基准
输入关键点节点圆角矩形24 × 88 pt左列,纵向居中偏上
关键点编码器圆角矩形(深一档填充)24 × 98 pt左列,输入下方
共享权重标注虚线框 + 无填充包住两个编码器7 pt 斜体跨左右两列
注意力层(单层)矩形26 × 98 pt两列对称
层叠标注 "L ×"大括号 + 文本—8 pt两列中间
相似度矩阵网格矩形22 × 227 pt中部偏右
垃圾桶行列灰底窄带宽 4 mm—矩阵右侧与下方
输出匹配连线直线 + 端点——两图之间

表里最需要斟酌的是尺寸。A4 正文宽度一般 170 mm,插图占满也就 160 mm 可用,模块框宽度超过 30 mm 以后文字换行会很难看,所以 24–26 mm 是个比较稳的区间。字号 8 pt 是底线,再小印出来就费劲了;7 pt 只留给斜体标注和矩阵里的下标。

顺便说清楚哪些东西不要画进图里:损失函数、训练细节、具体的注意力头数、时间消耗。这张图讲的是推理时的数据流,把这些塞进去只会让主次不分。

3. 在 Word 里从零搭一张 SuperGlue 框架图:画布、形状与连接符的参数表

上一章定的是"画什么",这一章全是"怎么画"。Word 画图被很多人嫌弃,主要原因是没用对容器——把形状直接铺在页面上的,一改正文全散;用绘图画布的,整张图就是一个整体,缩放、移动、复制到别的文档都不散架。

3.1 画布起步:页面、网格与嵌入型的区别

第一步不是画框,是定页面。A4,上下边距 25 mm,左右 20 mm,这样正文宽 170 mm,图宽上限设成 160 mm,左右各留 5 mm 余量,避免图贴着版心边缘。单位统一成毫米(文件 → 选项 → 高级 → 显示度量单位),后面所有尺寸都按毫米报,不换算厘米,省得每次算小数点。

然后插入 → 形状 → 新建绘图画布,把画布拖到 160 mm × 95 mm。画布本身是个内嵌对象,跟着段落走,不会像浮动形状那样在改稿时跳到别的页——这是它能当"容器"用的关键。画布上右键 → 设置绘图画布格式 → 大小,把"锁定纵横比"勾上,"相对于"选"页面",位置固定。

栅格设置是省力的关键:布局 → 对齐 → 网格设置,把"对象与其他对象对齐"勾上,水平间距和垂直间距都设成 1 mm,网格线显示打开。这样拖动时形状会自己贴到别的形状边缘,不用靠眼睛估。对齐这件事,靠手感是一种玄学或者凭经验,靠网格是工程。

3.2 模块框:圆角矩形、字号与文字垂直居中

先画一个主模块框,把所有属性一次设好,再复制。插入圆角矩形,尺寸填 26 mm × 9 mm,圆角半径通过黄色控点调到很小(约 1 mm),圆角太大的话两个框并排会显得松散。

填充用浅灰(RGB 242,242,242)或者白色,轮廓 0.75 pt 黑色,这个线宽在 PDF 里不会发虚,打印也不会糊成一片。形状里的文字:字体中文用黑体、西文用同类无衬线体,8 pt,行距设成固定值 10 pt(比字号略大即可,太大文字会飘在框外), 段落居中、段前段后都设 0,"形状中的文字自动换行"打开,内部边距左右各 0.5 mm。这组参数调好后,框里无论写"关键点编码器"还是"Keypoint Encoder"都不会溢出。

复制的方式有讲究:Ctrl+D 复制出来,位置会偏一点点,用"形状格式 → 对齐 → 分布"重新排,或者按住 Shift 拖动做水平/垂直约束移动。先摆左边一列,五个框等距,选中它们,形状格式 → 对齐 → 纵向分布,间距自动均匀;再把这一列整体复制到右边,水平间距设成 60 mm 左右,两列就对称了。

注意:模块框不要用 Word 的"文本框"。文本框有独立的边距和自动调整行为,转形状、批量改字号时表现和形状不一致,混用会让后期维护很麻烦。

3.3 连接符:肘形、锚点与箭头端点

连线一律用"插入 → 形状 → 直线/肘形连接符",不要用画线工具手绘。连接符的端点是带磁性的,拖到形状边缘会出现灰色小圆点,松开就吸附住,之后移动框,线跟着走。手绘线条不会跟,改一次位置就得连一遍,这是最常见的返工来源。

三种线型分工明确:同列上下相邻的模块用垂直直线连接符;两列之间的交叉注意力用直线连接符(斜线),从左侧框的右边缘中点到右侧框的左边缘中点;跨越多层的长连接用肘形连接符,黄色控点可以调拐弯位置,把拐点对齐到网格上,几条线的拐点落在同一条竖线上会整齐很多。

箭头设置:选中连接符 → 形状格式 → 轮廓 → 箭头 → 末端箭头类型选实心三角,大小选"中"。0.75 pt 的线上用"大"箭头会显得笨重。单向数据流用单端箭头,共享权重那条虚线用两端无箭头,线型改成短划线。

这里有个反复出现的坑:两列之间的交叉箭头如果都从同一高度的边缘中点出发,会重叠成一条线。解决办法是让起点沿边上下错开 1–2 mm,或者一根从上部出发、一根从下部出发,视觉上一眼能看出是两对独立的注意力方向。

3.4 命名、选择窗格与分组顺序

图画到一半,最难的事变成"找到刚才那个框"。开始 → 选择 → 选择窗格,打开后会列出所有对象的名称,默认是"圆角矩形 17"这种,改成人能看懂的:enc_left、enc_right、layer_self_1、ot_matrix、dustbin_col。这一步看着琐碎,但当你要统一把"9 层"改成"L ×"、或者把所有框的字号从 8 pt 调到 7.5 pt 时,选不中目标就是纯粹的折磨。

层级顺序也在这里管。连接线应该压在形状下面,否则线头会盖住方框边缘的文字;垃圾箱灰带要压在矩阵网格下面。用选择窗格里的上移/下移按钮调,不要用"置于顶层"这类快捷操作一把梭。

全部画完再组合:Ctrl+A 选中画布内所有对象,Ctrl+G。组合后的图在文档里是一个整体,缩放时会等比变化,但内部连接符的连接关系仍然保留——这就是"可修改"的核心:双击进入组合,改字、挪框、线的连接都还在,不用重新画。

4. 一次画好、批量复用:用 SVG 骨架 + 转形状把 docx 做成可维护的图

纯手工画一次可以,但如果这张图要出三四个变体(中文版、英文版、去掉垃圾桶的简化版),手画就是重复劳动。我一般的做法是:用代码生成一张 SVG 骨架,再让 Word 把它"转成形状",既有版本管理的便利,又保留在 Word 里继续手调的自由。

4.1 用节点-边结构把这张图写成数据

关键在于把图从"像素"变成"数据"。上一章的模块卡表,其实就是一个节点表;连接关系就是边表。写成 Python 里的两个字典,改一个坐标、换一个标签都是改一行代码,不用打开 Word。

单位还是毫米,SVG 的 viewBox 直接按毫米给,width="160mm"一设,1 个用户单位就等于 1 mm,后面所有坐标都能和 Word 里的尺寸对得上。字号也要换算:8 pt 约等于 2.82 mm,所以 SVG 里 font-size 写 2.8 就对了,别写 8,那是像素单位,转出来会大一圈。

4.2 生成 SVG 的脚本与参数说明

# 1 用户单位 = 1 mm;SVG 输出后可直接被 Word 插入 FS = 2.8 # 约 8 pt FS_SMALL = 2.4 # 约 7 pt,用于斜体标注 NODES = { # id: (x, y, w, h, 标签, 是否填充) "in_a": (6, 12, 24, 8, "关键点 + 描述子 A", 0), "enc_a": (6, 26, 24, 9, "编码器 MLP", 1), "in_b": (90, 12, 24, 8, "关键点 + 描述子 B", 0), "enc_b": (90, 26, 24, 9, "编码器 MLP", 1), "self_a": (6, 45, 26, 9, "自注意力", 1), "self_b": (88, 45, 26, 9, "自注意力", 1), "cross": (44, 45, 32, 9, "交叉注意力 L ×", 1), "ot": (62, 66, 22, 22, "Sinkhorn", 0), } EDGES = [("in_a", "enc_a"), ("in_b", "enc_b"), ("enc_a", "self_a"), ("enc_b", "self_b"), ("self_a", "cross"), ("self_b", "cross")] def anchor(a, b): """按两个框的相对位置,就近选边中点作为进出锚点""" ax, ay, aw, ah = a[0] + a[2] / 2, a[1] + a[3] / 2, a[2], a[3] bx, by = b[0] + b[2] / 2, b[1] + b[3] / 2 if abs(bx - ax) >= abs(by - ay): # 横向为主 return (a[0] + aw, ay), (b[0], by) if bx > ax else (a[0], ay), (b[0] + b[2], by) return (ax, a[1] + ah), (bx, b[1]) if by > ay else (ax, a[1]), (bx, b[1] + b[3]) parts = ['<svg xmlns="http://www.w3.org/2000/svg" width="160mm" height="95mm" ' 'viewBox="0 0 160 95">', '<defs><marker id="ar" markerWidth="6" markerHeight="6" refX="5" refY="3" ' 'orient="auto"><path d="M0,0 L6,3 L0,6 z" fill="#000"/></marker></defs>'] for nid, (x, y, w, h, label, filled) in NODES.items(): fill = "#f2f2f2" if filled else "#ffffff" parts.append(f'<rect x="{x}" y="{y}" width="{w}" height="{h}" rx="1" ' f'fill="{fill}" stroke="#000" stroke-width="0.27"/>') # 0.27mm≈0.75pt # 文字基线:垂直居中再下移 0.35 个字号 parts.append(f'<text x="{x + w/2}" y="{y + h/2 + FS*0.35:.2f}" font-size="{FS}" ' f'font-family="SimHei" text-anchor="middle">{label}</text>') for s, e in EDGES: (x1, y1), (x2, y2) = anchor(NODES[s], NODES[e]) parts.append(f'<line x1="{x1:.1f}" y1="{y1:.1f}" x2="{x2:.1f}" y2="{y2:.1f}" ' f'stroke="#000" stroke-width="0.27" marker-end="url(#ar)"/>') parts.append('</svg>') open("superglue_frame.svg", "w", encoding="utf-8").write("\n".join(parts))

这段代码的逻辑很直白:节点表定义"哪些框、在哪、写什么",边表定义"谁连谁",anchor()负责根据两个框的相对位置自动选最近的边中点当进出点,避免手动算坐标。生成出来的 SVG 里,一个框就是一条<rect>,一根线就是一条<line>,标签是独立的<text>——这个结构决定了 Word 转形状之后每一项都能单独选中修改。

参数上有三处需要按自己的稿子调:stroke-width="0.27"是毫米单位,除以 0.3528 就是磅,0.27 mm 约等于 0.75 pt,和第三章的线宽对齐;font-family写成系统里确实存在的中文字体名,写错了转形状后会静默回退成别的字体,这是最隐蔽的一类翻车;rx="1"是圆角半径,和 Word 里手动设的 1 mm 保持一致,两边混用时视觉才统一。

矩阵和垃圾桶那部分建议留白,生成骨架后在 Word 里手动画——网格用表格或者多个细矩形拼,比写代码算格线省事得多,也更符合"哪里需要精修就在哪里手工"的原则。

4.3 插入 SVG 并转换为形状的操作与校验清单

打开 docx,光标定位到要放图的位置,插入 → 图片 → 选择刚生成的 .svg。插入后它还是一张"图片",右键菜单里会有"转换为形状",点它,图就变成一组可编辑的 Office 形状。之后右键 → 组合 → 取消组合,就能单独选中每个框和每条线了。

转换完必须逐项核对四件事,顺序不要乱:

检查项具体动作常见异常
文字是否还在双击框内文字,看能否编辑变成不可编辑的路径,需重新加文本框
字体是否被替换选中文字看字体名变回默认宋体/西文字体,需统设
线条是否还是线选中箭头看是否有多边形填充箭头变成实心三角块,可接受
尺寸是否等比看图形高度是否仍为 95 mm出现 0.1 mm 级偏差,属正常

如果转出来整张图是一个对象、右键没有"转换为形状",基本可以判定是 Word 版本或在兼容模式下打开了 .doc 文件,另存为 .docx 再试一次。

5. 排查清单:可修改 docx 版本最常见的 5 个翻车点

这一章全是我自己遇到过、也被别人问过多次的问题。每条按"现象 → 原因 → 解决"写,能对号入座就直接跳到对应那条。

现象一:整张图右键没有"转换为形状",或者转完是一坨看不出结构的色块。原因是插入的不是真正的 SVG,而是 EMF、WMF 或者带透明通道的 PNG;另一种情况是文档还在兼容模式(标题栏显示"兼容模式"),旧格式不支持形状转换。解决办法是先确认文件后缀和文件头确实是 SVG(用文本编辑器打开,第一行应该是<svg),再把文档另存为 .docx 关闭兼容模式,重新插入。这一步不做,后面所有精修都无从谈起。

现象二:转形状后箭头位置全乱,移动方框时线不跟着走。这个最典型。SVG 里的<line>在 Word 眼里只是普通曲线,没有"连接符"的语义,所以没有磁性吸附。解决方式是两条路选一条:一是接受现状,把图当成静态矢量图用,只改文字不挪框;二是把交叉箭头删掉,在 Word 里用肘形连接符重连一遍,重新获得吸附能力。如果这张图要长期维护、反复改结构,我建议走第二条,多花二十分钟,省掉后面每次挪框都要重连的麻烦。

现象三:中文字体全变了,字号整体偏大或偏小。原因有两层:SVG 里只写了字体名,Word 找不到就静默回退;字号单位写成了像素,转过来尺寸不对。解决办法是在 SVG 里把font-size用 pt 或 mm 明确写出来(8 pt 就是 2.82 mm),字体名用系统里确定存在的;转完形状后框选全部文字,统一设一次主题字体和字号,别指望它自己对齐。

现象四:缩放到栏宽之后,线条粗细不一致,1 pt 的线在 PDF 里发灰甚至消失。原因是部分形状勾了"随形状缩放",缩放时线宽按比例变化;期刊对最小线宽一般有要求,0.25 pt 以下的线在胶印里会断。解决办法是框选所有形状 → 设置形状格式 → 线条,把"随形状缩放"取消勾选,线宽统一到 0.5–0.75 pt 之间;导出 PDF 后在 100% 和 200% 两档下各看一遍,发灰就加粗到 1 pt 再试。

现象五:自己电脑上好好的,发给别人打开排版全乱,图跑到下一页或者压住正文。原因是用了浮动式形状而不是绘图画布,形状的锚点绑在某个段落上,对方字体、行距一变,锚点位置就漂了。解决办法是把整张图放进绘图画布(内嵌型),画布随段落走,位置稳定;同时在画布上右键 → 大小和位置 → 位置 → 取消"对象随文字移动"以外的额外锁定。发出去之前,换一台机器或者把文档用另一种字体打开自检一遍,是最省事的后悔药。

6. 交付前的两步验证:用玩具矩阵核对标注,再锁死字体与线宽

图画完不等于画对。框架图上最容易标错的两个数字,一个是 Sinkhorn 的迭代次数,一个是"行列归一化"这件事到底归一化成了什么。这两个点光看图看不出来,用几行代码跑一个玩具矩阵,五分钟就能确认自己的标注有没有说错。

import numpy as np from scipy.special import logsumexp rng = np.random.default_rng(0) S = rng.normal(size=(5, 5)) # 5×5 的玩具相似度矩阵 def sinkhorn(logS, T): logP = logS.copy() for _ in range(T): logP -= logsumexp(logP, axis=1, keepdims=True) # 行归一化 logP -= logsumexp(logP, axis=0, keepdims=True) # 列归一化 return np.exp(logP) for T in (10, 50, 100): P = sinkhorn(S, T) print(T, "行和最大偏差", np.abs(P.sum(1) - 1).max(), "列和最大偏差", np.abs(P.sum(0) - 1).max())

跑完会看到一个很直观的趋势:迭代次数越多,行和、列和越接近 1,但永远差一点点,而且在交替归一化的过程中,行归一化会把列归一化的结果再破坏一点。这正好解释了为什么图上要标"迭代 T 次"而不是"归一化"四个字——它是一个近似过程,不是一个精确解。如果你在图上写了"行归一化到 1",跑一遍就知道这句话不严谨,改成"交替行列归一化、迭代 T 次逼近双随机矩阵"才站得住。至于垃圾桶行列,真实的归一化是在增强矩阵上做的,行和里含了那一项,图注里加一句"含垃圾桶行列"能省掉审稿人一轮追问。

第二步是把样式锁死。整张图选中,字号统一(正文块 8 pt、标注 7 pt),线宽统一(0.75 pt,最小不低过 0.5 pt),填充统一(只有一档浅灰),然后把这张图另存成一个单独的 docx 模板,以后所有同类型的框架图都从它复制。我吃过一次亏:同一篇文章里三张框架图,分别在不同时间画的,字号 8 pt、7.5 pt、7 pt 混着,线宽 0.75 和 1 pt 混着,排到版面上像三个人画的,返工改了两轮才对整齐。

最后一个习惯:交付前把 docx 用 PDF 打印机导出一份,在阅读器里放大到 200% 逐块看,重点看四角、箭头端点和最密的那片矩阵区域。屏幕上看着没问题的东西,缩放之后往往能暴露出半像素级的错位。这张 SuperGlue 框架图我从位图重描到做成可复用 docx 模板,前后改了四版,真正花时间的不是画框,是搞清楚每一根线为什么存在。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询