📢前言:姿势估计作为计算机视觉领域中的一个重要分支,本章将介绍姿势估计和一个用于姿势估计的工具。并以斑马鱼的运动视频为例,手把手教你如何用deeplabcut训练自己的数据。
目录
Ⅰ 初识姿势估计
0x00 姿势估计介绍
姿势估计(Pose Estimation)是指从图像或视频中识别和推断人体或物体的姿势或关节位置的过程。它是计算机视觉领域中的一个重要任务,具有广泛的应用领域,包括人机交互、运动分析、医疗诊断、安防监控等。
姿势估计是指通过计算机视觉和机器学习技术,从图像或视频数据中推断出目标物体或人体的姿势信息,即确定其关节的位置和姿态。姿势估计在许多领域中都有广泛的应用,包括人机交互、行为分析、运动捕捉、姿势识别等。
姿势估计可以分为两类:2D姿势估计和3D姿势估计。
-
2D姿势估计:2D姿势估计旨在从二维图像中推断出目标物体或人体的关节点位置。通常采用的方法是使用深度学习技术,通过训练模型来学习从图像中检测和定位关节点。常见的2D姿势估计方法包括基于人工标记数据的姿势估计和基于单人姿势估计的方法。
-
3D姿势估计:3D姿势估计旨在从图像或视频中推断出目标物体或人体的三维关节位置和姿态。由于从单个图像中无法直接获取深度信息,因此3D姿势估计是一个具有挑战性的问题。常见的方法包括基于多视角的3D姿势估计、基于深度学习的3D姿势估计和基于运动捕捉系统的3D姿势估计。
❓问题1:常见的姿势估计的方法有哪些呢?
-
基于关键点的方法:这是最常见和广泛应用的姿势估计方法之一。它通过检测和定位目标物体或人体的关节点来推断姿势信息。这些关节点通常代表身体的关键部位,如头部、肩膀、手臂、腿部等。该方法通常使用机器学习技术,如卷积神经网络(CNN)和图像处理算法,对关节点进行检测和定位。
-
基于模型的方法:这种方法利用预定义的人体模型或姿势模型来推断姿势信息。模型可以是基于物理学原理的刚体模型或者是统计学模型,如人体骨架模型或隐变量模型。基于模型的方法通常需要先进行模型拟合或参数估计,然后根据拟合结果推断姿势。
-
基于深度学习的方法:随着深度学习的发展,基于深度学习的姿势估计方法获得了很大的成功。这些方法使用深度神经网络来学习从图像或视频中直接推断姿势信息。常见的深度学习模型包括卷积神经网络(CNN)、递归神经网络(RNN)和卷积神经网络与长短期记忆网络(CNN-LSTM)等。
-
基于传感器的方法:除了使用图像和视频数据,还可以使用其他传感器数据来进行姿势估计。例如,使用惯性测量单元(IMU)或深度摄像头(如Microsoft Kinect)获取的深度和运动信息。这些传感器可以提供更丰富的数据,用于姿势估计和运动捕捉。
-
结合方法:姿势估计的方法也可以结合多种技术和方法,以提高准确性和鲁棒性。例如,可以结合基于关键点和基于模型的方法,或者将传感器数据与视觉数据相结合,实现多模态姿势估计。
❓问题2:常见的姿势估计的工具有哪些呢?
-
OpenPose:OpenPose是一个开源的姿势估计工具,使用深度学习技术实现对人体姿势的估计。它可以检测和定位人体的关节点,并生成与姿势相关的信息,如关节角度和身体姿态等。
-
DeepPose:DeepPose是一个基于深度学习的姿势估计框架,由微软研究院开发。它使用卷积神经网络(CNN)来实现对人体关节点的检测和定位,能够在复杂背景和遮挡情况下进行准确的姿势估计。
-
DeepLabCut:DeepLabCut是一个开源的姿势估计工具,主要用于动物行为学研究。它使用深度学习技术进行身体部位的识别和跟踪,可以用于分析和解释动物的运动模式和行为。
-
MediaPipe Pose:MediaPipe Pose是Google开发的一个实时姿势估计框架,提供高效的姿势估计算法和预训练模型。它可以在移动设备和桌面平台上实现实时的姿势跟踪,并支持多人姿势估计。
-
Kinect:Kinect是微软推出的一款深度摄像头设备,可以实现对人体姿势的实时跟踪。它结合了RGB图像和深度信息,通过自带的软件进行姿势估计和运动捕捉,广泛应用于游戏、虚拟现实和运动分析等领域。
既然提到了姿势估计,那肯定离不开另外一个技术:姿势识别
姿势识别(Pose Recognition)是指通过计算机视觉和机器学习技术,对特定的姿势或动作进行分类和理解。姿势识别的目标是将从图像或视频中提取的姿势信息与预定义的动作类别进行匹配,或者进行行为分析和动作识别。
姿势识别可以分为两个主要方面:
-
姿势分类:姿势分类是指将输入的姿势或动作与预定义的类别进行匹配。这需要训练一个分类模型,通过学习不同动作类别的特征和模式,来对输入的姿势进行分类。例如,可以识别出人体的站立、行走、跑步、举手等动作。
-
行为分析:行为分析旨在理解和分析特定的动作序列或行为模式。与姿势分类不同,行为分析更注重动作的上下文和序列信息。它涉及对一系列动作的分析,以推断出整个行为的含义和目的。例如,在体育领域,可以识别出篮球运动员的投篮动作、传球动作和防守动作,并分析出战术策略和技术能力。
❓问题3:姿势估计和姿势识别有什么区别呢?
可以说,姿势估计和姿势识别是两个相关但不同的概念。
姿势估计旨在从图像或视频数据中推断出目标物体或人体的姿势信息,即确定其关节的位置和姿态。
姿势识别旨在识别和理解特定姿势或动作的意义。它涉及对姿势进行分类或标记,以识别特定的动作或姿势模式。
姿势估计关注的是从图像或视频中推断出目标物体或人体的关节点位置和姿态,而姿势识别关注的是对特定姿势或动作进行分类和理解。姿势估计是实现姿势识别的基础,而姿势识别则在更高层次上对姿势进行语义理解和分析。两者相辅相成,共同为人体行为分析和人机交互提供重要的技术支持。
Ⅱ 初识姿势估计工具:DeepLabCut
0x00 简单介绍
本篇主要介绍一个用于姿态估计和运动跟踪的开源软件工具:DeepLabCut(DLC),并介绍该如何使用该工具对录制的视频进行姿势估计。
DeepLabCut基于深度学习技术,通过对图像和视频数据进行训练,能够识别和跟踪特定物体或生物的身体部位。它主要应用于行为学、神经科学和运动学等领域,在实验室研究和动物行为分析中得到广泛应用。
0x01 工作流程
DeepLabCut的工作流程包括以下几个步骤:
-
数据采集:使用摄像机记录目标物体或生物的行为,并生成图像或视频数据集。采集的数据应涵盖各种行为和姿势的变化,以及不同视角和环境条件下的情况。
-
标记数据:在数据集中手动标记目标物体或生物的身体部位。DeepLabCut提供了一个可视化界面,允许用户在每个帧中标记关键点或身体部位。这些标记将用于训练深度学习模型。
-
数据预处理:在训练模型之前,需要对数据进行预处理。这可能包括图像或视频的裁剪、大小调整、亮度和对比度的调整等,以确保数据质量和一致性。
-
训练网络:使用标记数据训练深度学习模型。DeepLabCut使用卷积神经网络(CNN)来学习从图像中检测和定位目标物体的身体部位。训练过程中,模型将学习关键点的空间位置和特征,以便在后续的测试中准确地识别和跟踪目标。
-
测试和优化:对测试数据进行预测和验证,评估训练好的模型的性能。可以使用未标记的数据集来测试模型的泛化能力和准确性。根据需要,可以对模型进行调整和优化,以提高其性能。
-
应用于新数据:使用训练好的模型对新的图像或视频数据进行姿态估计和运动跟踪。模型将识别和跟踪目标物体的关键点,并输出其位置和姿态信息。这些信息可以用于进一步的分析和研究,例如行为分析、运动模式分析等。
Ⅲ 实际演示
0x00 运行DeepLabCut
🚩注:这里默认读者已经安装好DeepLabCut,DLC共有两个版本,分别为GPU和CPU版本。
打开Anaconda Prompt
首先激活你为deeplabcut配置好的环境(建议大家创建一个新环境)
我设置的环境名称为DLC1
activate DLC1
进入ipython界面
ipython
打开deeplabcut
import deeplabcut
deeplabcut.launch_dlc()
示例图如下:
进入deeplabcut的页面,如下图:
0x01 创建项目
点击Manage Project
- 如果创建新的项目,点击create new project
- 如果导入已有的项目,点击load existing project
本篇以创建一个新的项目且项目中用到的视频为单动物(即视频中只有一只运动的动物)为例,
视频内容为一条运动的斑马鱼。
首先创建新的项目,并为项目命名;选择一个地方存放
点击OK,再点击Edit config file。
对原文件进行编辑,内容包括:从视频中提取多少张照片进行标记,标记点的大小,设计哪些标记点以及标记点之间的联系等等。
可选择用记事本方式打开(示意图仅展示需要修改的地方):
修改前的代码如下:
修改bodyparts,skeleton,numframes2pic部分,按需修改skeleton_color(连接处的颜色),dotsize(标记点的大小)等。
本次演示需要标记斑马鱼的头部与尾部,由于视频中斑马鱼较小,所以修改dotsize,标记的更精细。
设置numframes2pick为20,从视频中截取20张图片用于标记
🚩注:skeleton部分为需要连接的部分,如需要将头部和尾部之间建立骨架(通俗说就是要连在一起),可在skeleton部分写出,格式为:
--head
-tail
🚩注: numframes2pick部分为从视频中截取x张图片用于标记,此处设置为默认值20张。
0x02 标记数据
修改结束后保存,进入Extract frames
可以选择自动提取,或者人工手工提取图片,是否裁剪框架等,可以根据需要自己选择。
可选择不同的算法进行提取,这里选择kmeans。
点击OK,进入Label frames
点击Label frames,再点击load frames对图片进行标记
🚩注:等终端显示successfully extracted时再进行下一步
选择提取好的图片进行标记:
进入标记页面:
先介绍一下底部的按钮:
- Home:回到当前主页面
- Help:查看帮助文档
- Zoom:将选中的区域放大(效果如下图)
- Save:保存标记好的图片
介绍一下右侧的按钮:
由于斑马鱼较小,所以使用Zoom工具放大,并按鼠标右键进行标记。
🚩注:若不小心标记错误,可以用鼠标左键进行拖动,移动到想要标记的地方。
此前numframes2pick的值为20,故一共要标记20张,标记完成后点击save。
0x03 训练过程
点击Create training dataset,创建训练数据集。
可以选择不同的经典网络模型进行训,如resnet_50,resnet_101等。
这里我们选择resnet_101为训练网络。
可以选择不同的图像增强的方法 ,这里选择默认的imgaug。
可选择不同的网络进行比较:
这里只选择resnet_101为训练网络,暂不比较其他网络。
点击ok,完成数据集的创建,点击Train network
在源文件中修改训练参数,如下图:
分别修改display_iters, multi_step, save_iters。
简单介绍一下这三个参数:
-
display_iters
(显示迭代次数):它指定了在训练过程中每隔多少个迭代就显示一次训练损失或其他指标。通过显示训练过程中的指标,可以及时监控模型的训练进展和性能。 -
multi_step
(多步调整学习率):它是一个列表或元组,用于指定在训练过程中何时调整学习率。通常,学习率在训练过程中会进行调整以提高模型的收敛性和性能。multi_step
中的每个值表示在训练过程中经过多少个迭代后进行一次学习率调整。 -
save_iters
(保存迭代次数):它指定了在训练过程中每隔多少个迭代就保存一次模型。通过定期保存模型,可以在训练过程中保留模型的中间状态,以防止意外中断或用于后续的模型评估和推理。
这里设置为:
点击Update the parameters,更新修改后的参数。
得到如下示例图:
点击ok,开始训练。
终端中显示“Staritng training”:
🚩注:训练所花费的时间和迭代次数,电脑的显存,选择的训练网络等因素有关
训练中......
训练完成后,点击Evaluate network
点击RUN Evaluate network,若不需要编辑视频,可直接进入Analyze videos
若想要得到斑马鱼的运动的轨迹坐标图,可点击Want to plot the trajectories,并选择想要生成的部位。
生成的运动轨迹坐标图可在项目——videos——plot_poses——1中找到:
运动轨迹坐标图示例:
点击Step 1:Analyze Videos,分析结束后,进入Create videos
若想要生成的视频包含骨架,可点击Build skeleton,人工绘制骨架。
如果觉得标记点不够准确或视频效果不好,可点击Extract outlier frames和Refine labels,进一步的提高标记点和视频的质量,本篇不再赘述。
💎如果在运行DeepLabCut的过程中出现问题,欢迎大家在评论区讨论,也可以在评论区留言,作者看到都会回复!
END
📝因为作者的能力有限,所以文章可能会存在一些错误和不准确之处,恳请大家指出!