代码以及视频讲解
本文所涉及所有资源均在传知代码平台可获取
概述
本项目创新在于采用多级网络串联工作来进行目标的行为分析,并使用在视频监控领域,可部署在任何有需要的人员流动密集场所(如医院,机场,养老院等)或者用于空巢老人陪伴看护,有极强的社会实用价值。项目基于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_heightself.inp_w = input_widthself.device = deviceself.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 = deviceself.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())
部署方式
源码及部署详情请看附件
权重下载
源码下载