1.背景

随着当今社会老龄化的加快,老年人口比例越来越大,老年人的身体健康及安全问题逐渐成为家庭及社会关注的焦点。老年人跌倒是导致其伤残、失能甚至死亡的主要原因之一,老年人跌倒后不能及时发现并寻求帮助往往会使后果更加严重,鉴于跌倒对老人的伤害之大,一款能够准确检测老人跌倒的设备至关重要。基于计算机视觉的智能监控系统由于其实时性、成本低、可多任务并行等优点成为老人摔倒问题的研究热点。

2.图片演示

3.视频演示

Python基于HRHet的跌倒检测系统(源码&教程)_哔哩哔哩_bilibili

4.HRNet方法介绍

中科大和微软亚洲研究院,发布了新的人体姿态估计模型,刷新了三项COCO纪录,还中选了CVPR 2019。

这个名叫HRNet的神经网络,拥有与众不同的并联结构,可以随时保持高分辨率表征,不只靠从低分辨率表征里,恢复高分辨率表征。如此一来,姿势识别的效果明显提升:

在COCO数据集的关键点检测、姿态估计、多人姿态估计这三项任务里,HRNet都超越了所有前辈。

5.HRNet网络改进

参考该博客,从高分辨率子网络(high-resolution subnetwork)作为第一阶段开始,逐步增加高分辨率到低分辨率的子网,形成更多的阶段,并将多分辨率子网并行连接。我们进行了多次多尺度融合multi-scale fusions,使得每一个高分辨率到低分辨率的表征都从其他并行表示中反复接收信息,从而得到丰富的高分辨率表征。因此,预测的关键点热图可能更准确,在空间上也更精确。通过 COCO keypoint detection 数据集和 MPII Human Pose 数据集这两个基准数据集的pose estimation results,我们证明了网络的有效性。此外,我们还展示了网络在 Pose Track 数据集上的姿态跟踪的优越性。

二维人体姿态估计 2D human pose 是计算机视觉中一个基本而又具有挑战性的问题。目标是定位人体的解剖关键点(如肘部、腕部等)或部位。它有很多应用,包括人体动作识别、人机交互、动画(human action recognition, human-computer interaction, animation)等。本文着力于研究single-person pose estimation,这是其他相关问题的基础,如multiperson pose estimation[6,27,33,39,47,57,41,46,17,71],video pose estimation and tracking[49,72]等。(引用的论文见博客最后,许多论文还是值得一读的)

最近的发展表明,深度卷积神经网络已经取得了最先进的性能。大多数现有的方法通过一个网络(通常由高分辨率到低分辨率的子网串联而成)传递输入,然后提高分辨率。例如,Hourglass[40]通过对称的低到高分辨率(symmetric low-to-high process)过程恢复高分辨率。SimpleBaseline[72]采用少量的转置卷积层(transposed convolution layers)来生成高分辨率的表示。此外,dilated convolutions还被用于放大高分辨率到低分辨率网络(high-to-low resolution network)的后几层27,77。

该博客提出了一种新的架构,即高分辨率网络,它能够在整个过程中维护高分辨率的表示。我们从高分辨率子网作为第一阶段始,逐步增加高分辨率到低分辨率的子网(gradually add high-to-low resolution subnetworks),形成更多的阶段,并将多分辨率子网并行连接。在整个过程中,我们通过在并行的多分辨率子网络上反复交换信息来进行多尺度的重复融合。我们通过网络输出的高分辨率表示来估计关键点。生成的网络如图所示。

6.跌倒数据集

通过视频流抠图demo转成数据集
代码如下:

import cv2
from numpy import *
import numpy as npdef resizeimg(img):height, width, channels = img.shapeif width > 1500 or width < 600:scale = 1200 / width#print("图片的尺寸由 %dx%d, 调整到 %dx%d" % (width, height, width * scale, height * scale))scaled = cv2.resize(img, (0, 0), fx=scale, fy=scale)else:scaled = imgreturn scalednormal_file = './train3'
cap = cv2.VideoCapture("./3.mp4")
num = 0
num2 = 0
while(1):try:ret, frame = cap.read()num += 1if num == 10:num = 0num2 += 1cv2.imwrite(normal_file + "/" + str(num2) + '.jpg',frame, [int(cv2.IMWRITE_JPEG_QUALITY), 100])except:break

7.HRNet训练

experiments 目录下新建配置文件 eg: experiments/own/own_hrnet_w18.yaml

修改 DATASET中 ,ROOT、TRAINSET、TESTSET 目录路径 ,DATASET: 数据集名称
修改MODEL中 ,NUM_JOINTS: 对应自己训练集特征点数

DATASET:DATASET: OWNROOT: '../data/own/images'TRAINSET: '../data/own/train.json'TESTSET: '../data/own/val.json'FLIP: trueSCALE_FACTOR: 0.25ROT_FACTOR: 30
MODEL:NAME: 'hrnet'NUM_JOINTS: 37  // 根据自己数据集特征点数量INIT_WEIGHTS: truePRETRAINED: 'hrnetv2_pretrained/hrnetv2_w18_imagenet_pretrained.pth'

lib/datasets 中 新建 own.py 用于根据自己数据格式读取数据 拷贝 face300w.py内容, 修改类名和__getitem__方法

center,scale 计算公式

scale = max(w, h) / 200
center_w = (x1 + x2) / 2
center_h = (y1 + y2) / 2

根据自己格式读取. 我生成的是json格式.

def calCenterScale(self, bbox):w = bbox[2] - bbox[0]h = bbox[3] - bbox[1]center_w = (bbox[0] + bbox[2]) / 2.0center_h = (bbox[1] + bbox[3]) / 2.0scale = round((max(w, h) / 200.0), 2)return center_w, center_h, scaledef __getitem__(self, idx):image_path = os.path.join(self.data_root,self.landmarks_frame[idx]["image_path"])bbox = self.landmarks_frame[idx]['bbox']center_w, center_h, scale = self.calCenterScale(bbox)center = torch.Tensor([center_w, center_h])pts = np.array(self.landmarks_frame[idx]["keypoints"])pts = pts.astype('float').reshape(-1, 2)       ...

修改 lib/datasets/init.py 增加自己的数据集名称 (yaml 中设置的名称)

 from .aflw import AFLWfrom .cofw import COFWfrom .face300w import Face300Wfrom .wflw import WFLWfrom .own import Own__all__ = ['AFLW', 'COFW', 'Face300W', 'WFLW', 'OWN', 'get_dataset']def get_dataset(config):if config.DATASET.DATASET == 'AFLW':return AFLWelif config.DATASET.DATASET == 'COFW':return COFWelif config.DATASET.DATASET == '300W':return Face300Welif config.DATASET.DATASET == 'WFLW':return WFLWelif config.DATASET.DATASET == 'OWN':return Ownelse:raise NotImplemented()

修改 lib/core/evaluation.py compute_nme 方法 ,增加自己的特征点数 取两个眼角下标。

    targets = meta['pts']preds = preds.numpy()target = targets.cpu().numpy()N = preds.shape[0]L = preds.shape[1]rmse = np.zeros(N)for i in range(N):pts_pred, pts_gt = preds[i,], target[i,]if L == 19:  # aflwinterocular = meta['box_size'][i]elif L == 29:  # cofwinterocular = np.linalg.norm(pts_gt[8,] - pts_gt[9,])elif L == 68:  # 300w# interocularinterocular = np.linalg.norm(pts_gt[36,] - pts_gt[45,])elif L == 98:interocular = np.linalg.norm(pts_gt[60,] - pts_gt[72,])elif L == 37:interocular = np.linalg.norm(pts_gt[0,] - pts_gt[15,])else:raise ValueError('Number of landmarks is wrong')rmse[i] = np.sum(np.linalg.norm(pts_pred - pts_gt, axis=1)) / (interocular * L)return rmse

修改 utils/transforms.py 中 fliplr_joints 方法 ( FLIP=false 无需改 )
** 据自己的特征点标注下标,如果从下标0开始标注,不需要 -1 ,类似 WFLW 数据集

打开cmd输入

python scripts/train_coco.py --help

开始训练

python scripts/train_coco.py --help
usage: train_coco.py [-h] [--exp_name EXP_NAME] [--epochs EPOCHS][--batch_size BATCH_SIZE] [--num_workers NUM_WORKERS][--lr LR] [--disable_lr_decay][--lr_decay_steps LR_DECAY_STEPS][--lr_decay_gamma LR_DECAY_GAMMA] [--optimizer OPTIMIZER][--weight_decay WEIGHT_DECAY] [--momentum MOMENTUM][--nesterov][--pretrained_weight_path PRETRAINED_WEIGHT_PATH][--checkpoint_path CHECKPOINT_PATH] [--log_path LOG_PATH][--disable_tensorboard_log] [--model_c MODEL_C][--model_nof_joints MODEL_NOF_JOINTS][--model_bn_momentum MODEL_BN_MOMENTUM][--disable_flip_test_images][--image_resolution IMAGE_RESOLUTION][--coco_root_path COCO_ROOT_PATH][--coco_bbox_path COCO_BBOX_PATH] [--seed SEED][--device DEVICE]optional arguments:-h, --help            show this help message and exit--exp_name EXP_NAME, -n EXP_NAMEexperiment name. A folder with this name will becreated in the log_path.--epochs EPOCHS, -e EPOCHSnumber of epochs--batch_size BATCH_SIZE, -b BATCH_SIZEbatch size--num_workers NUM_WORKERS, -w NUM_WORKERSnumber of DataLoader workers--lr LR, -l LR        initial learning rate--disable_lr_decay    disable learning rate decay--lr_decay_steps LR_DECAY_STEPSlearning rate decay steps--lr_decay_gamma LR_DECAY_GAMMAlearning rate decay gamma--optimizer OPTIMIZER, -o OPTIMIZERoptimizer name. Currently, only `SGD` and `Adam` aresupported.--weight_decay WEIGHT_DECAYweight decay--momentum MOMENTUM, -m MOMENTUMmomentum--nesterov            enable nesterov--pretrained_weight_path PRETRAINED_WEIGHT_PATH, -p PRETRAINED_WEIGHT_PATHpre-trained weight path. Weights will be loaded beforetraining starts.--checkpoint_path CHECKPOINT_PATH, -c CHECKPOINT_PATHprevious checkpoint path. Checkpoint will be loadedbefore training starts. It includes the model, theoptimizer, the epoch, and other parameters.--log_path LOG_PATH   log path. tensorboard logs and checkpoints will besaved here.--disable_tensorboard_log, -udisable tensorboard logging--model_c MODEL_C     HRNet c parameter--model_nof_joints MODEL_NOF_JOINTSHRNet nof_joints parameter--model_bn_momentum MODEL_BN_MOMENTUMHRNet bn_momentum parameter--disable_flip_test_imagesdisable image flip during evaluation--image_resolution IMAGE_RESOLUTION, -r IMAGE_RESOLUTIONimage resolution--coco_root_path COCO_ROOT_PATHCOCO dataset root path--coco_bbox_path COCO_BBOX_PATHpath of detected bboxes to use during evaluation--seed SEED, -s SEED  seed--device DEVICE, -d DEVICEdevice

8.训练过程

Epoch: [0][0/916]    Time 18.342s (18.342s)  Speed 0.9 samples/s Data 14.961s (14.961s)  Loss 0.00214 (0.00214)
Epoch: [0][50/916]  Time 0.542s (0.880s)    Speed 29.5 samples/s    Data 0.000s (0.294s)    Loss 0.00076 (0.00085)
Epoch: [0][100/916] Time 0.537s (0.708s)    Speed 29.8 samples/s    Data 0.000s (0.148s)    Loss 0.00074 (0.00080)
Epoch: [0][150/916] Time 0.530s (0.650s)    Speed 30.2 samples/s    Data 0.000s (0.099s)    Loss 0.00075 (0.00079)
Epoch: [0][200/916] Time 0.531s (0.621s)    Speed 30.1 samples/s    Data 0.001s (0.075s)    Loss 0.00074 (0.00077)
Epoch: [0][250/916] Time 0.532s (0.603s)    Speed 30.1 samples/s    Data 0.000s (0.060s)    Loss 0.00072 (0.00077)
Epoch: [0][300/916] Time 0.525s (0.592s)    Speed 30.5 samples/s    Data 0.000s (0.050s)    Loss 0.00073 (0.00076)
Epoch: [0][350/916] Time 0.541s (0.583s)    Speed 29.6 samples/s    Data 0.000s (0.043s)    Loss 0.00071 (0.00075)
Epoch: [0][400/916] Time 0.536s (0.577s)    Speed 29.9 samples/s    Data 0.000s (0.038s)    Loss 0.00067 (0.00074)
Epoch: [0][450/916] Time 0.534s (0.572s)    Speed 30.0 samples/s    Data 0.000s (0.034s)    Loss 0.00057 (0.00073)
Epoch: [0][500/916] Time 0.534s (0.568s)    Speed 30.0 samples/s    Data 0.000s (0.030s)    Loss 0.00056 (0.00072)
Epoch: [0][550/916] Time 0.528s (0.565s)    Speed 30.3 samples/s    Data 0.000s (0.027s)    Loss 0.00055 (0.00071)
Epoch: [0][600/916] Time 0.533s (0.562s)    Speed 30.0 samples/s    Data 0.001s (0.025s)    Loss 0.00053 (0.00069)
Epoch: [0][650/916] Time 0.528s (0.560s)    Speed 30.3 samples/s    Data 0.000s (0.023s)    Loss 0.00051 (0.00068)
Epoch: [0][700/916] Time 0.535s (0.558s)    Speed 29.9 samples/s    Data 0.000s (0.022s)    Loss 0.00050 (0.00067)
Epoch: [0][750/916] Time 0.537s (0.556s)    Speed 29.8 samples/s    Data 0.000s (0.020s)    Loss 0.00053 (0.00066)
Epoch: [0][800/916] Time 0.532s (0.555s)    Speed 30.1 samples/s    Data 0.000s (0.019s)    Loss 0.00047 (0.00065)
Epoch: [0][850/916] Time 0.531s (0.554s)    Speed 30.1 samples/s    Data 0.000s (0.018s)    Loss 0.00051 (0.00064)
Epoch: [0][900/916] Time 0.526s (0.552s)    Speed 30.4 samples/s    Data 0.000s (0.017s)    Loss 0.00054 (0.00063)
Train Epoch 0 time:0.5524 loss:0.0006 nme:0.3472
best: True
Test Epoch 0 time:0.3146 loss:0.0005 nme:0.1605 [008]:0.8482 [010]:0.5162
=> saving checkpoint to output\OWN\own_hrnet_w18

9.系统整合

下图源码&环境部署视频教程&数据集&自定义UI界面

10.参考文献

[1]基于SVM和阈值分析法的摔倒检测系统[J]. 陈玮,周晴,曹桂涛. 计算机应用与软件. 2017(07)
[2]图像阈值分割算法及对比研究[J]. 詹志宇,安友军,崔文超. 信息通信. 2017(04)
[3]基于核函数的非线性支持向量机[J]. 张立,王渊民. 科技展望. 2017(01)
[4]基于树莓派的物联网应用[J]. 刘继元. 电子世界. 2016(08)
[5]老年人跌倒检测系统的研究现状与发展趋势[J]. 高青,陈洪波,冯涛,朱振朋. 医疗卫生装备. 2015(12)
[6]基于OpenCV的老人跌倒检测的设计和实现[J]. 宋菲,薛质. 信息技术. 2015(11)
[7]基于树莓派B+微处理器的视频检测跟踪系统[J]. 高峰,陈雄,陈婉秋. 电视技术. 2015(19)
[8]行人检测中非极大值抑制算法的改进[J]. 陈金辉,叶西宁. 华东理工大学学报(自然科学版). 2015(03)
[9]一种基于改进差分的运动目标检测方法[J]. 季鸣,王红茹. 网络新媒体技术. 2015(03)
[10]基于嵌入式视频监控的摔倒检测系统的设计[J]. 白云飞,李瞡,何金龙. 电视技术. 2014(15)
[11]人体姿势状态判决的跌倒检测方法[J]. 沈秉乾,武志勇,贺前华,李磊. 计算机应用. 2014(S1)
[12]基于智能手机的人体跌倒检测系统设计[J]. 吴志强,曹蕾,王凯,吕庆文. 计算机工程与设计. 2014(04)
[13]行人检测技术研究综述[J]. 张春凤,宋加涛,王万良. 电视技术. 2014(03)
[14]基于智能视频监控的老人跌倒识别算法研究[J]. 万航,陈立潮,潘理虎,谢斌红,张英俊. 太原科技大学学报. 2013(04)
[15]浅析数学形态学在图像处理中的应用[J]. 肖大雪. 科技广场. 2013(05)
[16]中国老年人口的家庭居住、健康与照料安排——第六次人口普查数据分析[J]. 张翼. 江苏社会科学. 2013(01)
[17]基于三轴加速度传感器的人体跌倒检测系统设计与实现[J]. 王荣,章韵,陈建新. 计算机应用. 2012(05)
[18]一种可穿戴式跌倒检测装置设计[J]. 石欣,张涛. 仪器仪表学报. 2012(03)
[19]基于头部运动轨迹和3D视觉的跌倒检测系统[J]. 杨帆,谢靖,周余,王自强. 现代电子技术. 2012(02)
[20]基于HOG特征的行人视觉检测方法[J]. 程广涛,陈雪,郭照庄. 传感器与微系统. 2011(07)
[21]图像中基于滑动窗口的行人检测框架[J]. 彭源,杨娜,吴建国,田秀霞. 上海电力学院学报. 2011(01)
[22]支持向量机理论与算法研究综述[J]. 丁世飞,齐丙娟,谭红艳. 电子科技大学学报. 2011(01)
[23]基于惯性传感器件的跌倒检测系统设计[J]. 陈炜,佟丽娜,宋全军,葛运建. 传感器与微系统. 2010(08)
[24]中国农村老年人口照料现状分析[J]. 伍小兰. 人口学刊. 2009(06)
[25]图像分割及其常用的方法[J]. 王智,魏巍. 科技信息. 2008(26)
[26]支持向量机及其应用研究综述[J]. 祁亨年. 计算机工程. 2004(10)
[27]利用中值滤波进行图像处理[J]. 孙宏琦,施维颖,巨永锋. 长安大学学报(自然科学版). 2003(02)
[28]老年跌倒的疾病负担与危险因素[J]. 李林涛,王声湧. 中华流行病学杂志. 2001(04)

Python基于HRHet的跌倒检测系统(源码&教程)相关推荐

  1. Python基于YOLOv7的火灾检测系统(源码&教程)

    1.项目背景 为解决传统传感器在检测火灾的过程中受到环境.安装距离等因素影响导致适应性差的缺点,本文基于视觉传 感器,通过视觉目标检测技术对火灾进行检测,从而实现火灾的预警. 2.识别效果展示 3.视 ...

  2. 【YOLOv7】Python基于YOLOv7的人员跌倒检测系统(源码&部署教程&数据集)

    1.项目背景: 世界老龄化趋势日益严重,现代化的生活习惯又使得大多数老人独居,统计数据表明,跌倒是老年人的主要致伤原因.利用先进的计算机技术.传感器技术和图像信息处理技术实现人体跌倒自动检测,不仅可以 ...

  3. java基于ssm空气质量检测系统源码网站空气质量监测源码

    简介 Java基于ssm的空气质量检测系统,检测设备检测一定范围内的企业空气指数,如果有污染则地图显示红色标记. 演示视频 https://www.bilibili.com/video/BV1GK4y ...

  4. Python基于OpenCV的异常行为检测系统[源码&部署教程]

    1.项目背景 智能视频监控(Intelligent Video Surveillance , IVS)[1.2·3.4是计算机视觉技术5l在安防领域的应用,实现了由"被动监控"到& ...

  5. Python基于OpenCV高空抛物检测系统[完整源码&部署教程]

    1.视频演示: [项目分享]Python基于OpenCV高空抛物检测系统[完整源码&部署教程]_哔哩哔哩_bilibili 2.图片演示: 3.算法原理: 参考该博客提出的移动侦测法,即是根据 ...

  6. 基于Python Unet的医学影像分割系统源码,含皮肤病的数据及皮肤病分割的模型,用户输入图像,模型可以自动分割去皮肤病的区域

    手把手教你用Unet做医学图像分割 我们用Unet来做医学图像分割.我们将会以皮肤病的数据作为示范,训练一个皮肤病分割的模型出来,用户输入图像,模型可以自动分割去皮肤病的区域和正常的区域.废话不多说, ...

  7. [YOLOv7]基于YOLOv7的食物卡路里检测系统(源码&部署教程&数据集)

    1.识别效果展示 2.视频演示 [YOLOv7]基于YOLOv7的食物卡路里检测系统(源码&部署教程&数据集)_哔哩哔哩_bilibili 3.YOLOv7算法简介 YOLOv7 在 ...

  8. YOLO&Deepsort的车速&车流量检测系统(源码&部署教程)

    1.研究内容: 基于车辆行驶异常事件检测研究主要包括检测检测车辆的行驶速度异常.检测到流量异常行为的处理两个部分. 2.研究目标: 检测车辆违规变道:熟练运用图像处理的相关工具,可对车辆的异常变道行为 ...

  9. 跌倒检测和识别3:Android实现跌倒检测(含源码,可实时跌倒检测)

    跌倒检测和识别3:Android实现跌倒检测(含源码,可实时跌倒检测) 目录 跌倒检测和识别3:Android实现跌倒检测(含源码,可实时跌倒检测) 1. 前言 2. 跌倒检测数据集说明 3. 基于Y ...

  10. YOLOv7的食物卡路里检测系统(源码&部署教程&数据集)

    1.识别效果展示 2.视频演示 [YOLOv7]基于YOLOv7的食物卡路里检测系统(源码&部署教程&数据集)_哔哩哔哩_bilibili 3.YOLOv7算法简介 YOLOv7 在 ...

最新文章

  1. org.apache.ibatis.binding.BindingException: Type interface XXX is not known to the MapperRegistry.
  2. 一个Java Web后台任务执行工具的设计与实现
  3. Linux中新建用户用不了sudo命令问题:rootr is not in the sudoers file.This incident will be reported解决
  4. 深度学习助力网络科学:基于深度学习的社区发现最新综述
  5. 观点 | 商汤科技联合创始人林达华:深度学习遭遇瓶颈,未来之路需要新的思考
  6. Linux下Rsync+Inotify-tools实现数据实时同步
  7. libiconv2.dll
  8. Cocos游戏引擎3D特效全新升级 更流畅更炫酷
  9. 哔哩哔哩swot分析_哔哩哔哩2020校园招聘游戏运营笔试真题
  10. 计算机教育部学科评估2019,2019教育部8大学科评估公示名单,学科实力一眼较高低!...
  11. 前端开发 认识css 体验变色的效果 0228
  12. php能开发管理系统吗,PHP《个人管理系统》希望大家一起来开发
  13. linux下查询汇编指令手册,Linux命令大全
  14. VB ListView控件各种操作详解
  15. 爱看小说网源码全站带数据打包ThinkPHP内核小说网站源码
  16. mos管的rc吸收电路计算_RC吸收电路参数计算
  17. 分享几个常用的国外英文论文文献数据库,先收藏再说
  18. python 对文件夹下的所有图片进行重命名
  19. Poj1704:staircase nim【博弈】
  20. webservice概述及cxf在Java开发中应用(三) cxf客户端开发

热门文章

  1. Tilera的多核CPU
  2. 欧拉定理和费马小定理
  3. 激光扫描测距仪的实质就是3D激光雷达
  4. 2022 年十大绩效考核技巧
  5. Microsoft官网 Windows10 系统重装教程
  6. 【报告分享】抖店百宝书-抖音电商(附下载)
  7. 考研压力越来越大,你秃了吗?
  8. 摩斯密码(Morse)
  9. 国内薪水最高的IT公司排行榜TOP25,大家都说说你们觉得这数据准确吗,我怎么觉得不太准确。。
  10. MindManager下载和使用