一、数据集介绍
IEEE数据集官方下载链接:https://ieee-dataport.org/documents/60-ghz-fmcw-radar-gesture-dataset
随着人机交互领域的不断发展,人们越来越需要新的手势识别方法,这些方法可用于从游戏和娱乐到医疗保健和机器人等各种应用。虽然传统的手势识别方法依赖于摄像头或其他光学传感器,但这些系统可能会受到照明条件和遮挡等因素的限制。
为了应对这些挑战,研究人员开发了一种基于雷达传感技术的新手势数据集。该数据集包含 21000 个精心挑选的手势,使用 英飞凌BGT60TR13C XENSIV™ 60GHz 调频连续雷达传感器记录。
我们相信,该数据集将成为手势识别领域研究人员和开发人员的宝贵资源。通过提供大量多样化的基于雷达的手势数据,我们希望能够开发出新的创新应用程序,以增强广泛领域的人机交互。
二、数据集说明
该雷达系统配置的工作频率范围为 58.5 GHz 至 62.5 GHz(4GHz),距离分辨率为 37.5mm,最大分辨距离为 1.2 米。对于信号发射,雷达采用突发配置,每突发 32 个chirps,帧率为 33 Hz,脉冲重复时间为 300 µs。
这些手势由 8 个人在 6 个不同位置执行,视野为 ±45°,距离雷达 ≤ 1 米。数据集包括五种不同的手势类型,包括向左滑动、向右滑动、向上滑动、向下滑动和推,每个手势记录的平均持续时间为 0.5 秒或 10 帧。数据集的总大小为 48.1 GB
室内地点包括健身房、图书馆、厨房、卧室、共享办公室和封闭的会议室。
每个手势样本的数据集序列保存为一个4维的numpy数组,100x3x32x64,其中第一维表示每个手势的帧长,第二维表示虚拟天线的数量,第三维表示一帧中的chirps数量,第四维表示样本数量。每个numpy文件的格式为GestureName_EnvironmentLabel_UserLabel_SampleLabel.npy,分别表示手势名称、环境标签、用户标签和样本编号。
环境标志定义如下:
· e1:封闭式会议室
· e2:开放式办公室
· e3:图书馆
· e4:厨房
· e5:健身房
· e6:卧室
用户标签定义如下(原文为p,实际数据集为u):
· u1:男性
· u2:女性
· u3:女性
· u4:男性
· u5:男性
· u6:男性
· u7:男性
· u8:男性
文件名示例:SwipeUp_e4_u1_s394.npy
三、解析代码
代码功能:
(1)MATLAB读取.npy数据文件。可以直接采用python读取,不过用MATLAB也能读,就是需要下载一个库文件。库文件下载链接:https://github.com/kwikteam/npy-matlab
(2)设置雷达参数,读取数据后进行测距、静态杂波滤除、测速、测水平角度、测俯仰角度等等,结果如下图所示。
(3)保存图形为gif格式,如下图所示(SwipeRight_e1_u2_s113.npy数据)。
顶层代码如下:
mainv1.m和mainv2.m,分别采用不同的静态杂波滤除方法。
clc;
close all;
clear ;
作者:调皮连续波,微信公众号
时间:20241101
功能:实现FMCW MIMO雷达雷达手势数据读取和处理,输出距离、速度和角度信息,并用于手势识别
数据集:https://ieee-dataport.org/documents/60-ghz-fmcw-radar-gesture-dataset
添加MATLAB读取npy数据的函数路径
;
addpath('..\fulldata_zipped\fulldata');
读取npy数据
filename ='SwipeUp_e4_u1_s394.npy';
your_data = readNPY(filename);
第一维表示每个手势的帧长,第二维表示虚拟天线的数量,第三维表示一帧中的chirps数量,第四维表示样本数量
frame =size(your_data,1);
VirtualArray = size(your_data,2);
chirps =size(your_data,3);
AdcSamples = size(your_data,4);
波形参数
B = ( 62.5- 58.5) *1e9;
c =3*10^8;
f = 60*10^9;
lambda = c/f;
res =c/(2*B);
FrameRate =33;
Tf = 1/FrameRate;
Tc = 300*10^-6;
vres = lambda/(2*chirps*Tc);
fftpoint =AdcSamples/2;
坐标轴
Rax = (0:fftpoint-1)*res;
Vex = (-chirps/2:chirps/2-1)*vres;
Rangefft = complex(zeros(VirtualArray,chirps,AdcSamples/2));
Doppler = complex(zeros(VirtualArray,chirps,AdcSamples/2));
RangefftMTI = complex(zeros(VirtualArray,chirps,AdcSamples/2));
MtiSize =6; %MTI滑动窗长度
MtiBuffer = complex(zeros(VirtualArray,AdcSamples/2,MtiSize));
%%
gifName = '..\fulldata_zipped\fulldata\test.gif'; % 打开或者创建一个gif文件
打开GIF文件以写入
if exist(gifName, 'file')
% 如果文件已存在,则删除
end
fid = fopen(gifName, 'w');
for i =1:frame
RadarData = squeeze(your_data(i,:,:,:));
for j =1:VirtualArray
%时域信号
adcDataRowRx = squeeze(RadarData(j,:,:));
%%RangeFFT
for k = 1:chirps
temp= fft(adcDataRowRx(k,:));
) =temp(:,1:AdcSamples/2); :
end
%%静态杂波滤除算法
,1:end -1) =MtiBuffer(j,:,2:end); :
,end) = mean(squeeze(Rangefft(j,:,:)),1); :
,:) = squeeze(Rangefft(j,:,:))-mean(squeeze(MtiBuffer(j,:,:)),2).'; :
%%DopplerFFT
for m =1:AdcSamples/2
,m) = fftshift(fft(squeeze(RangefftMTI(j,:,m)))); :
end
end
%%三个通道非相参积累
DopplerNCC = squeeze(sum(abs(Doppler),1));
figure(1);
subplot(121);
mesh(abs(adcDataRowRx));
xlabel('samples');ylabel('chirps');zlabel('Amp');title([filename,' # ADC data Frmes = ',num2str(i)]);grid on
%
subplot(122);
imagesc(10*log10(abs(squeeze(RangefftMTI(1,:,:)))));axis xy
xlabel('Range(m)');ylabel('chirps');zlabel('Power(dB)');title('RangeFFT data');grid on
%%caponBFC测水平角
scale = -50:1:50; % 扫面范围
M=2; % 阵元单元
d = 0:lambda/2:(M-1)*lambda/2;% 阵列天线
N = size(Doppler,2);
,:,1) =squeeze(Doppler(1,:,:)); :
,:,2) =squeeze(Doppler(3,:,:)); :
P_Capon =zeros(length(Rax),length(scale));
idR =0;
for r =1:fftpoint
idR =idR+1;
Y =squeeze( Rx(:,r,:)).';
R = (Y*Y')/N;
R_inv = pinv(R);
idx = 1;
for n=scale
steeringVector = (exp(-1j*2*pi/lambda*d*sind(n))).'; % 转向矢量转置
( 1/(steeringVector'*R_inv*steeringVector)); % Capon算法 =
idx = idx + 1;
end
end
%%caponBF测俯仰角
-50:1:50; % 扫面范围 =
M=2; % 阵元单元
d = 0:lambda/2:(M-1)*lambda/2;% 阵列天线
N = size(Doppler,2);
,:,1) =squeeze(Doppler(2,:,:)); :
,:,2) =squeeze(Doppler(3,:,:)); :
P_CaponEle =zeros(length(Rax),length(scale));
idR =0;
for r =1:fftpoint
idR =idR+1;
Y =squeeze( Rx(:,r,:)).';
R = (Y*Y')/N;
R_inv = pinv(R);
idx = 1;
for n=scale
steeringVector = (exp(-1j*2*pi/lambda*d*sind(n))).'; % 转向矢量转置
( 1/(steeringVector'*R_inv*steeringVector)); % Capon算法 =
idx = idx + 1;
end
end
figure(2);
subplot(131);
xy
clim([30,40])
data # Frames = ',num2str(i)]);grid on
subplot(132);
axis xy
clim([50,65])
Angle(°)');ylabel('Range(m)');zlabel('Power(dB)');title('Horizontal CaponBF DOA');grid on
subplot(133);
axis xy
clim([50,65])
Angle(°)');ylabel('Range(m)');zlabel('Power(dB)');title('Pitch CaponBF DOA');grid on
写入gif过程
frame = getframe(gcf);
frame2im(frame); =
rgb2ind(im{i},256); %将 RGB 图像转换为索引图像 A。map 最多包含 n 个颜色。 =
if i == 1
imwrite(A,map,gifName,'gif','LoopCount',Inf,'DelayTime',0.1);%'DelayTime'为每帧图像播放时间
else
imwrite(A,map,gifName,'gif','WriteMode','append','DelayTime',0.1);
end
pause(0.1)
end
四、全部代码和数据集下载方式
本文为感谢2024年度新/老会员(未过期)和论文品读专栏订阅读者的支持,本学习资料特此提供(可私信获取)。
论文品读专栏:点击跳转
参考资料:
https://ieee-dataport.org/documents/60-ghz-fmcw-radar-gesture-dataset
加雷达群(备注单位+研究方向)、产品推广(雷达芯片、雷达模组、雷达产品和解决方案)、企业品牌推广、招生/招聘宣传、展会/学术活动宣传、宣传推文撰写和代发、文章转载开白、雷达行业/技术交流、年度会员、付费咨询、代码仿真、资料代找、企业引流、公众号互推、文章投稿、其他合作或问题,请扫描下方二维码。
喜欢文章可以一键四连【分享】【收藏】【在看】【点赞】,有疑问可以在文章最下方【写留言】给我留言!