首页 > 编程语言 >计算机视觉算法中的人体动作识别(Human Action Recognition)

计算机视觉算法中的人体动作识别(Human Action Recognition)

时间:2023-09-17 11:32:43浏览次数:51  
标签:动作 cv2 光流 人脸 Human Action 识别 Recognition 人体

引言

人类的动作是一种非常重要的信息来源,它能传达出人们的意图、情感和行为。因此,对于计算机来说,能够准确识别和理解人体动作是一项具有挑战性的任务。计算机视觉领域中的人体动作识别(Human Action Recognition)旨在从图像或视频中自动识别和解释人体的运动模式和行为。本文将介绍人体动作识别的重要性、应用领域以及常见的计算机视觉算法。

重要性和应用领域

人体动作识别在许多领域都具有重要的应用价值。以下是一些常见的应用领域:

视频监控和安全

人体动作识别可以帮助监控系统自动检测和报警异常行为,如盗窃、暴力等。它可以用于公共场所、银行、机场等地方的安全保障。

人机交互和虚拟现实

人体动作识别可以用于人机交互系统,例如手势识别和姿势控制。它可以帮助用户直观地与计算机进行交互,提供更自然、便捷的操作方式。此外,在虚拟现实领域,人体动作识别可以用于实时追踪用户的动作,实现更真实的交互体验。

运动分析和康复辅助

人体动作识别可以用于运动分析和康复辅助。它可以帮助运动员改善技术,提高运动表现。同时,它还可以用于康复辅助,帮助康复者监测和评估康复训练的效果。

媒体与娱乐

人体动作识别可以用于电影特效、游戏和虚拟角色的控制。它可以使虚拟角色根据用户的动作实时作出相应的反应,增强娱乐体验。

计算机视觉算法

人体动作识别是一个复杂而多样化的任务,需要结合多种计算机视觉算法来实现。以下是一些常见的算法:

基于深度学习的方法

深度学习在人体动作识别中取得了显著的突破。基于卷积神经网络(CNN)的方法可以从图像或视频中提取特征,并使用循环神经网络(RNN)或长短时记忆网络(LSTM)来捕捉时间序列信息。这些方法具有较好的识别性能,但需要大量的标注数据和计算资源。

基于姿态估计的方法

姿态估计是人体动作识别的重要预处理步骤。它可以通过关节点的检测和跟踪来提取人体的姿势信息。基于姿态估计的方法可以使用关节轨迹、关节角度等信息来表示和识别人体动作。

基于光流的方法

光流是一种表示图像中像素运动的方法。基于光流的方法可以通过计算连续帧之间的光流场来捕捉人体的运动信息。这些方法通常用于处理视频序列,对于动作的快速变化和细节变化具有较好的鲁棒性。

以下是一种基于光流的方法的算法,用于实现光流跟踪:

  1. 首先,选择两幅连续的图像作为输入,分别称为前一帧和当前帧。
  2. 对前一帧和当前帧进行预处理,例如灰度化或彩色去噪等操作。
  3. 使用光流算法(如Farneback算法或Lucas-Kanade算法)计算前一帧和当前帧之间的光流场。光流场表示了图像中每个像素的运动信息。
  4. 根据计算得到的光流场,可以选择不同的方法来跟踪光流。
  • 一种常见的方法是使用光流向量的方向和大小来估计目标的运动轨迹。可以通过设置一个阈值来筛选出具有一定运动量的光流向量,然后根据这些光流向量的位置信息来估计目标的运动轨迹。
  • 另一种方法是使用光流向量的方向和大小来估计目标的运动速度。可以计算光流向量的平均值或最大值来得到目标的平均运动速度或最大运动速度。
  1. 根据跟踪结果可以进行进一步的分析和应用,例如目标检测、目标跟踪、动作识别等。 需要注意的是,光流算法的选择和参数设置会对跟踪结果产生影响,因此在实际应用中需要根据具体情况进行调整和优化。 以下是一个基于Farneback算法的光流跟踪的示例代码:
pythonCopy codeimport cv2
import numpy as np
# 读取视频文件
cap = cv2.VideoCapture('input.mp4')
# 读取第一帧
ret, frame1 = cap.read()
prvs = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY)
# 创建光流图像的掩码
hsv = np.zeros_like(frame1)
hsv[...,1] = 255
while(1):
    # 读取当前帧
    ret, frame2 = cap.read()
    next = cv2.cvtColor(frame2,cv2.COLOR_BGR2GRAY)
    # 计算光流
    flow = cv2.calcOpticalFlowFarneback(prvs,next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
    # 将光流转换为颜色图像
    mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1])
    hsv[...,0] = ang*180/np.pi/2
    hsv[...,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX)
    rgb = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
    # 显示光流图像
    cv2.imshow('Optical Flow',rgb)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    # 更新前一帧
    prvs = next
cap.release()
cv2.destroyAllWindows()

在这个示例代码中,我们使用OpenCV库中的calcOpticalFlowFarneback函数来计算两帧之间的光流。我们读取视频文件,并将第一帧作为前一帧。然后,我们使用while循环读取视频的每一帧,并计算每一帧与前一帧之间的光流。接下来,我们将光流转换为颜色图像,并显示在窗口中。最后,我们通过按下'q'键来停止光流跟踪并关闭窗口。

基于特征提取和分类的方法

传统的计算机视觉方法通常使用手工设计的特征来表示人体动作,并使用机器学习算法进行分类。例如,使用光流直方图、形状描述符等特征进行动作识别。这些方法在一些小规模数据集上具有较好的性能。

以下是一个示例代码,用于实现基于姿态估计的方法:

pythonCopy codeimport cv2
import numpy as np
# 加载预训练的人脸检测器和姿态估计器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
pose_estimator = cv2.dnn.readNetFromTensorflow('pose_deploy_linevec_faster_4_stages.pb')
# 读取输入的图像
image = cv2.imread('input.jpg')
# 将图像转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 人脸检测
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
# 遍历检测到的人脸
for (x, y, w, h) in faces:
    # 提取人脸区域
    face_roi = image[y:y+h, x:x+w]
    # 对人脸区域进行姿态估计
    blob = cv2.dnn.blobFromImage(face_roi, 1.0, (224, 224), (104.0, 177.0, 123.0), False, False)
    pose_estimator.setInput(blob)
    output = pose_estimator.forward()
    # 解析姿态估计结果
    for i in range(0, output.shape[2]):
        confidence = output[0, 0, i, 2]
        if confidence > 0.5:
            # 获取关键点坐标
            x_coord = int(output[0, 0, i, 3] * w)
            y_coord = int(output[0, 0, i, 4] * h)
            # 在人脸区域绘制关键点
            cv2.circle(face_roi, (x_coord, y_coord), 3, (0, 255, 0), -1)
    # 在原图像中绘制人脸和姿态估计结果
    cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)
    cv2.imshow('Output', image)
# 显示结果
cv2.waitKey(0)
cv2.destroyAllWindows()

这段代码使用OpenCV库实现了基于姿态估计的方法。首先,加载了预训练的人脸检测器和姿态估计器。然后,读取输入的图像,并将其转换为灰度图像。接下来,使用人脸检测器检测图像中的人脸区域。对于每个检测到的人脸,提取人脸区域并对其进行姿态估计。通过解析姿态估计结果,可以得到人脸的关键点坐标。最后,将绘制出的关键点和人脸框添加到原图像中,并显示结果。

挑战与展望

尽管人体动作识别在许多领域都具有广泛的应用,但仍然存在许多挑战需要克服。以下是一些挑战:

  • 视角变化和遮挡:人体动作识别需要对不同视角和遮挡下的人体动作进行准确识别。
  • 多人动作识别:如何区分和识别多个人之间的不同动作是一个具有挑战性的问题。
  • 数据缺乏和标注困难:获取大规模的标注数据集是人体动作识别的一个关键问题。
  • 实时性和效率:实时性是一些应用领域中的重要需求,需要高效的算法和系统来满足这一需求。 未来,随着深度学习和计算机视觉技术的不断发展,人体动作识别将会取得更大的突破。同时,结合其他传感器(如深度传感器、惯性传感器等)的信息,将能够更准确地对人体的运动进行分析和理解。

结论

人体动作识别是计算机视觉领域中的一个重要研究方向,具有广泛的应用价值。通过使用深度学习、姿态估计、光流和特征提取等算法,可以实现对人体动作的自动识别和解释。然而,仍然有许多挑战需要解决,如视角变化、多人动作识别和数据缺乏等。未来,随着技术的发展,我们可以期待更准确、高效的人体动作识别算法,为人们提供更好的服务和体验。

标签:动作,cv2,光流,人脸,Human,Action,识别,Recognition,人体
From: https://blog.51cto.com/u_15702012/7500483

相关文章

  • IFAction导出的游戏如何在linux程序下运行?
    在linux系统里,应该都自带python环境,把游戏以web方式导出,在文件夹下创建一个python文件(文件后缀以.py结束),把以下代码复制进去,#author:rkey#date:20230904#note:用于解决IFAction导出的web版游戏在linux系统下运行的问题。importtkinterastkfromthreadingimportThrea......
  • delegate IDE buildrun actions actions to Maven
    IDEA中的maven项目下,可能出现这种情况:代码编辑器中无编译错误,通过maven的clean、compile、package进行各种操作也都没问题,但是单击绿色箭头运行(默认会先执行IDE本身的Build操作)却报:程序包xxx不存在使用IDEA运行maven项目,代码没有编译错误运行却报错:"程序包xxx不存在"的问题,......
  • vue vuex module mapActions
    新建vue项目 main.jsimportVuefrom'vue'importAppfrom'./App.vue'importstorefrom'@/store'Vue.config.productionTip=false;newVue({render:h=>h(App),store}).$mount('#app');app.vue<template>......
  • Paper reading: Improving Deep Forest by Exploiting High-order Interactions
    目录研究动机文章贡献本文方法通过gRIT和ERF提取特征交互特征交互的稳定性分数自适应层次生成实验结果合成数据集实验真实数据集实验数据集实验设置实验结果计算复杂度优点和创新点PaperReading是从个人角度进行的一些总结分享,受到个人关注点的侧重和实力所限,可能有理解不......
  • Training language models to follow instructions with human feedback
    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布!NeurIPS 2022 Abstract将语言模型做得更大并不能从本质上使它们更好地遵循用户的意图。例如,大型语言模型可能生成不真实、有害或对用户毫无帮助的输出。换句话说,这些模型与其用户不一致。在本文中,我们展示了一种通......
  • 在dva.js里面发送异步action
    在dva.js的effects里面不能使用setTimeout,会报错。得使用redux-saga的delay才行(注:dva.js内置了redux-saga)。如下,这样才能延时。 ......
  • SMON: Parallel transaction recovery tried
    这个一般是在具有在跑大数据量的transaction的时候kill掉了进程而导致smon去清理回滚段时导致的。这个在业务高峰期的时候,如果发现这个,有可能导致SMON占用了100%cpu而导致系统hang在那边。即使你shutdownimmediate,Oracle也会等待smon清理完毕才能关机,而这个等待过程......
  • 关于intent之android.intent.action.USER_PRESENT的接收与使用
    在做解锁监听程序时,一开始采用监听屏幕SCREEN_ON和SCREEN_OFF这两个action。但奇怪的是,这两个action只能通过代码动态的形式注册,才能被监听到,使用AndroidManifest.xml完全监听不到。百度后发现这是PowerManager那边在发这个广播的时候做了限制,限制只能有register到代......
  • 使用Github Action在Github Pages上部署vue页面
    GithubAction部分:name:NodeJSon:push:branches:["master"]#SetspermissionsoftheGITHUB_TOKENtoallowdeploymenttoGitHubPagespermissions:contents:write#Allowonlyoneconcurrentdeployment,skippingrunsqueuedbetwee......
  • 2023-09-08 类型“any[]”的参数不能赋给类型“SetStateAction<never[]>”的参数 ==》
    如题,react+taro+ts小程序开发,在给一个变量设值的时候报错,如:初始化变量const[isChecked,setCheck]=useState([]);设值setCheck([123]);原因:默认[]会被ts推导成never[]类型。解决方案:把useState改为useState<any[]>即可,即:const[isChecked,setCheck]=useStat......