☞ 문서의 내용은 가장 하단 참고문헌 및 사이트를 참고하여 필자가 보기 쉽도록 정리한 내용입니다.
☞ 틀린 내용 및 저작권 관련 문의가 있는 경우 문의하시면 수정 및 삭제 조치하겠습니다.
ITOP Dataset(Invariant Top View)는 사람의 측면과 상단 View에서 촬영한 100,000개의 Depth image를 가지고 있는Dataset이다. 각 Depth image에 대해 15개의 Human body parts를 가지고 있으며 센서 위치를 기준으로 3차원(x , y, z)좌표로 레이블되어 있다. 뿐만 아니라 Segmentation, point Clouds 등과 같은 정보도 제공한다.
ITOP Dataset 다운로드와 사용법
ITOP Dataset은 다음 링크를 통해 다운로드 받을 수 있다. 파일은 총 16개의 압축 파일이 있으며 용량이 약23GB로 크다. 필자는 약 1시간 정도 걸렸다. 16개의 파일은 side_test, side_train, top_test, top_train으로 4개로 분류되며 다시 depthmap, images, labels, pointcloud로 분류된다.
대 분류 | 소분류 | 파일 이름 |
Side_test | depthmap | ITOP_side_test_depth_map.h5.gz |
images | ITOP_side_test_images.h5.gz | |
labels | ITOP_side_test_labels.h5.gz | |
pointcloud | ITOP_side_test_point_cloud.h5.gz | |
Side_train | depthmap | ITOP_side_train_depth_map.h5.gz |
images | TOP_side_train_images.h5.gz | |
labels | ITOP_side_train_labels.h5.gz | |
pointcloud | ITOP_side_train_point_cloud.h5.gz | |
top_test | depthmap | ITOP_top_test_depth_map.h5.gz |
images | ITOP_top_test_images.h5.gz | |
labels | ITOP_top_test_labels.h5.gz | |
pointcloud | ITOP_top_test_point_cloud.h5.gz | |
top_train | depthmap | ITOP_top_train_depth_map.h5.gz |
images | TOP_top_train_images.h5.gz | |
labels | ITOP_top_train_labels.h5.gz | |
pointcloud | ITOP_top_train_point_cloud.h5.gz |
메타데이터
Images, Depth Map, Point Cloud, Labels의 파일 크기는 압축되지 않은 크기를 나타낸다.
View | Split | Frames | People | Images | Depth Map | Point Cloud | Labels |
Side | Train | 39,795 | 16 | 1.1Gib | 5.7Gib | 18Gib | 2.9Gib |
Side | Test | 10,501 | 4 | 276Mib | 1.6Gib | 4.6Gib | 771Mib |
Top | Train | 39,795 | 16 | 974Mib | 5.7Gib | 18Gib | 2.9Gib |
Top | Test | 10,501 | 4 | 261Mib | 1.6Gib | 4.6Gib | 771Mib |
Python에서 Import하기
다운로드된 모든 알집의 압축파일을 풀고 Python에서 아래의 명령어를 이용하여 h5py를 설치한다.
pip install h5py
또는
conda install h5py
설치가 완료되면 h5파일을 python에서 가져올 수 있다. 아래의 코드는 ITOP_side_test_depth_map.h5파일에서 data와 id를 가져오는 코드이다.
import h5py
import numpy as np
f = h5py.File('ITOP_side_test_depth_map.h5', 'r')
data, ids = f.get('data'), f.get('id')
data, ids = np.asarray(data), np.asarray(ids)
print(data.shape, ids.shape)
# (10501, 240, 320) (10501,)
Transformation
Point Clouds에서 240 x 320 이미지로 변환하기 위해 다음 변환이 사용되었다. $x_{img}$ 와 $y_{img}$가 이미지 평면의 (x, y)좌표를 나타낸다. raw point cloud$(x, y, z)$ 실제 좌표를 사용하여 Depth map을 다음과 같이 계산한다.
$x_{img} = \frac{x}{C_{z}}+160$
$y_{img} = \frac{y} {C_{z}}+120$
$C ≈ 3.50 × 10^{-3} = 0.0035$는 내장 카메라 보정 매개변수이다.
이렇게하면 Depth mpa이 생성된다. $(x_{img}, y_{img},z)$
Joint ID(index) Mapping
joint_id_to_name = {
0: 'Head', 8: 'Torso',
1: 'Neck', 9: 'R Hip',
2: 'R Shoulder', 10: 'L Hip',
3: 'L Shoulder', 11: 'R Knee',
4: 'R Elbow', 12: 'L Knee',
5: 'L Elbow', 13: 'R Foot',
6: 'R Hand', 14: 'L Foot',
7: 'L Hand',
}
구분 | Key | 설명 | |
Depth Maps | id | Dimensions | (n, ) |
Data Type | uint8 | ||
Description | XX_YYYY형식의 frame을 식별한다. 여기서 XX는 사람의 ID번호이고 YYYYY는 프레임 번호이다. |
||
data | Dimensions | (n, 240, 320) | |
Data Type | float 16 | ||
Description | 단일 프레임에 해당하는 Depth map의(i.e. mesh) Depth 값의 단위는 실제 미터(m)이다. | ||
Point Clouds | id | Dimensions | (n, ) |
Data Type | uint8 | ||
Description | XX_YYYY형식의 frame을 식별한다. 여기서 XX는 사람의 ID번호이고 YYYYY는 프레임 번호이다. |
||
data | Dimensions | (n, 76800, 3) | |
Data Type | float16 | ||
Description | 76,800 Point (240 x 320)가 포함된 Point Clouds. 각 Point는 실제 미터(m)로 측정된 3D tuple로 표시된다. | ||
Labels | id | Dimensions | (n, ) |
Data Type | uint8 | ||
Description | XX_YYYY형식의 frame을 식별한다. 여기서 XX는 사람의 ID번호이고 YYYYY는 프레임 번호이다. |
||
is_valid | Dimensions | (n, ) | |
Data Type | uint8 | ||
Description | 인체 라벨링 작업 결과에 해당하는 플래그이다. 이것은 bool 값이며, 여기서 (1)은 사람이 사람이 승인한 깨끗한 데이터이며 (0)은 노이즈가 많은 인체 부위이다. | ||
visivle_joints | Dimensions | (n, 15) | |
Data Type | int16 | ||
Description | 각 관절이 보이는지 또는 가려졌는지 나타내는 binary mask이다. 이것은 논문에서 $a_{j} = 1$이면 $j^{th}$관절이 보인다.(즉 가려지지 않음). 그렇지 않고 $a_{j} = 0$이면 $j^{th}$관절이 폐색된 것이다. | ||
image_ coordinates |
Dimensions | (n, 15, 2) | |
Data Type | int16 | ||
Description | depth image 또는 depth map에서 각 body part의 위치에 해당하는 2차원(x, y)좌표 | ||
real_world_ coordinates |
Dimensions | (n, 15, 3) | |
Data Type | float16 | ||
Description | 실제 좌표(m)에서 각 body part의 위치에 해당하는 3차원(x, y, z)좌표 | ||
segmentation | Dimensions | (n, 240, 320) | |
Data Type | int8 | ||
Description | body part lavels의 픽셀을 보여준다. 배경 클래스(즉, 신체 부위 없는 부분)는 -1로 표시된다. |
참고 문헌