Skip to content

yunLin0/Radar_monitor

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

65 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

IWR1642毫米波雷达心纹识别与生命体征监测系统

Python PyTorch License

基于TI IWR1642毫米波雷达的实时心纹识别生命体征监测系统

功能特性快速开始系统架构API文档文档中心


📋 项目简介

本项目是一个基于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

安装步骤

  1. 克隆项目
git clone https://github.com/yourusername/radar_stream_monitor.git
cd radar_stream_monitor
  1. 安装依赖
pip install -r requirements.txt
  1. 配置雷达

编辑 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'
  1. 配置网络

设置PC网络适配器:

IP地址: 192.168.33.30
子网掩码: 255.255.255.0
  1. 启动Web服务
python web_app.py
  1. 访问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.pth

🏗️ 系统架构

整体架构图

graph 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
Loading

虚线表示信号处理层同时向后处理层(生命体征估计)和深度学习层(心拍识别)两条路径输出。

核心模块说明

模块 文件 功能描述
雷达控制 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 可选

详细的模型架构说明请参考:模型架构文档


📡 API文档

系统控制接口

启动雷达

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/stop

实时数据接口

获取实时数据

GET /api/real_time/data

Response:
{
  "status": "success",
  "data": {
    "vitals": {
      "heart_rate": 120.5,
      "resp_rate": 35.2
    },
    "identification": {
      "identity": "蔡家康",
      "confidence": 0.92
    }
  }
}

SSE实时数据流

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 改进实施记录
维护手册 版本更新历史 + 已知问题与限制

🔍 常见问题

Q1: 实际帧率只有~10fps而不是20fps?

这是硬件或网络限制,可能原因:

  • DCA1000数据传输速率限制
  • 网络带宽或延迟
  • USB带宽限制

软件已做自适应处理,使用实际帧率计算分析间隔。

Q2: 采集模式下没有进度打印?

采集模式下结果不放入识别队列(避免干扰识别逻辑),仅保存数据并在采集完成时发送 collection_complete 信号。进度通过 GET /api/person/collect/status 接口查询,详见 Web服务文档

Q3: 如何添加新人员?

方式1:通过Web界面

  1. 访问 http://localhost:5000
  2. 点击"新增人员"
  3. 填写信息并启动采集

方式2:通过API

curl -X POST http://localhost:5000/api/person/collect \
  -H "Content-Type: application/json" \
  -d '{"auth_id": "person001", "num_frames": 300}'

Q4: 如何重新训练模型?

# 准备数据集 (按照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

Q5: WinError 10038错误?

这是Flask开发服务器的问题,建议:

  • 使用生产环境部署(gunicorn/waitress)
  • 或重启服务器

Q6: 如何调整心率/呼吸率的异常阈值?

编辑 web_app.pyperform_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!

开发环境设置

  1. Fork本仓库
  2. 创建特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 开启Pull Request

代码规范

  • 遵循PEP 8规范
  • 添加必要的注释和文档字符串
  • 确保代码通过现有测试

📄 License

本项目采用 MIT License - 详见 LICENSE 文件


👥 联系方式


🙏 致谢

TODO


📊 项目状态

指标 状态
开发状态 ✅ 活跃开发
文档完整度 ✅ 完整
测试覆盖 🔄 进行中
生产就绪 ✅ 是
版本 v3.3

⭐ 如果这个项目对你有帮助,请给个Star! ⭐

About

本项目是一个基于TI IWR1642毫米波雷达的完整生命体征监测与身份识别系统。系统通过非接触式毫米波雷达技术,实现:实时心率监测:高精度心率提取; 实时呼吸率监测:呼吸频率检测 ;心纹身份识别:基于心电信号的独特性进行身份识别 ;多视角数据融合:4个雷达视角数据融合,提高识别准确性 ;实时Web监控:基于Flask的Web服务,实时显示监测数据;

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors