OpenPose 是一个用于实时多人姿态估计的开源库,主要用于2D姿态估计,涵盖了身体、手和脸部的关键点检测,它能够检测人体的关键点并估计其姿态。
body
: 用于检测人体关键点的模型,默认使用 BODY_25
,检测 25 个关键点,包括头部、颈部、肩部、肘部、手腕、髋部、膝部和脚踝等关键点。。hand
: 检测手部关键点的模型,默认使用 HAND_21
,检测 21 个手部关键点。face
: 检测面部关键点的模型,默认使用 FACE_70
,检测 70 个面部关键点。这些模型在 OpenPose 中确实是经过训练的,它们的作用是进行关键点检测,从而实现姿态估计和面部特征识别等任务。
OpenPose 是一个用于实时多人关键点检测的开源库,主要用于2D姿态估计,涵盖了身体、手和脸部的关键点检测。下面是关于 OpenPose 中人体姿态估计的主要参数及其功能的详细介绍:
这些模型都是通过大规模数据集上的训练来学习提取特征和预测关键点位置的能力。在训练过程中,使用了深度学习技术,如卷积神经网络(CNN),来逐步优化模型,以使其能够准确地在输入图像中定位指定的关键点。
模型的训练通常包括数据标注、损失函数设计、参数优化等步骤,以最大化模型对关键点位置的准确预测能力。模型经过训练后,能够在实际应用中快速而准确地检测出关键点,从而支持各种人体姿态和面部特征相关的应用场景。
这些训练好的模型在 OpenPose 中扮演了关键角色,通过它们可以实现对人体姿态、手部姿态和面部特征的精确识别和分析,为各种视觉和交互应用提供了强大的功能支持。
2.body_estimation
0
或 false
: 禁用身体部位估计。此时仅进行关键点检测,不进行身体部位的连接。1
或 true
: 启用身体部位估计。OpenPose执行完整的身体姿态估计,包括关键点检测和身体部位的连接。body_estimation
设置为 false
。./build/examples/openpose/openpose.bin --body_estimation 0 --image_path your_image.jpg
这里假设 --image_path your_image.jpg
是你要处理的图像路径,而 --body_estimation 0
则是指示 OpenPose 不执行身体部位估计,仅进行关键点检测。
如果你使用 OpenPose 的 API 进行编程,则可以通过 API 的参数来设置 body_estimation
,具体设置方式会依赖于你使用的编程语言和 API 的具体实现。
3. 网络结构:
姿态估计和关键点检测:
特征图(Feature Maps)的作用:
必要性:
OpenPose 最初基于 Caffe 框架实现,使用了基于 CMU 的网络结构。这些网络结构包括多个卷积层、池化层和连接层,通过多次卷积和非线性激活函数处理特征图,从而实现姿态估计的功能。
网络结构的具体设计会根据任务的复杂性和性能需求而有所不同。例如,可能会采用深度残差网络(ResNet)或者轻量级网络结构(如MobileNet)来平衡准确性和速度之间的权衡。
输入参数:
image_path
: 要处理的图像路径。camera
: 摄像头参数,用于实时姿态估计。video
: 视频文件路径或者实时视频流。输出参数:
keypoints
: 检测到的关键点列表,每个关键点包括坐标和置信度。keypoint_threshold
: 关键点检测的阈值,控制接受的关键点置信度的最低阈值,低于此阈值的关键点会被过滤掉。pose_pairs
: 定义连接姿态估计中不同关键点的对,帮助将检测到的关键点连接成姿态骨架,以便于可视化和后续分析。render_threshold
: 控制渲染关键点时的置信度阈值,低于此阈值的关键点不会被渲染。pose_pairs
参数通常是一个列表,每个元素是一个关键点对,用来指定要连接的两个关键点的索引。这些索引通常对应于特定的人体部位,例如连接肩部和臀部、连接肘部和手腕等。通过连接这些关键点对,系统可以形成完整的姿态骨架,从而更直观地显示人体的姿态和动作。
假设我们有一个简化的 pose_pairs
列表,定义如下关键点对的连接:
(0, 1)
: 连接第一个关键点(例如头顶)和第二个关键点(例如颈部)。(1, 2)
: 连接第二个关键点(颈部)和第三个关键点(右肩)。(1, 5)
: 连接第二个关键点(颈部)和第六个关键点(左肩)。在这个例子中,(0, 1)
表示将头顶和颈部关键点连接起来,(1, 2)
表示将颈部和右肩关键点连接起来,依此类推。这些连接定义了一个简单的上半身姿态骨架。
通过这些连接,姿态估计系统可以生成一个图像或视频中检测到的关键点之间的连接线(线段),形成人体的轮廓和姿势。这对于可视化和后续动作分析非常有用,因为它提供了更直观的理解人体姿势和动作的方式。
在计算机视觉和深度学习中,关键点的置信度(confidence score)是指该关键点被正确检测的概率或可信度程度。它通常是一个0到1之间的值,表示检测算法对该关键点存在的置信程度,即该关键点真实存在的可能性大小。
它是通过训练神经网络学习到的一个数值,用来衡量每个关键点在图像中被正确检测的概率。它的大小由网络的输出和训练过程中的优化目标共同决定。
神经网络输出:
损失函数:
训练时通常会定义一个损失函数,这个函数不仅帮助网络学习预测关键点的准确位置,还会鼓励网络对于预测正确关键点的置信度进行正确的估计。
损失函数会考虑预测值与真实标签之间的差异,同时损失函数会增加,从而惩罚模型对于置信度预测不准确的情况。
损失函数可以包括以下几个部分:
1、位置损失: 衡量预测的关键点位置与真实位置之间的差异,通常使用欧氏距离或其他距离度量。
2、连接损失: 考虑关键点之间的连接关系,以促进一致的姿势预测。
3、置信度损失: 衡量预测的置信度与实际情况之间的差异,可能使用交叉熵损失函数或其他适合分类问题的损失函数。
数据集标注:
后处理:
后处理参数:
OpenPose 在检测到关键点后,还会进行一些后处理操作来优化结果。
scale_gap
: 多尺度处理中的尺度间隔。scale_number
: 多尺度处理中的尺度数量。heatmap_peak
: 用于检测关键点的热图峰值。 定义热图中关键点峰值的阈值,用于确定关键点的位置。热图(heatmap)在计算机视觉中是一种常见的技术,用于检测和定位物体或关键点。在关键点检测任务中,热图被用来表示图像中可能存在的关键点的位置和强度。
热图:
热图峰值:
用途:
heatmap_peak
参数:
heatmap_peak
参数用于设置热图中的阈值。具体来说,它决定了哪些热图峰值被认为是有效的关键点位置。heatmap_peak
参数后,OpenPose 将只选择那些热图中像素值高于该阈值的位置作为有效的关键点位置。这样做可以帮助过滤掉热图中那些可能不是真实关键点的噪声或次要峰值。假设在进行人体关键点检测时,OpenPose 使用了一个预训练的深度学习模型,并生成了对应于每个关键点的热图。如果设置 heatmap_peak
为 0.2,那么只有那些热图中像素值大于 0.2 的位置被认为是有效的关键点位置。较低的像素值则可能代表噪声或不明显的特征点,将被过滤掉,从而提高关键点检测的准确性和稳定性。
net_resolution
: 网络分辨率,通过调整网络分辨率可以平衡速度和精度需求,影响检测速度和准确度。number_people_max
: 控制系统可以同时处理的最大人数。tracking
: 使用帧间跟踪来提高多人检测的准确性,通过跟踪相同人体的关键点在连续帧中的位置来提升多人姿态估计的稳定性。output_resolution
: 输出图像的分辨率, 控制输出图像的分辨率大小,影响最终渲染结果的清晰度和细节。在 OpenPose 中,这些参数的默认设置如下,并且可以通过命令行参数或配置文件进行修改:
net_resolution
: 网络分辨率默认设置:
"656x368"
。这个分辨率在保证检测速度和相对较高准确度之间做了权衡。修改方式:
--net_resolution
参数来修改网络分辨率。例如,设置为 "960x544"
可以提高分辨率以获得更精细的检测结果。--net_resolution "960x544"
number_people_max
: 最大检测的人数默认设置:
修改方式:
--number_people_max
参数来限制最大检测的人数。例如,设置为 2
表示最多检测两个人。--number_people_max 2
tracking
: 使用帧间跟踪默认设置:
tracking
参数为 0
)。这意味着每一帧图像都独立处理,不会考虑前后帧之间的关系。修改方式:
--tracking
参数设置为 1
。--tracking 1
output_resolution
: 输出图像的分辨率默认设置:
修改方式:
--output_resolution
参数来改变输出图像的分辨率。例如,设置为 "640x480"
可以将输出图像分辨率调整为 640x480 像素。--output_resolution "640x480"
这些参数和配置可以通过 OpenPose 的配置文件进行调整和优化,以适应不同场景和应用需求。
当在 Linux 系统上安装并准备运行 OpenPose 时,可以使用各种命令行选项来配置和控制姿态估计的行为。以下是 OpenPose 的常用命令和选项的全面概述,包括输入、输出、显示、渲染设置等方面:
输入设置:
--image_path path_to_image.jpg
:指定要处理的单张图像的路径。--video path_to_video.mp4
:指定要处理的视频文件的路径。--camera camera_index
:指定使用的摄像头索引号进行实时姿态估计。输出设置:
--write_json output_directory
:将检测到的关键点数据以 JSON 格式保存到指定的输出目录。--write_images output_directory
:将检测结果保存为图像文件到指定的输出目录。--write_video path_to_output.mp4
:将处理后的视频保存为视频文件到指定路径。显示和窗口设置:
--display display_mode
:设置显示模式,0 表示禁用显示窗口,1 表示显示窗口并实时更新。--number_people_max max_people
:限制最大检测的人数。渲染设置:
--render_pose render_threshold
:设置渲染关键点的置信度阈值,低于此阈值的关键点将不会被渲染。--render_pose_keypoints size
:设置关键点的尺寸。--render_pose_alpha alpha_value
:设置姿态渲染的透明度。姿态估计参数:
--model_folder path_to_models
:指定模型文件夹的路径,包含用于姿态估计的神经网络模型。其他参数:
--help
:显示帮助信息,列出所有可用的命令行选项和参数。--disable_blending
:禁用渲染时的混合效果,适用于需要更高性能的情况。输入设置:
--image_path
、--video
或 --camera
参数来指定不同的输入源,以适应处理单张图像、视频文件或实时摄像头流的需求。输出设置:
--write_json
和 --write_images
可以选择将姿态估计的结果以 JSON 格式和图像文件的形式保存下来,便于后续分析和处理。显示和窗口设置:
--display
参数可以控制是否显示实时处理的窗口,方便实时观察姿态估计效果。--number_people_max
可以限制检测的人数,有助于提高处理效率和减少误检。渲染设置:
--render_pose
可以调整渲染关键点的置信度阈值,确保只有置信度足够高的关键点被显示。--render_pose_alpha
可以调整姿态渲染的透明度,使得姿态线在图像上的可视化效果更加清晰和可调节。处理单张图片:
./build/examples/openpose/openpose.bin --image_path path_to_your_image.jpg
这个命令将对指定路径的单张图像进行姿态估计,并在屏幕上显示结果。
处理视频文件:
./build/examples/openpose/openpose.bin --video path_to_your_video.mp4
这个命令用于对指定路径的视频文件进行实时姿态估计。OpenPose 会逐帧处理视频,并在视频中显示检测到的关键点和姿态。
使用摄像头进行实时姿态估计:
./build/examples/openpose/openpose.bin --camera 0
这里的 --camera 0
指定使用摄像头编号为 0 的设备进行实时姿态估计。可以根据需要更改摄像头的编号。
输出格式设置:
./build/examples/openpose/openpose.bin --write_json output_directory --write_images output_directory
这个命令将检测到的关键点数据以 JSON 格式保存到指定的输出目录,并将检测结果保存为图像文件。可以通过 --write_json
和 --write_images
参数控制输出的格式和存储位置。
其他参数设置:
./build/examples/openpose/openpose.bin --display 1 --render_pose 1 --number_people_max 2
--display 0
:禁用显示窗口,适用于服务器环境。--display 1
:启用图像显示,默认使用的是 2D 渲染器进行关键点和骨架的可视化。--display 2
:使用 2D 渲染器进行关键点和骨架的可视化,与 --display 1 相同。--display 3
:使用 3D 渲染器进行姿态的可视化,需要 OpenPose 编译时启用了 USE_3D_RENDERER 标志。--render_pose 1
:调整姿态渲染的透明度为 1,用于调整可视化效果。--number_people_max 2
:限制最大检测的人数为 2,用于多人姿态估计场景的控制。帮助和版本信息:
./build/examples/openpose/openpose.bin --help
这个命令将显示 OpenPose 支持的所有命令行选项和参数的帮助信息。
切换到openpose目录下(–render_pose 默认为1,可省略)
使用摄像头进行实时姿态估计:
./build/examples/openpose/openpose.bin --camera 0 --display 2 --render_pose 1 --number_people_max 2
视频检测
./build/examples/openpose/openpose.bin --video ./examples/media/video.avi --display 2 --render_pose 1
图片检测
./build/examples/openpose/openpose.bin --image_dir ./examples/media/ --display 2 --render_pose 1
输出json和视频
使用openpose自带示例,要在openpose目录下建好output_jsons和output_videos目录,output.avi会自动生成,不需要提前建好
./build/examples/openpose/openpose.bin --video ./examples/media/video.avi --write_json ./output_jsons --write_video ./output_videos/output.avi --display 2 --render_pose 1
使用自己保存的视频,在openpose目录下建好my_videos/event1目录,把要处理的视频放在目录下,这里是1202184754.mp4
另外,建好output_jsons/event1和output_videos目录,event1.avi会自动生成,不需要提前建好,这样就OK啦!
./build/examples/openpose/openpose.bin --video ./my_videos/event1/1202184754.mp4 -write_json ./output_jsons/event1 --write_video ./output_videos/event1.avi -display 2 -render_pose 1