Note
Go to the end to download the full example code.
CSI human fall detection Tutorial¶
# !pip install pysensing
In this tutorial, we will be implementing codes for CSI human fall detection task
import sys
sys.path.append('../..')
import pysensing.csi.dataset.get_dataloader as get_dataloader
import pysensing.csi.model.get_model as get_model
import pysensing.csi.inference.predict as predict
import pysensing.csi.inference.train as train
import pysensing.csi.inference.embedding as embedding
import torch
Load the model¶
Model zoo: FallNet
model = get_model.load_hfd_model('FallFi', 'FallNet')
print(model)
FallNet(
(down1): segnetDown2(
(conv1): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(conv2): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(maxpool_with_argmax): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(down2): segnetDown2(
(conv1): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(conv2): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(maxpool_with_argmax): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(down3): segnetDown3(
(conv1): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(conv2): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(conv3): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(maxpool_with_argmax): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(down4): segnetDown3(
(conv1): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(conv2): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(conv3): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(maxpool_with_argmax): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(down5): segnetDown3(
(conv1): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(conv2): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(conv3): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(maxpool_with_argmax): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(up5): segnetUp3(
(unpool): MaxUnpool2d(kernel_size=(2, 2), stride=(2, 2), padding=(0, 0))
(conv1): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(conv2): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(conv3): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
)
(up4): segnetUp3(
(unpool): MaxUnpool2d(kernel_size=(2, 2), stride=(2, 2), padding=(0, 0))
(conv1): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(conv2): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(conv3): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(512, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
)
(up3): segnetUp3(
(unpool): MaxUnpool2d(kernel_size=(2, 2), stride=(2, 2), padding=(0, 0))
(conv1): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(conv2): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(conv3): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(256, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
)
(up2): segnetUp2(
(unpool): MaxUnpool2d(kernel_size=(2, 2), stride=(2, 2), padding=(0, 0))
(conv1): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(conv2): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(128, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
)
(up1): segnetUp2(
(unpool): MaxUnpool2d(kernel_size=(2, 2), stride=(2, 2), padding=(0, 0))
(conv1): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
(conv2): conv2DBatchNormRelu(
(cbr_unit): Sequential(
(0): Conv2d(64, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
)
)
)
(fc1): Linear(in_features=512, out_features=9, bias=True)
(fc2): Linear(in_features=512, out_features=9, bias=True)
(fc3): Linear(in_features=9, out_features=512, bias=True)
)
Model inference¶
The dataset is not published. Please refer to the original paper: https://scholar.google.com/citations?view_op=view_citation&hl=en&user=QodpJREAAAAJ&sortby=pubdate&citation_for_view=QodpJREAAAAJ:ufrVoPGSRksC
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
csi = torch.randn(1, 3, 224, 66).to(device)
model = get_model.load_pretrain(model, 'FallFi', 'FallNet', device=device)
output = predict.hfd_predict(csi, 'FallFi', model, device)
print("output:", output.shape)
/data1/msc/zyj/yunjiao_csi/1028/yunjiao_csi/tutorials/csi_source/../../pysensing/csi/model/hfd.py:132: UserWarning: The torch.cuda.*DtypeTensor constructors are no longer recommended. It's best to use methods such as torch.tensor(data, dtype=*, device='cuda') to create tensors. (Triggered internally at ../torch/csrc/tensor/python_tensor.cpp:83.)
eps = torch.cuda.FloatTensor(std.size()).normal_()
output: torch.Size([1, 3, 224, 66])
Generate embeddings¶
csi_embedding = embedding.hfd_csi_embedding(csi, 'FallFi', model, device)
print('csi_embedding: ', csi_embedding)
csi_embedding: tensor([[ 0.2815, 0.2006, -0.4935, ..., 0.9731, 0.2763, -0.2674],
[ 0.8439, 0.6335, -0.5842, ..., 0.5461, 0.9722, 0.4551],
[ 0.5726, 0.5446, -0.1974, ..., -0.0212, 1.0321, 0.6345],
...,
[ 0.3257, 0.9846, 0.0162, ..., 1.2023, 0.5825, 0.2871],
[-0.6423, -0.9386, -0.7000, ..., 0.5079, -0.1062, -0.8448],
[-0.7176, -0.4647, -0.7317, ..., -0.1374, -0.5185, -0.4691]],
device='cuda:0')
And that’s it. We’re done with our CSI human fall detection tutorials. Thanks for reading.
Total running time of the script: (0 minutes 2.293 seconds)