热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

openpose学习之:可视化PAF场

加载准备好的数据(训练前的数据).h5的数据是通过代码的预处理操作得到的原本的数据只有一个COCO数据集,通过预处理步骤,
加载准备好的数据(训练前的数据)
  • .h5 的数据是通过代码的预处理操作得到的
  • 原本的数据只有一个 COCO 数据集,通过预处理步骤,将数据整合成一个 .h5 的训练文件
  • 这里使用的代码是 基于 keras 的 openpose,源码网址在:

https://github.com/kevinlin311tw/keras-openpose-reproduce

import numpy as np
import cv2
import matplotlib.pyplot as plt
from matplotlib import cm as c
import os
import math
'''我自己的工作路径,在本文中与工作路径的问题,大家需要自己调一下'''
os.chdir("../mycodes/keras-openpose-reproduce/")
from py_rmpe_server.py_rmpe_data_iterator import *

数据路径

h5file = "../../datasets/val_dataset_2017.h5"

'''程序中定义好的加载数据的类,aug 要选 False 否则会进行数据增强,
数据会被裁剪和旋转,不利于我们可视化的过程'''

raw_data_iterator = RawDataIterator(h5file,augment=False)

通过 next 从 generator 中获取一张图片的数据 + 标签

gene = raw_data_iterator.gen()

img,mask,labels,joints = next(gene)

'''下图中的黑边是因为对不同尺寸的图片进行了 pad 操作,为了输入尺寸一致'''
b,g,r = img[0],img[1],img[2]
img_ = cv2.merge([r,g,b])
plt.imshow(img_)

在这里插入图片描述

label 的 [0-38) 通道是 PAF 的 label,[38-57) 是 heatmap 的 label

labels.shape

(57, 46, 46)

取前 38 通道并把通道调整为(46,46,38)

pafs = labels[:38,:,:].transpose([1,2,0])
pafs.shape

(46, 46, 38)

img_.shape

(368, 368, 3)

  • 每个 PAF 的标签占据两个通道,这两个通道分别代表:
    • 某个 limb PAF 的 x 方向坐标矩阵
    • 某个 limb PAF 的 y 方向的坐标矩阵

pafs_shape = pafs.shape
x,y = np.meshgrid(np.arange(pafs_shape[0]),np.arange(pafs_shape[1]))
'''可视化一下 x 方向 limb 的分量'''
u = pafs[:,:,0]
v = pafs[:,:,1]m = np.zeros((46,46),dtype="bool")
m[u**2 &#43; v**2 < 0.5**2] &#61; Truefrom numpy import ma
u &#61; ma.masked_array(u,mask&#61;m)
v &#61; ma.masked_array(v,mask&#61;m)
&#39;&#39;&#39; stride &#xff0c;在 X,Y 构成的坐标图上&#xff0c;每隔 stride 个像素点画一个向量&#39;&#39;&#39;
s &#61; 2 plt.quiver(x[::s],y[::s],u[::s],v[::s],color&#61;"r")&#39;&#39;&#39;注意&#xff0c; plt.quiver 和 plt.imshow 的时候&#xff0c;他们的 y 轴坐标的起始是不同的&#39;&#39;&#39;

在这里插入图片描述

plt.imshow(pafs[:,:,0])

在这里插入图片描述

在 PAF label 上画出对应的矢量场

plt.quiver(x[::s],y[::s],u[::s],v[::s],color&#61;"r")
plt.imshow(pafs[:,:,0])

在这里插入图片描述

pafs[:,:,0].max()

0.08548474821581316

将矢量图叠加到原图上


  • 由于原图尺寸被 pad 成了 (368,368) 因此&#xff0c;我们先将 label resize 成和 img 对应尺寸
  • 由于 PAF 图的数据值的分布范围在 0-1 &#xff0c;因此我们需要对他进行操作&#xff0c;normalize 成 (0-255) 之间的 uint类型&#xff0c;才能进行 opencv 的操作
  • 最后我们采用 cv2.addweighted 对图进行叠加

X,Y &#61; np.meshgrid(np.arange(368),np.arange(368))
U &#61; cv2.resize(pafs[:,:,0],(368,368),cv2.INTER_CUBIC)
V &#61; cv2.resize(pafs[:,:,1],(368,368),cv2.INTER_CUBIC)
M &#61; np.zeros((368,368),dtype&#61;"bool")
M[U**2 &#43; V**2 < 0.5 * 0.5] &#61; True

from numpy import ma
U &#61; ma.masked_array(U, mask&#61;M)
V &#61; ma.masked_array(V, mask&#61;M)# 1
plt.figure()
plt.imshow(img_, alpha &#61; .5)
s &#61; 5
Q &#61; plt.quiver(X[::s,::s], Y[::s,::s], U[::s,::s], V[::s,::s], scale&#61;50, headaxislength&#61;4, alpha&#61;.5, width&#61;0.001, color&#61;&#39;r&#39;)
fig &#61; plt.gcf()
fig.set_size_inches(20, 20)

在这里插入图片描述

将所有的身体部分的场放到一个图中

# U &#61; cv2.resize(np.sum(pafs,axis&#61;2),(368,368),cv2.INTER_CUBIC)
# V &#61; cv2.resize(np.sum(pafs,axis&#61;2),(368,368),cv2.INTER_CUBIC)
# U &#61; ma.masked_array(U, mask&#61;M)
# V &#61; ma.masked_array(V, mask&#61;M)
# plt.figure()
# plt.imshow(img_, alpha &#61; .5)
# s &#61; 3
# Q &#61; plt.quiver(X[::s,::s], Y[::s,::s], U[::s,::s], V[::s,::s],
# scale&#61;50, headaxislength&#61;4, alpha&#61;.5, width&#61;0.001, color&#61;&#39;r&#39;)
# fig &#61; plt.gcf()
# fig.set_size_inches(20, 20)

首先展示一个 image 中 38 个通道的所有 PAF label

figure &#61; plt.figure(figsize&#61;(120,200))
for i in range(pafs.shape[2] // 2):axes &#61; figure.add_subplot(8, 5, i&#43;1)plt.imshow(pafs[:,:,2*i])
plt.show()

在这里插入图片描述

按照 x 和 y 分别叠加其分别的 19 个通道的矢量图

&#39;&#39;&#39;矢量图中的第偶数个&#xff0c;但是他们对应通道的索引是偶数&#39;&#39;&#39;
odd &#61; [i for i in range(pafs.shape[2]) if i % 2 &#61;&#61; 0]
&#39;&#39;&#39;矢量图中的第偶数个&#xff0c;但是他们对应通道的索引都是奇数&#39;&#39;&#39;
even &#61; [i for i in range(pafs.shape[2]) if i % 2 !&#61; 0]
final_x &#61; np.amax(pafs[:,:,odd],axis&#61;2)
final_y &#61; np.amax(pafs[:,:,even],axis&#61;2)

pafs.shape

(46, 46, 38)

plt.imshow(final_x)

在这里插入图片描述

plt.imshow(final_y)

在这里插入图片描述

展示整个 PAF 矢量图叠加在原图上

U &#61; cv2.resize(final_x,(368,368),cv2.INTER_CUBIC)
V &#61; cv2.resize(final_y,(368,368),cv2.INTER_CUBIC)
M &#61; np.zeros((368,368),dtype&#61;"bool")
M[U**2 &#43; V**2 < 0.5 * 0.5] &#61; True
U &#61; ma.masked_array(U, mask&#61;M)
V &#61; ma.masked_array(V, mask&#61;M)
plt.figure()
plt.imshow(img_, alpha &#61; .5)
s &#61; 2
Q &#61; plt.quiver(X[::s,::s], Y[::s,::s], U[::s,::s], V[::s,::s], scale&#61;50, headaxislength&#61;4, alpha&#61;.5, width&#61;0.001, color&#61;&#39;r&#39;)
fig &#61; plt.gcf()
fig.set_size_inches(20, 20)

在这里插入图片描述

可视化小拓展&#xff1a;
  • 在这篇文章中&#xff0c;作者将 PAF 的 imshow 的图和原图进行叠加&#xff0c;用的是 cv2.addweighted 大家有兴趣可以查看&#xff0c;最终的结果是这样的

在这里插入图片描述

https://blog.csdn.net/hjxu2016/article/details/111035439



推荐阅读
  • Python交叉分析学习笔记
    Python交叉分析学习笔记本文将介绍两种方法来进行交叉分析:1.独立T检验2.数据透视表。数据源:百度网盘,课程来源:慕课网数据源共包括10个变量,如下:satisfaction ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 注意力汇聚:NadarayaWatson 核回归
    Nadaraya-Watson核回归是具有注意力机制的机器学习范例。Nadaraya-Watson核回归的注意力汇聚是对训练数据中输出的加权平均。从注意力的角度来看, ... [详细]
  • seaborn箱线图_Seaborn线图的数据可视化
    seaborn箱线图Hello,folks!Inthisarticle,wewillbetakingtheSeaborntutorialaheadandunderstandingt ... [详细]
  • 循环发电厂电能输出预测
    前言本次项目是就某联合循环发电厂的数据,运用线性回归模型进行预测电能输出,若文中出现错误的地方,还望指正,谢谢!目录1.数据来源及背景2.数据探索分析3.相关分析4.回 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 解决python matplotlib画水平直线的问题
    本文介绍了在使用python的matplotlib库画水平直线时可能遇到的问题,并提供了解决方法。通过导入numpy和matplotlib.pyplot模块,设置绘图对象的宽度和高度,以及使用plot函数绘制水平直线,可以解决该问题。 ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • python seaborn_大白话Python绘图系列Seaborn篇
    1.目的了解python第三方绘图包seaborn,从常用绘图实例开始,快速体验seaborn绘图。建议用时:10分钟绘图例子:12个每个例子代码量:1 ... [详细]
  • 全卷积网络fcn详解_全卷积神经网络原理
    全卷积网络fcn详解_全卷积神经网络原理原文链接:全卷积网络FCN详解背景CNN能够对图片进行分类,可是怎么样才能识别图片中特定部分的物体,在2015年之前还是一个世界难题。神经网 ... [详细]
  • 开发笔记:共享单车数据分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了共享单车数据分析相关的知识,希望对你有一定的参考价值。共享单车数据分析和共享单车用户行为分析PPT从数据分 ... [详细]
  • Giventhefollowingexample:给出以下示例:X<-matrix(nrow3,ncol3)X[1,]<-c(0.3,0.4,0.45)X ... [详细]
author-avatar
mikewuhan_689
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有