五一假期那几天,我正好在一个商业综合体做停车系统的压力测试,现场排队的车子从入口一直堵到市政路,保安拿着手持机挨个拍照、手动放行,车主摇下车窗一脸不耐烦。当时我就想,这套流程确实该换了。回来之后,我把"小程序+Python人脸识别+智能AI"这套停车管理方案重新梳理了一遍,今天把它完整写出来。这是一套面向商场场景的智能停车管理系统,以微信小程序做C端入口,后端用Python承载识别与业务逻辑,核心是把人脸识别技术用在车辆出入场识别、无感支付和会员联动上。它解决的是传统停车系统排队慢、无牌车难处理、缴费流程割裂这几个老大难问题。适合正在做智慧园区、商业停车、会员数字化改造的朋友参考,也适合想用Python快速落地一个AI小项目的开发者阅读。
1. 项目需求拆解与方案选型逻辑
1.1 商场停车场景的痛点到底在哪
做停车系统之前,得先把场景看明白。商场停车和写字楼、小区停车有本质区别:车流集中、高峰时段短、用户对速度极度敏感。我观察过很多商业体的停车场入口,早高峰和周末午后的排队时间经常超过十分钟,原因不外乎几个。
第一个痛点是出入口身份核验方式单一。传统方案基本是车牌识别,这套东西对正常悬挂车牌的车辆没问题,但遇到无牌新车、车牌被泥遮挡、新能源车临时牌照,识别率会断崖式下跌。保安只能切换到人工模式,一车一车登记,效率立刻崩盘。
第二个痛点是缴费流程和用户身份割裂。很多商场停车缴费要先扫一个缴费码、输车牌、再跳转支付,如果车牌识别错了,还得手动改,体验非常糟糕。更麻烦的是,用户的停车记录和商场会员体系完全是两套数据,停车时长不能自动变成积分,消费抵扣也要人工核对小票。
第三个痛点是反向寻车困难。商场地下停车场动辄几千个车位,结构复杂,我见过太多车主在电梯口转悠十几分钟找不到车。如果系统只能识别车牌,用户终端没有绑定关系,就没有办法做位置记忆和导航功能。
人脸识别出现在这个场景里,逻辑上非常顺:用户入场前通过小程序注册一次人脸,之后进出场刷脸通行,把"车"的识别变成"人"的识别,直接绕开了车牌识别对车辆物理特征的依赖,同时把停车行为和会员身份绑定在一起。
1.2 为什么是"小程序+Python+人脸识别"这套组合
选型的时候不是没有犹豫过。最初的想法是做个独立App,但很快被否了。商场停车是低频刚需,用户不可能为了停车专门装一个App,更不可能容忍下载、注册、授权这一堆流程。小程序的好处是扫码即用、用完即走,而且和微信支付、会员卡、消息通知天然打通,用户从扫码到完成人脸注册的路径可以控制在三十秒以内。
后端选Python,最直接的理由是AI生态。人脸识别领域最成熟的几个开源库face_recognition、OpenCV、dlib全是Python生态,训练好的模型可以直接调用,不需要像C++那样从头写图像处理管线。Flask框架用来写API接口也足够轻量,一个停车管理系统的并发量远没有电商秒杀那么夸张,没有必要上重型框架。再加上Pandas、NumPy这些数据处理工具,做日志分析和运营报表非常顺手。
人脸识别在停车场景里的优势是其他识别方式替代不了的。车牌识别处理的是"车是谁的"这个问题,但商场运营方更关心"来的人是谁"。刷脸入场之后,系统可以直接识别出这是哪个等级的会员、上次消费是什么时候、有没有未使用的优惠券,这些信息实时推送到停车后台,商场可以做定向运营。这是纯车牌方案完全做不到的。
1.3 自研识别与云端API怎么选
技术路线我对比过两条,一条是本地自研,基于face_recognition库自己做特征提取和比对;另一条是接入云服务商的人脸识别API。两条路各有取舍,最终方案选的是本地自研为主、云端作为兜底,原因有几个。
云端API的优势是识别精度高,活体检测、照片质量校验这些都有现成的接口,按调用次数付费,初期接入很快。但问题也很明显:第一,每次识别都要走网络请求,商场出入口的网络环境不一定稳定,一旦云端抖动,整个闸机就瘫痪了;第二,按次计费,一个中型商场日均进出几千车次,一年下来费用不低;第三,用户人脸数据全部经过第三方服务器,合规上的解释成本很高。
本地自研最大的好处是数据可控和零边际成本。face_recognition库基于dlib的深度学习模型,能在普通服务器CPU上做到每张人脸几百毫秒级别的比对速度,对于几千人的会员库完全够用。缺点是需要自己处理光线、角度、遮挡等复杂情况,需要一些调参经验。我的做法是把两条腿都准备好:核心识别走本地模型,当照片质量太差、本地比对置信度不足时,才把图片转发到云端API做二次确认,这样既保住了稳定性又控制住了成本。
2. 核心技术原理与人脸识别落地细节
2.1 人脸识别从检测到比对的完整链条
人脸识别不是"拍一张照片,和库里的照片比一比"这么简单,它是一条完整的图像处理流水线,我拆开讲。
第一步是人脸检测。摄像头拍到的画面里可能有很多人、很多物体,系统要先找到人脸在哪里。这一步用的是HOG(方向梯度直方图)特征配合滑动窗口,或者用深度学习目标检测模型,比如MTCNN或OpenCV的DNN模块。face_recognition库封装了HOG检测器,速度很快,单张图几十毫秒就能完成,适合闸机这种需要快速响应的场景。缺点是检测距离近、侧面角度大的人脸会漏检,所以现场摄像头的安装角度要正对驾驶员车窗。
第二步是人脸对齐。检测到人脸之后,系统要找到眼睛、鼻子、嘴巴这些关键点,然后把人脸图片做仿射变换,摆正到标准位置。这一步很关键,因为后续特征提取对位置非常敏感,歪着脸的照片直接做特征提取,识别精度会掉一大截。dlib提供了68点人脸关键点检测器,face_recognition库内部会自动完成这一步,不需要手动干预。
第三步是特征提取。对齐后的人脸图片会被送入一个预训练的深度卷积神经网络,输出一个128维的特征向量。这个向量的意义是:把一张人脸压缩成一串数学数字,同一张脸在不同光线、不同角度下提取出的向量距离很小,不同人的脸距离很大。这就是整个识别系统的核心,后面所有的比对都建立在向量距离的度量上。
第四步是特征比对。把摄像头抓到的特征向量和数据库里预存的特征向量逐一计算欧氏距离,距离小于预设阈值就算匹配成功。听起来简单,但这里面的细节会直接影响用户体验,我放一小节单独讲。
2.2 特征提取与人脸库管理
人脸库的管理是整个系统里最容易被低估的环节。很多教程告诉你"识别就是调用face_recognition.compare_faces",但真实项目里要处理的问题多得多。
首先是特征向量怎么存。我建议在MySQL里用TEXT字段存JSON数组,128个浮点数序列化后大约一两千字节,完全够用。每次识别的时候把这张表读出来,预加载到内存里做成一个Python列表,避免每次请求都打数据库。几百个用户的小商场,内存里的几十KB开销可以忽略;几千个用户也就是几MB,依然很轻松。
其次是特征向量的更新策略。人脸会随着年龄、发型、胖瘦变化,如果用户注册后三年不变,识别率会逐步下降。我的做法是每次成功识别之后,把这次的照片重新提取一个特征向量,和旧向量做加权平均,再写回数据库。这样做的好处是特征向量会随着用户实际外貌的变化缓慢漂移,始终保持最新状态。不过要注意加权系数不能太大,否则一次识别的误差就会被带进模型里,我设置的系数是0.3。
第三个问题是入库照片的质量。注册人脸的质量直接决定后续识别率。我在小程序端就做了限制:用户上传或拍摄的照片必须是正脸、光线充足、不能带墨镜帽子。后端还要再做一个质量校验闭眼检测和数据增强处理,避免把模糊照片存进库里。
注意:人脸特征是一种生物识别信息,存储和传输过程中必须加密,数据库要做好脱敏和权限隔离,这是合规红线,不能有一点侥幸。
2.3 识别阈值怎么定才不会误判
识别阈值是整个系统里最需要调参的参数,也是很多人容易忽略的地方。face_recognition库的默认匹配距离阈值是0.6,意思是待识别特征和库中特征之间的欧氏距离小于0.6即判定为同一个人,但实际项目中这个值不可能直接拿来就用。
阈值调得太小,会频繁拒认,用户体验就是"我明明注册过了,系统非要我再刷一次脸",停车高峰期真的会被骂。阈值调得太大,容易出现误认,把张冠李戴,两个人长得有点像就直接放行,这在停车场场景里是有资金安全风险的,因为停车费和会员权益是挂钩的。
我建议的调参方法是准备一个测试集,收集100张不同用户的照片作为正样本,再准备50张无关人员的照片作为负样本,遍历0.4到0.7之间的阈值,画出正确接受率和错误接受率随阈值变化的曲线,取两条曲线的交叉点附近作为初始值。实际落地时,我对会员用户放宽到0.55,对临时用户收紧到0.48,既能保证老会员的通行速度,又能控制陌生人闯入的概率。
另外要强调一点:比对结果不要只输出"是或否",还要输出距离值。系统里保存这个距离值,后续分析误判原因时可以通过日志回看,定位是阈值问题还是人脸库数据问题。这个习惯为后面优化模型省了很多力气。
3. 系统架构与数据库设计
3.1 前后端整体架构
整套系统的架构不复杂,但要把链路串清楚。
最上层是微信小程序,负责用户交互:停车场地图展示、人脸注册、扫码入场、出场缴费、会员信息查看。小程序通过HTTPS调用后端API,所有图片上传走HTTP Multipart协议。
中间层是Python后端服务,选用Flask框架。我把它拆成三个模块:网关模块负责路由和参数校验;业务模块负责停车记录、费用计算、会员积分这些逻辑;识别模块负责把人脸图片交给本地模型做特征提取和比对。识别模块单独拆出来,是为了后续如果性能不够,可以直接把这个模块替换成独立服务而不影响其他业务。
底层是MySQL数据库,存用户信息、停车记录、车位状态、缴费流水。图片文件不存数据库,存储在服务器本地磁盘或对象存储,数据库里只存URL路径。
闸机控制这一层需要注意:闸机设备和后端之间是硬件对接,一般闸机都提供串口或网络协议控制接口。我这边通过一个继电器控制器,后端识别成功之后向控制器发送开闸指令。要考虑的是网络中断时怎么兜底,我的做法是保留一个手动开闸按钮,同时在后端识别服务里做本地缓存,短暂断网时允许已注册用户离线放行。
3.2 核心表结构设计
表结构设计我直接给出核心的三张表,更多细节字段可以根据实际需求扩展。
user表存储用户信息,openid是小程序用户的唯一标识,face_encoding字段存人脸特征向量的JSON文本,member_level是会员等级,用于后续计费折扣判断。这里要注意openid和手机号是敏感数据,查询接口要做权限控制。
parking_record表是停车流水表。入场时插入一条记录,enter_time和enter_gate记录入场时间和闸口编号;出场时更新exit_time字段并计算费用。is_paid字段标记是否已支付,关联payment表存储微信支付流水。这张表的数据量会随着时间增长,建议按月做分区,并且定期把三个月前的记录归档到冷表,避免主表过大影响查询速度。
parking_space表记录车位状态。space_no是车位编号,status字段标识占用或空闲,current_record_id关联当前占用这条车位的停车记录。用户端查询空车位时就是查这张表。如果后续要做反向寻车,可以再加一个location_x和location_y字段,存车位在停车场地图上的坐标。
3.3 核心接口定义与业务流程串接
我把核心的API接口列了一下,一共六个,覆盖了完整业务闭环。
注册人脸接口接收用户openid和上传的图片,服务端做人脸质量校验、特征提龋,然后存入user表。这里要提醒一下:注册时建议采集两张以上不同角度的照片,分别提取特征后取平均向量,能够明显提升后续识别成功率。
入场识别接口是流程的核心。闸机摄像头抓拍用户面部图片上传,服务端提取特征、和用户库比对,匹配成功后再查用户是否有未支付的停车记录(防止上一笔订单未结清就再次入场),校验通过后创建新的parking_record并控制闸机开闸。
出场识别接口逻辑类似,识别成功后先结算费用,若用户开启了免密支付且余额足够,自动扣款并推送通知;否则把账单推到小程序端,用户确认支付。支付成功之后开闸放行。
车位查询接口返回车位地图和空闲数量,支持按楼层筛选。缴费接口对接微信支付统一下单和支付回调,回调用异步方式更新parking_record表状态。
整个业务流程走下来,用户从入场到出场可以做到全程不掏手机,这就是"无感通行"的价值。而传统方案至少要经历扫码、输车牌、支付三个步骤,高峰期的体验差距是质变的。
4. 从0到1的实操实现过程
4.1 开发环境准备
动手之前先把环境踩平,这一步省得后面被坑。
Python版本建议3.8到3.10,太新的版本可能会遇到依赖库兼容性问题。需要安装的库有:Flask、PyMySQL、face_recognition、opencv-python、numpy、requests。建议用虚拟环境安装,避免污染系统Python。
face_recognition是这里面安装最容易出问题的库,它依赖dlib,而dlib需要C++编译环境。Windows用户直接pip install face_recognition大概率会在编译dlib时报错。我实测有效的方案是先去安装Visual Studio Build Tools,勾选"使用C++的桌面开发"组件,或者直接用Anaconda安装,conda会提供预编译好的dlib包,省掉编译这一步。Linux服务器上则要先安装cmake和libboost-dev这些系统依赖。
数据库我用MySQL 8.0,建库语句里要设置utf8mb4字符集,因为人脸特征JSON序列化后是ASCII字符,无所谓,但用户昵称、车牌号这些字段可能会有中文,编码要提前设置好。表结构按照上一节的三张核心表来建,字段类型注意face_encoding用TEXT,openid用VARCHAR(64)。
4.2 后端识别服务实现
识别服务写起来不算复杂,但有几个细节必须处理好。核心函数分成两类:第一类是注册入库,第二类是识别比对。
注册入库的核心代码逻辑是接收图片文件,用face_recognition.load_image_file读取,再用face_recognition.face_encodings提取特征。这里要注意,如果没有检测到人脸,face_encodings返回空数组,一定要做这个判断并返回提示,否则后面就会出现空特征入库的脏数据。提取成功后,把128位浮点数转成列表,再json.dumps存进数据库。
识别比对的逻辑是加载库里的所有特征向量,和当前图片的特征向量逐一计算距离。计算距离用numpy的linalg.norm就可以,也可以直接用face_recognition.compare_faces和face_distance。我要提醒一个性能问题:不要每次识别都读库、都提特征,正确做法是在服务启动时把全部已知人脸特征加载到内存,之后每次请求只在内存里比对。注册新用户或更新特征时再用锁机制同步更新内存缓存。
关于并发处理,Flask自带的开发服务器是单线程的,生产环境一定要换用gunicorn或uwsgi部署。每条识别请求都是CPU密集操作,建议为识别模块单独开启进程池,把特征提取放到子进程里执行,避免阻塞主进程的API响应。
4.3 小程序端开发要点
小程序端我用的是原生开发,不引入额外的UI框架,因为页面逻辑确实不复杂。核心页面有四个:首页停车场状态、人脸注册页、扫码入场页、停车记录和缴费页。
人脸注册页是技术含量最高的一个页面。小程序提供了camera组件,可以直接调起摄像头拍摄照片,权限标签是scope.camera。拍摄时我做了几个约束:页面顶部提示用户正对摄像头、摘下墨镜和帽子,取景框里套一个椭圆引导线,照片拍出来还要做个前置检测,判断画面里有没有人脸。这些细节直接影响后端识别率,值得多花时间做。
拍照完成后用wx.uploadFile把临时文件路径上传到后端,这个接口的name字段要和后端Flask接收的参数名一致。上传成功后返回注册结果,注册成功则跳到首页,失败则提示用户重新拍摄。
入场页和出场页是核心操作页面。入场时用户点一下扫码按钮,系统调用wx.scanCode扫描入口闸机上的二维码,把车位ID和闸口ID拼接成参数传给入场接口。同时也支持直接调用摄像头拍照识别,算法识别出用户身份即可开闸。二维码扫码和刷脸识别可以并列存在,用户任选其一,实际使用中扫码更稳,刷脸更快。
缴费页面就是展示当前停车时长、费用明细,然后调用wx.requestPayment发起微信支付。这里要特别处理支付回调的时序问题:用户付完钱,小程序拿到支付成功回调后,后端可能还没收到微信服务器的异步通知,这时不要急着关闸机,后端回调成功后再控制开闸,否则会出现用户付款成功但系统没记录到、二次收费的纠纷。
4.4 全流程联调与真机测试
联调阶段是最容易出问题的,我习惯按"先本地、再内网、再真机"三步走。
本地联调时,后端服务跑在本机,小程序开发者工具里要把不校验合法域名选项打开,不然HTTPS请求会被拦截。同时要注意localhost在小程序开发者工具里指向的是开发者工具所在机器,真机预览时必须要用局域网IP地址,而且后端服务要监听0.0.0.0而不是127.0.0.1。
第一次真机测试时我就碰到过一个问题:小程序上传图片超时。原因是拍的原始照片分辨率太高,一张图好几MB,上传时间太长。解决办法是在小程序端先用canvas把图片压缩到宽800像素、质量0.8,再上传,大小能压到200KB以内,上传时间和后端处理时间都大幅缩短。
全流程联调时,我建议把闸机控制逻辑用一个模拟器替代,做一个测试按钮模拟开闸信号,在后端日志里打点记录。等所有流程都验证通过,再接入真实闸机设备,降低硬件接错导致的安全风险。
5. 常见问题与排查实录
5.1 环境问题:dlib安装失败怎么处理
安装face_recognition时踩坑的人非常多,我在不同机器上前后解决过好几轮,这里把有效方案整理一下。
Windows环境最容易出问题。直接pip install dlib大概率会现场编译C++源码,如果没有装Visual Studio Build Tools,编译必然失败,报错信息里会出现一堆红色的error C2061或者fatal error。解决办法是先安装Visual Studio Build Tools,在安装界面的"单个组件"里勾选Windows 10 SDK和MSVC v143构建工具,然后再安装dlib。如果不想折腾VS,还有一个更省事的路子:去一些预编译wheel仓库下载对应Python版本的dlib.whl,pip直接装预编译包,全程不超过两分钟。
Linux服务器上通常没有这个问题,但要先确保系统里装了cmake和build-essential,否则同样会编译失败。Anaconda用户最省心,conda install -c conda-forge dlib直接装编译好的二进制包。
注意:dlib安装完成后要确认版本,face_recognition对dlib版本要求比较严格,版本不匹配可能在运行时出现"模型加载失败"或者识别结果全错的诡异问题。我建议固定使用dlib 19.24.0这个稳定版本。
5.2 识别准确率不稳定怎么办
识别准确率问题是最难排查的,因为它牵涉的因素太多。我总结下来,主要从三个方向去查。
第一个方向是摄像头安装角度。商场入口闸机的摄像头如果装在正前方正上方,驾驶员刷脸时脸部会投射出奇怪的光影,识别率必然下降。我调试过很多现场,发现摄像头应该装在驾驶员车窗侧面或斜向上30到45度的位置,让驾驶员自然抬头就能被拍到正脸。这个安装角度的调整,比调任何算法参数都有效。
第二个方向是光照条件。停车场入口通常是逆光环境,车灯直射摄像头,面部完全是黑的。解决办法是增加补光设备,或者开启摄像头自带的宽动态功能。没有硬件条件时,后端可以在图片送入模型前做一个直方图均衡化预处理,对暗光照片有明显改善。
第三个方向是阈值和特征更新。阈值设置不合理会导致频繁拒认或误认,这个前面已经说过。还有一个隐蔽的问题:用户在注册时上传的是美颜照片,这会导致特征向量偏差很大。美颜功能会磨皮、瘦脸、大眼,实际人脸和照片差异很大,识别率肯定受影响。我在注册页直接禁用了美颜相机拍摄,只允许系统原生camera组件拍摄。
5.3 性能与并发问题
停车系统的并发量不算特别高,但高峰期的瞬时有突发性。周末中午入场高峰,一分钟可能有几十辆车排队进场,如果每个请求都在后台同步做特征比对,请求会堆积。
我采用的方案是异步任务队列。小程序的入场请求进来后,先返回一个"处理中"状态,后台把识别任务丢进队列,识别完成后由前端轮询或者WebSocket推送结果。这样即使瞬时并发高,也不会拖垮主接口。队列的实现在初期直接用Python的queue模块就够了,业务量大了之后再引入Redis队列或消息中间件。
特征比对本身的耗时也值得优化。几百人的库,遍历一遍也就几十毫秒,但如果用户量到了几万人,线性遍历就会突破一秒钟,这时候就要考虑用向量索引库。我调研过faiss和Annoy,对于几万到几十万级别的向量库,Annoy集成简单、内存占用可控,效果很好。
5.4 隐私与合规事项
人脸数据属于敏感个人信息,这是完全绕不开的合规问题,必须在项目设计阶段就想清楚,而不是上线前再补救。
首先是用户授权。小程序端在注册人脸前必须弹出单独的授权提示,明确说明收集人脸信息的目的、使用范围、保存期限,让用户主动勾选同意,不能藏在用户协议里。建议把"人脸注册"做成用户主动触发的动作,而不是无感抓拍,这样合规风险会小很多。
其次是数据安全。人脸特征向量在数据库里不能明文存储,至少要加密。传输过程中必须全程HTTPS,图片文件访问要有鉴权。管理后台的查询权限要按角色划分,真正能导出人脸数据的只能是一两个管理员账号,而且每次导出都要留审计日志。
第三是数据生命周期。用户注销小程序账号时,必须同步删除人脸特征数据,不能留在库里做冷备。长期不活跃的用户,也要定期清理人脸数据。这些需求要在代码里做成定时任务,而不是靠人工去数据库里删。
6. 项目上线后的运营思考与扩展方向
6.1 冷启动期的人脸库积累
新系统上线后,最大难题不是技术而是用户量。商场停车场的用户大部分是临时来访的顾客,如果要求每个人都先注册人脸再入场,很多用户会嫌麻烦直接放弃。我建议把冷启动策略拆成三层。
第一层是给注册用户实际好处。首次注册人脸送停车时长或商场优惠券,用利益驱动用户完成注册动作。第二层是降低注册门槛,注册页引导语要足够简单直白,指给人看"扫一扫、拍张照、领优惠"三步流程,把操作路径压缩到极致。第三层是保留传统入场方式作为兜底,车牌识别、取票入场都保留,人脸识别只是可选方式中的最优解,而不是强制手段。
冷启动阶段还要主动积累正样本。每次用户刷脸成功之后,后台应该把这次照片存成样本数据,人工抽检一部分并入特征库,这样即使最初注册的质量不高,随着使用次数增加,识别率会越来越高。
6.2 从停车到会员运营的联动设计
停车系统真正的价值不在停车本身,而在于它把商场获客、留存的链条打通了。用户刷脸的瞬间,系统就识别出这个人是谁、消费习惯如何、上次哪天来的,这些信息比停车费本身值钱得多。
我的建议是在后端把识别结果和会员系统对接。用户入场时,如果系统识别出是高等级会员,可以在小程序推送一条停车引导消息,"尊敬的XX会员,您常去的区域还有空位",这种个性化体验是纯车牌识别系统给不了的。用户出场结算时,停车费可以设计成会员积分抵扣,或者消费满额免停车费,通过小程序消息提醒用户查看免停规则,把原本的刚性支出转化成会员激励。
这套联动不需要额外开发新系统,后端在识别成功之后加几条查询和推送的逻辑就够了,但用户体验的提升是显而易见的。停车从"交钱走人"变成了商场会员服务的一部分,用户粘性自然更强。
6.3 还能扩展哪些玩法
系统的基础框架搭好之后,扩展空间很大。我简单列几个已经验证过可行的方向。
反向寻车功能是最容易加的用户体验优化。车位表和停车记录表里加上坐标字段,出场前用户在小程序里点"找车",小程序直接展示车辆所在位置和从当前电梯口过去的导航路径。做这个功能需要在地下停车场部署蓝牙信标做室内定位,成本不高,但用户感知极强。
车位预约功能可以预约热门时段或充电桩车位。用户在到商场前通过小程序预约车位,系统预留车位,入场后直接引导到预约区域,这对有充电需求的电车车主吸引力非常大。
临时访客管理模式也值得做。有些商场有共享办公区,访客出入频繁,给临时访客发一张"访客码",扫码后自动关联受访人的人脸信息,进闸机时刷脸通行,离场后授权自动失效。这种场景下人脸识别比传统登记方式高效得多,也更受企业客户欢迎。
最后再说几句实操体会
这套系统我从开发到上线跟了完整的一遍,最大的感触是:人脸识别本身不难,难的是把它嵌进一个真实业务流程里,并且让用户感觉不到技术存在。用户不会因为你用了AI就原谅你让他多排两分钟队,也不会因为你系统复杂就容忍一次刷脸失败。
如果现在让我重新做一遍,我会把更多的精力花在注册流程的用户引导和现场摄像头的安装调试上,这两件事对最终体验的影响比算法选型大得多。再有一个小技巧:给注册页加一个"拍摄时稍微侧一下头"的提示,让用户第二张照片和第一张角度略有差异,识别成功率会有肉眼可见的提升。这个细节是我在反复测试中发现的,分享给你们,希望能帮大家在类似项目里少走弯路。