MPII數據集簡介

MPII數據集簡介

概述:

MPII人體姿勢數據集是人體姿勢預估的一個 benchmark,數據集包括了超過 40k 人的 25000 張帶標註圖片,這些圖片是從 YouTube video 中抽取出來的。在測試集中還收錄了身體部位遮擋、3D 軀幹、頭部方向的標註。
在這裏插入圖片描述
MPII 地址: http://human-pose.mpi-inf.mpg.de/#overview
MPII 樣本數: 25000 個(單人、多人)
16類標註: (0 - r ankle, 1 - r knee, 2 - r hip, 3 - l hip, 4 - l knee, 5 - l ankle, 6 - pelvis, 7 - thorax, 8 - upper neck, 9 - head top, 10 - r wrist, 11 - r elbow, 12 - r shoulder, 13 - l shoulder, 14 - l elbow, 15 - l wrist)

demo

將MATLAB的mat標籤轉爲txt格式,僅針對單人。

"""
摘錄:https://github.com/Fangyh09/PoseDatasets
"""
from scipy.io import loadmat
import numpy as np


def save_joints():
    mat = loadmat('./mpii_human_pose_v1_u12_1.mat')
    fout = open(r'mpii_list.txt','w')
    for i, (anno, train_flag) in enumerate(
        zip(mat['RELEASE']['annolist'][0, 0][0],
            mat['RELEASE']['img_train'][0, 0][0],
            )):
        img_fn = anno['image']['name'][0, 0][0]
        train_flag = int(train_flag)

        head_rect = []
        if 'x1' in str(anno['annorect'].dtype):
            head_rect = zip(
                [x1[0, 0] for x1 in anno['annorect']['x1'][0]],
                [y1[0, 0] for y1 in anno['annorect']['y1'][0]],
                [x2[0, 0] for x2 in anno['annorect']['x2'][0]],
                [y2[0, 0] for y2 in anno['annorect']['y2'][0]])

        if 'annopoints' in str(anno['annorect'].dtype):
            # only one person
            annopoints = anno['annorect']['annopoints'][0]
            head_x1s = anno['annorect']['x1'][0]
            head_y1s = anno['annorect']['y1'][0]
            head_x2s = anno['annorect']['x2'][0]
            head_y2s = anno['annorect']['y2'][0]

            for annopoint, head_x1, head_y1, head_x2, head_y2 in zip(
                    annopoints, head_x1s, head_y1s, head_x2s, head_y2s):
                if annopoint != []:
                    head_rect = [float(head_x1[0, 0]),
                                 float(head_y1[0, 0]),
                                 float(head_x2[0, 0]),
                                 float(head_y2[0, 0])]
                    # build feed_dict
                    feed_dict = {}
                    feed_dict['width'] = int(abs(float(head_x2[0, 0]) - float(head_x1[0, 0])))
                    feed_dict['height'] = int(abs(float(head_y2[0, 0]) - float(head_y1[0, 0])))

                    # joint coordinates
                    annopoint = annopoint['point'][0, 0]
                    j_id = [str(j_i[0, 0]) for j_i in annopoint['id'][0]]
                    x = [x[0, 0] for x in annopoint['x'][0]]
                    y = [y[0, 0] for y in annopoint['y'][0]]
                    joint_pos = {}
                    for _j_id, (_x, _y) in zip(j_id, zip(x, y)):
                        joint_pos[str(_j_id)] = [float(_x), float(_y)]

                    # visiblity list
                    if 'is_visible' in str(annopoint.dtype):
                        vis = [v[0] if v else [0]
                               for v in annopoint['is_visible'][0]]
                        vis = dict([(k, int(v[0])) if len(v) > 0 else v
                                    for k, v in zip(j_id, vis)])
                    else:
                        vis = None
                    feed_dict['x'] = x
                    feed_dict['y'] = y
                    feed_dict['vis'] = vis
                    feed_dict['filename'] = img_fn

                    if len(joint_pos) == 16:
                        data = {
                            'filename': img_fn,
                            'train': train_flag,
                            'head_rect': head_rect,
                            'is_visible': vis,
                            'joint_pos': joint_pos
                        }

            print(data)
            
            label = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
            sss = ' '
            for key in label:
                sss = sss + str(int(data['joint_pos'][key][0]))+' '+str(int(data['joint_pos'][key][1]))+' '+str(int(data['is_visible'][key]))+' '
            sss = sss.strip()
            fout.write(data['filename'] + ' ' + sss + '\n')
    fout.close()

if __name__ == '__main__':
    save_joints()

輸出結果:

{‘filename’: ‘015494179.jpg’, ‘train’: 1, ‘head_rect’: [1085.0, 95.0, 1144.0, 180.0], ‘is_visible’: {‘6’: 0, ‘7’: 0, ‘8’: 0, ‘9’: 0, ‘0’: 0, ‘1’: 0, ‘2’: 0, ‘3’: 1, ‘4’: 1, ‘5’: 1, ‘10’: 1, ‘11’: 0, ‘12’: 0, ‘13’: 1, ‘14’: 1, ‘15’: 1}, ‘joint_pos’: {‘6’: [1162.0, 345.0], ‘7’: [1170.0, 182.0], ‘8’: [1146.7901, 163.3903], ‘9’: [1082.2099, 111.6097], ‘0’: [1149.0, 572.0], ‘1’: [1158.0, 466.0], ‘2’: [1161.0, 344.0], ‘3’: [1163.0, 346.0], ‘4’: [1161.0, 466.0], ‘5’: [1161.0, 577.0], ‘10’: [1102.0, 227.0], ‘11’: [1147.0, 227.0], ‘12’: [1165.0, 175.0], ‘13’: [1175.0, 189.0], ‘14’: [1175.0, 280.0], ‘15’: [1146.0, 346.0]}}

Display

# -*- coding: utf-8 -*-
"""
mat格式轉成txt格式
"""
import numpy as np
import cv2
import os

if __name__ == '__main__':
    dst = r"./ooo"
    img_name = r"001170661.jpg"
    label = "532 472 1 524 407 1 534 310 0 553 313 1 542 407 1 550 470 1 544 312 0 558 216 0 555 193 0 550 142 0 519 263 0 534 264 0 540 216 0 576 215 1 586 269 1 556 255 1"
    label = label.split()
    label = [int(temp) for temp in label]
    label = np.array(label).reshape(16,3)
    
    img = cv2.imread(os.path.join(r"D:\human_pose\MPII_Data\mpii",img_name))

    for i,key in enumerate(label):
        cv2.circle(img,(key[0],key[1]),8,(0,0,255),2)
        cv2.putText(img, str(i), (key[0],key[1]), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2)
        
    cv2.imwrite(os.path.join(dst,img_name),img)
    cv2.imshow('src',img)
    cv2.waitKey(0)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章