跑过很多次openposeDemo了,不管是video、Webcam还是Images,都是运行结果一闪而过,然而我们所要的肯定不是只看一下运行结果就完事的,很多情况下,我们都希望能够把运行结果的图像、关节点坐标信息、人数统计等数据信息全部保存下来,以便于我们对openpose进行更加深入的分析和应用,那么这篇博客的作用就是告诉大家如何把这些运行结果保存下来。
openposeDemo的程序运行结果的保存,其实有两种方式,一种便是直接使用官方Github的openpose demo的1.0.1的发布版本的命令行操作,另一种就是修改openposeDemo的源代码的方式,使得编译发布版本的程序直接可以保存运行结果。下面,笔者就两种方式做详细介绍。
一、命令行模式
根据官方Github quick-start文档,Windows上运行openposeDemo 1.0.1版本的程序如下,
根据以上命令,如果需要保存运行图片结果,亦或是保存关节点(特征点)的坐标信息,亦或是保存人数统计的信息内容,可运行如下命令
【PS】下述命令仅提供Images的命令,其他Video和Webcam的保存方式与Images的一致。
在examples/文件夹下创建与media文件夹并列的文件夹media_out,然后运行如下程序
保存图像
bin/OpenPose.exe --image_dir examples/media/ --write_images examples/media_out/
- 1
- 1
write_images:源代码给出的解释为”Directory to write rendered frames in write_images_format
image format.examples”,即为存储运行结果图像的路径设置,其格式为 write_images_format
,默认为png
格式。上面的命令默认将添加了骨骼的图像保存到 media_out
文件夹下。
保存json文件
bin/OpenPose.exe --image_dir examples/media/ --write_keypoint_json examples/media_out/
- 1
- 1
write_keypoint_json:源代码给出的解释为”Directory to write the people body pose keypoint data. Set format with write_keypoint_format
“,即为人体骨骼姿态的关节点数据文件,文件格式为write_keypoint_format
,默认为 json
格式。上面的命令默认将添加了骨骼的图像保存到 media_out
文件夹下。
下图表示一张人体骨骼关键点的json文件,笔者没有运行face和hand模型,因而只显示了pose关节点的数据信息。
“pose_keypoints”即为当前图像中人体18个关节点的数据信息,其具体的含义还有待深入的了解,这里笔者就不做深究了,至于如何看出是18个关节点,其实我们随便看一遍这个数据集,马上就能看出大概3个数据为一组,即表示一个关节点,刚好有18组信息。
【2017/8/6】看过官方Github提供的文档output.md才知道,原来一个关节点信息包括(x,y,score)
三个信息,x和y即为图像中的坐标信息,取值范围为(0,image.size),而score则表示预测评分,做了归一化处理,取值范围(0,1),越接近1值表示预测的越准确,其关节点的还原度就越高,同时姿态的还原度也就越高。
以上关节点的坐标信息可以参考官方文档给出的模型,如下,进行研究
【PS】该模型提供的是COCO 18个关节点的骨骼模型。
保存yml文件
bin/OpenPose.exe --image_dir examples/media/ --write_keypoint examples/media_out/
- 1
- 1
write_keypoint:源代码给出的解释为”File extension and format for write_keypoint
: json, xml, yaml & yml. Json not available for OpenCV < 3.0, use write_keypoint_json
instead”,即为人体骨骼姿态的关节点数据文件,文件格式为 write_keypoint
,默认为 yml
格式。上面的命令默认将添加了骨骼的图像保存到 media_out
文件夹下。
【PS】注意opencv低于3.0版本的,不支持json格式的文本输出,当然,官方提供的Opencv是高于3.0的,大家一开始学习为了避免问题,尽可能使用官配版本。
下图表示一张人体骨骼关键点的yml文件,笔者没有运行face和hand模型,因而只显示了pose关节点的数据信息。
使用同样的办法可以生成xml文件,至于yml文件中具体的含义,这里笔者也不再详细介绍,因为笔者暂时也还没弄明白,欢迎已经弄清楚的小伙伴给笔者留言。
【2017/8/6】
关于yml文件
“%YAML:1.0”表示当前yaml使用版本为1.0;
“pose_0”表示当前处理图像的全部姿态信息,包括单人情况和多人情况;
“sizes”表示当前”data”为大小是1*18*3的矩阵,其中,”1”表示统计到人的数量,”18”表示使用的model应该检测到的关节点的数量,笔者使用的是COCO,故而是18,3表示一个关节点的坐标和score信息。
“dt”这个东东笔者还没弄清楚,怀疑是数据的格式为float,还有待验证。
“data”中具体数据的含义暂时还没搞懂。
二、源码修改编译发布模式
源码修改更是方便,现在让我们来看看openposeDemo的源代码内容,
其中有这样一段,这里我看明确的看到注释的“//Result Saving”信息,以上9个值字段便是为运行结果进行保存所准备的,具体的含义,笔者在这里就不再胡乱的翻译了,大家可以看右侧的字段解释,修改自己想要保存的结果以及保存结果的路径后,就可以执行openposeDemo的程序,生成可执行文件啦,其生成的内容参见命令行模式方案。
三、题外话—关于Ubuntu
笔者在帮助网友在Ubuntu上保存运行结果的过程中发现,其实Ubuntu和Windows上的命令是一致的,只要吧可执行的命令换成Ubuntu的,如下所示
./build/examples/openpose/openpose.bin --image_dir examples/media/ --write_images examples/media_out/
- 1
- 1
其他命令可以类比来进行修改。
【PS】以上内容为笔者探索openpose过程中的浅见,欢迎各位openpose爱好者指出问题和技术交流,如有不当之处,请留言给笔者。