签名核验最容易出问题的不是模型,是口径。所以证据一章最长:协议、总表、局限,一个都不省。
柜员或后台把单据签名与预留印鉴卡比对。速度与一致性取决于个人经验,难以抽检、难以量化,更难回答「这个月漏掉了多少伪造」。
每位客户只有少量预留样本;中文签名笔画多、写法随时间漂移;真正的风险来自模仿过的熟练伪造,而不是随手乱签 —— 随手乱签人和模型都容易识别。
已发表的强模型几乎都用 GPDS、CEDAR 等非商用数据训练;云端 API 又意味着生物特征出行。两条路都走不通,只能为银行场景重新训练。
按到达顺序逐张人工比对;结果取决于个人经验,难以抽检,也回答不了「漏掉了多少」;高峰期只能靠加人。
系统先打分、排序、分到三个区间并附理由码;复核员先看最可疑的,最终判断仍由人做,并且每一步都可审计。
--network none 运行| 约束 | 落在哪里 | 怎么验 |
|---|---|---|
| 数据不出行 | 镜像运行层没有 pip / uv,设置 PIP_NO_INDEX、HF_HUB_OFFLINE;模型目录只读 | 冒烟脚本在 --network none 下跑完全流程 |
| 永不自动拒绝 | 决策只有 accept / review / priority_review 三个取值 | 单元测试 + 变异清单 |
| 可审计 | 每次核验一行 JSONL:模型哈希、阈值版本、区间、理由码 | 单元测试校验审计行 |
| 可商用 | 来源登记表 commercial.SOURCES → 生成 DELIVERY_NOTICE.md | 声明由程序生成,不手写 |
9 个来源:自研合成中文签名 SynCN + CC BY / CC0 公开手写数据
两个 ResNet18 + 一个 ConvNeXt(DINOv3 初始化)
与原模型特征余弦 < 0.9999 即拒绝写出
每个文件的 sha256 与 CPU 延迟由脚本实测生成,随版本记录
至少 2 张;模板加密钩子由行内 KMS 提供
用贵行自己的真签与伪造,按目标误受率定阈值
通过 / 复核 / 重点复核
模型哈希、阈值版本、区间与理由码
签名框图像,固定分辨率;去除印刷横线
尺寸、对比度、墨迹占比不合格即带理由码转人工
3 个成员各出特征,归一化后拼接
该客户专属分类器:自己的参考签名 vs 他人真签
与两个阈值比较,输出区间 + 理由码
low_reference_count、quality_low_contrast),复核员看得到系统为什么这么分。| 成员 | 结构 / 初始化 | 训练数据 | sha256 前缀 |
|---|---|---|---|
| D2f | ResNet18 · 随机初始化 | SynCN + 5 个 CC BY 来源 | 4af9190c59c6 |
| D5 | ResNet18 · 随机初始化 | D2f 数据 + 3 个 CC0 / CC BY 手写来源 | 6cf5e3fbae04 |
| D9 | ConvNeXt-T · DINOv3 预训练 | 同 D5 | 41474669c54d |
来源全部登记在 commercial.SOURCES;归属声明 DELIVERY_NOTICE.md 由程序生成,不手写;哈希可与收到的文件逐一核对。
用至少 200 张行内真签重估 BatchNorm 统计量;不碰伪造、不反向传播
原模型与适配后模型各对同一批开发集打分
按目标误受率下的误拒率选优,EER 打破平局;样本不配对即拒绝比较
新文件哈希不同;模板和阈值只为选中的模型生成
扫描条件与训练数据差异大时,重估统计量能把特征分布拉回到训练时的状态。
差异本来就小时,重估反而丢掉了训练时学到的、更好的统计量。
# 每个成员各适配一次(只用真签),再把两份开发集分数配对比较 run adapt-bn --onnx /models/d2f.onnx --out /data/d2f_bank.onnx /data/adapt_genuine/*.png # run score:同一批开发集人员,原模型与适配后模型各打一次分 → dev_plain.npz / dev_adabn.npz run compare --scores plain=/data/dev_plain.npz adabn=/data/dev_adabn.npz --target-far 0.01
compare 选。每位用户一个分类器,用自己的参考签名对抗他人的真签。所有模型只换特征提取器,其余完全相同。
同一折、同一组参考样本上比较。我们的每一个种子都必须在至少 60% 的配对单元上赢过最强对手,且平均更低。
任何一个对手在某列没跑完,这一列就不许宣称胜出。见过该数据集作者的对手不计入最强对手。
每个配置至少 3 个独立训练种子;一个种子不达标,整列不算赢。v1 配方已用全新种子 3–5 完整复现:11/15 列胜出。
不同模型的特征维度不同,SVM 的核宽度按维度归一,避免高维模型被默认参数吃亏或占便宜。
vs FKD ResNet18 (Tsourounis 2025): Δ-1.62 10/15, Δ-2.11 12/15, Δ-0.80 9/15
| 基准 | 最强对手 | 对手 | v1 | 判定 | v1 + AdaBN | 判定 | 新种子复现 |
|---|---|---|---|---|---|---|---|
| ChiSig 中文(4 参考) | FKD ResNet18 (Tsourounis 2025) | 15.4 | 13.9 | 胜 | 15.1 | 未达 | 未达 |
| ChiSig 中文(4 参考) · FRR@FAR1% | FKD ResNet18 (Tsourounis 2025) | 69.4 | 65.2 | 胜 | 68.6 | 未达 | 胜 |
| ChiSig 中文(2 参考) | DetailSemNet (ECCV 2024) | 18.9 | 17.6 | 未达 | 18.8 | 未达 | 未达 |
| SigComp-CN 中文(12 参考) | SigNet (Hafemann 2017) | 11.7 | 16.2 | 未达 | 11.4 | 未达 | 未达 |
| SigComp-CN 中文(4 参考) | SigNet (Hafemann 2017) | 22.4 | 26.0 | 未达 | 20.0 | 胜 | 未达 |
| SVC2004 中英(10 参考) | Multi-task Triplet (Viana 2023) | 13.7 | 10.5 | 胜 | 10.3 | 胜 | 胜 |
| SVC2004 中英(5 参考) | Multi-task Triplet (Viana 2023) | 18.9 | 15.3 | 胜 | 15.2 | 胜 | 胜 |
| CEDAR 英文 | SigNet (Hafemann 2017) | 6.7 | 4.9 | 胜 | 5.0 | 胜 | 胜 |
| BHSig 孟加拉文 | SigNet (Hafemann 2017) | 5.0 | 2.4 | 胜 | 2.3 | 胜 | 胜 |
| BHSig 印地文 | Multi-task Triplet (Viana 2023) | 5.0 | 3.6 | 胜 | 3.3 | 胜 | 胜 |
| SOHI 阿萨姆文(12 参考) | FKD ResNet18 (Tsourounis 2025) | 5.5 | 4.8 | 胜 | 5.0 | 胜 | 胜 |
| SOHI 阿萨姆文(4 参考) | FKD ResNet18 (Tsourounis 2025) | 8.2 | 7.0 | 胜 | 7.0 | 胜 | 胜 |
| ICFHR2018 泰文 | SigNet-S (Viana 2023) | 3.8 | 3.1 | 胜 | 3.3 | 胜 | 胜 |
| TRSig 土耳其文 | Multi-task NT-Xent (Viana 2023) | 8.2 | 6.8 | 胜 | 6.1 | 胜 | 胜 |
| SigComp2009 荷兰文 | SigNet-S (Viana 2023) | 9.7 | 6.8 | 胜 | 7.0 | 胜 | 胜 |
compare 决定。在开发集上把阈值定到熟练伪造误受率 1%,再看测试集上有多少真签落到阈值以下。这比 EER 更接近银行的实际取舍:先锁住风险,再看给复核员增加多少工作量。阈值只用开发集人员定,测试人员不参与。
误受率锁在 1% 时,约 65.2% 的真签会落入重点复核 —— 已优于所有对手,但离「自动化」很远。这正是我们坚持三区间、不自动拒绝的原因。
用 ChiSig 等非商用数据训练的对照模型,不交付。它的作用是给出「用真实中文签名继续训练」能到达的参考水平,也是试点之后的改进方向。
总表的中文与英文列在开发过程中反复看过,存在「对着测试集调」的风险。泰文、土耳其文、荷兰文三个基准是在配方冻结之后才接入的:泰文 900 张真签 / 360 张伪造,土耳其文 1,408 / 1,334,荷兰文 222 / 624。它们的结果,是模型对全新书写体系的真实泛化。
泰文 vs SigNet-S (Viana 2023): Δ-0.82 5/5, Δ-0.82 4/5, Δ-0.58 4/5
土耳其文 vs Multi-task NT-Xent (Viana 2023): Δ-1.29 5/5, Δ-1.02 4/5, Δ-1.84 5/5
荷兰文 vs SigNet-S (Viana 2023): Δ-1.99 4/5, Δ-3.27 5/5, Δ-3.24 5/5
原模型 16.2%,AdaBN 后 11.4%,SigNet 11.7%。平均已略好,但没过「每个种子 60% 配对胜」的判定,所以不宣称。
v1 平均 17.6%,对手 18.9%:平均更低,但配对胜率不够。参考样本越少,个体差异越大。
它让 SigComp-CN 4 参考从 26.0% 降到 20.0% 并胜出,却让 ChiSig 从 13.9% 升到 15.1%。必须在贵行数据上量。
演示站的阈值是在合成数据上定的:真实签名图库的排序 12/13 正确,但所有真实样本都落进了重点复核。阈值不能跨数据源搬用。
公开的中文签名库以简体为主,我们今天给不出繁体的数字。这是试点的必测项。
公开库的熟练伪造由志愿者模仿完成;真实作案者可能更强。试点应纳入贵行的历史伪造案例。
| 模型 | 尺度随机 | 固定尺度 | 固定尺度 + 去横线 |
|---|---|---|---|
| SigNet (Hafemann 2017) | 44.1 | 6.2 | 5.4 |
| SigNet-S (Viana 2023) | 32.3 | 4.9 | 3.9 |
| FKD ResNet18 (Tsourounis 2025) | 37.2 | 10.0 | 6.0 |
| 交付成员 D2f | 29.0 | 3.3 | 2.7 |
| 交付成员 D2f + D5 集成 | 29.4 | 3.1 | 2.4 |
指标:同一签名叠在不同底纹上 vs 熟练伪造的 EER(%,越低越好)。D9 未参与此探针。
模拟扫描分辨率不统一:同一签名以不同大小出现在底纹上。
按墨迹宽度对齐到训练尺度,相当于全行统一扫描 DPI。
再去掉支票上的印刷横线,只留签名笔画本身。
| 成员 | 1 线程 p50 (ms) | 4 线程 p50 (ms) | sha256 前缀 |
|---|---|---|---|
| D2f · ResNet18 | 27.7 | 7.5 | 4af9190c59c6 |
| D5 · ResNet18 | 27.7 | 7.5 | 6cf5e3fbae04 |
| D9 · ConvNeXt-T | 71.7 | 26.1 | 41474669c54d |
release_facts.py 在发布文件上实测生成;贵行硬件不同,冒烟脚本会给出本机数字。账号以 KMS 下发的密钥做哈希后才进模板目录与日志。未配置密钥时退回无密钥 sha256,并在每一行审计日志标注 sha256-unkeyed。
模板是特征向量,属于生物特征数据。加解密钩子由行内提供;未配置时启动即告警,并在每个模板元数据写 encryption: "none"。
每次核验一行 JSONL:模型哈希、阈值版本、区间、理由码。复核员与审计都能回溯「当时用的是哪个模型、哪版阈值」。
模型哈希覆盖集成的每个成员且有序;不同模型的模板与阈值不会混用,换模型必须重新注册与校准。
| 贵行提供 | 用途 | 缺失时系统怎么做 |
|---|---|---|
KMS 密钥 SIGVERIFY_ID_KEY | 账号的密钥哈希 | 退回无密钥 sha256,每行审计标 sha256-unkeyed |
| 加解密钩子 | 模板加密存储 | 明文存储,启动告警,元数据写 encryption: "none" |
| 负样本池(他人真签) | 每位客户分类器的负例 | 拒绝注册:no_negative_pool |
| 开发集人员(真签 + 熟练伪造) | 按目标误受率定阈值 | 拒绝核验:no_thresholds;伪造不足时阈值文件写警告 |
导入镜像与模型,核对 sha256,断网跑通冒烟脚本
固定分辨率扫描;真签 + 熟练伪造;负样本池
原模型 vs AdaBN,compare 决定
按贵行目标误受率生成阈值文件
与人工并行,不影响业务,只比较
| 步骤 | 验收标准 | 负责方 |
|---|---|---|
| 环境就绪 | 三个文件 sha256 与发布记录一致;冒烟脚本在 --network none 下通过 | 贵行运维 · AWS 远程支持 |
| 准备开发集 | 开发集人员与测试人员不重叠;熟练伪造数量足以支撑目标误受率(不足时阈值文件会警告) | 贵行业务与影像 |
| 选模型 | 得到一份配对的 compare 报告,记录选择理由 | 贵行 · AWS 协助解读 |
| 校准阈值 | 留出人员上的实测误受率接近目标值 | 贵行 |
| 影子运行 | 得出「重点复核命中的伪造比例」与「通过区间的真签比例」两个业务数字 | 贵行业务 · AWS 复盘 |
一台断网的 x86 服务器;固定分辨率扫描的开发集;负样本池;KMS 密钥与加解密钩子。
一份 compare 报告、一份阈值文件、影子运行的两个业务数字,以及是否上线的决策依据。
可以,且研究轨结果说明有空间。但训练要 GPU 与数据治理审批,建议在试点数字出来后再立项,训练数据同样要走许可登记。新模型照样要过同一套 15 列判定。
模型看的是笔迹形态而非字符本身。但公开基准以简体为主,繁体签名的效果必须在贵行开发集上验证,这是试点的必测项,开发集应按简繁比例抽样。
模板可随新的已核验签名更新;参考样本越多越稳,少于 4 张会被标注并收严阈值。更新只能用已人工确认的签名,否则伪造会被学进模板。
我们实测了 DINOv2/v3、SigLIP 2 等通用视觉模型作为对手,直接用都不如专门训练的模型;云 API 则不满足数据不出行。通用模型的数字都在总表的对手里。
新文件、新哈希。模型哈希变化后旧模板与阈值不会被误用,需要重新注册与校准;冒烟脚本可在断网环境先验证新版本,再切换生产。
当前是离线图像核验。手写板轨迹可以渲染成图像接入(演示站已这样做),但未针对笔速、压力等动态特征优化;如有需要,可作为独立课题评估。