
在实际生物识别项目中手掌静脉识别是一个经常被低估的方案。它和指纹、人脸不同依靠近红外光照射下静脉血管对光的吸收差异形成身份特征天然具备活体检测优势不受手掌表面磨损和污渍影响很难用照片或模具直接伪造。真正让开发者头疼的往往不是静态图像识别而是把识别放进真实场景用户手持设备时手掌晃动、环境光不停变化、近红外补光不均匀、视频帧出现运动模糊、手掌部分被遮挡。基于视频的手掌静脉认证核心任务就是在这些挑战性条件下稳定地完成“采集—增强—特征提取—匹配”把识别率拉回可用水平。接下来的内容会围绕视频手掌静脉认证的完整链路展开先讲清楚它解决什么问题再给出实验环境、数据集组织方式、核心代码实现、挑战性条件下的处理策略、评估方法最后补充排查思路和工程落地建议。写作对象是在做生物识别课题的学生以及准备把掌静脉识别接入门禁、支付、考勤等系统的工程师。1. 先理解视频手掌静脉认证要解决什么问题1.1 手掌静脉识别的原理和优势手掌静脉识别利用的是近红外光的生物光学特性。波长大约在 700nm 到 1000nm 的近红外光可以穿透皮肤浅层但会被血液中的还原血红蛋白和氧合血红蛋白吸收。于是用近红外光源照射手掌再用带有近红外滤镜的相机拍摄静脉血管区域在图像中会呈现出比周围组织更暗的纹路结构。这些纹路在个体之间差异明显形状相对稳定且位于皮肤内部不容易被磨损或伪造。相比指纹识别和人脸识别手掌静脉识别有三个比较实际的优点活体检测成本低只有真实血流才能形成静脉纹路照片、视频、硅胶模具都很难复现同样的吸收特征。特征稳定且抗污染手掌表面有油污、汗液、轻微磨损对静脉成像影响不大。用户接受度高不需要直接接触采集设备卫生性和安全性都比指纹更合适。但它的难点也很突出。静脉纹路在图像中的对比度普遍偏低近红外成像容易受环境光干扰采集距离和角度稍微变化ROI 区域就会出现明显偏移。这些特性决定了静态单帧识别很难同时保证准确率和稳定性也正是视频方案存在的理由。1.2 为什么静态单帧不够要用视频静态手掌静脉识别只采集一张图像然后直接做特征匹配。流程简单但对采集条件要求很高。用户手放偏了、手没有完全展开、采集瞬间有抖动、环境光发生变化都会导致这一张图质量不合格。在真实产品里用户不会像在实验室里那样配合系统也不可能反复要求用户重试否则体感会非常差。视频方案一次采集几秒钟的视频流把决策从“单帧判断”变成“多帧融合判断”。它的技术价值在于可以连续采集几十帧甚至上百帧从中筛选质量最高的帧。可以利用帧与帧之间的互补信息例如某一帧模糊但另一帧清晰某一帧手掌偏左但另一帧位置正常。可以在连续帧中估计运动状态用于去模糊或判断是否为活体。最终识别时通过多帧分数融合降低单帧误判带来的影响。换句话说视频方案不会让识别算法本身变得简单但它给了系统更多“纠错机会”。关键问题是如何把这种机会用起来而不是简单地把所有帧都送去匹配。1.3 挑战性条件到底指哪些干扰在论文标题和工程实践中challenging conditions 通常包括以下几类实际项目中基本都会遇到运动模糊采集过程中手掌在动近红外传感器曝光时间稍长就会出现重影和边缘拖尾。光照变化室内灯光的频闪、外部自然光进入、补光灯亮度波动都会改变图像的灰度分布。低对比度静脉纹路本身对比度就低如果用户肤色较深、手掌距离不合适纹路会更不明显。部分遮挡手指没有完全张开或者佩戴手环、戒指等物品遮挡了关键区域。姿态和距离变化手掌相对于相机的角度、距离发生变化导致 ROI 提取不稳定。帧质量问题视频流中会出现失焦、反光、过曝、欠曝等低质量帧不能直接参与匹配。这些干扰很少单独出现。真实场景里往往是“光照偏暗 手掌晃动 手没完全张开”同时发生。所以设计系统时不能只针对某一类问题做优化而要从整条链路去控制误差积累。2. 视频手掌静脉认证的整体流程和算法选型2.1 经典处理链路基于视频的手掌静脉认证可以拆成以下几个模块顺序执行采集 → 帧质量评估 → 手掌检测与 ROI 提取 → 静脉增强 → 特征提取 → 匹配 → 多帧融合 → 决策每一步都影响最终结果。ROI 提取不准后面增强和特征提取都是在错误区域上计算帧质量评估如果放行了模糊帧匹配分数必然被拉低多帧融合策略选错又会把好的帧和坏的帧一视同仁。在工程上这条链路需要同时兼顾速度和准确率。质量评估和手掌检测通常要保证实时性不能每个模块都上大模型。2.2 传统特征和深度学习特征如何取舍静脉特征可以分成两类手工设计特征和深度特征。手工特征包括基于纹理的 LBP、HOG基于血管结构的 Gabor 响应、Hessian 增强后提取的细节点等。优点是计算量小、可解释性强在小规模实验里很容易调试。缺点是泛化能力有限特征表达能力依赖人工设计遇到复杂场景变化时鲁棒性不够。深度特征通常用一个卷积神经网络直接从静脉 ROI 中提取嵌入向量。优点是在大数据量下能学到比手工特征更稳健的表征对光照和姿态变化更耐受。缺点是需要较多标注数据训练成本高且推理链路更重。实际项目中常见做法是先把传统方法做成一个可运行的基线跑通质量评估、ROI 提取、增强、匹配的完整链路再逐步把特征提取模块替换成深度模型。这样可以明确判断性能提升到底来自哪个环节。下面的示例代码也按这个思路先用 OpenCV 和传统特征搭建最小闭环。2.3 质量评估要先于特征提取质量评估模块容易被忽略但它对视频方案的作用非常关键。它的目标不是识别身份而是判断“当前这一帧适不适合送去匹配”。常见质量指标包括清晰度用拉普拉斯方差衡量数值越低说明越模糊。对比度计算 ROI 内灰度直方图的方差静脉纹路可见度通常与局部对比度正相关。遮挡比例检测手掌连通域与图像边界的接触情况或者前景面积占比。位置完整度手掌关键特征点是否全部落在 ROI 内。质量评估可以直接做硬过滤低于阈值的帧丢弃不参与后续匹配也可以输出一个质量分数作为多帧融合时的权重。推荐两者结合先过滤掉明显不合格的帧再用质量分数加权融合有效帧。3. 实验环境准备和数据集组织方式3.1 环境与依赖版本基于视频的实验通常用 Python 快速验证。推荐环境如下Python 3.8 OpenCV 4.5 NumPy 1.21 SciPy 1.7 scikit-learn 1.0安装命令pip install opencv-python numpy scipy scikit-learn如果后续要接入深度学习特征可以再补充 PyTorch 或 TensorFlow以及对应的 CUDA 环境。原始项目没有限定具体版本落地前要结合自己的系统确认依赖版本避免因为 OpenCV 接口不同导致代码报错。硬件采集建议使用带近红外滤镜的工业相机配合 850nm 波长的近红外 LED 阵列光源。没有专用硬件时也可以先用普通摄像头录制手掌视频把整条算法链路跑通但这会明显降低识别上限。3.2 视频样本和标注组织实验数据需要体现“挑战性条件”否则验证结果没有说服力。建议按下面这个目录结构组织数据dataset/ raw_videos/ user_001/ 01_normal.avi 02_move.avi 03_lowlight.avi 04_partial.avi user_002/ ... processed/ user_001/ frame_001.png frame_002.png ...每个用户录制多个视频包含正常、晃动、低光照、部分遮挡等场景。建议为每个视频准备一份元数据文件记录用户 ID、场景类型、采集距离、环境光亮度等信息方便后面做对照组分析。JSON 元数据示例{ user_id: user_001, video: 02_move.avi, condition: motion, fps: 30, frame_count: 150, distance_cm: 25, note: 采集时手掌左右晃动 }视频方案还需要划分注册集和验证集。注册集用每个用户的清晰视频生成模板验证集用挑战性条件视频做测试。划分时要注意同一用户的训练和测试不能来自同一条视频片段否则会严重高估识别效果。3.3 公开数据集和自采数据的关系常见的掌纹掌静脉实验数据集包括 PolyU 多光谱掌纹库、CASIA 多光谱掌纹库、VERA 掌静脉数据库等。这些数据集多以静态图像为主视频级样本通常需要研究团队自行采集。如果实验题目是“video-based”最好自采一段统一协议下的视频数据并使用公开静态数据集辅助验证算法模块的可用性。自采数据要固定采集协议。比如规定手掌距离相机 20cm 到 30cm采集 2 到 3 秒帧率 30fps近红外补光亮度保持一致。这样后续复现和对比实验才有依据。4. 从视频帧到静脉特征的核心代码实现4.1 读取视频并做帧采样视频流的处理并不需要把每一帧都走完全流程。30fps 的视频2 秒就有 60 帧其中大量帧内容是近似的。合理的做法是先按固定间隔采样或者先跑一遍轻量级质量评估再决定哪些帧进入后续处理。import cv2 def sample_video_frames(video_path, interval5): cap cv2.VideoCapture(video_path) frames [] idx 0 while True: ret, frame cap.read() if not ret: break if idx % interval 0: frames.append(frame) idx 1 cap.release() return framesinterval表示每隔多少帧采样一次。实验阶段可以先用interval5减少计算量等算法流程稳定后再根据效果调整。4.2 帧质量评估和模糊帧过滤质量评估放在特征提取之前先用清晰度和对比度两个指标做硬过滤。清晰度用拉普拉斯方差对比度用灰度直方图的标准差。import cv2 import numpy as np def frame_quality(gray): lap_var cv2.Laplacian(gray, cv2.CV_64F).var() contrast gray.std() return lap_var, contrast def is_acceptable_frame(gray, min_sharpness80.0, min_contrast20.0): sharpness, contrast frame_quality(gray) return sharpness min_sharpness and contrast min_contrast这里的min_sharpness和min_contrast是示例阈值实际需要通过一组典型样本统计得到。阈值设太高会把大量可用帧过滤掉设太低又会让模糊帧进入匹配需要根据具体设备标定。4.3 手掌区域提取近红外图像中手掌区域通常比背景亮可以先用阈值分割找出前景连通域再取最大连通域作为手掌候选。下面给出的是简化版本更稳的方案是检测手指关键点利用指缝点定位手掌 ROI。def extract_palm_roi(gray): blurred cv2.GaussianBlur(gray, (5, 5), 0) _, binary cv2.threshold(blurred, 0, 255, cv2.THRESH_OTSU) kernel cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) binary cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel) contours, _ cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if not contours: return None, None palm max(contours, keycv2.contourArea) if cv2.contourArea(palm) 10000: return None, None x, y, w, h cv2.boundingRect(palm) return gray[y:yh, x:xw], (x, y, w, h)注意几点OTSU 阈值只适用于背景和手掌灰度差异明显的图像如果视频本身存在大面积高光噪声需要先做平滑最小面积阈值需要根据相机分辨率和采集距离调整。ROI 精度直接决定后续特征质量建议调试阶段把 ROI 结果可视化保存逐个检查。注意调试阶段一定要把 ROI 结果可视化保存出来逐帧检查。很多后续识别失败问题根因都在 ROI 提取不稳定这一层。4.4 静脉纹路增强提取到手掌 ROI 后需要增强静脉纹路的对比度。常用的两步是 CLAHE 提升局部对比度再用 Gabor 滤波增强血管的线性结构。def enhance_vein_texture(roi_gray, gabor_ksize31, gabor_sigma4.0, gabor_lambda12.0): clahe cv2.createCLAHE(clipLimit3.0, tileGridSize(8, 8)) enhanced clahe.apply(roi_gray) fused np.zeros_like(enhanced, dtypenp.float32) for theta in np.arange(0, np.pi, np.pi / 6): kernel cv2.getGaborKernel( (gabor_ksize, gabor_ksize), gabor_sigma, theta, gabor_lambda, 0.5, 0, ktypecv2.CV_32F ) response cv2.filter2D(enhanced, cv2.CV_32F, kernel) fused np.maximum(fused, response) fused cv2.normalize(fused, None, 0, 255, cv2.NORM_MINMAX) return fused.astype(np.uint8)Gabor 滤波本质上让图像与一组不同方向的核做卷积。静脉纹路是线状结构某个方向的响应会在对应方向特别强取多方向响应的最大值可以保留所有走向的血管。gabor_sigma控制核的尺度gabor_lambda控制波长。数值越大捕捉的纹路越粗数值太小会放大噪声。4.5 特征提取与匹配增强后的纹理图可以切分成若干子块分别统计灰度直方图再拼接成特征向量。这种方式对局部光照变化有一定容忍能力。def compute_block_histogram_features(enhanced_roi, blocks4, bins16): resized cv2.resize(enhanced_roi, (128, 128)) block_h 128 // blocks block_w 128 // blocks features [] for i in range(blocks): for j in range(blocks): cell resized[i*block_h:(i1)*block_h, j*block_w:(j1)*block_w] hist cv2.calcHist([cell], [0], None, [bins], [0, 256]).flatten() hist hist / (np.sum(hist) 1e-6) features.extend(hist) return np.array(features, dtypenp.float32)匹配时用余弦距离衡量两个特征向量的相似度。由于特征是直方图拼接余弦距离比欧氏距离对幅值变化更稳定。from scipy.spatial.distance import cosine def match_feature(probe_feature, gallery_feature): return cosine(probe_feature, gallery_feature)距离越小越相似。实际系统中注册模板可以保存多次注册特征的均值也可以保存多个模板分别匹配取最小值。后者召回率更高但会增加误识别风险需要结合业务场景选择。4.6 多帧融合决策视频方案最后一步是把多个有效帧的匹配分数融合成一个决策分数。常见融合方式有均值、最大值和清晰度加权。def fuse_frame_scores(frame_scores, weightsNone): if len(frame_scores) 0: return None if weights is None: return float(np.mean(frame_scores)) weights np.array(weights, dtypenp.float32) weights weights / (weights.sum() 1e-6) return float(np.sum(weights * np.array(frame_scores)))加权融合需要额外设计权重的来源。最简单的是取每一帧的拉普拉斯方差做归一化后作为权重清晰度越高的帧贡献越大。再进一步可以训练一个分数融合模型输入多帧的分数序列输出最终判断但样本量不足时容易过拟合建议先从均值开始。5. 挑战性条件下的处理策略5.1 运动模糊的处理运动模糊是视频手掌静脉认证中最常见的干扰。手掌晃动会让边缘变钝静脉纹路被“涂抹”特征匹配分数大幅下降。处理方式分三个层次帧选择在视频流中跳过模糊帧只保留清晰帧。这是成本最低、收益最明显的方法。去模糊对模糊帧做去卷积或基于深度学习的去模糊但计算成本高且在静脉这种低对比度纹理上效果不稳定。硬件优化缩短相机曝光时间、增强近红外补光亮度从源头减少运动模糊。这是产品化时的首选。方案设计上应该优先做帧选择而不是试图把所有帧都修好。视频的优势本来就是“帧多”与其修复坏帧不如直接用质量门槛把坏帧挡在外面。5.2 光照变化下的增强策略光照变化会改变图像的整体灰度和局部对比度。处理思路是在输入层面先做直方图均衡化或 CLAHE让灰度分布更平坦。在特征层面使用块级直方图特征并做归一化减少整体亮度的影响。在采集层面增加近红外补光并给相机配置窄带滤光片滤掉环境光中的可见光成分。要注意CLAHE 并不是万能的。如果原图过曝静脉区域完全变成白色任何增强都无法恢复纹路信息。此时应把该帧判定为不合格帧而不是强行增强后送入匹配。5.3 遮挡和姿态变化手指没有完全张开、手掌边缘超出画面、用户佩戴饰品都会导致 ROI 不完整。处理策略包括缩小 ROI 范围只取手掌中心区域的纹路减少边缘遮挡的影响。使用掩码特征匹配ROI 缺失区域的特征不参与距离计算。在识别前增加完整度校验遮挡比例过高直接提示用户重新采集。姿态变化需要通过对齐来缓解。传统方法可以把指缝点作为基准将手掌旋转和缩放到统一坐标系深度方法则依赖数据增强在训练时随机旋转、平移、缩放手掌图像。5.4 不同干扰策略对比把上面的策略整理成一张速查表干扰类型典型表现推荐处理策略不建议的做法运动模糊边缘拖尾、纹路模糊帧质量过滤、短曝光、近红外补光对所有帧做复杂去模糊光照变化整体过亮或过暗、局部反光CLAHE、块级特征归一化、窄带滤光只靠全局直方图均衡化部分遮挡手掌边缘缺失、手指未张开ROI 收缩、掩码匹配、完整度校验强行用缺失区域匹配姿态变化手掌旋转、距离变化关键点对齐、训练时数据增强固定坐标直接裁剪6. 实验验证和指标解读6.1 评估指标FAR、FRR、EER静脉认证的评估指标和其他生物识别一致核心是 FAR错误接受率和 FRR错误拒绝率。FAR把别人的特征误判为本人数值越高安全性越差。FRR把自己的特征误判为别人数值越高体验越差。EERFAR 和 FRR 相等时的错误率用于综合评价算法。计算 EER 的示例代码import numpy as np def compute_eer(genuine_scores, impostor_scores): # 假设输入都是余弦距离分值越小越相似 scores np.concatenate([genuine_scores, impostor_scores]) thresholds np.linspace(scores.min(), scores.max(), 2000) best_thr thresholds[0] min_diff float(inf) for thr in thresholds: # 距离小于等于阈值时判为同一人 far np.mean(impostor_scores thr) frr np.mean(genuine_scores thr) diff abs(far - frr) if diff min_diff: min_diff diff best_thr thr eer (np.mean(impostor_scores best_thr) np.mean(genuine_scores best_thr)) / 2 return best_thr, eer这里的分数含义需要和前面的匹配函数对应起来。余弦距离越小越相似所以 genuine 分数通常较小impostor 分数通常较大。6.2 对比实验设计为了证明视频方案在挑战性条件下的有效性建议设计三组对比静态帧基线从每个视频中随机取一帧识别连续多次取平均结果。最优帧选择从视频中选质量最高的一帧识别。多帧融合用 4.6 节的方法融合多个有效帧的分数。如果多帧融合结果明显优于随机单帧且在高模糊比例的视频中优于最优帧选择说明视频信息被有效利用了。6.3 结果解读和常见误区结果解读要注意三个坑。第一个坑是数据集划分不严格。同一个视频的不同帧既出现在注册集又出现在验证集会让 EER 看起来非常低实际部署时却达不到。第二个坑是只用 EER 一个指标。EER 只反映均衡点产品往往需要在 FAR 和 FRR 之间做取舍。比如门禁系统更看重 FAR 低便捷支付更看重 FRR 低因此要同时报告 FAR 在特定值下的 FRR例如 FAR 1e-4 时对应的 FRR。第三个坑是忽略失败样本的模式。不要只看总分要统计被拒绝的样本集中在哪种干扰条件下。如果大部分错误都来自低光照场景就说明增强和归一化模块还有优化空间而不是盲目调匹配阈值。7. 常见问题排查7.1 从现象到根因的排查表格视频手掌静脉认证涉及链路长问题往往不在特征匹配这一层。下面按排查优先级整理问题现象可能原因检查方式处理建议所有帧质量都不达标曝光不足或补光损坏查看原始帧灰度直方图调整曝光时间、提高补光功率ROI 频繁跳动阈值分割不稳定保存 ROI 可视化结果逐帧检查改用关键点定位或增加时序平滑静脉纹路不可见波长不匹配或滤镜缺失检查相机是否接收近红外光使用 850nm 波长和对应窄带滤镜本人识别经常失败注册模板和验证姿态差异过大比较注册和验证的 ROI 角度、距离注册时采集多姿态匹配时多模板陌生人误通过率高特征区分度不足或阈值过松绘制 genuine 和 impostor 分数分布提高阈值或更换更有区分度的特征增强后噪声很大Gabor 参数不适合当前分辨率调整 gabor_sigma、gabor_lambda做参数扫描可视化选择合适尺度7.2 典型的错误排查顺序如果最终结果是“认证失败”不要立刻去调匹配阈值。按下面的顺序排查先看输入的视频帧是否清晰灰度分布是否正常。输入不合格后面所有模块都没有意义。再看 ROI 是否提取正确。把 ROI 结果可视化出来确认剪裁区域包含完整的手掌中心。再看增强后的纹理图静脉纹路是否清晰可见。如果增强图全是噪声要回头检查 Gabor 参数。然后检查特征维度是否稳定。帧之间 ROI 大小变化会导致特征向量长度不一致必须在计算特征前统一尺寸。最后才看匹配分数分布。分数不能区分 genuine 和 impostor说明特征表达力不够。排查顺序优先级输入帧质量 → ROI 正确性 → 增强效果 → 特征一致性 → 分数分布。不要跳过前面的环节直接调阈值。7.3 实验阶段常见的三个坑第一个坑直接在彩色图像上做阈值分割。普通摄像头采集的 RGB 图像包含大量背景噪声静脉纹路在可见光下几乎不可见。必须确认图像来自近红外传感器或者先将图像转换到适合的通道。第二个坑注册和验证使用不同来源的图像。注册时使用清晰视频帧验证时使用挑战性视频帧这本身是合理的但如果两者的分辨率、灯光、距离差异太大算法会被迫学习“域差异”而不是“身份差异”。建议注册阶段就采集多种条件的样本。第三个坑帧融合把所有帧的分数平均不分好坏。这样做的结果是清晰帧和模糊帧对最终分数的贡献一样系统性能反而被低质量帧拖累。必须先过滤低质量帧再融合。8. 从实验到工程落地的最佳实践8.1 学习环境和生产环境的差异实验环境的代码追求快速验证生产环境则要考虑稳定性、安全性和可维护性。两者差异很大项目实验环境生产环境视频来源录制好的视频文件实时相机流处理语言Python 原型C 或经过优化的服务配置方式代码硬编码参数外置配置中心或配置文件日志简单打印结构化日志、监控、告警模板存储本地文件加密数据库、硬件安全模块活体检测可选必须回滚方案不涉及灰度发布、旧模板备份8.2 参数调优建议最容易影响结果的参数有三个质量过滤阈值、Gabor 核参数、融合策略。质量过滤阈值建议先从每个样本的 sharpness 分布统计入手。取一批手工标记为清晰的帧和模糊的帧画出拉普拉斯方差的直方图选择两个分布的交叠区域作为阈值区间再做小范围扫描。Gabor 参数建议用网格搜索。每个参数组合在固定测试集上计算 EER选择 EER 最低的组合。注意不要只在训练集上调参要预留验证集。融合策略建议至少对比均值、最大值、清晰度加权三种方式。实验结论并不总是一致有的数据集上最大值更稳有的数据集上均值更好必须基于自己的数据验证。8.3 发布前检查清单把一个视频手掌静脉认证系统从实验推向落地至少过一遍下面这个清单[ ] 采集设备是否使用近红外光源和对应滤镜。[ ] 相机曝光参数和补光灯亮度是否固定。[ ] 视频帧率是否满足最少有效帧数要求。[ ] 质量过滤阈值是否基于真实场景样本标定。[ ] ROI 提取在各类姿态和遮挡下是否稳定。[ ] 注册模板是否覆盖多姿态、多光照条件。[ ] 匹配阈值是否按业务的 FAR/FRR 要求设定。[ ] 多帧融合前是否过滤低质量帧。[ ] 模板数据是否加密存储访问是否授权。[ ] 是否有异常日志和监控指标。[ ] 是否有旧版本模板的回滚机制。上线前至少要在目标设备上重新标定质量阈值不能用开发机的参数直接部署。8.4 扩展方向视频手掌静脉认证的下一步可以从三个方向展开。第一个方向是端到端深度模型。用视频序列直接学习帧间时序特征引入 3D 卷积或时序注意力替代“逐帧提取特征后融合”的传统流水线。这个方向对数据量要求高但特征表达上限更高。第二个方向是活体检测融合。利用视频中手掌的微小运动、血流变化、光反射特性来区分真实手掌和伪造物与静脉特征形成互补。第三个方向是跨设备泛化。训练时在多个不同相机、不同距离、不同光照下采集数据使用域适应或域随机化方法让模型在换设备后不会明显掉点。如果从零开始做这个课题建议先不要急着上深度学习模型。把 OpenCV 版本的最小闭环跑通用质量评估、ROI 提取、Gabor 增强、直方图特征和余弦匹配建立基线再针对识别失败样本逐类排查。这个流程能帮你定位问题到底出在采集、增强、特征还是匹配层。基线稳定之后再考虑引入深度特征和端到端模型每一步都有可比对的数值依据。