本项目是一个基于TI IWR1642毫米波雷达的完整生命体征监测与身份识别系统。系统通过非接触式毫米波雷达技术,实现:
- ✅ 实时心率监测:高精度心率提取,误差 <2 BPM
- ✅ 实时呼吸率监测:呼吸频率检测,误差 <1 BPM
- ✅ 心纹身份识别:基于心电信号的独特性进行身份识别,准确率 >90%
- ✅ 多视角数据融合:4个雷达视角数据融合,提高识别准确性
- ✅ 实时Web监控:基于Flask的Web服务,实时显示监测数据
- ✅ 微波监护系统:专为微波监护设计,支持异常报警
- FMCW毫米波雷达:77GHz工业级雷达,非接触式监测
- 多重交叉注意力 + ArcFace 模型:双模态(频域+时域)深度学习架构,开源集识别
- 小波变换心拍检测:精确的心拍分割与对齐算法
- 心拍质量评估 + 时序投票:质量加权与证据累积,提升识别稳定性
- 卡尔曼滤波:生命体征实时平滑,消除跳变
- K折交叉验证:5折交叉验证训练,确保模型可靠性
- 实时信号处理:多通道雷达信号实时流水线处理
| 指标 | 测量范围 | 精度 | 更新频率 |
|---|---|---|---|
| 心率 | 40-200 BPM | ±2 BPM | 10秒 |
| 呼吸率 | 8-60 BPM | ±1 BPM | 10秒 |
- 识别准确率:>90% (21人数据集)
- 识别速度:<50ms (GPU推理)
- 支持人数:可扩展,当前支持21人
- 开源集识别:支持 unknown 拒绝,避免误识别
- 数据需求:每人约300帧 (约50分钟数据)
- 🎯 实时数据流:20Hz雷达数据流实时处理
- 📊 Web可视化:HTML+JS 前端,实时曲线图和数据展示
- 💾 数据采集:支持新用户数据采集和存储
- 🔔 异常报警:心率/呼吸异常自动报警
- 📧 邮件通知:异常情况邮件推送
- 📱 响应式设计:支持PC和移动端访问
硬件要求
- TI IWR1642BOOST 毫米波雷达评估板
- DCA1000 数据采集卡
- 网线 (连接DCA1000与PC)
- USB转串口线 (连接IWR1642与PC)
软件要求
- Python 3.8+
- CUDA 11.0+ (GPU加速,可选)
- Windows 10/11 或 Linux
- 克隆项目
git clone https://github.com/yourusername/radar_stream_monitor.git
cd radar_stream_monitor- 安装依赖
pip install -r requirements.txt- 配置雷达
编辑 config.py,根据实际情况调整参数:
# 雷达硬件配置在 config.py 中:
RADAR_CLI_PORT = 'COM5' # 串口号 (Windows) 或 '/dev/ttyUSB0' (Linux)
RADAR_DATA_IP = '192.168.33.30' # PC IP地址
RADAR_FPGA_IP = '192.168.33.180' # DCA1000 FPGA IP
RADAR_CONFIG_FILE = 'config/iwr1642.cfg'- 配置网络
设置PC网络适配器:
IP地址: 192.168.33.30
子网掩码: 255.255.255.0
- 启动Web服务
python web_app.py- 访问Web界面
http://localhost:5000
如果不需要Web界面,可以使用命令行模式:
python main.py --cfg config/iwr1642.cfg --cli-port COM5如果有自己的数据集,可以训练自定义模型:
# K折交叉验证训练 (闭集识别)
python train.py --mode kfold --data_dir data --k_folds 5 --epochs 50 --augment
# ArcFace 开源集训练 (推荐)
python train.py --mode arcface --data_dir data --k_folds 5 --epochs 50训练设计原则:
- 无早停:每折完整训练全部 epochs,确保充分收敛
- 权重不继承:每折从随机初始化开始,符合标准K折交叉验证规范
- 逐折评估:用每折自己的最佳模型评估该折验证集
- 逐折保存:每折权重保存在
fold_weights/目录,总体最佳模型保存为best_model.pth
训练完成后,将模型权重文件放在项目根目录:
cp outputs/kfold_train_xxx/best_model.pth best_model.pthgraph LR
subgraph HW["📡 硬件采集层"]
R["IWR1642<br/>77GHz FMCW"] --> D["DCA1000"] --> U["UdpCollector<br/>DLL双缓冲"]
end
subgraph DSP["🔧 信号处理层"]
IQ["I/Q解析"] --> FFT["距离FFT"] --> PH["相位差分"] --> CH["通道选择"]
CH --> BP["带通滤波<br/>呼吸/心跳"]
CH --> CWT["CWT心拍检测<br/>→对齐→过滤"]
end
subgraph DL["🧠 深度学习推理层"]
QA["质量评估<br/>5维评分"] --> SG["频谱图生成<br/>STFT 224×224"]
SG --> MCA["多重交叉注意力<br/>CNN+BiLSTM"]
MCA --> AF["ArcFace<br/>开源集识别"]
end
subgraph POST["📊 后处理决策层"]
TV["时序投票<br/>滑动窗口+滞后"]
VT["生命体征估计<br/>HR / RR BPM"]
end
subgraph OUT["🖥️ 输出层"]
ID["身份识别"]
VIT["心率/呼吸率"]
ALT["异常报警"]
end
U -->|"raw ADC"| IQ
CWT -->|"心拍信号"| QA
BP -.->|"呼吸/心跳信号"| VT
AF --> TV
TV --> ID
VT --> VIT
VT --> ALT
ID --> WEB["Flask Web<br/>SSE实时推送"]
VIT --> WEB
ALT --> WEB
虚线表示信号处理层同时向后处理层(生命体征估计)和深度学习层(心拍识别)两条路径输出。
| 模块 | 文件 | 功能描述 |
|---|---|---|
| 雷达控制 | iwr1642_radar.py |
雷达配置、串口通信、DCA1000控制、UDP数据采集 |
| 信号处理 | signal_processor.py |
FFT、相位差分、通道选择、生命体征提取、心拍检测 |
| 数据流水线 | data_pipeline.py |
整合硬件控制和信号处理,10秒周期分析 |
| 深度学习模型 | multi_cross_attention.py |
多重交叉注意力模型架构定义 |
| ArcFace 模型 | arcface_model.py |
ArcFace 嵌入模型 + 画廊管理 |
| 模型训练 | train.py |
统一训练脚本 (K折/ArcFace双模式) |
| 模型推理 | inference.py |
统一推理引擎 (闭集/开源集双模式) |
| 频谱图工具 | spectrogram_utils.py |
统一频谱图生成管线 (STFT + Parula colormap) |
| 质量评估 | quality_assessment.py |
心拍质量多维评分 (5维度加权) |
| 时序投票 | temporal_voting.py |
时序证据累积与身份决策 (滑动窗口+滞后切换) |
| Web服务 | web_app.py |
Flask Web服务和API接口 (SSE实时推送) |
radar_stream_monitor/
├── 📂 config/ # 硬件配置文件
│ └── iwr1642.cfg # 雷达配置文件
│
├── 📄 config.py # 系统全局配置
├── 📂 data/ # 数据目录
│ ├── fre/ # 频域数据 (频谱图)
│ │ └── {人员ID}/
│ │ ├── view1/ # 视角1数据
│ │ ├── view2/ # 视角2数据
│ │ ├── view3/ # 视角3数据
│ │ └── view4/ # 视角4数据
│ ├── time/ # 时域数据 (心拍波形)
│ │ └── {人员ID}/
│ │ ├── view1/
│ │ ├── view2/
│ │ ├── view3/
│ │ └── view4/
│ └── babies.json # 用户信息数据库
│
├── 📂 libs/ # 第三方库
│ └── UDPCAPTUREADCRAWDATA.dll # DCA1000数据采集DLL
│
├── 📂 md/ # 文档目录
│ ├── 技术指南.md # 文档导航 (推荐首先阅读)
│ ├── 数据流详解.md # 数据流详细说明
│ ├── 模型架构.md # 模型架构文档
│ ├── 训练详解.md # 训练流程文档
│ ├── Web服务文档.md # Web服务文档
│ ├── 雷达配置参数.md # 雷达配置参数文档
│ ├── 改进报告.md # 改进方向调研 + P0实施记录
│ └── 维护手册.md # 版本更新历史 + 已知问题
│
├── 📂 templates/ # Flask模板
│ └── index.html # Web前端页面 (HTML+JS)
│
├── 📂 static/ # 静态资源
│ ├── styles.css # 样式文件
│ ├── pictures/ # 前端图片资源
│ └── voice/ # 报警音频
│
├── 📄 web_app.py # Web服务入口 (Flask)
├── 📄 iwr1642_radar.py # 雷达硬件控制 + UDP采集
├── 📄 signal_processor.py # 信号处理算法 (FFT/滤波/心拍检测)
├── 📄 data_pipeline.py # 数据处理流水线 (10秒分析)
├── 📄 multi_cross_attention.py # 多重交叉注意力模型架构
├── 📄 arcface_model.py # ArcFace 嵌入模型 + 画廊管理
├── 📄 train.py # 统一训练脚本 (--mode kfold|arcface)
├── 📄 inference.py # 统一推理引擎 (--mode radar|open_set)
├── 📄 quality_assessment.py # 心拍质量评估 (5维度评分)
├── 📄 temporal_voting.py # 时序投票与证据累积
├── 📄 spectrogram_utils.py # 统一频谱图生成管线
├── 📄 utils.py # 工具函数 (模型加载/信号归一化/数据库)
├── 📄 config.py # 系统全局配置
└── 📄 README.md # 本文件
基于 config/iwr1642.cfg 的关键参数:
| 参数 | 值 | 说明 |
|---|---|---|
| 载波频率 | 77 GHz | 毫米波频段,平衡穿透力和分辨率 |
| 发射天线 | 2 | TDM模式交替发射 |
| 接收天线 | 4 | 4个接收通道 |
| 虚拟通道 | 8 | 2×4 = 8个虚拟通道 |
| ADC采样点 | 128/256 | 每Chirp采样点数 |
| 采样率 | 5209 ksps | ADC采样率 |
| Chirp数/帧 | 32 | 每帧Chirp数量 (frameCfg 解析) |
| 帧周期 | 50 ms | 对应20Hz帧率 |
| 频率斜率 | 70 MHz/μs | Chirp调频斜率 |
| 信号带宽 | ~4 GHz | 决定距离分辨率 |
| 距离分辨率 | ~4 cm | c/(2×BW) |
| 最大距离 | ~9 m | 受采样率限制 |
# 每帧数据量 (TDM模式: 2TX × 4RX, 32 chirps/帧)
帧率: 20 Hz (frameCfg 50ms)
每帧字节数 ≈ frame_length (由配置文件自动计算)
数据吞吐量 ≈ 20 Hz × 64 KB = 1.25 MB/s详细的参数推导过程请参考:雷达配置参数文档
本系统采用多重交叉注意力模型,具有以下特点:
双模态输入
- 频域分支:处理小波频谱图 (224×224 RGB)
- 时域分支:处理原始心拍信号 (100点)
多视角融合
- 4个雷达视角对应4个输入通道
- 自注意力机制整合视角信息
- 交叉注意力实现模态交互
网络结构 (原始闭集模型)
输入:
- images: (batch, 4, 3, 224, 224) # 4视角频谱图
- signals: (batch, 4, 100) # 4视角时域信号
频域分支:
- Multi_FreModule (5层CNN)
- SelfAttention (视角融合)
- 输出: (batch, 4, 49)
时域分支:
- Multi_TimeModule (4层CNN + BiLSTM)
- SelfAttention (视角融合)
- 输出: (batch, 4, 50)
交叉注意力融合:
- CrossAttention1: 图像关注信号
- CrossAttention2: 信号关注图像
- 特征拼接与展平
分类:
- 全连接层
- 输出: (batch, num_classes)
ArcFace 开源集模型 (增强版)
Backbone (同上) → Flatten(400)
→ FC(256) → L2-Norm → Embedding
→ ArcFaceHead(s=30.0, m=0.50) → Logits
推理时: 查询嵌入与画廊做余弦相似度检索
相似度 ≥ 阈值 → 返回对应身份
相似度 < 阈值 → 返回 "unknown"
| 参数 | 值 | 说明 |
|---|---|---|
| 优化器 | AdamW | 学习率1e-4,权重衰减1e-4 |
| 学习率调度 | CosineAnnealing | 余弦退火 |
| 损失函数 | CrossEntropyLoss | 标签平滑0.1 |
| 批次大小 | 16 | 根据显存调整 |
| 训练轮数 | 50 | 每折 |
| K折 | 5 | 交叉验证 |
| 数据增强 | RandomFlip, Rotate | 可选 |
详细的模型架构说明请参考:模型架构文档
POST /api/radar/start
Content-Type: application/json
{
"cli_port": "COM5",
"data_ip": "192.168.33.30",
"fpga_ip": "192.168.33.180"
}POST /api/radar/stopGET /api/real_time/data
Response:
{
"status": "success",
"data": {
"vitals": {
"heart_rate": 120.5,
"resp_rate": 35.2
},
"identification": {
"identity": "蔡家康",
"confidence": 0.92
}
}
}GET /api/data/stream
Response (Server-Sent Events):
data: {"timestamp": 1678832000.0, "vitals": {...}, ...}
data: {"timestamp": 1678832000.5, "vitals": {...}, ...}POST /api/person/collect
Content-Type: application/json
{
"auth_id": "baby_001",
"num_frames": 300
}GET /api/person/collect/result
Response:
{
"status": "success",
"data": {
"auth_id": "baby_001",
"total_frames": 300,
"statistics": {
"heart_rate": {"mean": 120.5, "std": 2.3},
"resp_rate": {"mean": 35.2, "std": 1.5}
}
}
}POST /api/baby/add
Content-Type: application/json
{
"id": "baby_002",
"gender": "女",
"age": "3个月",
"location": "监护床-A02",
"parent_email": "parent@example.com"
}POST /api/baby/authorization
Content-Type: application/json
{
"baby_id": "蔡家康",
"authorized": true
}完整的API文档请参考:Web服务文档
| 文档 | 描述 |
|---|---|
| 技术指南 (导航) | 文档导航索引,按需求快速定位 |
| 数据流详细说明 | 详细说明数据如何从雷达流向最终结果 |
| 模型架构文档 | 深度学习模型的完整架构说明 |
| 训练流程文档 | 模型训练的完整流程 |
| Web服务文档 | API接口和使用说明 |
| 雷达配置参数 | 雷达参数配置和推导过程 |
| 改进报告 | 改进方向调研 + P0 改进实施记录 |
| 维护手册 | 版本更新历史 + 已知问题与限制 |
这是硬件或网络限制,可能原因:
- DCA1000数据传输速率限制
- 网络带宽或延迟
- USB带宽限制
软件已做自适应处理,使用实际帧率计算分析间隔。
采集模式下结果不放入识别队列(避免干扰识别逻辑),仅保存数据并在采集完成时发送 collection_complete 信号。进度通过 GET /api/person/collect/status 接口查询,详见 Web服务文档。
方式1:通过Web界面
- 访问 http://localhost:5000
- 点击"新增人员"
- 填写信息并启动采集
方式2:通过API
curl -X POST http://localhost:5000/api/person/collect \
-H "Content-Type: application/json" \
-d '{"auth_id": "person001", "num_frames": 300}'# 准备数据集 (按照data/目录结构组织数据)
# K折交叉验证训练 (闭集识别)
python train.py --mode kfold \
--data_dir data \
--k_folds 5 \
--epochs 50 \
--batch_size 16 \
--augment \
--gpu 0
# ArcFace 开源集训练 (推荐,支持 unknown 拒绝)
python train.py --mode arcface \
--data_dir data \
--k_folds 5 \
--epochs 50 \
--batch_size 16 \
--gpu 0
# 训练完成后,复制最佳模型
cp outputs/kfold_train_xxx/best_model.pth best_model.pth这是Flask开发服务器的问题,建议:
- 使用生产环境部署(gunicorn/waitress)
- 或重启服务器
编辑 web_app.py 中 perform_identification_from_signals() 附近的阈值判断逻辑。
当你想修改某个功能或排查某个问题时,直接定位到对应文件,节省翻代码的时间。
| 我想改/查的功能 | 主要文件 | 关键函数/类 |
|---|---|---|
| 雷达硬件参数(频率、天线、帧率) | iwr1642_radar.py + config/iwr1642.cfg | RadarConfig |
| 串口通信 / DCA1000控制 | iwr1642_radar.py | RadarSerialController, DCA1000Controller |
| UDP数据采集 | iwr1642_radar.py | UdpCollector |
| 信号处理算法(FFT、相位差分、滤波) | signal_processor.py | process_multichannel_to_signals(), phase_diff_signal() |
| 呼吸/心跳分离 | signal_processor.py | extract_resp_heart() |
| 心拍检测与对齐 | signal_processor.py | extract_beats_from_signal(), detect_peaks_valleys_cwt() |
| 心率/呼吸率估计 | signal_processor.py | estimate_vitals() |
| 10秒数据处理周期 | data_pipeline.py | RadarSignalProcessor, _process_accumulated_data() |
| 数据采集模式 | data_pipeline.py | start_collecting(), _save_collected_data() |
| 信号导出(IQ/相位/融合/心跳波形) | data_pipeline.py | _export_signals() |
| 深度学习模型架构(CNN/LSTM/注意力) | multi_cross_attention.py | MultiCrossAttentionModel, Fre_Feature, Time_Feature |
| ArcFace 嵌入模型 | arcface_model.py | ArcFaceEmbeddingModel, ArcFaceHead |
| 画廊管理(注册/检索/阈值) | arcface_model.py | GalleryManager |
| 心拍质量评估 | quality_assessment.py | BeatQualityAssessor |
| 时序投票与身份决策 | temporal_voting.py | TemporalVoter |
| 推理引擎(闭集/开源集) | inference.py | ClosedSetEngine, OpenSetInferenceEngine |
| 频谱图生成(STFT + Parula colormap) | spectrogram_utils.py | beat_signal_to_spectrogram_image() |
| 模型训练(K折/ArcFace) | train.py | main_kfold(), main_arcface(), HeartPrintDataset |
| SCI论文图表生成 | plot_sci_figures.py | fig1~fig6 |
| 数据集统计(均值/标准差) | cal_train_mean_std.py | 主函数 |
| Web API / SSE实时推送 | web_app.py | 30+ Flask 路由 |
| 异常报警阈值(心率/呼吸率) | web_app.py | perform_identification_from_signals() 附近的阈值判断 |
| 邮件报警 | web_app.py | /api/send-alert-email |
| 全局配置(IP、端口、路径、归一化参数) | config.py | Config 类 |
| 用户数据库(babies.json CRUD) | utils.py | BabyDatabase |
| 模型加载/信号归一化 | utils.py | load_model_checkpoint(), normalize_signal() |
| 我遇到的问题 | 排查文件 | 排查位置 |
|---|---|---|
| 雷达连不上 / 数据收不到 | iwr1642_radar.py | RadarSerialController, UdpCollector.get_frame() |
| get_frame() 一直返回 None | iwr1642_radar.py | 检查 _frame_counter_ptr[0] 是否递增 |
| 帧率不到 20fps | iwr1642_radar.py | RadarConfig.fs 实际值 |
| 检测不到心拍 | signal_processor.py | ProcessingConfig.CWT_SCALES、能量阈值 |
| 心拍检测过多 | signal_processor.py | ProcessingConfig 中 CWT 参数、remove_outlier_beats() |
| 心率/呼吸率不准 | signal_processor.py | estimate_vitals() 频率搜索范围 |
| 心率低于60 BPM | signal_processor.py | _smooth_data() NaN感知平滑、extract_dynamic_vitals() 0→NaN替换 |
| 10秒延迟太长 | data_pipeline.py | analysis_interval 参数 |
| 采集模式没有进度 | data_pipeline.py | _process_in_background() 队列逻辑 |
| 采集模式误报警 | web_app.py | 采集模式检查逻辑 |
| 识别结果不稳定 | temporal_voting.py | TemporalVoter 滞后参数 |
| 误识别为已知人员 | arcface_model.py | GalleryManager.threshold(调高阈值) |
| unknown 过多 | arcface_model.py | GalleryManager.threshold(调低阈值) |
| 频谱图样式不对 | spectrogram_utils.py | STFT 参数、Parula colormap |
| 训练损失不下降 | train.py | 学习率、数据加载、标签 |
| 验证准确率低 | train.py | 数据增强、过拟合、类别不平衡 |
| 显存不足 | train.py | batch_size、梯度累积 |
| WinError 10038 | web_app.py | Flask 服务器重启 |
| 心率/呼吸率异常阈值 | web_app.py | perform_identification_from_signals() 中的阈值常量 |
| 模型加载失败 | utils.py | load_model_checkpoint() key prefix 自动剥离 |
| 归一化参数不对 | config.py | NORMALIZE_MEAN, NORMALIZE_STD(用 cal_train_mean_std.py 重算) |
| babies.json 损坏 | utils.py | BabyDatabase JSON 读写 |
欢迎提交Issue和Pull Request!
- Fork本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启Pull Request
- 遵循PEP 8规范
- 添加必要的注释和文档字符串
- 确保代码通过现有测试
本项目采用 MIT License - 详见 LICENSE 文件
- Texas Instruments - IWR1642毫米波雷达硬件
- PyTorch团队 - 深度学习框架
- Flask团队 - Web框架
- [RadarStream](https://github.com/Tkwer/RadarStream.git) by Tkwer
- [real-time-radar](https://github.com/AndyYu0010/real-time-radar) by AndyYu0010
- [OpenRadar](https://github.com/PreSenseRadar/OpenRadar) - specifically the DSP module
- 所有贡献者 - 感谢对本项目的贡献
| 指标 | 状态 |
|---|---|
| 开发状态 | ✅ 活跃开发 |
| 文档完整度 | ✅ 完整 |
| 测试覆盖 | 🔄 进行中 |
| 生产就绪 | ✅ 是 |
| 版本 | v3.3 |
⭐ 如果这个项目对你有帮助,请给个Star! ⭐