介绍
the first real-time multi-person system to jointly detect human body, hand, facial, and foot keypoints (in total 135 keypoints) on single images.(在一张图片上对人体、手部、面部、足部关节点检测的首个实时多人系统)
下载代码
去Github去clone:https://github.com/CMU-Perceptual-Computing-Lab/openpose
安装CMake
下载:Download | CMake
下载好后默认安装即可,然后添加环境变量
下载pybind11(下载Zip包即可)
GitHub - pybind/pybind11 at 085a29436a8c472caaaf7157aa644b571079bcaa
下载完成后放入openpose的3rdparty\pybind11文件夹下
下载Caffe(下载Zip包即可)
https://github.com/CMU-Perceptual-Computing-Lab/caffe/tree/b5ede488952e40861e84e51a9f9fd8fe2395cc8a
下载完成后放入openpose的3rdparty\caffe文件夹下
安装Cuda
CUDA Toolkit 11.7 Downloads | NVIDIA Developer
默认安装即可
下载Cudnn
cuDNN Archive | NVIDIA Developer
先去到这个地址,然后复制下载链接到迅雷下载即可,因为直接点链接下载经常加载不进去页面(此外,还需要用邮箱注册一下)
解压后有三个文件夹bin
、include
和lib
,依次将三个文件夹中的内容拷贝到cuda
的安装目录(默认情况下是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2
)下的bin
、include
和lib
下,这个要一一对应,如下图所示。
找到Visual Studio Installer, 点击修改
选择单个组件,搜索Cmake,勾选并点击修改
搜索Windows 10 SDK勾选
编译openpose代码
在openpose文件夹下新建build文件夹
配置路径,第一个框是openpose源码的文件夹,第二个框里填的是生成路径
然后点击Configure,选择VS2022,然后Finish
然后打开Build Python,然后点击Configure
然后点击Generate
然后点击open Project,在VS中打开编译好的项目
然后鼠标右键 OpenposeDemo选择生成
生成完成
我们可以看到,最后生成的exe文件
右键OpenPoseDemo,选择设为启动项目
然后运行,点击本地Windwos调试器,这时就会调用摄像头实时地识别人体关节点了
如果想使用某个视频文件来运行OpenPoseDemo
,可以在visual studio
中增加命令行参数,方法是右键打开解决方案中的OpenPoseDemo
,选择属性
选择调试,然后在命令参数输入:
--video C:\Users\hzkdediannao\Desktop\python\openpose\test.mp4 (这是视频保存的位置)
然后再次运行即可
运行时遇到的问题:
- Failed to parse NetParameter file: models\pose/body_25/pose_iter_584000.caffemodel
0x00007FF9F320286E (ucrtbase.dll) (OpenPoseDemo.exe 中)处有未经处理的异常: 请求了严重的程序退出。
编译遇到这个错误大概率是model没有下载全,去models目录下运行getModels.bat
然后我们尝试使用python调用
右键pyopenpose点击生成
然后将x64/Release下文件和python/openpose/Release下文件拷贝到bin目录下
然后把openpose下地models目录拷贝到bin目录下
然后在bin目录下新建一个data文件夹,来保存需要识别地图片或视频
然后我们先在cmd调用一下
然后我们在bin目录下打开Jupyter Notebook
然后新建一个ipynb文件,参考examples/tutorial_python/body_form_image.py下代码进行自定义编程
import pyopenpose as op
import matplotlib.pyplot as plt
import cv2
# Custom Params (refer to include/openpose/flags.hpp for more parameters)
params = dict()
params["model_folder"] = "./models/"
# Starting OpenPose
opWrapper = op.WrapperPython()
opWrapper.configure(params)
opWrapper.start()
# Process Image
datum = op.Datum()
imageToProcess = cv2.imread('data/test2.jpg')
imageToProcess = cv2.cvtColor(imageToProcess,cv2.COLOR_RGB2BGR)
plt.imshow(imageToProcess)
datum.cvInputData = imageToProcess
opWrapper.emplaceAndPop(op.VectorDatum([datum]))
# Display Image
print("Body keypoints: \n" + str(datum.poseKeypoints)) #X\Y\C(置信度)
plt.imshow(datum.cvOutputData)
可以看到有10个点
在图片中正好也有10个点
对面部和手部的识别
查看命令参数:OpenPoseDemo --help
常用参数举例:
--net_resolution 320*176:是指定分辨率
--face:显示面部关键点
--hand:显示手部关键点
--image_dir examples\media\test.jpg:指定图片位置
--video examples\media\test.mp4:指定视频位置
更多参数解释
-3d(运行OpenPose 3d重建演示:1)从立体相机系统读取。2) 从多个视图执行三维重建。3) 显示三维重建结果。请注意,它将仅显示1人。如果有多人在场,它将失败。)类型:bool默认值:false
-3d_min_views(重建每个关键点所需的最小视图数。默认情况下(-1),需要最多(2个,最小(4个,#摄像头-1))摄像头才能看到关键点以重建它。)int32:default类型:-1
-3d_views(用于“--image_dir”或“--video”的补充选项。OpenPose将在每次迭代中读取尽可能多的图像,允许执行立体相机处理(“--3d”)等任务。请注意,必须设置“--camera_parameter_path”。OpenPose必须在参数文件夹中找到与此数字相同数量的“xml”文件。)类型:int32默认值:-1
-alpha_heatmap(热图和原始帧之间的混合因子(范围0-1))。1只显示热图,0只显示边框。仅对GPU渲染有效。)类型:双默认值:0.69999999996
-alpha_pose(混合因子(范围0-1)。1将完全显示它,0将隐藏它。仅对GPU渲染有效。)类型:双默认值:0.59999999998
-body(选择0禁用身体关键点检测(例如,用于更快但更不准确的人脸关键点检测、自定义手部检测器等),选择1(默认)用于身体关键点估计,选择2禁用其内部身体姿势估计网络,但仍运行贪婪关联解析算法)类型:int32默认值:1
-caffemodel_path(组合“--model_文件夹”+--caffemodel_路径”代表caffemodel文件的整个路径。如果为空,则将使用默认的OpenPose caffemodel文件。)类型:字符串默认值:“
-camera(cv::VideoCapture的摄像头索引。范围[0,9]内的整数)。选择负数(默认情况下),自动检测并打开第一个可用的摄像头。)类型:int32默认值:-1
-camera_parameter_path(带有摄像头参数所在文件夹的字符串。如果只有一个XML文件(用于同一摄像头的单个视频、网络摄像头或图像),则必须指定整个XML文件路径(以.XML结尾)类型:字符串默认值:“models/cameraParameters/flir/”
-camera_resolution(设置摄像头分辨率(无论是“--camera”还是“--flir\u camera”)`-1x-1`将使用默认的1280x720表示“--camera”,或使用可用于“--flir_camera”的最大flir摄像机分辨率。类型:字符串默认值:“-1x-1”
-cli_verbose(如果为-1,将禁用它(默认)。如果它是一个正整数,它将在命令行中每隔“verbose”帧打印一次。如果数字在(0,1)范围内,它将每隔“verbose”乘以总帧数打印一次进度。)类型:双默认值:-1
-disable_blending(如果启用,它将在黑色背景上渲染结果(关键点骨架或热图),而不是渲染到原始图像中。相关:'part_to_show'、'alpha_pose'、和'alpha_pose')类型:bool默认值:false
-disable_multi_thread(它将略微降低帧速率,以大大减少延迟。主要用于1)需要低延迟的情况(例如,在使用低范围GPU设备的实时场景中使用网络摄像头);2)在OpenPose崩溃时调试OpenPose以定位错误。)类型:bool默认值:false
-display(显示模式:-1表示自动选择;0表示不显示(如果没有X服务器,则有用;如果不需要视觉输出,则略微加快处理速度);2个用于二维显示;3用于三维显示(如果启用了“---3d”;1个用于二维和三维显示。)类型:int32默认值:-1
-face(启用面部关键点检测。它将共享身体姿势的一些参数,例如“model_folder”。请注意,这将大大降低性能并增加所需的GPU内存。此外,图像上的人数越多,打开姿势的速度越慢。)类型:bool默认值:false
-face_alpha_heatmap(类似于'alpha_heatmap',但适用于face。)类型:双默认值:0.69999999996
-face_alpha_pose(类似于'alpha_pose',但适用于面部。)类型:双默认值:0.59999999998
-face_detector(一种人脸矩形检测器。选择0(默认值)选择OpenPose body detector(如果body已启用,则选择最精确和最快的一种),1选择OpenCV face detector(不适用于手),2表示将由用户提供,或3也应用手部跟踪(仅适用于手部)。手部跟踪可能会提高网络摄像头(如果帧速率足够高,即每个GPU>7 FPS)和视频的手部关键点检测。这不是人物ID跟踪,它只是在前几帧中手所在的位置查找手,但它不保证帧中的人物ID相同。)类型:int32默认值:0
-face_net_resolution(16的倍数和平方。类似于'net_resolution',但适用于人脸关键点检测器。320x320通常工作正常,但在图像上出现多个人脸时,速度会大大加快。)类型:字符串默认值:“368x368”
-face_render(类似于“render_pose”,但应用于面部。额外选项:-1使用与“render_pose”相同的配置。)类型:int32默认值:-1
-face_render_threshold(类似于“渲染阈值”,但应用于面关键点。)类型:双默认值:0.40000000000000002
-flir_camera(是否使用flir(点灰)立体摄像头。)类型:bool默认值:false
-flir_camera_index(选择-1(默认值))可同时在所有检测到的flir摄像头上运行。否则,选择要运行的flir相机索引,其中0对应于具有最低序列号的检测到的flir相机,“n”对应于第n个最低序列号的相机。)int32:default类型:-1
-fps_max(最大处理帧速率。默认情况下(-1),OpenPose将尽可能快地处理帧。示例用法:如果OpenPose显示图像的速度太快,这可能会降低速度,因此用户可以更好地分析GUI中的每一帧。)类型:双默认值:-1
-frame_first(从所需的帧号开始。索引基于0,即第一帧的索引为0。)类型:uint64默认值:0
-frame_flip(翻转/镜像每个帧(例如,用于实时网络摄像头演示)类型:bool默认值:false
-frame_last(完成所需的帧编号。选择-1禁用。索引基于0,例如,如果设置为10,它将处理11帧(0-10)。)类型:uint64默认值:18446744073709551615
-frame_rotate(旋转每个帧,4个可能的值:0、90、180、270。)类型:int32默认值:0
-frame_step(已处理帧之间的步骤或间隙。例如,`--frame_步骤5`将读取并处理帧0、5、10等)类型:uint64默认值:1
-frame_undistort(如果为false(默认),则不会对图像进行不失真,如果为true,则会根据“camera_parameter_path”中的相机参数对其进行不失真)类型:bool默认值:false
-frames_repeat(完成后重复帧)类型:bool默认值:false
-fullscreen(在全屏模式下运行(运行时按f键切换)。)类型:bool默认值:false
-hand(启用手关键点检测。它将共享身体姿势中的一些参数,例如“model_folder”。与“face”类似,它还将降低性能,增加所需的GPU内存,其速度取决于人数。)类型:bool默认值:false
-hand_alpha_heatmap(类似于阿尔法热图,但适用于手部。)类型:双默认值:0.69999999996
-hand_alpha_pose(类似于“阿尔法姿势”,但适用于手。)类型:双默认值:0.59999999998
-hand_detector(一种手形矩形检测器,类似于“脸形检测器”)类型:int32默认值:0
-hand_net_resolution(16和平方的倍数。类似于'net_分辨率',但适用于手部关键点检测器。)类型:字符串默认值:“368x368”
-hand_render(类似于“render_pose”,但应用于手部。额外选项:-1使用与“render_pose”相同的配置。)类型:int32默认值:-1
-hand_render_threshold(类似于“渲染阈值”,但适用于手部关键点。)类型:双默认值:0.200000000001
-hand_scale_number(类似于“刻度号”,但适用于手部关键点检测器。我们的最佳结果是“手部刻度号”=6和“手部刻度范围”=0.4。)类型:int32默认值:1
-hand_scale_range(与“刻度间隙”类似,但适用于手动关键点探测器。最小刻度和最大刻度之间的总范围。刻度将以比率1居中。例如,如果刻度长度=0.4,刻度数=2,则将有两个刻度,即0.8和1.2。)类型:双默认值:0.40000000000000002
-heatmaps_add_PAFs(与“添加热图零件”功能相同,但添加PAF。)类型:bool默认值:false
-heatmaps_add_bkg(功能与“add_heatmaps_parts”相同,但添加与背景对应的热图。)类型:bool默认值:false
-heatmaps_add_parts(如果为true,它将用身体部位的热图填充op::Datum::poseHeatMaps数组,并将面部和手部的热图类似地填充到op::Datum::faceHeatMaps&op::Datum::handHeatMaps。如果启用了多个“add_heatmaps_X”标志,它将按顺序存储顺序放置:身体部位+bkg+PAFs。它将遵循`src/openpose/POSE/POSE/POSE中的姿势和身体部位的映射顺序参数。cpp`。程序速度将大大降低。OpenPose不是必需的,仅当您打算稍后明确使用此信息时才启用它。)类型:bool默认值:false
-heatmaps_scale(将0设置为scale op::Datum::poseHeatMaps,范围为[-1,1],1表示[0,1];2表示整数取整[0255];3表示无缩放。)类型:int32默认值:2
-identification(实验性的,还不可用。是否启用跨帧身份识别。)类型:bool默认值:false
-ik_threads(实验性,尚未提供。是否从三维关键点启用反向运动学(ik)以获得三维关节角度。默认情况下(0个线程),它是禁用的。增加线程数将提高速度,但也会增加全局系统延迟。)类型:int32默认值:0
-image_dir(处理一个图像目录。使用'examples/media/`作为包含20个图像的默认示例文件夹。读取所有标准格式(jpg、png、bmp等)类型:字符串默认值:“
-ip_camera(带有ip摄像头URL的字符串。它支持RTSP和HTTP等协议。)类型:字符串默认值:“
-keypoint_scale(最终姿势数据数组的(x,y)坐标的缩放,即将使用“write_json”和“write_keypoint”标志保存的(x,y)坐标的缩放。选择“0”将其缩放到原始源分辨率`1`将其缩放到净输出大小(设置为'net_resolution')`2`将其缩放到最终输出大小(设置为'resolution')`3`在[0,1]范围内缩放,其中(0,0)是图像的左上角,(1,1)是右下角;4表示范围[-1,1],其中(-1,-1)表示图像的左上角,(1,1)表示图像的右下角。与“刻度号”和“刻度间隙”无关。)类型:int32默认值:0
-logging_level(范围[0,255]中的logging level.Integer)。0将输出任何opLog()消息,而255将不输出任何opLog()消息。当前OpenPose库消息的范围为0-4:低优先级消息为1,重要消息为4。)类型:int32默认值:3
-maximize_positives(它降低了接受候选人的阈值。它极大地增加了假阳性和真阳性。也就是说,它最大化了平均回忆,但可能会损害平均准确度。)类型:bool默认值:false
-model_folder(文件夹路径(绝对或相对),其中包含模型(姿势、面部等)位置。)类型:字符串默认值:“models/”
-model_pose(要使用的模型。例如,`BODY_25`(CUDA版本最快,最准确,包括脚关键点),`COCO`(18个关键点),`MPI`(15个关键点,最不准确的模型,但在CPU上最快),`MPI_4_layers`(15个关键点,甚至更快,但精确度更低)。)类型:字符串默认值:“BODY\u 25”
-net_resolution(16的倍数。如果增加,精度可能会增加。如果降低,速度会增加。为了获得最大的速度精度平衡,它应该保持与要处理的图像或视频尽可能接近的纵横比。在任何维度中使用“-1”,OP将根据用户的输入值选择最佳纵横比。例如,默认值`-1x368'相当于16:9分辨率的656x368,例如全高清(1980x1080)和高清(1280x720)分辨率。)类型:字符串默认值:“-1x368”
-no_gui_verbose(不要在gui上的输出图像上写入文本(例如,当前帧的数量和人员)。它不会影响姿势渲染。)类型:bool默认值:false
-num_gpu(要使用的gpu设备的数量。如果为负数,它将使用机器中所有可用的gpu。)类型:int32默认值:-1
-num_gpu_start(gpu设备开始编号)类型:int32默认值:0
-number_people_max(此参数将通过保留得分最高的人来限制检测到的最大人数。得分基于图像上的个人区域、身体部位得分以及关节得分(每对连接的身体部位之间)。如果你知道场景中的确切人数,那么它会很有用,这样可以消除误报(如果所有人都被检测到了。但是,它也可能包括误报,通过移除非常小或高度遮挡的人。-1将保留所有人。)类型:int32默认值:-1
-output_resolution(图像分辨率(显示和输出)。使用“-1x-1”强制程序使用输入图像分辨率。)类型:字符串默认值:“-1x-1”
-part_candidates(也可以启用“write_json”以保存此信息。如果为true,它将用身体部位候选者填充op::Datum::poseCandidates数组。候选者指的是所有检测到的身体部位,然后再组装成人。请注意,候选者的数量等于或大于最终身体部位的数量(即组装成人之后)。空的身体部位充满了0。程序速度将略有下降。OpenPose不是必需的,仅当您打算显式使用此信息时才启用它。)类型:bool默认值:false
-part_to_show(要可视化的预测通道:0(默认值)用于所有身体部位,1用于背景热图,2用于热图叠加,3用于PAF叠加,4-(4+#关键点)用于每个身体部位热图,以下为每个身体部位对PAF。)类型:int32默认值:0
-process_real_time(允许保持原始源帧速率(例如视频)。如果处理时间过长,它将跳过帧。如果速度太快,就会减慢速度。)类型:bool默认值:false
-profile_speed(如果在CMake或Makefile.config文件中设置了PROFILER_ENABLED,OpenPose将显示此帧号的一些运行时统计信息。)类型:int32默认值:1000
-prototxt_path(组合`--model_folder`+`--prototxt_path`表示prototxt文件的整个路径。如果为空,则将使用默认的OpenPose prototxt文件。)类型:字符串默认值:“
-render_pose(设置为0表示无渲染,设置为1表示CPU渲染(稍快),设置为2表示GPU渲染(速度较慢但功能更强,例如,`alpha_X`标志)。如果为-1,则在仅启用CPU_时选择CPU,如果启用CUDA时选择GPU。如果启用了渲染,它将使用原始图像和要显示的所需身体部位(即关键点、热图或PAF)渲染“outputData”和“cvOutputData”。)int32:default类型:-1
-render_threshold(仅渲染分数置信度高于此阈值的估计关键点。注意:渲染仅指OpenPose basic GUI中的视觉显示,而不是保存的结果。通常,高阈值(>0.5)只会渲染非常清晰的身体部位;虽然小阈值(~0.1)也会输出猜测和遮挡的关键点,但也会输出更多误报(即错误检测)类型:双默认值:0.05000000000000003
-scale_gap(刻度之间的刻度间距。除非刻度数值大于1,否则不会产生任何效果。初始刻度始终为1。如果要更改初始刻度,实际上需要将“净分辨率”乘以所需的初始刻度。)类型:双默认值:0.25
-scale_number(刻度盘数量与平均值之比)类型:int32默认值:1
-tracking(实验性的,还不可用。是否启用跨帧跟踪。该值指示在每个OpenPose关键点检测之间运行跟踪的帧数。选择-1(默认值)将其禁用,或选择0将同时运行OpenPose关键点检测器和跟踪,以获得比仅OpenPose更高的精度。)类型:int32默认值:-1
-udp_host(实验性的,还不可用。udp通信的IP。例如,`192.168.0.1`。)类型:字符串默认值:“
-udp_port(实验性的,还不可用。udp通信的端口号。)类型:字符串默认值:“8051”
-upsampling_ratio(净分辨率和输出净结果之间的上采样率。小于或等于0的值(默认值)将使用网络默认值(建议)。)类型:双默认值:0
-video(使用视频文件而不是相机。使用'examples/media/video.avi'作为默认示例视频。)类型:字符串默认值:“
-write_bvh(实验性的,尚未提供。例如,“~/Desktop/mocapResult.bvh”。)类型:字符串默认值:“
-write_coco_json(使用json coco验证格式写入人体姿势数据的完整文件路径。如果还需要脚、脸、手等json(“--write_coco_json_variants”),它们将以不同的文件名后缀保存。)类型:字符串默认值:“
-write_coco_json_variant(目前,此选项是实验性的,仅对汽车json生成产生影响。它为cocoJsonSaver选择coco变体。)类型:int32默认值:0
-write_coco_json_variants(身体加1,脚加2,脸加4,手加8。使用0使用所有可能的候选项。例如,7表示身体+脚+脸coco json。)类型:int32默认值:1
-write_heatmaps(以PNG格式写入身体姿势热图的目录。必须至少启用1个“add\u heatmaps\u X”标志。)类型:字符串默认值:“
-write_heatmaps_format(write_heatmaps的文件扩展名和格式,类似于write_images_format)。对于无损压缩,建议使用整型“heatmaps_scale”的“png”,浮动值的“float”。有关详细信息,请参阅'doc/output.md'类型:字符串默认值:“png”
-write_images(以“write_images_format”图像格式写入渲染帧的目录。)类型:字符串默认值:“
-write_images_format(文件扩展名和“write_images”的格式,例如png、jpg或bmp。检查OpenCV函数cv::imwrite以获取所有兼容的扩展名。)类型:字符串默认值:“png”
-write_json(以json格式编写OpenPose输出的目录。它包括身体、手和面部姿势关键点(二维和三维),以及姿势候选(如果启用了“---part_候选”)类型:字符串默认值:“
-write_keypoint((已弃用,请使用'write_json')目录来写入关键点数据。使用“write_keypoint_format”设置格式。)类型:字符串默认值:“
-write_keypoint_format((不推荐使用,使用'write_json')文件扩展名和'write_keypoint'格式:json、xml、yaml和yml。Json不适用于OpenCV<3.0,请改用“write_Json”。)类型:字符串默认值:“yml”
-write_video(以运动JPEG视频格式写入渲染帧的完整文件路径。如果最终路径未在“.avi”中完成,则可能会失败。它在内部使用cv::VideoWriter。标志“write_video_fps”控制fps。或者,视频扩展名可以是“.mp4”,从而生成一个小得多的文件,并允许使用“--write_video_with_audio”。但是,这需要:1)Ubuntu或Mac系统,2)安装了FFmpeg库(`sudo apt get install FFmpeg`),3)临时创建一个与最终视频(不带扩展名)文件路径相同的文件夹,以存储中间帧,稍后将用于生成最终MP4视频。)类型:字符串默认值:“
-write_video_3d(类似于“--write_video”,但应用于3d输出。)类型:字符串默认值:“
-write_video_adam(实验性的,尚未提供。类似于“--write_video”,但适用于adam模型。)类型:字符串默认值:“
-write_video_fps(录制视频的帧速率)。默认情况下,它将尝试获取输入帧的帧速率(例如,输入视频或网络摄像头帧速率)。如果输入帧生成器没有设置FPS(例如,如果OpenCV未使用其支持编译,则为image_dir或网络摄像头),则相应地设置该值(例如,设置为OpenPose GUI显示的帧速率)类型:双默认值:-1
-write_video_with_audio(如果输入是视频,输出也是视频,它将用音频保存视频。它要求输出视频文件路径以“.mp4”格式完成(详细信息请参见“写入视频”)类型:bool默认值:false
如何在pycharm中使用Openpose:
只需把bin文件导入项目,然后在新建的py文件中加入sys语句即可引入openpose以来了,后面的代码和jupyter notebook完全一致
import sys
sys.path.append('./')
import pyopenpose as op
....
将pycharm项目打包
首先下载pyinstaller
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple Pyinstaller
参考:
windows编译openpose及在python中调用 - 知乎