DejaOS常见问题
1、有关人脸问题
(1)人脸重复注册
① -11是注册相似度过高,因为照片已经注册过了,您可以清空 /app/data/db/app.db(存储人员凭证权限等业务数据不包含人脸特征值)和/vgmj.db(存储人脸特征值)文件后再重试
② 如果您是全量同步后仍然提示已经注册,您可以修改dbPath的路径,把他修改到/app/data下,/app/data被我们定义为用户运行数据,重置设备和全量同步代码,都会删除此目录所有数据
③ 如果您想允许重复注册的话也是可以的,我们有一个注册相似度的校验,我们可以把这个做成一个开关,允许您传入参数控制注册时相似度的校验,如果同一个人注册两个特征值,在识别过程中会优先匹配到最近的一个人员并返回userId,不会返回注册的所有userId,这个逻辑需要您知晓,比较建议开启注册相似度校验,因为流程逻辑更清晰,更好把控,原则上一张人脸是不允许识别出张三李四两个人的
④ 注册相似度校验,是注册的时候把注册照片的特征值和人脸特征库比对一遍,如果相似度达到指定阈值,就返回注册失败(这个功能现在是默认开启,所以您重复注册的时候会返回-11),后面我们计划加一个开关配置,可以开启或关闭注册时的重复校验
⑤ 一次识别完成后,下一次识别就得重新进入人脸然后识别,在初始化人脸时修改重检默认时间,把recheckIntervalTime(默认5秒)改短一些,辑上不建议低于1~2秒
(2)人脸注册方式
① 人脸照片下发从服务器下发到设备里,设备会自动转成特征值存到人脸库,每个人脸有一个id
② 人站在设备面前,设备会自动识别人脸并和人脸库比对,并返回这个id。同时会抓拍一个照片,作为通行的记录
③ 通行记录上传到服务器
④ 先调用一个额外的服务把照片转成特征值,然后把特征值直接下发到设备
人脸相关的基本流程,通常我们有以下几种方式:
方式一:远程把照片下发到设备里
1. 通过手机或其它方式拍照人脸照片上传到服务端,服务端把人脸照片转换成base64,然后通过MQTT下发到设备端
2. 设备在设备里面把人脸照片转换人脸特征值(1024字节),对应的key是人脸的id,然后存储在设备中,这个步骤用户无需考虑细节,组件会自动完成。
3. 设备扫描到人脸后,会和人脸库里的特征值作比较,比较的细节用户无需考虑,组件会返回比对结果,主要是人脸的id。
注: 这种方式设备端需要存储人脸照片,如果需要删除人脸,需要用户手动删除设备端的照片。
方式二:设备拍照人脸并注册
1. 设备拍照人脸,设备把人脸照片转换人脸特征值(1024字节),需要手动录入人脸的id,然后存储在设备中。
2. 设备扫描到人脸后,会和人脸库里的特征值作比较,比较的细节用户无需考虑,组件会返回比对结果,主要是人脸的id。
注: 这种方式设备端需要存储人脸照片,如果需要删除人脸,需要用户手动删除设备端的照片。
方式三:远程把特征值下发到设备里
1. 通过手机或其它方式拍照人脸上传到服务端,服务端调用一个我们提供的API接口,把人脸照片裁剪并转换成人脸特征值,然后通过MQTT下发特征值到设备端
2. 剩下的过程和方式一一致
注:这种方式是最安全的,因为没有照片存储在设备端。同时转换特征值的API接口可以使用我们提供的,也可以你自己独立部署(需要CentOS系统的服务器)。
(3)补光灯问题
① 可以定时获取环境光亮度,根据亮度值判定是否点亮白色补光灯,face.getEnvBrightness 获取环境光亮度
② 可以捕捉人脸检测绘框的状态,当发生会框的时候点亮白色补光灯
③ 红外补光灯需要一直开启,并且不建议修改红外补光灯的亮度,因为可能会导致过曝无法识别
④ 像屏幕和音频补光灯这些可以调整功率范围的器件,不能拉到100%的功率,最好只使用到80%~90%及以下,功率拉的太大会烧坏硬件(后续会在系统层限制,当前需要在应用侧人为控制)
2、组件使用问题
(1)request 请求请使用dxHttp组件,如果要接收其它设备的http请求,需要启动web服务,请使用dxWebserver组件
(2)vf105、vf114等通过uart串口来获取扫码数据,获取不到值,可能是 通道对应的path、uart.ioctl()方法的第一个参数、第二个参数波特率不对
(3)点开页面然后给密码框赋值,但是赋值的话会突然闪一下,然后再变成点,执行(input.obj.lvTextareaSetPasswordShowTime(0))
(4)ota升级失败,可能3秒的超时时长不够,所以下载一半做md5总是失败。可以给个60秒的超时时长,推荐更新到最新版本
(5)两个http的方法有什么不同吗?本质没有区别,老版本有内存的bug,httpclient作为http的替代,未来http组件逐渐废弃
(6)主线程、子线程、线程池、消息总线
① 主线程通常负责UI或主要控制逻辑
② 子线程是主线程中创建的其他线程,用于执行耗时任务,避免阻塞主线程(如下载、计算)
③ 线程池是一组可复用的线程对象,任务来了不新建线程,从池里复用,提高效率,控制线程数量
④ 消息总线类似发布订阅机制,线程间传递数据或事件的桥梁
注意点:
① 区分主线程和子线程专用模块,不要在子线程里引用主线程专用的文件,不能直接访问主线程变量方法
② 主线程里不能做耗时操作,否则会卡死
3、业务问题
(1)人脸设备检索不到5G频段的wifi,要把热点设置成2.4G频段,可能设备里面的wifi模块不支持5G频段
(2)设备起不来有可能配置文件损坏了
(3)源码内的配置文件会在第一次上电进行读取并且复制一份到设备的app/data/config目录下,后续修改配置都是修改的这个复制文件
(4)手动删除 /app/data/config/config.json,然后运行app,app会自动把src/config.json复制到/app/data/config/config.json,这样src/config.json里所有变化都可以起作用了
(5)通过串口工具修改设备模式:
echo 'dev' > /etc/.mode_v1
echo 'app' > /etc/.app_v1
(6)配置工具改不了运行模式可能烧的是带日志的固件
(7)base64图片前缀,data:image/png;base64,
4、其他问题
(1)通常MQTT是自建还是用其他网上的服务?
Mosquitto 或 EMQX 都是常用的自己部署的 MQTT Broker服务。或者用第三方提供的云MQTT服务,比如国内会用阿里的
(2)mqtt和webserver
mqtt的优势方便实施云管理(弊端传输文件不方便),webserver更适合内网管理(弊端不能直接使用云端外网访问内网ip)
(3)烧录的流程
① 拆开设备
② 远程控电脑安装驱动和相关工具
③ 按下主板按钮
④ 烧录
⑤ 装好设备
⑥ 标定摄像头
(4)配置工具下载地址
https://github.com/DejaOS/DejaOS/blob/main/tools/tools.zip
(5)人脸mqtt文档
http://wiki.koodle.cn:10086/doc/233/
(6)wav音频文件获取
https://www.text-to-speech.cn/
https://www.text-to-speech.cn/