OpenPose 人体姿态估计:热点图生成和评价代码示例
以下代码使用 OpenCV 和 Matplotlib 库实现了 OpenPose 算法的热点图和评价,并提供详细说明:
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 加载模型和配置文件
net = cv2.dnn.readNetFromTensorflow('pose/coco/pose_iter_440000.pb')
inWidth = 368
inHeight = 368
threshold = 0.1
# 定义身体关键点的连接关系
BODY_PARTS = {
'Nose': 0,
'Neck': 1,
'RShoulder': 2,
'RElbow': 3,
'RWrist': 4,
'LShoulder': 5,
'LElbow': 6,
'LWrist': 7,
'RHip': 8,
'RKnee': 9,
'RAnkle': 10,
'LHip': 11,
'LKnee': 12,
'LAnkle': 13,
'REye': 14,
'LEye': 15,
'REar': 16,
'LEar': 17,
'Background': 18
}
# 定义身体关键点连接的顺序
POSE_PAIRS = [
['Neck', 'RShoulder'],
['Neck', 'LShoulder'],
['RShoulder', 'RElbow'],
['RElbow', 'RWrist'],
['LShoulder', 'LElbow'],
['LElbow', 'LWrist'],
['Neck', 'RHip'],
['RHip', 'RKnee'],
['RKnee', 'RAnkle'],
['Neck', 'LHip'],
['LHip', 'LKnee'],
['LKnee', 'LAnkle'],
['Nose', 'REye'],
['REye', 'REar'],
['Nose', 'LEye'],
['LEye', 'LEar']
]
# 读取图像
image = cv2.imread('test.jpg')
# 对图像进行预处理
blob = cv2.dnn.blobFromImage(image, 1.0 / 255, (inWidth, inHeight), (0, 0, 0), swapRB=False, crop=False)
# 运行模型
net.setInput(blob)
out = net.forward()
# 获取关键点
points = []
for i in range(len(BODY_PARTS)):
heatMap = out[0, i, :, :]
_, conf, _, point = cv2.minMaxLoc(heatMap)
x = int((image.shape[1] * point[0]) / out.shape[3])
y = int((image.shape[0] * point[1]) / out.shape[2])
if conf > threshold:
points.append((x, y))
else:
points.append(None)
# 绘制关键点和连接线
for pair in POSE_PAIRS:
partFrom = pair[0]
partTo = pair[1]
idFrom = BODY_PARTS[partFrom]
idTo = BODY_PARTS[partTo]
if points[idFrom] and points[idTo]:
cv2.line(image, points[idFrom], points[idTo], (0, 255, 0), 3)
cv2.circle(image, points[idFrom], 4, (0, 0, 255), thickness=-1, lineType=cv2.FILLED)
cv2.circle(image, points[idTo], 4, (0, 0, 255), thickness=-1, lineType=cv2.FILLED)
# 显示图像
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.show()
# 计算关键点的热点图
h, w, c = image.shape
heatmap = np.zeros((h, w), dtype=np.float32)
for i in range(len(BODY_PARTS)):
heatMap = out[0, i, :, :]
heatmap += cv2.resize(heatMap, (w, h))
heatmap /= len(BODY_PARTS)
# 显示关键点的热点图
plt.imshow(heatmap, cmap='hot')
plt.show()
# 计算关键点的评价
score = 0
for pair in POSE_PAIRS:
partFrom = pair[0]
partTo = pair[1]
idFrom = BODY_PARTS[partFrom]
idTo = BODY_PARTS[partTo]
if points[idFrom] and points[idTo]:
dist = np.sqrt((points[idFrom][0] - points[idTo][0]) ** 2 + (points[idFrom][1] - points[idTo][1]) ** 2)
score += dist
score /= len(POSE_PAIRS)
print('Score:', score)
使用说明
- 下载 OpenPose 算法的模型文件和配置文件,将其保存在
pose/coco目录下。 - 将要测试的图像保存在当前目录下并命名为
test.jpg。 - 运行代码后会显示图像和关键点的热点图,并输出关键点的评价得分。
代码说明
- 代码首先加载 OpenPose 模型和配置文件。
- 然后定义了身体关键点的连接关系和连接顺序。
- 读取图像并进行预处理。
- 运行模型并获取关键点。
- 绘制关键点和连接线,显示图像。
- 计算关键点的热点图,并显示热点图。
- 计算关键点的评价得分,并输出得分。
注意事项
- 模型文件和配置文件可以从 OpenPose 官方网站 下载。
- 图像格式可以是 JPG、PNG 或 BMP 等常见格式。
- 评价得分越高,表示姿态估计结果越准确。
代码中使用了以下库:
- OpenCV 用于图像处理和模型运行。
- Matplotlib 用于绘制图像和热点图。
- NumPy 用于数值计算。
希望这篇文章能帮助您了解 OpenPose 算法的热点图生成和评价。
原文地址: https://www.cveoy.top/t/topic/nZIt 著作权归作者所有。请勿转载和采集!