320x100
320x100
matlab 파일을 python으로 여는 방법으로 가장 흔히 검색되는 코드는 아래와 같다.
from scipy import io
mat = io.loadmat('./COFW_train_color.mat')
문제는 이 방식이 에러를 낸다는 점이다. v7.3 files 저쩌구라하면서 에러를 낸다.
해결방법을 여기에서 찾을 수 있었다.
import cv2, h5py
import numpy as np
f = h5py.File('./COFW_train_color.mat', 'r')
bboxed = f['bboxesTr']
images = f['IsTr']
keypoints = f['phisTr']
idx = 399
images = images[0]
image_ref = images[idx]
image = f[image_ref]
if image.ndim == 2:
image = np.array(image)[np.newaxis, :, :]
image = np.concatenate([image, image, image], axis = 0)
image = np.transpose(image)
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
keypoint = np.transpose(keypoints)[idx]
coordi_x = keypoint[:29]
coordi_y = keypoint[29:]
for x, y in zip(coordi_x, coordi_y):
image = cv2.circle(image, (int(x), int(y)), 2, (255, 255, 0), -1)
cv2.imshow('image', image)
- Line 4
파일을 h5py 라이브러리를 통해 열어주면 딕셔너리와 비슷한 방식으로 데이터를 다룰 수 있게 된다. - Line 5 ~ 7
keyword를 이용해서 f에 저장돼있는 데이터들을 불러낸다. - Line 10 ~ 12
곧 바로 좌표 값을 내뱉는 'bboxesTr', 'phisTr'과는 다르게
image 파일은 reference를 반환해주기 때문에
f[image_ref]의 문법을 사용해줘야 이미지를 불러올 수 있다. - Line 14 ~ 18
읽어들인 이미지를 cv2(BGR)에 맞게 변경해주는 과정이다.
이미지들 중에 흑백이미지도 들어있어 Line 14 ~ 16의 과정을 추가했다. - Line 20 ~ 24
대상 이미지의 facial landmark를 그려주는 과정이다.
keypoints가 [ landmark 정보 x 이미지 수 ] 형태로 저장되어 있어서 np.transpose( )를 해준뒤 [idx]로 indexing을 해준 것이고,
[ image 개수, x, y, occlusion bit ] 순으로 저장된 게 아니고
[ x,x,x, ... y,y,y, ... ob,ob,ob ... ] 순으로 저장돼 있어 Line 21, 22와 같이 접근해준 것이다.
잘 따라 왔다면 위와 결은 결과 사진을 확인할 수 있을 것이다.
[ 참고 사이트 ]
https://stackoverflow.com/questions/28541847/how-convert-this-type-of-data-hdf5-object-reference-to-something-more-readable
'Deep Learning > Facial Landmark' 카테고리의 다른 글
Facial Landmark Dataset 정리 (0) | 2019.08.12 |
---|---|
얼굴에서 랜드마크를 추출하는 모델을 만들어보자 (0) | 2019.08.09 |