基于深度学习的UWB门禁检测

1 序

       在很多工业生产场所入口都会安装智能门禁管理系统,用于对进入人员进行身份识别。当前通常采用UWB技术,根据双向测距TWR(Two Way Ranging)结果作为距离判断依据。
       由于卡片在人体携带位置有差异,或者人员走向门禁角度不同,卡片信息可能被遮挡,单纯采用TWR测距结果可能会有误差,导致门禁产生不合理动作。为了适应复杂的现场状况,在这里分析如何采用基于深度学习的方法,对不同的场景进行分类,并通过对TWR测距数据、TWR监听数据、到达角度差(PDOA)、信道脉冲响应(CIR)等数据维度进行深度学习,利用 TensorFlow建立相应的推导模型。训练完成以后将其迁移到现场设备端,现场设备运行轻量化以后的模型,根据接收的信息进行综合推导,可以对卡片姿态进行更加精准可靠的检测,从而更好完成闸机联动开合控制。

2 数据维度

2.1 判断结果

       通常情况下,当携带卡片人员足够靠近门禁时,门禁必须自动打开。即便是由于类似于阻塞、信号衰减和多路径等原因,导致测距不准,也应该经过补偿修正,正确将门开启;反之,如果距离较远,也不应该由于误差存在而过早开启。简化来看,作为判断输出的结果,仅有门禁开和关两种。
在这里插入图片描述

2.2 判断来源

       补偿修正所依赖的数据来源,应该考虑测距结果本身、人员行进方向,非视距等综合因素,尽量采集更多的特征信息,以进行综合比对。在这里,我们采用三种数据来源。

  • TWR
           双边双向测距(DS-TWR, Double Side - Two Way Ranging)是比较常用且稳定可靠的测距方式,卡片通常采用这种方式与读卡器进行测距通讯,并视为携卡人员与门禁之间的距离。
           在非视距情况下,TWR方式难以避免的有一定的偏差,有时会接近米级,在门禁这种应用场合是难以接受的。为了更加全面地表达当前的状态,需要采用另外一个天线的对整个测距过程进行监听,并将监听数据也纳入到考察范围中。

  • PDOA
           PDOA,英文全称是Phase-Difference-of-Arrival,信号到达相位差。由于读卡器两个天线位置一定,在不同的位置,卡片发出信息到达两个天线的相位是不同的。和常规的PDOA应用不同,在这里我们并不需要将两个天线靠得很近,因为就算是天线之间的距离是N倍波长也没有关系,因为我们只关心相位偏差,这个偏差能够大体反映人员走向门禁的角度, 并以此作为判断的数据源。

  • CIR
           CIR数据常用于研究非视距(NLOS)信号的识别,并且具有较好的效果,一些时域和频域特征可以通过CIR数据计算得到,所以CIR数据作为数据源是针对非视距情况的有效补充。

3 环境需求

       在此,我们采用TensorFlow进行深度学习建立推导模型,以及实现现场的部署。

3.1 软件

       TensorFlow是一个由Google开发的开源机器学习框架,TensorFlow提供了丰富的API和工具,可以用于各种机器学习和深度学习任务。
       TensorFlow Lite(通常简称TFLite)是一个移动端库,可用于在移动设备、微控制器和其他边缘设备上部署模型。TensorFlow学习完成以后,可以使用 TensorFlow Lite Converter 将 TensorFlow 模型转换为TensorFlow Lite 模型。在转换过程中,应用量化等优化措施,以缩减模型大小和缩短延时,并最大限度降低或完全避免准确率损失 。

3.2 读卡硬件

       为了执行TWR测距和监听操作,读卡装置至少需要两个UWB模块(命名为AM和BM),并且均有天线引出,,两个天线至少拉开1米距离,以形成距离和角度的差异。AM负责与卡片测距,BM负责监听AM与卡片的测距过程。
       另外,由于需要进行PDOA操作,所以两个UWB模块的时钟必须是同一晶振作为时钟源。以常用的DW1000为例,需要注意芯片时钟控制引脚 SYNC(时钟同步)和EXTCLK(外部时钟输入),为了减小温度等因素对晶振输出频率的影响,需采用温补晶振(TCXO)作为时钟源。

3.3 TensorFlow现场设备

       TFLite支持多种平台,涵盖 Android 和 iOS 设备、嵌入式 Linux ,TFLite其实是TensorFlow团队为了将模型部署到移动设备而开发的一套解决方案,可以简单理解为TensorFlow的手机版。对于嵌入式 Linux ,主要是Raspberry Pi 风格系统,这个移植量要小一些,硬件上也是丰富多样。
       对于微控制器,还有一个TensorFlow Lite for Microcontrollers(TFLM)版本,这个可以运行在诸多的MCU上面,比如可以看到Arduino、STM32F746、 ESP32等老朋友的身影,不过其具有实验性质,实用时需要一定的法力和时间。
       具体选用什么样的操作系统,要看自已的熟悉程度。

3.4 TensorFlow训练设备

       这个就是一台具备GPU的PC机,windows或Linux均可,配置稍微像样一点就可以,因为在这里没有图像数据,推导的工作量不大。

4 数据集建立

4.1 TWR数据

  • 对于直接测距的方式:
    在这里插入图片描述

d = R a ∗ R b − D a ∗ D b R a + R b + D a + D b d=\frac{Ra*Rb-Da*Db}{Ra+Rb+Da+Db} d=Ra+Rb+Da+DbRaRbDaDb

  • 对于监听模式:

在这里插入图片描述

d = R a ∗ D c − D a ∗ R c R a + D a + R c + D c d=\frac{Ra*Dc-Da*Rc}{Ra+Da+Rc+Dc} d=Ra+Da+Rc+DcRaDcDaRc

4.2 PDOA数据

       由于两个UWB模块采用同一晶振,为相同的PLL计时,所以生成载波将具有相同的相位。在不同的角度情况下,卡片发出信息到达两个天线时间会有细微不同,因此两者在下变频器中将具有一定的载波相位差。可以读取这个相位差,作为一个判断的数据源。
       每条记录,需要记录两个模块的acc和sfd角度信息,共四个float数据。参考读取代码如下:

static float  acc_angle[2]; //需要输出的数据
static float  sfd_angle[2]; //需要输出的数据
#define M_PI 3.1415926535

typedef __packed struct
{
    int16_t real;           
    int16_t imag;             
}Tcir_complex_t;

typedef __packed union {
    Tcir_complex_t Sept;
    uint8_t array[sizeof(Tcir_complex_t)];
}Tcir_complex_u;

typedef __packed struct {
    uint8_t dummy; //读取时,前面有一个dummy字节
    Tcir_complex_u RecvData;
}TCirRecv;

//以Dw为索引,一次读取2个模块的信息
static void FRead(void)
{
    u8  Dw;
    TCirRecv CirRecv;
    float  fpfloat,fpfloat1;
    u16    fp_idx_reg,fp_idx;
    int16_t    imag_val[2];
    int16_t    real_val[2];
    u16        sfd_val[2];
    for(Dw=0;Dw<=1;Dw++)
    {
         //读取寄存器0x15,偏移量5,两个字节(FP_INDEX的10个最高有效位代表数字的整数部分,6个最低有效位代表小数部分)
         fp_idx_reg =  dwt_read16bitoffsetreg(Dw,RX_TIME_ID, RX_TIME_FP_INDEX_OFFSET);
	 fp_idx=fp_idx_reg>>6; //高10位表示数字的整数部分
         //本代码中,没有处理小数部分,参考如下
         //---fpfloat=(fp_idx_reg&0x3F);  //低6位代表小数部分
         //---fpfloat/=100.0;

         //现在已经获得累加器索引,即累加器中计算相位差的位置,
         //(e.g. 2984) (=746 x 4 because they are 16-bit complex numbers)
         //读取此索引处的累加器值 (reading 5 bytes to get 2 byte real and 2 byte imaginary value)
	 dwt_readaccdata(Dw,(u8 *)&CirRecv,5,4*fp_idx);//获取要获得的复数

        //将累加器值视为复数-获取CIR对应的角度值
        acc_angle[Dw] = atan2((double)CirRecv1.RecvData.Sept.imag,(double)(CirRecv2.RecvData.Sept.real));

        //读取SFD角度 
        sfd_val[Dw] = dwt_read8bitoffsetreg(Dw,RX_TTCKO_ID, 4);
        sfd_val[Dw]&=0x7F;
        sfd_angle[Dw]=((float)sfd_val[Dw]*M_PI)/64.0; //SFD角度 (in radians)通过乘以π/64获得
	}
}

4.3 CIR数据

       以DW1000为例,其配置有一个存储累积信道冲激响应数据的寄存器,其中保存了包含一次 UWB 信号接收的所有 CIR 数据,当处于16MHz工作模式下时记录了991个样本点,处于64MHz工作模式下记录了1015个样本点。 每个样本点表示1ns的采样间隔。 CIR寄存器在接收到前导码时开始累积,接收的前导码时间几乎相同, 在UWB 信号实际接收之前以及接收完毕后,CIR寄存器中记录的是空中噪声或者系统噪声,因此这两段没有分析意义。
       一般来说,CIR 数据的特征主要集中在第一路径索引开始点后 30 个样本点处,其余样本点大多是采集到的空中噪声响应数据,所以最小化时CIR数据集合为30个样本即可。
       如果硬件资源较丰富,可以考虑将范围放宽至152个,因为在152个CIR信号中,基本包含了关于环境中传播特性的大部分可用信息,因此可以选择第一个路径索引开始的152个CIR数据,以获得更高的准确度。

4.4 训练数据采集

       为了便于深度学习,我们需要针对实际运行时不同的状态进行数据采集,并标注数据集合。简化起见,输出状态我们只定义开和关两种即可。
       学习期间,卡片与门禁测距间隔设置为默认值100ms(也可以更小)。读卡器每100ms收集一次测距结果,每个结果记录包括TWR测距数据、TWR监听数据、PDOA角度差、CIR数据。我们为每个姿态收集2000个结果,根据距离远近,以及卡片在人体中不同的可能位置,分别作为一个姿态进行数据采集。为了避免数据短缺相关的过度拟合问题,所有的姿态总共大体需要50000个样本用于训练和测试。

5 训练

       下图示出了基于综合数据集的正确门禁开关分类,其所采用的深度学习模型架构。
在这里插入图片描述
       输入层包括来自TWR测距数据、监听数据、PDOA角度以及CIR数据。其次是4个CNN层,从空间、时间数据中提取有意义的实用特征方面效率很高。Flatten层将CNN的输出从2D格式展平为1D矢量;接下来是Dense层,其中前一层和当前隐藏层的所有神经元使用权重成对连接;Dense的输出被传递到Sigmoid激活层,该激活层应用Sigmoid函数来产生0和1之间的数,在这种情况下,该数指示当前数据记录对应于开关条件的概率;最后,Sigmoid的输出由低通滤波器(LPF)平滑以去除异常值,并且信号被分类为0 或1,这个对应于当前数据条件下门禁的开关状态。
       建议采用70%的数据进行训练,10%用于验证,剩下的20%用于测试。

6 迁移

       TensorFlow Lite 是 TensorFlow 在移动和 IoT 等边缘设备端的解决方案,提供了 Java、Python 和 C++ API 库,可以运行在 Android、iOS 和 Raspberry Pi 等设备上。目前 TFLite 只提供了推理功能,在服务器端进行训练后,通过TensorFlow Model Optimization Toolkit 可以对训练模型的量化、剪枝和聚类等优化操作,并布置在现场设备端。

7 结语

       AI在工业现场落地应用,一直存在一个场景寻找的问题。如果结合当前的工业现场,找准技术基点,辅以AI手段进行改进,那么这些贴合实际的AI应用,将给工业生产带来很大的革新和进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值