尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

OpenHarmony人脸门禁端侧开发与信创国产化实践

OpenHarmony人脸门禁端侧开发与信创国产化实践 园区门禁这个方向我一直觉得属于那种看起来三句话能讲完、上手全是坑的活。摄像头加一套识别算法认出来就开闸——听起来简单得不行可真到了园区、写字楼、学校、工厂这类需要长期无人值守的场景问题立刻变成一堆逆光、侧光、口罩、照片翻拍、断网、上万人脸库怎么做到秒级比对再加上这几年越来越多项目要求软硬件底座走自主可控的技术路线原先那套通用工控机 通用摄像头 一堆散件的拼装方式交付时总要在中间环节临时找补越到后期越难受。我最近在做的就是基于开源鸿蒙OpenHarmony搭一条完整的人脸门禁终端链路主控运行 OpenHarmony 小型系统摄像头走 HDF 驱动人脸检测、活体判别、特征提取全部在端侧 NPU 上跑比对结果通过韦根或 OSDP 直接驱动闸机继电器人脸库离线存在设备本地管理平台侧另做适配。整套东西的目标很实在——把门禁从一台只会转发数据的哑终端变成能自己算、自己扛、能远程维护的端侧设备同时在信创交付场景里不用因为底座不匹配而临时改方案。这篇文章我准备把这条链路从头到尾拆开讲硬件为什么这么选、HDF 驱动怎么接、活体怎么防翻拍、1:N 比对阈值怎么调、韦根为什么老是丢卡、OTA 刷坏了怎么回滚。如果你正在做 OpenHarmony 的设备侧开发或者手上正好压着一个门禁、考勤、人员通行类的国产化迁移项目这里的记录应该能帮你省掉几周反复试错的时间。1. 先把场景说透门禁终端为什么需要一个新底座1.1 传统门禁方案在迁移中撞到的三块硬骨头先说我为什么非要把底座换掉。门禁这类设备有三个特点部署点位多、单点算力要求不高但实时性要求死、生命周期长到离谱。一栋楼装两百台装完三年内基本没人愿意去动它。这三个特点叠在一起就决定了它在迁移时最容易撞上三块硬骨头。第一块是算力与功耗的矛盾。传统做法要么用通用工控机X86 小主机塞在闸机里性能富余但功耗、散热、主板寿命都成问题要么用纯单片机方案功耗低但根本跑不动人脸算法只能做读卡。门禁柜内空间狭小、常年不通空调夏天柜内温度能到 55℃ 以上被动散热的主机跑两年就开始随机重启这类故障排查起来极其折磨人——你到现场测什么都是正常的就是偶尔重启。第二块是驱动与外设碎片化。一台门禁终端要接的东西比想象中多MIPI 摄像头模组、红外补光灯、白光补光灯、LCD 屏、触摸、继电器、韦根输入输出、RS485、门磁、出门按钮、消防联动干接点。这些东西在传统方案里各自带一套厂商私有驱动一旦主控换代或者内核升级全部要重新适配一遍甚至有些模组厂已经不维护了只能换料。第三块是安全与可维护性。门禁是物理通行的最后一道关卡人脸特征属于敏感数据要求本地存储、本地比对、不出设备。传统方案里很多是把特征传到后台服务器比对一旦网络抖动就整栋楼排队。再加上远程升级这块很多老方案根本不支持差分升级改一个小 bug 就得派人到每一台设备上插 U 盘。我的判断是要同时解掉这三个问题只能把系统底座统一让驱动、服务、升级机制走同一套框架。这也是我选 OpenHarmony 而不是自己拿 Linux 从零裁剪的主要原因——它的 HDF 驱动框架和 SA 服务模型正好就是冲着多外设、长生命周期、可远程维护这类设备去的。1.2 这套方案的边界做什么不做什么动手之前我给自己划了条线避免范围失控。这套方案负责的是端侧从摄像头成像、人脸检测、活体判别、特征提取、1:N 检索到输出开门信号全部在设备本地完成。它不负责人事系统、权限审批流、跨园区大联网检索、访客预约这些后台业务——那些交给上位平台端侧只通过一套稳定的接口和平台交互。接口我定了四条后面所有实现都围绕这四条走接口方向用途形式人脸库同步平台 → 端侧下发/删除/更新人员特征HTTPS 拉取 增量包通行记录上报端侧 → 平台打卡记录、抓拍图、异常事件本地队列 断网续传远程配置平台 → 端侧阈值、补光策略、时间段MQTT 或长连接下发固件升级平台 → 端侧差分升级包分片下载 A/B 回滚划这条线的好处是端侧开发的时候不用去纠结业务逻辑怎么变。实际项目里我见过太多方案一开始就想把审批流也做进设备结果平台一改流程几百台设备全部要重新刷固件运维直接崩溃。边界划得越早后期返工越少这条经验我认为比任何技术选型都值钱。2. 整体架构拆解从摄像头像素到闸机继电器2.1 硬件选型的取舍逻辑主控这块我对比过几档方案最后落在中端 SoC 上。判断标准有三条有没有 NPU、摄像头接口够不够、长期供货靠不靠谱。人脸门禁不需要大算力但必须有独立 NPU因为用 CPU 跑推理会导致帧率抖动久了自己发热降频体验就是有时候一秒开门有时候站三秒。我实测过几个档位的大致表现列出来供参考数据是我自己在 640×480 输入、单帧检测 112×112 识别裁剪的配置下测的主控档位NPU 算力单帧检测耗时端到端延迟适配难度适用场景低端无 NPU0180ms~350ms500ms 以上低只做读卡/二维码中端0.8~1TOPS约 0.8TOPS25~35ms200~300ms中单目/双目门禁主力高端6TOPS 级约 6TOPS8~12ms120~180ms中高多路摄像头、带屏交互中端档位是性价比最舒服的位置。算力够跑一个轻量检测网络加一个特征提取网络余量还能挂活体判别的小模型功耗 2~3W无风扇被动散热完全压得住。摄像头模组的选择更关键。我最终用的是双目红外方案一颗 RGB 彩色摄像头做识别一颗红外摄像头配合红外补光灯做活体。理由在 3.2 节细讲这里只说结论——在成本预算有限、又要挡住照片和屏幕翻拍的前提下双目红外的投入产出比最高比单目 RGB 强得多又比 3D 结构光便宜一大截、结构简单一大截。安全存储这块我单独挂了一颗安全芯片用来做人脸特征的加密存储和密钥管理。这一步不能省特征数据一旦落到普通文件系统里拆机取走 eMMC 就能拿到风险太高。用安全芯片做密钥派生特征密文存本地即使存储介质被拆走也解不开。2.2 软件分层内核、HDF、SA 服务怎么摆软件分层我是这么切的从上往下四层每层职责尽量单一第一层是应用层跑一个门禁业务应用负责状态机待机→检测→识别→判定→开门→记录、UI 显示、语音播报。这层不碰任何硬件寄存器全部通过服务接口调用。第二层是SA 服务层我拆了五个服务人脸识别服务模型推理、活体服务、人脸库服务存储与检索、外设控制服务补光、继电器、门磁、通信服务和平台对接。拆这么细的原因是便于单测——我可以不给摄像头通电直接喂一张图片进识别服务验证模型链路对不对。第三层是HDF 驱动层摄像头、GPIO、I2C补光灯驱动、串口、看门狗都在这一层。HDF 的好处是驱动和设备解耦换一颗摄像头模组只要改配置和少量适配代码不用动上层。第四层是内核态OpenHarmony 小型系统的 Linux 内核裁剪掉用不到的东西减小启动时间和内存占用。这里有个我踩过的坑值得提前说HDF 驱动不要图省事写成用户态直读 V4L2。一开始为了赶进度我直接在应用里用 V4L2 ioctl 抓帧跑起来确实快但后面换模组、改分辨率、加多路的时候发现抓帧代码和业务代码缠在一起动一处崩三处。后来老老实实按 HDF 相机模型重写前面多花了一周后面省了至少三周。2.3 端到端数据流与必须守住的性能预算把数据流画成时间线每个环节都有预算超了就要优化摄像头出帧MIPI CSI 采集到 buffer约 15~25fps单帧约 8~15msHDF 相机驱动转交用户态含一次内存拷贝尽量用零拷贝 buffer约 3~5ms人脸检测推理NPU中间档主控约 25~35ms质量评估与对齐裁剪缩放、仿射变换CPU约 5~8ms活体判别红外与 RGB 双帧配合约 10~15ms特征提取NPU约 15~20ms1:N 检索人脸库 1 万条暴力比对约 8~15ms用索引可压到 3ms 以内判定与开门继电器动作 韦根发送约 10~30ms取决于继电器机械响应加起来端到端大约 200~300ms人站在门口的感受是走近、抬头闸机就开了不需要刻意等。我给自己定的红线是400ms超过这个数体感就明显变差人会下意识地后退再看一眼反而降低通行效率。注意继电器选型要留意机械响应时间有些便宜的继电器吸合要 20ms 以上加上防抖逻辑很容易吃掉 50ms 预算。别只算算法耗时。3. 人脸链路的核心细节检测、活体、比对3.1 检测与质量评估把坏脸挡在门外很多方案的问题不在识别网络弱而在把不该拿去识别的帧也拿去识别了。人脸偏转过 45 度、被强光打出一半过曝、只有三分之一张脸进画面、运动模糊糊成一团——这些帧送进特征提取网络出来的向量本身就是噪声拿去比对要么误识要么拒识还把延时拉长。我的做法是在检测之后加一道质量评估门不达标直接丢弃这一帧等下一帧。评估维度我用了四个人脸框尺寸宽高都要大于画面短边的 12%太小说明人太远特征细节不够。按 640×480 算大约就是宽高都要超过 76×76 像素。姿态角用五点关键点估算偏航和俯仰偏航超过 30 度、俯仰超过 20 度就丢。实际用的时候我放到偏航 25 度宁可多等两帧。清晰度拉普拉斯方差阈值根据摄像头模组实测定我这边定在 60低于就认为糊了。亮度与过曝比例人脸区域内过曝像素占比超过 8% 就丢这条专门治逆光。这四个条件同时满足才进入活体环节。加上这道门之后误识率下降非常明显而且平均识别耗时反而缩短了因为无效帧不再进入后面昂贵的推理链路。关于检测网络本身我试过几种轻量结构最后选的是带有多尺度输出的单阶段检测器。原因很实际门禁场景人脸尺度变化大靠得太近是大脸三米外是小脸只用单尺度特征图会有明显的尺度盲区。多尺度输出在 NPU 上的额外开销很小大约多 5ms换来的是三米外的检出率从八成多提到九成五以上我认为这个交易划算。3.2 活体检测双目红外为什么是性价比之选活体这块是所有门禁方案的核心战场。攻击手段就那么几类打印照片、手机屏幕翻拍、平板播放视频、面具。防御手段从便宜到贵依次是单目 RGB 静默活体、双目红外、3D 结构光、双目 结构光融合。我选双目红外理由有三条。第一条是物理原理可靠。红外摄像头配红外补光灯成像依赖的是红外反射强度手机屏幕和打印照片在红外波段的反射特性和真人皮肤差异很大——皮肤对红外有比较强的漫反射屏幕却是镜面反射或者干脆不反射红外。这个差异是物理层面的不依赖模型猜所以非常稳。第二条是抗环境光能力强。红外成像基本不受可见光影响白天黑夜、逆光顺光表现一致。这对门禁太重要了很多点位就是一个大玻璃门正对太阳RGB 摄像头拍出来人脸全黑但红外通道看得清清楚楚。我实测过一个特别极端的点位下午三点正对西晒RGB 画面人脸区域过曝到只剩轮廓双目红外方案依然正常识别。第三条是成本和结构可控。双目模组两个摄像头平行摆放出厂前做一次立体标定拿到内参和外参之后直接算视差就能估深度。不像结构光需要投射器和专门的解码算法也不怕强光干扰投射图案。实现上我是这么串的RGB 和红外两路各自做检测拿到人脸框后计算两者的重叠度。重叠度高说明是同一张真实的脸因为照片贴在同一平面上也能对上所以还要加上红外图内部的纹理分析。红外图里真人脸有丰富的深浅纹理血管、毛孔、皮肤褶皱造成的反射变化照片和屏幕在红外下往往是一块平坦的高亮或低亮区域纹理方差很低。最后我把这三路证据做加权融合深度一致性、红外纹理丰富度、RGB-红外运动相关性真人会有微小的呼吸和微动两路画面同时变化翻拍时两路画面是同步平移的。三个分数加权求和在阈值以上才判为活体。这套逻辑我实测过打印照片、手机屏、平板放视频三类攻击拒真率在万分之一以下。3.3 特征比对与阈值调参1:N 场景下 FAR 怎么压阈值怎么定是整个方案里最容易被拍脑袋决定、也最容易出事故的一步。1:1 场景刷脸验证身份阈值可以放得很松因为这是验证你不是别人拿错人概率本来就低。但 1:N 场景刷脸直接开门是完全不同的性质——一个员工要跟库里一万个人比任何一次像都会开门误识率的放大倍数就是库里的人数。我调阈值的流程是这样的。先采集测试集至少 200 人的多姿态多光照样本其中包含故意做的相似人同卵双胞胎、戴相似眼镜的人脸。然后跑比对得到同一人的相似度分布和不同人的相似度分布两条分布曲线一画阈值就落在这两条曲线的交叉区域附近。具体到数值我用的余弦相似度最终把阈值定在0.68。这个数不是凭感觉定的我做了扫描阈值误识率1万库拒识率备注0.60约 1/2万2% 左右偏松有安全风险0.65约 1/8万4% 左右可接受下限0.68约 1/30万6% 左右我最终采用0.72约 1/200万11% 左右拒识太多体验差0.78极低22% 以上不适合门禁门禁场景我偏向宁可多刷一次也不能误开。所以阈值取在偏严的一侧同时用二次确认来缓解拒识带来的体验问题第一次比对低于 0.68 但高于 0.62 时设备提示请再靠近一点/请看摄像头同时把这一帧的特征缓存下来和下一帧的结果做融合再判一次。实测这个策略能让原本要刷三次的案例降到平均一点二次体验和安全都保住了。还有一种情况要单独处理库里存在同一人的多条记录比如换过发型重新录入过。如果不做去重1:N 里会出现多个候选都很高判定逻辑会乱。我的做法是在人脸库服务里按人员 ID 做聚合一个人保留三到五条质量最高的特征比对时取该人所有特征的最高分作为这个人的分数。4. 实操全流程从开发板到可交付样机4.1 环境准备与系统编译先说环境。宿主机我用的是 Ubuntu 22.04内存至少 16GB硬盘 200GB 以上——OpenHarmony 全量编译吃资源很凶8GB 内存的机器会在链接阶段直接 OOM。依赖包按官方文档装一遍重点是 python3、gn、ninja、clang 这套构建链。拉代码的时候我建议只拉自己需要的子系统不要全量。门禁场景其实用不到图形、媒体的一大半能力把用不上的组件从构建配置里剔掉镜像能小一大截编译时间也从一小时多压到二十几分钟。这一步在调试阶段能省下大量等待时间值得花半天认真做。编译流程大致是这样# 拉取代码按自己用的分支 repo init -u manifest 地址 -b 对应版本分支 repo sync -c -j8 --no-tags # 装依赖 ./build/build_scripts/env_setup.sh # 选产品配置 ./build.sh --product-name 你的产品名 --ccache # 单独编译某个子系统调试时用得多 ./build.sh --product-name 你的产品名 --build-target face_access --ccache--ccache这个参数一定要加重复编译能省一半时间。另外我建议把编译和烧录做成一个脚本一条命令跑完因为调试驱动的时候一天可能要刷十几次。烧录我用的是 USB 线刷方式第一次烧录全量镜像之后调试业务代码可以只推system.img那一部分快很多。产品配置里记得把 A/B 分区打开升级回滚全靠它。4.2 摄像头与 NPU 接入摄像头接入是最费时间的环节我把关键点讲清楚。MIPI CSI 的配置要和模组手册对得很细lane 数、时钟频率、数据格式。配错的表现通常是设备节点存在但抓不到帧或者抓到的帧花屏。这两种现象要区分排查——前者查 lane 和时钟后者查数据格式和字节序。我当时有个模组标称输出 YUYV实际是 UYVY花屏排查了大半天才定位到。HDF 相机驱动这边主要工作是填好 sensor 的能力描述和通路配置。我的建议是先跑通官方最小示例抓三帧存成原始文件用工具转成图片看一眼确认成像没问题再往上做业务。跳过这一步直接写业务代码后面出问题时根本分不清是驱动问题还是算法问题。补光灯的控制我是用 I2C 驱动 GPIO 使能做的策略上分了三级先试红外补光单独工作夜间常用如果红外图的亮度评估不达标再叠加白光补光。这样白天基本不会触发白光晚上也不会突然闪一下吓到人。补光灯功率和角度也要试角度太窄中间过曝人脸边缘全黑太宽则亮度不够、噪点大。我最后用的是 60 度发散角加上两档电流调节。NPU 接入这块模型转换是重点。训练出来的模型一般先转 ONNX再转成目标平台能用的格式。这一步的坑在于算子支持。有些自定义算子转换工具不支持会退化到 CPU 执行速度直接掉五六倍。我遇到的典型是高阶的归一化层和某些变形操作解决办法是把它们拆成基础算子组合或者直接在训练阶段避开。量化也要小心。浮点转 int8 能提速并降低内存占用但精度会掉。我做了比对验证量化前后同一批测试样本的相似度分数分布变化如果同一人的相似度整体下移超过 0.03就说明掉点太多需要做量化感知训练或者对敏感层保留浮点。4.3 门禁业务服务与韦根/OSDP 对接业务服务用一个状态机实现状态我列一下逻辑简单但边界要写清IDLE待机间歇性检测人脸比如每 300ms 检测一次省电DETECTING检测到人脸开启常帧检测并启动活体RECOGNIZING特征提取 检索GRANTED比对通过开继电器、播报、写记录DENIED比对不通过或活体失败播报失败原因LOCKDOWN消防联动或强制锁定韦根协议这块我要多讲几句因为它是丢卡重灾区。韦根 26 位和 34 位是最常见的两种通过两根数据线 D0/D1 的脉冲组合传输没有时钟线全靠脉冲间隔判断。典型的坑是第一GPIO 中断延迟导致丢脉冲。韦根脉冲宽度典型是 50μs 到 1ms如果中断被其他任务抢占超过这个时间就会漏掉一位结果是卡号读出来完全不对而且是间歇性的。我的处理是把 D0/D1 的中断优先级提到最高并且在中断里只做时间戳记录不做任何解析解析放到下半部线程里做。第二防抖和毛刺。长线缆上很容易有毛刺我是靠脉冲宽度过滤太窄的比如小于 20μs直接忽略。第三超时判定。韦根数据没有明确的结束标志我是按最后一位之后超过 3ms 没有新脉冲认定一帧结束然后校验奇偶位。OSDP 就友好得多标准串口通信带校验和加密配置也简单。如果对方闸机支持 OSDP我一般优先推 OSDP韦根只作为兼容保留。这两种接口在端侧我都封装成了统一的服务接口上层业务不用关心具体用哪种。继电器这边有个细节开门信号要持续多久我默认给 500ms同时支持配置。太短闸机可能来不及响应太长则可能造成门锁持续通电发热、并且在连续通行时出现上一个人的开门信号开了下一个人的错觉。另外一定要接门磁输入来实现开门后检测到门已开再撤信号这种更聪明的逻辑同时门未关超时报警也靠它。4.4 离线人脸库、同步与 OTA人脸库我用的是本地嵌入式数据库特征以加密后的二进制 blob 存储索引结构用的是一个近似最近邻索引。库里规模在五万以内时暴力比对也能接受但超过之后延迟会明显上升——一万条大约 8~15ms五万条就 40ms 以上了端到端预算顶不住。加索引之后可以压到 3ms 以内代价是有一点点召回损失实测召回率损失在千分之二以内可以接受。同步机制我做了增量 事务。平台下发的是一个增量包包含新增、删除、更新三类操作和版本号。端侧先落盘到一个临时区全部校验通过后再原子替换索引避免同步中途断电导致库损坏。版本号用于幂等重复收到同一版本直接丢弃。断网续传也花了点心思。通行记录本地用队列表存每条记录带自增序号和抓拍图引用。网络恢复后按序上传平台上按序号去重。抓拍图我做了分级存储——正常通行只存一张小图十天内覆盖清理异常事件活体失败、多次拒识存原图保留时间长一些。这个策略是因为存储卡写满之后整个设备会出问题必须强制回收。OTA 用 A/B 双分区。升级包是差分包体积能压到全量的几分之一对现场网络更友好。流程是下载到备用分区 → 校验签名和完整性 → 设置启动标志 → 重启 → 健康检查启动成功、摄像头能出帧、人脸服务能推理→ 通过则确认失败则自动回滚到原分区。这个健康检查一定要做光看能不能启动是不够的我见过刷完能启动但摄像头驱动挂掉的情况设备活着但完全不能用比启动失败更麻烦。5. 常见问题排查速查表5.1 图像与算法类问题现象可能原因排查方法解决画面花屏、颜色错乱数据格式配错、字节序不对抓原始帧转图看对照模组手册改格式抓不到帧但设备节点存在MIPI lane 数或时钟错打印驱动初始化日志修正通路配置逆光下人脸全黑曝光策略不合适、缺宽动态看人脸区域亮度直方图开宽动态 区域测光夜间识别率骤降红外补光不足或角度不对对比白天夜间红外图调补光电流和发散角误识率高阈值偏松、质量门太宽跑相似人测试集提高阈值到 0.68 以上拒识频繁阈值过严、特征库质量差看拒识样本的相似度分数加二次确认 重录低质样本推理耗时忽然变高算子退到 CPU 执行看算子分配日志拆解或替换不支持算子量化后精度掉很多敏感层量化损失对比量化前后分数分布量化感知训练或保留浮点层5.2 驱动与外设类问题韦根丢卡是出现频率最高的一类。我总结的排查顺序是先用示波器看 D0/D1 波形确认脉冲宽度和间隔正常再在中断里打时间戳看有没有明显的间隔异常间隔异常基本就是被抢占了然后检查线缆长度和是否有屏蔽超过 30 米的韦根线我建议加屏蔽并且两端做好接地处理。继电器不动作先量 GPIO 电平有没有变化再量继电器驱动三极管最后看继电器本体。我遇到过一次是单片机侧 GPIO 配成了开漏但没加上拉电平一直是浮的表现就是有时候能开有时候不能开。这种问题一定要用表量不要靠猜。补光灯异常闪烁通常是 PWM 频率太低或者驱动电流不稳。我把频率调到 1kHz 以上之后就没再出现可见闪烁。看门狗误复位也遇到过一次。原因是某个推理任务跑在大块的临界区里时间超过了看门狗超时。解决办法是把临界区拆小并且把喂狗放在独立的低优先级线程里不要和业务线程耦合。5.3 系统与运维类问题设备跑几天后变慢第一要看内存有没有泄漏门禁是 7×24 运行一点点泄漏都会累积成大问题第二要看抓拍图的存储有没有及时回收。我给自己定的规矩是任何持有图像 buffer 的代码路径都必须在异常分支里也释放宁可写两个释放点也不要漏。这个看起来笨但比事后查泄漏省事得多。时间漂移是个隐蔽问题。设备长期不联网、又没有硬件时钟时间会慢慢偏导致打卡记录时间不对这会直接影响考勤结果。我的做法是内置电池供电的硬件时钟 联网时 NTP 校时 与平台通信时以平台时间为准做修正三条路一起保证。升级失败进不去系统靠的是 A/B 分区回滚。但我也遇到过回滚标志没写成功的情况原因是写入顺序不对——先写标志再写数据中间掉电就麻烦了。正确做法是先把数据写完并校验最后一步才写标志位。6. 交付前的实测数据与几条不写进文档的经验6.1 现场实测的一组数据样机定型后我在三个真实点位做了两周连续测试一个是写字楼大堂正对玻璃门逆光严重一个是工厂车间门口粉尘、油污、照明差一个是地下车库通道全暗环境靠补光。点位环境特点白天通过率夜间通过率平均识别耗时主要问题写字楼大堂强逆光97.8%99.1%245ms下午西晒时段需二次确认工厂车间粉尘油污96.2%98.4%268ms镜头需每周清洁地下车库全暗99.3%99.3%232ms补光灯电流需上调逆光点位的数据有意思夜间反而比白天高。原因很直白夜间没有阳光干扰红外活体和补光都工作在最舒服的状态。白天的两次点几的损失几乎全集中在下午两点到五点这个时段也就是人脸被强光切割的时候。所以我在这个点位额外配了一条策略——检测到人脸区域过曝比例高时自动降低整体曝光并提高增益让暗部提亮虽然噪点会多一些但识别率明显回升。工厂点位的通过率低一些主要不是算法问题是镜头被污染。粉尘落到镜头上形成一层雾状遮挡红外和可见光都受影响。解决办法是加了疏油疏水镀膜镜片并且把镜头朝下倾斜 15 度减少积尘同时把图像清晰度评分持续偏低作为一个告警事件上报平台提示现场维保。6.2 几条我个人踩出来的经验第一条别在最后阶段才做活体测试。我见过太多项目识别链路调得很好活体放在最后做结果一测发现翻拍都能过回头改算法来不及只能硬加一个要求眨眼的交互体验直接崩掉。活体要和识别链路并行开发从第一天就用真实攻击手段去测。第二条把能识别和能长期识别分开评估。实验室里识别率 99% 不难难的是三个月后还是 99%。影响长期表现的因素全是工程性的镜头脏了、补光灯衰减了、特征库里的照片是几年前的、员工换了发型。我在设备里加了一个质量趋势上报把每天的图像清晰度均值、亮度均值、活体通过率上平台掉的时候提前介入比等到投诉了再去现场强太多。第三条人脸录入这个环节的质量决定了整套方案的上限。特征提取网络再好录进去的原始照片如果偏转大、有阴影、像素低后面怎么调都救不回来。我做的录入端强制了质量校验必须正面、必须光照均匀、必须清晰度达标不合格不给保存。同时在设备上提供重新录入入口让员工自己一分钟就能刷新人脸特征比运维跑现场高效得多。第四条关于信创适配硬件换料是常态要留缓冲。这类项目里主控、安全芯片、存储颗粒都有可能出现供货变化被迫换料。我的应对方式是把硬件相关的部分全部收到 HAL 层以下业务层只依赖接口。换主控的时候只要新平台能跑通 HDF 相机、NPU 推理和 GPIO业务代码一行不用改。这一点在项目中期救过我一次当时有一颗物料交期从四周变成十二周我换了个主控两天就完成适配如果当时驱动和业务是缠在一起的两周都做不完。第五条把日志做成可以远程拉取的。现场排查的成本远高于实验室。我在设备里做了环形日志缓冲加条件触发上传——比如活体连续失败五次、识别耗时超过阈值、补光灯状态异常这些事件触发自动打包最近一段日志上传。这条几乎不占什么资源但把现场排查从上门一次变成看一份日志长期看节省的差旅和时间非常可观。这套方案后面还能往几个方向延一是加一路摄像头做双通道实现一边刷脸一边刷码分流高峰通行二是把端侧比对扩展到多设备协同一个园区内的几台设备共享人脸库索引减少单机存储压力三是把活体模型换成更强的多光谱融合进一步压攻击通过率。这些我都在陆续试跑通一个再整理一篇。
返回列表