python - 如何解析位姿估计 tflite 模型的热图输出?

标签 python tensorflow machine-learning tensorflow-lite

我从姿势估计 tflite 模型开始,用于获取人类的关键点。

https://www.tensorflow.org/lite/models/pose_estimation/overview

我开始拟合单个图像或一个人并调用模型:

img = cv.imread('photos\standing\\3.jpg')
img = tf.reshape(tf.image.resize(img, [257,257]), [1,257,257,3])
model = tf.lite.Interpreter('models\posenet_mobilenet_v1_100_257x257_multi_kpt_stripped.tflite')
model.allocate_tensors()
input_details = model.get_input_details()
output_details = model.get_output_details()
floating_model = input_details[0]['dtype'] == np.float32
if floating_model:
    img = (np.float32(img) - 127.5) / 127.5
model.set_tensor(input_details[0]['index'], img)
model.invoke()
output_data =  model.get_tensor(output_details[0]['index'])# o()
offset_data = model.get_tensor(output_details[1]['index'])
results = np.squeeze(output_data)
offsets_results = np.squeeze(offset_data)
print("output shape: {}".format(output_data.shape))
np.savez('sample3.npz', results, offsets_results)

但我正在努力正确解析输出以获得每个 body 部位的坐标/置信度。有人有解释这个模型结果的 python 例子吗? (例如:使用它们将关键点映射回原始图像)

我的代码(来自一个类的片段,本质上直接从模型输出中获取 np 数组):

def get_keypoints(self, data):
        height, width, num_keypoints = data.shape
        keypoints = []
        for keypoint in range(0, num_keypoints):
            maxval = data[0][0][keypoint]
            maxrow = 0
            maxcol = 0
            for row in range(0, width):
                for col in range(0,height):
                    if data[row][col][keypoint] > maxval:
                        maxrow = row
                        maxcol = col
                        maxval = data[row][col][keypoint]
            keypoints.append(KeyPoint(keypoint, maxrow, maxcol, maxval))
            # keypoints = [Keypoint(x,y,z) for x,y,z in ]
        return keypoints
def get_image_coordinates_from_keypoints(self, offsets):
        height, width, depth = (257,257,3)
        # [(x,y,confidence)]
        coords = [{ 'point': k.body_part,
                    'location': (k.x / (width - 1)*width + offsets[k.y][k.x][k.index],
                   k.y / (height - 1)*height + offsets[k.y][k.x][k.index]),
                    'confidence': k.confidence}
                 for k in self.keypoints]
        return coords

将索引与零件匹配后,我的输出是: enter image description here

这里有些坐标是负数,这不可能是正确的。我的错误在哪里?

最佳答案

将 numpy 导入为 np

用于输出热图和偏移的姿态估计模型。想要的积分可以通过以下方式获得:

  1. 在热图上执行 sigmoid 运算:

    分数 = sigmoid(热图)

  2. 这些姿势的每个关键点通常由一个二维矩阵表示,该矩阵中的最大值与模型认为该点在输入图像中的位置有关。使用argmax2D获取每个矩阵中该值的x和y索引,该值本身代表置信度值:

    x,y = np.unravel_index(np.argmax(scores[:,:,keypointindex]), 分数[:,:,关键点索引].shape) 置信度 = 分数[x,y,关键点索引]

  3. x,y用于找到对应的偏移向量来计算关键点的最终位置:

    offset_vector = (offsets[y,x,keypointindex], offsets[y,x,num_keypoints+keypointindex])

  4. 获得关键点坐标和偏移量后,您可以使用 () 计算关键点的最终位置:

    image_positions = np.add(np.array(heatmap_positions) * output_stride, offset_vectors)

参见this用于确定如何获得输出步幅(如果您还没有)。 tflite 位姿估计的输出步长为 32。

从姿势估计模型获取输出并输出关键点的函数。不包括 KeyPoint

def get_keypoints(self, heatmaps, offsets, output_stride=32):
        scores = sigmoid(heatmaps)
        num_keypoints = scores.shape[2]
        heatmap_positions = []
        offset_vectors = []
        confidences = []
        for ki in range(0, num_keypoints ):
            x,y = np.unravel_index(np.argmax(scores[:,:,ki]), scores[:,:,ki].shape)
            confidences.append(scores[x,y,ki])
            offset_vector = (offsets[y,x,ki], offsets[y,x,num_keypoints+ki])
            heatmap_positions.append((x,y))
            offset_vectors.append(offset_vector)
        image_positions = np.add(np.array(heatmap_positions) * output_stride, offset_vectors)
        keypoints = [KeyPoint(i, pos, confidences[i]) for i, pos in enumerate(image_positions)]
        return keypoints

关键点类:


PARTS = {
    0: 'NOSE',
    1: 'LEFT_EYE',
    2: 'RIGHT_EYE',
    3: 'LEFT_EAR',
    4: 'RIGHT_EAR',
    5: 'LEFT_SHOULDER',
    6: 'RIGHT_SHOULDER',
    7: 'LEFT_ELBOW',
    8: 'RIGHT_ELBOW',
    9: 'LEFT_WRIST',
    10: 'RIGHT_WRIST',
    11: 'LEFT_HIP',
    12: 'RIGHT_HIP',
    13: 'LEFT_KNEE',
    14: 'RIGHT_KNEE',
    15: 'LEFT_ANKLE',
    16: 'RIGHT_ANKLE'
}

class KeyPoint():
    def __init__(self, index, pos, v):
        x, y = pos
        self.x = x
        self.y = y
        self.index = index
        self.body_part = PARTS.get(index)
        self.confidence = v

    def point(self):
        return int(self.y), int(self.x)

    def to_string(self):
        return 'part: {} location: {} confidence: {}'.format(
            self.body_part, (self.x, self.y), self.confidence)

关于python - 如何解析位姿估计 tflite 模型的热图输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60032705/

相关文章:

python - Keras CNN 准确率高,但预测不佳。如何改进

python - 我对 python while 循环中的打印感到困惑

Python 模块错误 :Randint

python - Tensorflow 支持哪个版本的 python?

python - tf.tensor_scatter_nd_add 函数确实有效

python - 如何将架构组合传递给 MLPClassifier?

python - 如何使用多重继承强制 Django 删除对象

python - 使用 QuantLib 计算 FloatingRateBond 的现金流量

tensorflow - 如何在 TPU 上实现 bool 掩码

sql - 如何根据列的累积和创建不相等的十分位数/四分位数