【传知代码】多行人姿态检测系统(论文复现)

147 阅读5分钟

前言:随着计算机视觉技术的飞速发展,人体姿态检测已成为计算机视觉领域的一个热门研究方向。特别是在公共场所监控、智能交通、人机交互等应用场景中,多行人姿态检测系统的应用显得尤为关键。这类系统不仅能够实时准确地识别出图像或视频中的多个人体,并且能够进一步分析每个人的姿态信息,如站立、行走、坐下、弯腰等,从而为后续的分析和决策提供有力支持。

本文旨在全面介绍多行人姿态检测系统的最新研究成果和应用进展。首先,我们将简要回顾多行人姿态检测的发展历程和关键技术;其次,我们将详细介绍基于深度学习的多行人姿态检测算法的原理和实现方法;接着,我们将分析当前多行人姿态检测系统面临的挑战和存在的问题,并探讨可能的解决方案;最后,我们将展望多行人姿态检测系统的未来发展趋势和应用前景。

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

概述

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

1712649305148_image.png

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

原理实现方法

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

1712648514626_image.png

代码实现如下:

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()

人体姿态的关键点检测:

# 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

这里通过百度飞桨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

 1)模型输入可以直接为摄像头作为视频源或者用下载好的视频作为视频源,通过 -C 进行配置。

2)输出的渲染视频保存在save_out的路径下。

3)如果在非服务器端可以通过设置在窗口进行实时画面的显示。

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

1712653260212_image.png

核心代码如下:

# 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())

写在最后

多行人姿态检测系统仍将继续发展。一方面,随着计算机硬件性能的提升和深度学习技术的不断进步,系统的实时性和准确性将得到进一步提升;另一方面,随着应用场景的不断拓展和深化,系统需要更加关注行人的个性化需求和行为模式,以实现更加智能化、精细化的检测和分析,多行人姿态检测系统是一个具有广阔应用前景和重要研究价值的领域。通过深入研究系统架构、关键算法、应用场景以及未来发展趋势等方面,我们可以不断推动该领域的技术进步和应用创新,为社会的智能化发展做出更大的贡献。

详细复现过程的项目源码、数据和预训练好的模型可从该文章下方附件获取

【传知科技】关注有礼     公众号、抖音号、视频号