简介:这份PDF文献面向雷达信号处理、人体动作识别及深度学习方向的研究生与科研人员,聚焦微多普勒特征在复杂姿态下微弱模糊、难以稳定提取的痛点,提出以超宽带雷达高分辨率距离像构建时间-距离像,并借助深度卷积神经网络自动学习分层特征完成分类。资源包共1个PDF文件,大小约3.49MB,内容为正式期刊论文,含摘要、引言、实验设计与文献引用等完整章节,便于系统研读方法细节与理论依据。文中设计了挥手、打乒乓球、拍篮球、立定跳远、投保龄球、踢足球、垫排球、投篮和拳击共9种动作,从3个不同人体目标采集5000多组雷达回波数据,平均分类精度达96.67%,验证了该方案的可行性与有效性。目前已有101人学习,适合希望借鉴时间-距离像建模思路、复现DCNN分类流程或拓展雷达目标识别研究的读者参考。
1. 从微多普勒到时间距离像:这篇论文为什么值得你花时间拆
做雷达人体动作识别的人,大概率都经历过微多普勒特征“时灵时不灵”的折磨。躯干回波一强,肢体那点微弱的多普勒分量就被淹没,特征提取像在开盲盒。这篇《基于时间距离像的人体动作深度学习分类》给了一条不一样的路:不跟微多普勒死磕,改用超宽带雷达的高分辨距离像,把连续多帧距离像按时间顺序拼成一张二维灰度图,再交给深度卷积神经网络自动学特征。9 种体育动作,平均分类精度 96.67%,对比随机森林的 37.45%、kNN 的 52.05%、SVM 的 61.05%,差距不是一点半点。它适合谁?做雷达目标识别、非接触式行为感知、安防监控方向的研究生和工程师,尤其是手头有 UWB 雷达数据但分类精度卡在瓶颈的人。这篇论文的价值不在算法多新,而在于它把“时间距离像”这个数据表征讲透了,从雷达波形、实验布局到网络结构、参数设置,全链路可复现。
2. 时间距离像的构建:从 UWB 回波到 100×100 数据矩阵
2.1 为什么选冲激脉冲 UWB 雷达而不是调频连续波
论文用的是 Novelda 公司的 NVA6100 单片冲激脉冲雷达收发器,发射波形是一阶高斯脉冲,脉冲宽度约 300 ps,-10 dB 发射频谱覆盖 0.85~9.55 GHz,极限距离分辨率达到 2 cm。这个参数意味着什么?人体动作时肢体和躯干的空间位置变化通常在数厘米到数米,2 cm 的分辨率足够把不同部位的反射脉冲在距离轴上分开。雷达测距的极限分辨率公式是 ΔR = c / 2B,c 是光速,B 是发射信号带宽。要分辨厘米级的动作位置变化,带宽必须做到几 GHz 甚至十几 GHz,这就是为什么必须用 UWB 而不是普通窄带雷达。
常见做法里,线性调频连续波和步进频率连续波也能做宽带,但冲激脉冲的优势在于时域波形直接对应距离信息,不需要额外的去斜处理,对近距离人体探测更友好。代价是发射功率受限,作用距离一般较近,论文里人体距雷达 1.5~2.0 m,这个距离下信噪比是够的。
实验布局有几个细节值得注意。雷达放在高度约 0.8 m 的测试台上,人体面向雷达。为了压制对面墙壁的直接反射和地面天花板的二次反射,在人体后方和左右两侧 2~4 m 处设置了高度约 2.5 m 的吸波材料墙。这个布置直接决定了你采集到的距离像干不干净。我见过不少人复现时忽略吸波材料,结果时间距离像上全是水平亮线,网络学到的全是环境干扰。
2.2 从单帧距离像到时间距离像的拼接逻辑
NVA6100 对回波采取并行采样方式,以 39 GS/s 的采样率对当前回波连续采样 512 点,构成一幅目标的高分辨距离像。然后间隔 10 ms 采集下一幅距离像。这个 10 ms 就是时间距离像横轴的最小时间间隔。
单帧距离像相当于对目标进行一次快速“照相”,在 10 ns~1 ms 内完成,远小于完成一次人体动作所需时间,所以一帧距离像可以看成动作的一个时间切片。但一张照片判断不了动作,就像一张静态图不如一段视频可靠。时间距离像就是把多帧距离像按时间顺序并行排列,纵轴是目标到雷达的距离,横轴是动作测量的持续时间,灰度等级代表回波的归一化幅度。
论文把每组数据统一处理为 100×100 的数据矩阵。这里有个关键操作:每个动作的数据采集时间约 2~3 s,按 10 ms 间隔算,原始帧数在 200~300 帧。要压到 100 帧,需要做时间轴上的重采样或截断。常见做法是等间隔抽取 100 帧,或者对动作起止点做检测后归一化到 100 帧。论文没有展开这一步的细节,但这是复现时最容易翻车的地方——如果动作起止点没对齐,同一动作的不同样本在时间轴上会错位,网络学到的特征就不稳定。
下面是一段构建时间距离像的 Python 伪代码,假设你已经拿到了每帧的 512 点距离像数据:
import numpy as np def build_time_range_profile(frames, target_shape=(100, 100)): """ frames: list of 1D arrays, each array is one range profile (512 points) target_shape: (time_bins, range_bins) """ # 堆叠成二维矩阵:行是时间帧,列是距离单元 trp = np.stack(frames, axis=0) # shape: (num_frames, 512) # 时间轴重采样到 100 帧 num_frames = trp.shape[0] time_indices = np.linspace(0, num_frames - 1, target_shape[0]).astype(int) trp = trp[time_indices, :] # 距离轴降采样到 100 个距离单元 range_indices = np.linspace(0, trp.shape[1] - 1, target_shape[1]).astype(int) trp = trp[:, range_indices] # 归一化到 [0, 1],灰度图存储 trp = (trp - trp.min()) / (trp.max() - trp.min() + 1e-8) return trp # shape: (100, 100)这段代码的逻辑说明:第一步把多帧距离像堆成二维矩阵,行方向是时间,列方向是距离。第二步在时间轴上等间隔抽取 100 个点,把不等长的动作数据统一到相同的时间维度。第三步在距离轴上降采样,512 个距离单元压到 100 个,减少数据量的同时保留主要散射结构。第四步做 min-max 归一化,把回波幅度映射到 [0,1],方便后续作为图像输入网络。
参数怎么改:target_shape 的时间维度决定了网络输入的时间分辨率。如果你动作持续时间差异很大,建议先做动作起止点检测,再统一重采样,而不是直接等间隔抽取。距离维度如果雷达采样点不是 512,按实际点数调整 range_indices 的生成范围。归一化方式也可以用 z-score,但论文用的是归一化幅度,min-max 更贴近原文。
2.3 时间距离像里到底能看到什么
论文图 4 给出了 9 种动作的时间距离像。躯干是人体最强的散射源,所以每张图里最强的回波幅度主要来自躯干。立定跳远有较明显的躯干运动,躯干回波呈现密集的倾斜亮线;原地完成的动作,躯干回波大多是接近水平且有一定起伏的密集粗亮线。上下肢虽然散射弱,但运动变化的幅度范围和频度显著强于躯干,在图上表现为变化范围较大、起伏较快的细曲线。
不同动作的细亮曲线形态不同,这就是分类的依据。投保龄球、踢足球、垫排球这三个动作分类精度低于平均,原因是它们的上下肢特征曲线与其他动作存在局部相似性。从混淆矩阵看,投保龄球有 2 个样本被误判为踢足球,踢足球有 1 个被误判为投保龄球、2 个被误判为垫排球,垫排球有 1 个被误判为打乒乓球、1 个被误判为踢足球。这种局部相似性是时间距离像方法的边界——它捕捉的是空间位置变化,如果两个动作在距离轴上的变化模式接近,网络就容易混淆。
3. DCNN 网络结构与训练参数:4 层卷积怎么搭、SGD 怎么调
3.1 网络结构逐层拆解
论文的 DCNN 有 4 个卷积层和最大池化层,卷积核大小 5×5,池化尺度 2×2。输入是 100×100 的时间距离像。卷积层的操作是卷积核与输入数据的卷积,得到一系列特征映射。卷积核的大小称为感受野,相当于一个滤波器,是对输入数据做特征提取的窗口。相比全连接网络,卷积的局部连接和权值共享显著减少了参数数量。
每个卷积层之后接 ReLU 激活函数,形式是 f(i,j) = max(0, S(i,j))。ReLU 的分段线性特征可以构建较好的经验结果,同时减少训练时间,避免反向传播中的梯度消失问题。池化操作在每个卷积层之后进行,论文用的是最大池化,将邻域内的像素值用最大值代替,进一步减少数据量,同时保持特征的平移不变性。
一系列卷积池化之后加了一个 Dropout 层,作用是对随机抽取的特征进行组合,避免过拟合。Dropout 之后将特征向量化,送入 softmax 函数做多分类。softmax 的输出是判为各个类别的后验概率,取概率最高的类别作为最终判别结果。
这里有个容易忽略的点:论文没有给出每层卷积核的具体数量。从“带结构参数的 DCNN 示意图”看,4 个卷积层的特征图数量应该是逐层递增的。常见做法是 32-64-128-256 或者 16-32-64-128 这样的配置。如果你复现时精度上不去,先检查每层特征图数量是不是太少,导致高层特征表达能力不足。
3.2 训练参数与收敛行为
网络用 Keras 搭建,后端是 TensorFlow。整个 DCNN 采用随机梯度下降 SGD 训练,mini-batch 设为 50,学习率 0.001。梯度更新过程中加入了动量因子,动量权重 0.9,衰减因子权重 0.004。所有初始化参数设置为满足均值 0、方差 0.01 的高斯分布。
这些参数不是随便定的。mini-batch 50 在 5000 多组数据下,每个 epoch 大概迭代 100 次左右,梯度更新的噪声适中,收敛曲线比较平滑。学习率 0.001 是 Adam 和 SGD 在图像分类任务上的经典起点,配合动量 0.9 可以加速收敛并抑制震荡。衰减因子 0.004 的作用是每次更新时对权重做轻微衰减,防止权重过大导致过拟合。
论文做了 400 次循环更新迭代测试。经过 50 次迭代后,网络就达到 90% 以上的分类精度,随着进一步迭代,分类精度快速趋于收敛,最终达到 96.67%。这个收敛速度在 4 层卷积网络里算快的,说明时间距离像的特征区分度确实好,网络不需要太深的层次就能学到有效特征。
下面是一段 Keras 搭建对应网络的代码示例:
from tensorflow.keras import layers, models, optimizers def build_dcnn(input_shape=(100, 100, 1), num_classes=9): model = models.Sequential() # 第1层卷积 + 池化 model.add(layers.Conv2D(32, (5, 5), activation='relu', padding='same', input_shape=input_shape)) model.add(layers.MaxPooling2D((2, 2))) # 第2层卷积 + 池化 model.add(layers.Conv2D(64, (5, 5), activation='relu', padding='same')) model.add(layers.MaxPooling2D((2, 2))) # 第3层卷积 + 池化 model.add(layers.Conv2D(128, (5, 5), activation='relu', padding='same')) model.add(layers.MaxPooling2D((2, 2))) # 第4层卷积 + 池化 model.add(layers.Conv2D(256, (5, 5), activation='relu', padding='same')) model.add(layers.MaxPooling2D((2, 2))) # Dropout + 全连接 + softmax model.add(layers.Dropout(0.5)) model.add(layers.Flatten()) model.add(layers.Dense(num_classes, activation='softmax')) return model model = build_dcnn() sgd = optimizers.SGD(learning_rate=0.001, momentum=0.9, decay=0.004) model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy']) model.summary()逻辑说明:4 个卷积层,每层卷积核 5×5,padding 设为 same 保证输出尺寸在卷积后不变,池化层 2×2 把特征图尺寸逐层减半。100×100 输入经过 4 次池化变成 6×6,再展平送入全连接。Dropout 放在展平之前,随机丢弃 50% 的特征,抑制过拟合。优化器用 SGD,学习率 0.001,动量 0.9,衰减 0.004,和论文参数对齐。
参数怎么改:如果你的数据集比论文小,把每层卷积核数量减半,Dropout 提高到 0.6。如果训练损失震荡厉害,学习率降到 0.0005 或者把动量降到 0.8。如果验证集精度远低于训练集,先加数据增强,比如时间轴上的随机裁剪和距离轴上的随机平移,再考虑加 Dropout 比例。
3.3 数据划分与混淆矩阵的读法
论文对 3 个不同人采集了 9 种动作,每人每个动作重复约 200 组,总体数据 5000 多组。每个动作随机抽取 30 组作为测试集,剩余作为训练集。这个划分方式是按动作分层抽样的,保证每个动作在测试集中都有 30 个样本。
混淆矩阵的每一行代表实际动作,每一列代表网络识别的动作。从表 1 看,挥手、打乒乓球、拍篮球、立定跳远、投篮、拳击这 6 个动作的分类精度都是 1.0000,投保龄球 0.9000,踢足球 0.9333,垫排球 0.9000。错误集中在投保龄球、踢足球、垫排球这三个动作之间。如果你复现时发现某两个动作互相误判严重,先去时间距离像上对比这两个动作的上下肢曲线形态,大概率能找到局部相似的地方。解决办法可以是增加这两个动作的样本量,或者在网络里加一个注意力模块,让网络更关注区分性强的区域。
4. 复现避坑:从数据采集到网络训练的 5 个血泪教训
4.1 坑一:吸波材料没铺够,时间距离像全是水平亮线
现象:训练出来的时间距离像上,除了人体回波之外,还有多条水平细亮线,这些线在不同样本里位置固定,网络很容易学到这些环境干扰作为“特征”,导致测试集精度虚高,换一个房间采集数据精度直接崩掉。
原因:对面墙壁的直接反射、地面和天花板的二次反射被雷达接收,这些静态杂波在时间轴上不变化,形成水平亮线。论文在人体后方和左右两侧 2~4 m 处设置了高度约 2.5 m 的吸波材料墙,目的就是压制这些反射。
解决:采集数据前先做背景对消。具体做法是采集一组空场景的回波,从每个动作样本中减去这组背景。如果条件允许,尽量铺吸波材料,尤其是雷达正对的方向和地面反射路径上。背景对消的代码很简单:
# background: 1D array, 空场景的平均距离像 # frames: list of 1D arrays, 动作回波 frames_clean = [frame - background for frame in frames]4.2 坑二:动作起止点没对齐,同一动作的样本在时间轴上错位
现象:训练集精度很高,验证集精度波动大,同一动作的不同样本在时间距离像上亮线的起始位置不一致,网络学到的特征不稳定。
原因:每个动作的数据采集时间约 2~3 s,但动作的实际起止点在不同样本间有差异。如果直接按固定时间窗口截取,有的样本包含动作前的静止段,有的包含动作后的恢复段,时间轴上的特征就错位了。
解决:先做动作起止点检测,再统一重采样到 100 帧。常见做法是计算每帧距离像的能量,设定阈值,找到能量超过阈值的第一个和最后一个帧作为动作起止点。然后在这个区间内等间隔抽取 100 帧。如果动作本身持续时间差异很大,可以在重采样前先做时间归一化,把所有动作拉伸到相同长度。
4.3 坑三:距离轴没对齐,人体位置偏移导致特征平移
现象:同一动作在不同次采集时,人体距雷达的绝对距离有轻微变化,时间距离像上的亮线在距离轴上整体平移,网络把位置偏移当成了动作差异。
原因:论文里人体面向雷达并相距 1.5~2.0 m,但实际实验中人的站位不可能每次完全一致。距离轴上的平移会让卷积网络学到的特征发生偏移,影响分类。
解决:在构建时间距离像之前,先做距离对齐。常见做法是找到每帧距离像中能量最大的距离单元,以这个单元为参考点,把所有帧的距离轴对齐到同一参考位置。或者更简单粗暴:在训练时做距离轴上的随机平移数据增强,让网络学会忽略绝对位置差异。
4.4 坑四:学习率设太大,损失震荡不收敛
现象:训练损失在前几十个 epoch 上下震荡,精度卡在 60%~70% 上不去,和论文里 50 次迭代就到 90% 的收敛速度差很远。
原因:学习率 0.001 配合 SGD 和动量 0.9 在论文的数据集上工作良好,但如果你的数据集样本量更小或者时间距离像的噪声更大,这个学习率可能偏大,导致梯度更新步长过大,损失在最小值附近震荡。
解决:先把学习率降到 0.0005 或 0.0001,观察损失曲线是否变得平滑。如果还是震荡,检查输入数据的归一化是不是做好了。时间距离像的幅度如果不做归一化,不同样本的回波强度差异会很大,网络很难收敛。另外,mini-batch 设为 50 在 5000 组数据下是合理的,但如果你的数据只有几百组,mini-batch 要相应减小到 16 或 32。
4.5 坑五:把时间距离像当普通图像做水平翻转增强
现象:做了水平翻转数据增强后,验证集精度反而下降。
原因:时间距离像的横轴是时间,纵轴是距离。水平翻转相当于把动作的时间顺序倒过来,踢足球变成“倒着踢”,这改变了动作的物理含义。垂直翻转相当于把距离轴倒过来,人体回波跑到雷达后面去了,更不合理。
解决:时间距离像的数据增强要做在物理意义合理的方向上。时间轴上的随机裁剪(截取动作的某个片段)和随机缩放(模拟动作快慢变化)是合理的。距离轴上的随机平移(模拟人体站位前后变化)也是合理的。但翻转、大角度旋转这些图像分类里常用的增强手段,在时间距离像上要慎用。
5. 从 96.67% 再往上走:多普勒信息融合与跨视角泛化的实操思路
论文在结束语里自己留了两个口子:没有利用回波中的多普勒信息,没有考虑不同观测视角下同一动作的差异。这两点恰恰是后续提升精度的关键抓手。
先说多普勒信息融合。时间距离像捕捉的是空间位置变化,微多普勒捕捉的是肢体运动的速度分量。两者是互补的。如果你手头的雷达支持同时输出距离像和多普勒谱,可以构建双通道输入:通道一是时间距离像,通道二是时间-多普勒像,然后在 DCNN 的早期层做特征融合。常见做法是在第一个卷积层之后把两个通道的特征图按通道维度拼接,再送入后续卷积层。这样网络既能学到“肢体在哪里”,也能学到“肢体动得多快”。
再说跨视角泛化。论文只采集了面向雷达的人体动作数据,实际应用中人体可能侧向、背向雷达。不同视角下同一动作的时间距离像差异很大,直接拿面向视角训练的模型去测侧向数据,精度会掉得很厉害。一个低成本的做法是数据增强时在距离轴上做随机缩放和随机平移,模拟不同距离和站位。更彻底的做法是采集多视角数据,每个动作在 0°、45°、90°、135°、180° 五个角度各采一组,训练时随机抽取视角,测试时用留一视角交叉验证。这样训练出来的模型对视角变化更鲁棒。
还有一个容易被忽略的点:论文的 9 种动作里,投保龄球、踢足球、垫排球这三个的混淆率最高。如果你只关心这几个动作的区分,可以在网络里加一个注意力模块,让网络更关注上下肢曲线差异大的时间段。具体做法是在第四个卷积层之后加一个 SE 模块,对每个通道的特征做全局平均池化,然后通过两个全连接层学习通道权重,再乘回原特征。这个模块参数量很小,但能让网络自适应地放大区分性强的通道特征。
验证方法上,我一般会做三组对比:第一组用论文的原始参数复现,确认能到 96% 左右;第二组去掉 Dropout,看精度掉多少,判断过拟合程度;第三组把时间距离像换成单帧距离像,看精度掉多少,判断时间维度到底贡献了多少信息。这三组跑完,你对这个方法的边界就心里有数了。
从那以后我每次拿到新的雷达动作数据,都强制走一遍“背景对消 → 动作起止点检测 → 时间归一化 → 距离对齐 → 归一化”这五步预处理,少一步都不敢往网络里送。希望帮到你。
本文还有配套的精品资源,点击获取