天天看點

2D人體姿态識别-對Human3.6M資料集預處理(1):用python讀取并處理cdf檔案,cdflib包中各函數介紹,Human3.6M資料集2d關節點格式解讀一、Human3.6M資料集結構介紹二、處理cdf.檔案

文章目錄

  • 一、Human3.6M資料集結構介紹
  • 二、處理cdf.檔案
    • 1.法一:使用nasa官方提供的CDF library
    • 2.法二:使用CDF library的純python替代品:cdflib
      • 1)安裝cdflib
      • 2)cdflib中各函數介紹
        • ①讀取一個cdf.檔案 cdflib.CDF('xxx.cdf')
        • ②檢視此cdf.檔案資訊: cdf_info()
        • ③提取此cdf檔案中的變量:varget ()
      • 3)*cdflib執行個體:處理H3.6M中存儲2d keypoints的cdf檔案
      • 4)解讀Human3.6M資料集中視訊和2d關節點資料

前言

一、Human3.6M資料集結構介紹

Human3.6M資料集有360萬個3D人體姿勢和相應的圖像,共有11個實驗者(Subject)(6男5女,論文一般選取1,5,6,7,8作為train,9,11作為test),和17個動作場景(Scenario),諸如讨論、吃飯、運動、問候等動作。該資料由4個數字錄影機,1個時間傳感器,10個運動錄影機捕獲。

我需要訓練的網絡輸入應該為兩個角度的人物照片(從視訊中提取關鍵幀),2d關節的關鍵點作為監督(從cdf檔案中提取)。從官網的以下分類中下載下傳:

2D人體姿态識别-對Human3.6M資料集預處理(1):用python讀取并處理cdf檔案,cdflib包中各函數介紹,Human3.6M資料集2d關節點格式解讀一、Human3.6M資料集結構介紹二、處理cdf.檔案

大批量預處理Human3.6M資料集的方法可以參考:github: h36m-fetch

這次的小批量預處理先以S1(人物)的sitting1.55011271(人物右前方,觀察者的左側,下面用左來命名)和sitting.60457274(人物左前方,觀察者的右側,下面用右來命名)為例。

2D人體姿态識别-對Human3.6M資料集預處理(1):用python讀取并處理cdf檔案,cdflib包中各函數介紹,Human3.6M資料集2d關節點格式解讀一、Human3.6M資料集結構介紹二、處理cdf.檔案

二、處理cdf.檔案

1.法一:使用nasa官方提供的CDF library

參考:使用python讀取cdf資料

  • 第一步:下載下傳CDF Library:nasa cdf 官網
  • 第二步:編譯

    make OS=linux ENV=gnu CURSES=yes FORTRAN=no UCOPTIONS=-O2 SHARED=yes all

  • 第三步:安裝

    sudo make INSTALLDIR=/usr/local/cdf install

  • 第四步:安裝

    spacepy pip install spacepy

  • 第五步:使用代碼如下執行個體
import os
from spacepy import pycdf
os.environ["CDF_LIB"] = "/usr/local/cdf/lib"
anno_Greeting=pycdf.CDF('/home/maddaff/Documents/TestSpace/Greeting.54138969.cdf')
data=anno_Greeting.copy()
anno_Greeting.close()
print data.keys()
           

NASA官網提供的可下載下傳檔案太多了,我不知道下載下傳哪個才是正确的CDF Lib,故而放棄了這種方法。

2.法二:使用CDF library的純python替代品:cdflib

cdflib子產品詳情(github位址)

1)安裝cdflib

在cmd中執行

pip install cdflib

或者直接在Pycharm中安裝此package

2D人體姿态識别-對Human3.6M資料集預處理(1):用python讀取并處理cdf檔案,cdflib包中各函數介紹,Human3.6M資料集2d關節點格式解讀一、Human3.6M資料集結構介紹二、處理cdf.檔案

2)cdflib中各函數介紹

①讀取一個cdf.檔案 cdflib.CDF(‘xxx.cdf’)

import cdflib
cdf_file = cdflib.CDF('/path/to/cdf_file.cdf')
           

②檢視此cdf.檔案資訊: cdf_info()

傳回一個顯示基本CDF資訊的字典。這些資訊包括:

cdf

CDF的名稱

version

CDF的版本

encoding

CDF的位元組順序

Majority

行/列多數

zVariables

一個zVariables名稱的清單。

rVariables

一個rVariables名稱的清單。

Attributes

一個包含屬性名及其作用域的字典對象清單,例如 - {attribute_name : scope}。

Checksum

驗算符

Num_rdim

次元數,僅适用于 rVariables。

rDim_sizes

次元大小,僅适用于 rVariables。

Compressed

CDF壓縮到此檔案級

LeapSecondUpdated

最後更新的閏年表(如适用)

③提取此cdf檔案中的變量:varget ()

  • 預設情況下,将傳回完整的變量資料。要僅擷取記錄可變變量的一部分資料,可以指定時間或記錄(從0開始)範圍。
  • epoch

    可用于指定該變量所依賴的時間變量,并将在時間範圍内進行搜尋。對于符合ISTP的CDF,時間變量将來自此變量的屬性“ DEPEND_0”。該功能将自動搜尋它,是以無需指定“epoch”。
  • 如果未指定開始時間或結束時間(

    starttime

    end time

    ),則假定特定時期資料類型可能的最小值或最大值。
  • 如果未指定開始或結束記錄(

    startrec

    endrec

    ),則範圍從0開始,結束于最後寫入的資料。

開始(和結束)時間應在清單中顯示為:

  • [year month day hour minute second millisec] for CDF_EPOCH
  • [year month day hour minute second millisec microsec nanosec picosec] for

    CDF_EPOCH16

  • [year month day hour minute second millisec microsec nanosec] for CDF_TIME_TT2000

如果沒有提供足夠的時間分量,則隻有最後一項可以具有子時間分量的浮動部分。

注意:CDF的CDF_EPOCH16資料類型為每個資料值使用2個8位元組雙精度數。在Python中,每個值都表示為complex或numpy.complex128。

傳回變量資料。可以輸入變量名或變量号。預設情況下,它會根據資料類型傳回帶有變量data及其規範的numpy.ndarray or或list()class對象。

如果為expand=True,則傳回具有以下定義的鍵的字典用于輸出

Rec_Ndim

每個變量記錄的維數

Rec_Shape

變量的形狀

Num_Records

記錄總數

Records_Returned

檢索到的記錄數

Data_Type

CDF資料類型

Data

檢索變量資料

Real_Records

清單中稀疏記錄變量的真實資料記錄号

例如:

此指令将傳回變量Variable10中的所有資料,從記錄時刻0到150

3)*cdflib執行個體:處理H3.6M中存儲2d keypoints的cdf檔案

import cdflib

#load a cdf file
cdf= cdflib.CDF('Sitting 1.55011271.cdf')

#View the Information about the cdf file
info = cdf.cdf_info()

#Get the variables in the cdf file
x = cdf.varget("Pose")
           

4)解讀Human3.6M資料集中視訊和2d關節點資料

上述代碼生成的變量如下圖所示:

2D人體姿态識别-對Human3.6M資料集預處理(1):用python讀取并處理cdf檔案,cdflib包中各函數介紹,Human3.6M資料集2d關節點格式解讀一、Human3.6M資料集結構介紹二、處理cdf.檔案

我們重點關注x(1,3304,64),也就是從cdf檔案中提取出來的變量,表示的是視訊每一幀中各關節點的2d坐标标注。

  • 行-幀數:cdf檔案的每一行的定義是一幀中的标注,是以一個标注檔案對應的視訊有多少幀,這個檔案就有多少行。這個sitting1.55011271.mp4共有3304幀。
    2D人體姿态識别-對Human3.6M資料集預處理(1):用python讀取并處理cdf檔案,cdflib包中各函數介紹,Human3.6M資料集2d關節點格式解讀一、Human3.6M資料集結構介紹二、處理cdf.檔案
  • 列-32個關鍵點的2D坐标:這3304行的每一行裡面有64個資料,每2個資料為一組,共32組,每組表示的便是這個關鍵點的2D坐标。

論文《Human3.6M: Large Scale Datasets and Predictive Methods for 3D Human Sensing in Natural Environments》提到,資料集中共有32個關節點,但并未給出具體的标注順序和對應關節。

在h3.6m中,會有一些看似備援标注點,如圖中的11和0是重合的,其實是因為h36m的節點來說,如果它們的父節點相同,那麼它們共享同一個旋轉向量,是以所有父節點相同的節點相對父節點旋轉角度都是一樣的,這樣會造成一些問題,比如節點0有3子節點,但是胯部的方向和脊椎的旋轉方向是不一樣的,是以就需要一個多設定一個11節點作為12的父節點來改變12節點的旋轉方向。同理,20與19重合用來改變21的方向,28與27重合用來改變29的方向,16和24都與13重合,16用來改變17的方向,24用來改變25的方向,剩下的23和31則為無意義節點。

————————————————

版權聲明:本文為CSDN部落客「alickr」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/alickr/article/details/107837403

由此可知,H36M資料集中标注32個關鍵點(見右圖),一部分是為了滿足表達旋轉向量的需要的。我們隻研究關節點的2d位置時,不需要考慮全部的32個關鍵點,隻需要提取出有效表示對應關節的關鍵點即可(見左表)。

2D人體姿态識别-對Human3.6M資料集預處理(1):用python讀取并處理cdf檔案,cdflib包中各函數介紹,Human3.6M資料集2d關節點格式解讀一、Human3.6M資料集結構介紹二、處理cdf.檔案

右圖是參考博文CSDN:human3.6m資料集格式解析中給出的全部關鍵點(keypoints)的标注順序,左表是博文COCO和Human3.6m兩個資料集的人體骨骼标注順序 中給出的關鍵點和主要關節對應關系(注意這篇博文裡coco的标注是錯的!正确的關系見Coco key point json file parsing):