传知代码-多行人姿态检测系统

news2024/9/25 11:22:27

代码以及视频讲解

本文所涉及所有资源均在传知代码平台可获取

概述

本项目创新在于采用多级网络串联工作来进行目标的行为分析,并使用在视频监控领域,可部署在任何有需要的人员流动密集场所(如医院,机场,养老院等)或者用于空巢老人陪伴看护,有极强的社会实用价值。项目基于PaddlePaddle平台,通过多任务网络级联的方式实现了多目标跟踪以及姿态检测的系统,通过实时反馈监控人员的信息,结合场景提供相应的需求帮助。区别于市场上的已有产品,本项目提出的系统的应用场景比较清晰,通过多任务级联的方式,提取出了视频中人流的人员位置信息、人员ID信息以及人员行为信息,针对异常行为实时发出警报,在节省人力的同时最大限度地保障人员权益和安全

作品的市场价值及推广性

本系统使用简单,能够自动实时地对老人、儿童、残障人士等实现看护,因而容易在这一目标用户进行推广。
当今处于老龄化的社会,老年人数量基数大,同时由于独生子女政策和社会压力的剧增,导致子女很难抽出时间去照顾老人和儿童,而本产品能够在保障被看护人员安全的前提下最大限度地减少看护人员的精力投入,易于被年轻人所接受。
养老院、医院数量的增多、交通的日益发达,这些应用场景均可作为本产品的受众对象,能够帮助其解决人员优化调度的问题。
在这里插入图片描述

技术方案

该项目的AI技术方向为多目标跟踪以及人体姿态估计算法方面,本作品涉及到目标检测,目标跟踪,关键点检测以及人体姿态分类等一系列算法技术,对这些算法的应用融合,实时对目标人员进行确认、跟踪、检测和异常行为识别和处理等。选用的是飞桨PaddlePaddle2.0作为框架,可以部署到Jetson AGX Xavier平台上。

人体姿态关键点检测

# PoseEstimateLoader姿态估计
class SPPE_FastPose(object):          #sppe单人姿态估计
    def __init__(self,
                 backbone,
                 input_height=320,
                 input_width=256,
                 device='cuda'):
        assert backbone in ['resnet50', 'resnet101'], '{} backbone is not support yet!'.format(backbone)

        self.inp_h = input_height
        self.inp_w = input_width
        self.device = device

        self.model = InferenNet_fastRes50()
        self.model.eval()

    def predict(self, image, bboxs, bboxs_scores):
        inps, pt1, pt2 = crop_dets(image, bboxs, self.inp_h, self.inp_w)
        pose_hm = self.model(inps)

        # Cut eyes and ears.
        pose_hm = paddle.concat([pose_hm[:, :1, :, :], pose_hm[:, 5:, :, :]], axis=1)

        xy_hm, xy_img, scores = getPrediction(pose_hm, pt1, pt2, self.inp_h, self.inp_w,
                                              pose_hm.shape[-2], pose_hm.shape[-1])
        result = pose_nms(bboxs, bboxs_scores, xy_img, scores)
        return result

跌倒分类

采用姿态检测的结果,考虑到跌倒的过程是一个时序的过程,很难通过单张图片来区分行人是否摔倒,因而采用时空图卷积网络(Spatial Temporal Graph Convolution Network, ST-GCN)来进行跌倒的识别。人体姿态流程如图所示。
在这里插入图片描述

class TSSTG(object):
    def __init__(self,
                 weight_file="./Models/TSSTG/tsstg-model.pdparams",
                 device='cuda'):
        self.graph_args = {'strategy': 'spatial'}
        self.class_names = ['Standing', 'Walking', 'Sitting', 'Lying Down',
                            'Stand up', 'Sit down', 'Fall Down']
        self.num_class = len(self.class_names)
        self.device = device

        
        self.model.eval()

    def predict(self, pts, image_size):
        
        pts[:, :, :2] = normalize_points_with_size(pts[:, :, :2], image_size[0], image_size[1])
        pts[:, :, :2] = scale_pose(pts[:, :, :2])
        pts = np.concatenate((pts, np.expand_dims((pts[:, 1, :] + pts[:, 2, :]) / 2, 1)), axis=1)

        pts = paddle.to_tensor(pts, dtype='float32')
        pts = pts.transpose((2, 0, 1)).unsqueeze(0)

        mot = pts[:, :2, 1:, :] - pts[:, :2, :-1, :]

        out = self.model((pts, mot))

        return out.detach().numpy()

完整项目运行代码

环境搭建

百度飞桨2.1.2版本安装

#根据自己的cuda环境选择安装对应PaddlePaddle版本
# CPU only
python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple 
# CUDA 10.1
python -m pip install paddlepaddle-gpu==2.1.3.post101 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html
# CUDA 10.2
python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
# CUDA 11.0
python -m pip install paddlepaddle-gpu==2.1.3.post110 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html
# CUDA 11.2
python -m pip install paddlepaddle-gpu==2.1.3.post112 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html

安装完成后即可运行我们的项目啦!

代码运行推理

! python main.py -h
  • 模型输入可以直接为摄像头作为视频源或者用下载好的视频作为视频源,通过 -C 进行配置。
  • 输出的渲染视频保存在save_out的路径下。
  • 如果在非服务器端可以通过设置在窗口进行实时画面的显示。

视频推理

在main.py文件中找到source并添加所需推理的视频路径,如果需要使用本机的摄像头则将sourced设置为0,最后命令行运行下列代码
在这里插入图片描述

! python main.py -C  --save_out infer_output/tkk.mp4

视频显示

# video display
import imageio
import cv2
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
from IPython.display import HTML

# 定义一个展示视频的函数
def display(driving, fps, size=(8, 6)):
    fig = plt.figure(figsize=size)

    ims = []
    for i in range(len(driving)):
        cols = []
        cols.append(driving[i])

        im = plt.imshow(np.concatenate(cols, axis=1), animated=True)
        plt.axis('off')
        ims.append([im])

    video = animation.ArtistAnimation(fig, ims, interval=1000.0/fps, repeat_delay=1000)

    plt.close()
    return video
video_path = './infer_output/test2-1.mp4'  # 相对路径
video_frames = imageio.mimread(video_path, memtest=False)

# 获得视频的原分辨率
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
    

HTML(display(video_frames, fps).to_html5_video())

部署方式

源码及部署详情请看附件
权重下载

在这里插入图片描述
源码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1914865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot实现轻量级的动态定时任务调度

在使用SpringBoot框架进行开发时,一般都是通过Scheduled注解进行定时任务的开发: Component public class TestTask {Scheduled(cron"0/5 * * * * ? ") //每5秒执行一次public void execute(){SimpleDateFormat df new SimpleDateFormat(…

自定义枚举对象序列化规则: 在Json中以枚举的code值表示枚举;枚举序列化时,新增枚举描述字段;String到IEnum的转换

文章目录 引言I 案例分析1.1 接口签名计算1.2 请求对象1.3 枚举对象序列化1.4 创建JavaTimeModule以支持Java 8的时间日期类型序列化和反序列化1.5 请求对象默认值处理II 在JSON中以枚举的code值来表示枚举的实现方式2.1 自定义toString方法返回code2.2 使用@JsonValue注解,只…

buuctf面具下的flag

细节: 这道题可能因为是vmdk的原因 导致在window上 7z无法得到全部的信息 所以最后解压要在linux系统上 解密网站 Brainfuck/Ook! Obfuscation/Encoding [splitbrain.org] 这道题010打开,可以发现里面隐藏了很多 binwalk解压 两个文件 vmdk可以直接 用7z解压 7z x flag.…

1. InternLM - 入门岛

第1关 Linux 基础知识 1. 完成SSH连接与端口映射并运行hello_world.py SSH连接配置 # wsl2中生成密钥对(~/.ssh/id_rsa, ~/.ssh/id_rsa.pub) ssh-keygen -t rsa# 将id_rsa.pub在internStudio作为公钥导入SSH登录 $ ssh -p 38871 rootssh.intern-ai.o…

如何监控 PostgreSQL 中表空间的使用情况并进行合理的管理?

文章目录 如何监控 PostgreSQL 中表空间的使用情况并进行合理的管理 一、引言 在 PostgreSQL 数据库中,表空间(Tablespace)是用于管理数据库对象存储位置的逻辑存储区域。有效地监控和管理表空间的使用情况对于确保数据库的性能、优化存储资…

Flutter 开启混淆打包apk,并反编译apk确认源码是否被混淆

第一步:开启混淆并打包apk flutter build apk --obfuscate --split-debug-info./out/android/app.android-arm64.symbols 第二步:从dex2jar download | SourceForge.net 官网下载dex2jar 下载完终端进入该文件夹,然后运行以下命令就会在该…

【多GPU训练方法】

一、数据并行 这是最常用的方法。整个模型复制到每个GPU上。训练数据被均匀分割,每个GPU处理一部分数据。所有GPU上的梯度被收集并求平均。通常使用NCCL(NVIDIA Collective Communications Library)等通信库实现。参数更新 使用同步后的梯度…

愚人杯的RE题

easy_pyc pyc反编译成py文件 # uncompyle6 version 3.9.1 # Python bytecode version base 2.7 (62211) # Decompiled from: Python 3.11.8 (tags/v3.11.8:db85d51, Feb 6 2024, 22:03:32) [MSC v.1937 64 bit (AMD64)] # Embedded file name: enpyc.py # Compiled at: 2023…

批量下载手机中APP程序中文件

需求 利用 adb pull 下载手机中app的某目录 adb pull 命令本身不支持直接下载整个目录(文件夹)及其所有子目录和文件作为一个单一的操作。但是,可以通过一些方法来间接实现这一目的。 方法 1. 首先将要下载的目录进行 tar 打包 # 在 And…

初阶C++(三)

初阶C(三) 指针和引⽤的关系inline介绍对inline的运用宏函数与inline关系nullptr NULL在C中有歧义nullptr引用 指针和引⽤的关系 C中指针和引⽤就像两个性格迥异的亲兄弟,指针是哥哥,引⽤是弟弟,在实践中他们相辅相成,…

单向链表队列

实现单向链表队列的&#xff0c;创建&#xff0c;入队&#xff0c;出队&#xff0c;遍历&#xff0c;长度&#xff0c;销毁。 queue.h #ifndef __QUEUE_H__ #define __QUEUE_H__#include <stdio.h> #include <stdlib.h> #include <string.h> #define max 30…

Docker 使用基础(2)—镜像

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;秒針を噛む—ずっと真夜中でいいのに。 0:34━━━━━━️&#x1f49f;──────── 4:20 &#x1f504; ◀️ ⏸ …

【机器学习】(基础篇三) —— 线性回归

线性回归 本文介绍最经典的监督学习问题——线性回归&#xff0c;包括单变量线性回归和多变量线性回归 线性回归是回归任务&#xff0c;输入是带有标签的数据&#xff0c;根据数据关系&#xff0c;拟合出一个线性函数&#xff0c;并利用该函数进行预测等操作。线性回归分为单…

AirPods Pro新功能前瞻:iOS 18的五大创新亮点

随着科技的不断进步&#xff0c;苹果公司一直在探索如何通过创新提升用户体验。iOS 18的推出&#xff0c;不仅仅是iPhone的一次系统更新&#xff0c;更是苹果生态链中重要一环——AirPods Pro的一次重大升级。 据悉&#xff0c;iOS 18将为AirPods Pro带来五项新功能&#xff0…

LLM 研究方向(一): LLM Prompts--p-tuning、LoRA

目录 1. prompt-tuning background 2. Prompt Tuning 模型介绍 2.1 2021 prefix-tuning 2.2 2021 P-tuning v1 2.3 2021 Parameter-efficient prompt tuning (PET) 2.4 2022 P-tuning v2 2.5 2019 Adapter ​2.6 2021 LoRA (Low-Rank Adaptation) 2.7 2024 DoRA (…

剖析自闭症孩子玩手的独特之处

自闭症孩子玩手的行为常常具有一些较为独特的特点。 重复性是一个显著的特征。他们可能会以一种几乎相同的方式、节奏和频率反复地摆弄自己的手&#xff0c;例如不停地握拳、张开&#xff0c;或者持续地旋转手腕。 动作的单调性也是常见的。玩手的方式可能较为单一&#xff0c;…

python怎么求因数

要想做到python语言求因数方法&#xff0c;首先要明白其中的原理&#xff1a; 1、对由123456789这九个数字组成的9位数进行分解质因数。 2、1234576982x3x3x7x13x23x29x113&#xff0c;所以他的值因数是113。 3、总共有362880种可能&#xff0c;从中找出值因数中最小的数字和…

如何将heic格式转换jpg?四种将heic转换成jpg的方法!

如何将heic格式转换jpg&#xff1f;在现今的数字图像处理领域&#xff0c;Heic格式作为一种被吹捧的创新型图像格式&#xff0c;以其先进的压缩技术&#xff0c;迅速减小了图片文件的大小&#xff0c;然而&#xff0c;尽管其有许多优点&#xff0c;实际使用中Heic格式却带来了一…

视频解码故障案例两则

案例1 绿边 故障分析&#xff1a; 这个能明显看到视频上方出现绿色半透明边带。这说明Y数据正常。UV数据不正常。 它显然与视频帧的垂直分辨率设置有关。 UV数据和Y数据是连续放置的&#xff0c;如果上方出现彩色数据失调&#xff0c;说明这部分数据实际仍然是Y数据。也就是…

用微信服务号支付门诊缴费

时间上午10刚过&#xff0c;医院里计价收费处排起了长龙&#xff0c;放眼望去&#xff0c;左边的窗口六条队。右边在原来发药的位置也开辟了收费窗口&#xff0c;数了一下有四条队。一共十条排队付费的长龙&#xff0c;每一条队伍的人数不下20人&#xff0c;也即超过200人在排队…