openpose学习之:可视化 PAF 场

加载准备好的数据(训练前的数据)

  • .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 + v**2 < 0.5**2] = True

from numpy import ma
u = ma.masked_array(u,mask=m)
v = ma.masked_array(v,mask=m)
''' stride ,在 X,Y 构成的坐标图上,每隔 stride 个像素点画一个向量'''
s = 2 

plt.quiver(x[::s],y[::s],u[::s],v[::s],color="r")

'''注意, plt.quiver 和 plt.imshow 的时候,他们的 y 轴坐标的起始是不同的'''

在这里插入图片描述

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

在这里插入图片描述

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

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

在这里插入图片描述

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

将矢量图叠加到原图上

  • 由于原图尺寸被 pad 成了 (368,368) 因此,我们先将 label resize 成和 img 对应尺寸
  • 由于 PAF 图的数据值的分布范围在 0-1 ,因此我们需要对他进行操作,normalize 成 (0-255) 之间的 uint类型,才能进行 opencv 的操作
  • 最后我们采用 cv2.addweighted 对图进行叠加
X,Y = np.meshgrid(np.arange(368),np.arange(368))
U = cv2.resize(pafs[:,:,0],(368,368),cv2.INTER_CUBIC)
V = cv2.resize(pafs[:,:,1],(368,368),cv2.INTER_CUBIC)
M = np.zeros((368,368),dtype="bool")
M[U**2 + V**2 < 0.5 * 0.5] = True

from numpy import ma
U = ma.masked_array(U, mask=M)
V = ma.masked_array(V, mask=M)

# 1
plt.figure()
plt.imshow(img_, alpha = .5)
s = 5
Q = plt.quiver(X[::s,::s], Y[::s,::s], U[::s,::s], V[::s,::s], 
               scale=50, headaxislength=4, alpha=.5, width=0.001, color='r')
fig = plt.gcf()
fig.set_size_inches(20, 20)

在这里插入图片描述

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

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

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

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

在这里插入图片描述

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

'''矢量图中的第偶数个,但是他们对应通道的索引是偶数'''
odd = [i for i in range(pafs.shape[2]) if i % 2 == 0]
'''矢量图中的第偶数个,但是他们对应通道的索引都是奇数'''
even = [i for i in range(pafs.shape[2]) if i % 2 != 0]
final_x = np.amax(pafs[:,:,odd],axis=2)
final_y = np.amax(pafs[:,:,even],axis=2)
pafs.shape
(46, 46, 38)
plt.imshow(final_x)

在这里插入图片描述

plt.imshow(final_y)

在这里插入图片描述

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

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

在这里插入图片描述

可视化小拓展:

  • 在这篇文章中,作者将 PAF 的 imshow 的图和原图进行叠加,用的是 cv2.addweighted 大家有兴趣可以查看,最终的结果是这样的

在这里插入图片描述

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


  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暖仔会飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值