矽速科技 · 2023年05月05日 · 广东

MMPoes(衍生章):如何在爱芯派上实现跌倒检测并预警

在我们实现关键点检测并部署时
是否曾联想过可以借助关键点衍生出跌倒检测的实地场景应用呢?

前言

跌倒是老年人群中最常见的意外事件,这也是直接导致老年人伤残或者是死亡的几大元凶之一,我们该如何去减少老年人因跌倒带来的身体伤害及快速救治,可借助前文实现的人体骨骼关键点检测来实现对跌倒的实时检测及预警。

  • 以下视频为跌倒检测实现预警效果

https://www.bilibili.com/vide...

流程导读

本文是基于:MMPose:在爱芯派上玩转你的关键点检测 此文章的二次应用衍生文章,请先阅读完前文再接着往下学习如何实现跌倒检测。

文章补充说明

仓库:GitHub - prophet-mu/elderly_fell_detect
本文基于 prophet-mu 原文 进行整理以及补充发布。

要做什么

第一步:使用上文骨骼关键点检测拿到的关键点数据进行滤波处理
第二步:通过算法来判断人体当前姿态
第三步:部署在爱芯派上并且能够向手机发送 摔倒检测 结果通知

该怎么做

  • 模型训练:获取上文已训练好的模型
  • 模型部署:将模型部署到生产环境(爱芯派)中以便实际应用。
  • 算法实现:基于关键点的姿态识别算法
  • 预警通知:使用 Bark 来实现发送通知(iOSbark - 给你的手机发推送

模型训练及部署

模型训练以及部署的步骤可参考下文 MMPoes 的正文章节,这里不再浪费笔墨阐述。

MMPose:在爱芯派上玩转你的关键点检测

算法实现

判断人体是否出于跌倒状态可从以下方面去考虑:

  • 人体重心 y 方向的速度
  • 人体重心距离地面的高度
  • 头部和双脚中间连线和地面的夹角

这里使用了计算夹角来实现人体姿态的估计,为了尽可能的排除误差,我们使用 5 帧画面的坐标平均值作为一帧的坐标,再使用平均值坐标来判断人物是否躺在地面,然后使用 socket 向局域网的设备发送了 UDP 请求来进行更进一步的报警等操作。

本文以 Windows10 系统为例,首先参考以下文章学习连接爱芯派(推荐用 SSH 进行登录).

  1. 如何使用爱芯派网口进行 SSH 通信(推荐)
  2. 爱芯派系统使用手册
  3. 如何在 Mobaxterm 使用 SSH

第一步:确保成功连接后,如图进行操作进入爱芯派。

1681204631459.jpg

第二步:使用以下指令进入爱芯派的 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

基于关键点检测的二次衍生【跌倒检测并预警】应用文章到这里结束啦,其实很多小伙伴对于板卡是还处于玩具(把玩)阶段,并不能利用板卡性能去实际落地到应用及项目,但经过爱芯派这一系列的应用部署教程文,相信大家能够收获颇丰,实际得把板卡往更进阶的方向用起来!

常见问题

  • 出现模型识别不到或识别效果差的情况

在进行算法测试的过程中,发现了因为训练模型所使用数据集的问题,使得该模型不能很好的识别正在摔倒或者是倒在地上的人体。

1683275395234.jpg

鉴于数据集的来源都没有人物摔倒的图片,即使做了数据增强但其策略不够激进,还是无法识别到摔倒的人。
因此为数据集增加了更多人物倒下的数据和将原来的部分人物进行旋转90度进行重新训练,最终的识别效果非常好。

1683275425745.jpg

回顾往期文章

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 目标检测:训练自定义数据集并部署到爱芯派(二)

MMPose:在爱芯派上玩转你的关键点检测

MOT:如何在爱芯派上实现多目标跟踪的神奇效果!

还想了解更多内容?

内容链接
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 APIhttps://github.com/junhuanchen/ax-pipeline-api
系统 BSP SDKhttps://github.com/sipeed/axpi_bsp_sdk
基础 C++ SDKhttps://github.com/sipeed/libmaix
进阶 C++ SDKhttps://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
推荐阅读
关注数
7442
内容数
92
人工智能边缘计算软硬件解决方案,提供高性能、低成本、低功耗、易使用的硬件选型方案.
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息