본문 바로가기

Deep Learning/Facial Landmark

COFW Dataset 여는 방법

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