💛前情提要💛
本文是传知代码平台
中的相关前沿知识与技术的分享~
接下来我们即将进入一个全新的空间,对技术有一个全新的视角~
本文所涉及所有资源均在传知代码平台可获取
以下的内容一定会让你对AI 赋能时代
有一个颠覆性的认识哦!!!
以下内容干货满满,跟上步伐吧~
📌导航小助手📌
- 💡本章重点
- 🍞一. 概述
- 🍞二. 技术方案
- 🫓总结
💡本章重点
- 多行人姿态检测系统
🍞一. 概述
本项目创新在于采用多级网络串联工作来进行目标的行为分析,并使用在视频监控领域,可部署在任何有需要的人员流动密集场所(如医院,机场,养老院等)或者用于空巢老人陪伴看护,有极强的社会实用价值。项目基于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()
🫓总结
综上,我们基本了解了“一项全新的技术啦” 🍭 ~~
恭喜你的内功又双叒叕得到了提高!!!
感谢你们的阅读😆
后续还会继续更新💓,欢迎持续关注📌哟~
💫如果有错误❌,欢迎指正呀💫
✨如果觉得收获满满,可以点点赞👍支持一下哟~✨
【传知科技 – 了解更多新知识】