在我们实现关键点检测并部署时
是否曾联想过可以借助关键点衍生出跌倒检测的实地场景应用呢?
前言
跌倒是老年人群中最常见的意外事件,这也是直接导致老年人伤残或者是死亡的几大元凶之一,我们该如何去减少老年人因跌倒带来的身体伤害及快速救治,可借助前文实现的人体骨骼关键点检测来实现对跌倒的实时检测及预警。
- 以下视频为跌倒检测实现预警效果
https://www.bilibili.com/vide...
流程导读
本文是基于:MMPose:在爱芯派上玩转你的关键点检测 此文章的二次应用衍生文章,请先阅读完前文再接着往下学习如何实现跌倒检测。
文章补充说明
仓库:GitHub - prophet-mu/elderly_fell_detect
本文基于 prophet-mu 原文 进行整理以及补充发布。
要做什么
第一步:使用上文骨骼关键点检测拿到的关键点数据进行滤波处理
第二步:通过算法来判断人体当前姿态
第三步:部署在爱芯派上并且能够向手机发送 摔倒检测
结果通知
该怎么做
- 模型训练:获取上文已训练好的模型
- 模型部署:将模型部署到生产环境(爱芯派)中以便实际应用。
- 算法实现:基于关键点的姿态识别算法
- 预警通知:使用 Bark 来实现发送通知(iOS:bark - 给你的手机发推送)
模型训练及部署
模型训练以及部署的步骤可参考下文 MMPoes
的正文章节,这里不再浪费笔墨阐述。
MMPose:在爱芯派上玩转你的关键点检测
算法实现
判断人体是否出于跌倒状态可从以下方面去考虑:
- 人体重心 y 方向的速度
- 人体重心距离地面的高度
- 头部和双脚中间连线和地面的夹角
这里使用了计算夹角来实现人体姿态的估计,为了尽可能的排除误差,我们使用 5 帧画面的坐标平均值作为一帧的坐标,再使用平均值坐标来判断人物是否躺在地面,然后使用 socket 向局域网的设备发送了 UDP 请求来进行更进一步的报警等操作。
本文以 Windows10 系统为例,首先参考以下文章学习连接爱芯派(推荐用 SSH 进行登录).
第一步:确保成功连接后,如图进行操作进入爱芯派。
第二步:使用以下指令进入爱芯派的 home
目录。
cd ..
cd home
第三步:运行下文代码。
# -*- coding: utf-8 -*-
import time
from ax import pipeline
import numpy as np
from PIL import Image, ImageDraw
import socket
IP="192.168.43.91"
pipeline.load([
'libsample_vin_ivps_joint_vo_sipy.so',
'-p', '/root/elderly_fell_detect/hrnet_pose_yolov8.json',
'-c', '2',
])
def send_msg(msg):
print("---------------------------------udp------------------------------")
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
host = IP
port = 8888
message = msg
udp_socket.sendto(message.encode(), (host, port))
print('send:', message)
udp_socket.close()
lcd_width, lcd_height = 854, 480
img = Image.new('RGBA', (lcd_width, lcd_height), (255,0,0,200))
ui = ImageDraw.ImageDraw(img)
def rgba2argb(rgba):
r,g,b,a = rgba.split()
return Image.merge("RGBA", (a,b,g,r))
canvas_argb = rgba2argb(img)
WINDOW_SIZE = 5
THRESHOLD_ANGLE=30
isFall = False
detection = []
tag = 0
while pipeline.work():
#time.sleep(0.001)
argb = canvas_argb.copy()
tmp = pipeline.result()
if tmp and tmp['nObjSize']:
ui = ImageDraw.ImageDraw(argb)
for i in tmp['mObjects']:
x = i['bbox']['x'] * lcd_width
y = i['bbox']['y'] * lcd_height
w = i['bbox']['w'] * lcd_width
h = i['bbox']['h'] * lcd_height
objprob = str(isFall)
ui.rectangle((x,y,x+w,y+h), fill=(100,0,0,255), outline=(255,0,0,255))
ui.text((x,y+20), str(objprob))
if tag <5:
detection.append(i)
tag+=1
else:
# print("begin")
head_filtered = np.zeros(2)
foot_filtered = np.zeros(2)
for j in range(len(detection)):
landmark = detection[j]['landmark']
head = np.array([landmark[0]['x'], landmark[0]['y']])
foot = np.array([landmark[10]['x'], landmark[10]['y']])
head_filtered += head / WINDOW_SIZE
foot_filtered += foot / WINDOW_SIZE
vec = head_filtered - foot_filtered
angle = np.arctan2(vec[1], vec[0]) * 180.0 / np.pi
print(angle)
if abs(angle) > 150 or abs(angle) <30:
print('The person has fallen down!')
isFall=True
send_msg("detect fall")
time.sleep(5)
print(angle)
else:
print('The person is standing up!')
isFall=False
detection = []
tag = 0
# if tmp['nObjSize'] > 10: # try exit
# pipeline.free()
pipeline.config("display", (lcd_width, lcd_height, "ARGB", argb.tobytes()))
pipeline.free()
第四步:通过下文的 bark.py
即可利用 bark 向手机发送提醒。
import requests
def send_bark_notification(title, message):
# 请在下面的字符串中替换为您自己的Bark的URL
url = "https://api.day.app/YOUR_BARK_KEY/"
# 构造请求的URL
request_url = url + title + "/" + message
# 发送HTTP请求
response = requests.get(request_url)
# 打印响应结果
print(response.text)
第五步:这时可以找相关的测试物来测试效果,爱芯派识别到跌倒现象会向手机发送预警。
https://www.bilibili.com/vide...
To Be Continue
基于关键点检测的二次衍生【跌倒检测并预警】应用文章到这里结束啦,其实很多小伙伴对于板卡是还处于玩具(把玩)阶段,并不能利用板卡性能去实际落地到应用及项目,但经过爱芯派这一系列的应用部署教程文,相信大家能够收获颇丰,实际得把板卡往更进阶的方向用起来!
常见问题
- 出现模型识别不到或识别效果差的情况
在进行算法测试的过程中,发现了因为训练模型所使用数据集的问题,使得该模型不能很好的识别正在摔倒或者是倒在地上的人体。
鉴于数据集的来源都没有人物摔倒的图片,即使做了数据增强但其策略不够激进,还是无法识别到摔倒的人。
因此为数据集增加了更多人物倒下的数据和将原来的部分人物进行旋转90度进行重新训练,最终的识别效果非常好。
回顾往期文章
MAIX-III AXera-Pi 系列文章(1):新一代 3.6T 视觉 AI Linux 板卡面世
MAIX-III AXera-Pi 系列文章(2):丰富多采的 AI 应用
MAIX-III AXera-Pi 系列文章(3):Debian 系统 & 开箱案例
MAIX-III AXera-Pi 系列文章:开箱之硬件初体验
MAIX-III AXera-Pi 系列文章:上手之丝滑玩转 AI 板卡【一】
MAIX-III AXera-Pi 系列文章:上手之丝滑玩转 AI 板卡【二】
YOLOv8 目标检测:训练自定义数据集并部署到爱芯派(一)
YOLOv8 目标检测:训练自定义数据集并部署到爱芯派(二)
还想了解更多内容?
内容 | 链接 |
---|---|
AXera-Pi 产品介绍 | https://mp.weixin.qq.com/s/JIvVprWlQPvE7bTxozAG_Q |
AXera-Pi 产品资料 | wiki.sipeed.com/m3axpi |
海外购买渠道 | https://fr.aliexpress.com/item/1005005016931077.html |
国内购买渠道 | https://item.taobao.com/item.htm?id=682169792430 |
AI 开发工具链 | https://pulsar-docs.readthedocs.io/ |
AI 示例仓库 | https://github.com/AXERA-TECH/ax-samples |
Python API | https://github.com/junhuanchen/ax-pipeline-api |
系统 BSP SDK | https://github.com/sipeed/axpi_bsp_sdk |
基础 C++ SDK | https://github.com/sipeed/libmaix |
进阶 C++ SDK | https://github.com/AXERA-TECH/ax-pipeline |
AXERA 技术交流群 | 专供 AI ISP 技术交流:139953715 |
荔枝 MaixPy3 AI 交流群 | 产品开箱小白答疑:756313869 |
AI 训练平台 | http://maixhub.com |
在线文档 | http://wiki.sipeed.com |
交流社区 | http://bbs.sipeed.com |
开源组织 | http://github.com/sipeed |
官方推特 | https://twitter.com/SipeedIO |
商业邮箱 | support@sipeed.com |