您的位置:

Keypoints详解

一、Keypoints AP

Keypoints AP是一种评估人类姿态估计准确性的指标,是对人体关键点的检测和姿态估计的评估标准。在深度学习领域中,一般使用COCO数据集进行Keypoints AP的计算。

Keypoints AP可以通过以下方式计算:

import pycocotools.coco as coco
from pycocotools.cocoeval import COCOeval

# 加载预测结果和真实结果
cocoGt = coco.COCO('path/annotations/person_keypoints_val2017.json')
cocoDt = cocoGt.loadRes('path/annotations/person_keypoints_val2017_fakekeypoints100_results.json')

# 初始化评估类
cocoEval = COCOeval(cocoGt, cocoDt, 'keypoints')

# 运行评估
cocoEval.evaluate()
cocoEval.accumulate()
cocoEval.summarize()
Keypoints AP: (AP, AP50, AP75, APm, APl, AR, AR50, AR75, ARm, ARl)

二、Keypoints荧光笔

Keypoints荧光笔是一种可视化方法,可以将预测的人体关键点标记在图片上。在python中,可以使用OpenCV库进行Keypoints荧光笔的绘制。

以下是Keypoints荧光笔的示例代码:

import cv2
import numpy as np

# 加载图片和预测结果
img = cv2.imread('path/image.jpg')
points = np.array([[10, 20], [30, 40], [50, 60]])

# 用红色圆圈标记关键点
for point in points:
    cv2.circle(img, tuple(point), 5, (0, 0, 255), -1)

# 展示结果
cv2.imshow('Keypoints', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、文献中列出的keypoints

在人体姿态估计领域的文献中,常见的Keypoints包括17个关键点、18个关键点、25个关键点和68个关键点等多种方式。以下是常见的两种Keypoints:

1、17个关键点: nose, left_eye, right_eye, left_ear, right_ear, left_shoulder, right_shoulder, left_elbow, right_elbow, left_wrist, right_wrist, left_hip, right_hip, left_knee, right_knee, left_ankle, right_ankle。

2、25个关键点: nose, left_eye, right_eye, left_ear, right_ear, left_shoulder, right_shoulder, left_elbow, right_elbow, left_wrist, right_wrist, left_hip, right_hip, left_knee, right_knee, left_ankle, right_ankle, neck, background, left_palm, right_palm, spine, left_instep, right_instep。

四、difficultpoints

人体姿态估计中,有一些关键点是难以准确预测的,称为difficultpoints。如手和足底等部位,通常会对这些部位进行特殊处理,如使用更多的注意力机制、额外的数据增强等方法来提高精度。

以下是使用PyTorch处理difficultpoints的示例代码:

import torch

# 定义网络和损失函数
model = Model()
criterion = LossFunction()

# 初始化优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

# 加载训练数据和测试数据
train_dataset = Dataset(train=True)
test_dataset = Dataset(train=False)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)

# 训练模型
for epoch in range(10):
    for i, batch in enumerate(train_loader):
        # 加载数据
        inputs, targets, is_difficult = batch

        # 前向传播
        outputs = model(inputs)

        # 计算损失
        loss = criterion(outputs, targets, is_difficult)

        # 反向传播和优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

    # 在测试集上验证模型
    with torch.no_grad():
        test_loss = 0
        for i, batch in enumerate(test_loader):
            inputs, targets, is_difficult = batch
            outputs = model(inputs)
            test_loss += criterion(outputs, targets, is_difficult)
        test_loss /= len(test_loader)
    print('Epoch: {}, Test Loss: {}'.format(epoch+1, test_loss))

五、如何把Keypoints转化成CPU

在使用GPU进行人体姿态估计时,有时需要将Keypoints转化成CPU,方便进行后续的处理和可视化等操作。以下是PyTorch中将Keypoints转化成CPU的示例代码:

import torch

# 定义Keypoints
keypoints = torch.randn(2, 17, 3).cuda()

# 转化成CPU
keypoints_cpu = keypoints.cpu()