Created
February 4, 2017 18:20
-
-
Save czarrar/c5c18ed1c8560d79c1107e5aa0479ff8 to your computer and use it in GitHub Desktop.
Converting Landmarker JSON <=> PTS
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from menpo.shape import PointCloud | |
from menpo.shape import PointDirectedGraph | |
from menpo.shape import bounding_box | |
import json | |
def read_landmarker_pts(fname): | |
# Note: It's in this order! | |
#old_order = ['chin', 'left-eye', 'right-eye', 'left-eyebrow', 'nose', 'right-eyebrow', 'outer-mouth', 'inner-mouth'] | |
face_parts = { | |
'chin': range(17), # 0:16 | |
'left-eye': range(17,23), # 17:23 | |
'right-eye': range(23,29), # 23:28 | |
'left-eyebrow': range(29,34), # 29:33 | |
'nose': range(34,43), # 34:42 | |
'right-eyebrow': range(43,48), # 43:47 | |
'outer-mouth': range(48,60), # 48:59 | |
'inner-mouth': range(60,68) # 60:67 | |
} | |
# New order for pts | |
desired_order = ['chin', 'left-eyebrow', 'right-eyebrow', 'nose', 'left-eye', 'right-eye', 'outer-mouth', 'inner-mouth'] | |
# Load | |
d = json.load(open(fname, 'rb')) | |
lpts = d['landmarks']['points'] | |
# Convert | |
pts = [] | |
for do in desired_order: | |
for i in face_parts[do]: | |
pts.append(lpts[i]) | |
pts = np.array(pts) | |
#pts = np.array(lpts) | |
# Return | |
return pts | |
face_parts = { | |
'chin': range(17), # 0:16 | |
'left-eyebrow': range(17,22), # 17:21 | |
'right-eyebrow': range(22,27), # 22:26 | |
'nose': range(27,36), # 27:35 | |
'left-eye': range(36,42), # 36:41 | |
'right-eye': range(42,48), # 42:47 | |
'outer-mouth': range(48,60), # 48:59 | |
'inner-mouth': range(60,68) # 60:67 | |
} | |
def save_landmarker(img, land, ofname): | |
# only for ibug68 | |
desired_order = ['chin', 'left-eye', 'right-eye', 'left-eyebrow', 'nose', 'right-eyebrow', 'outer-mouth', 'inner-mouth'] | |
lands = {"landmarks": {"points":None, "connectivity":[[0,1],[1,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8],[8,9],[9,10],[10,11],[11,12],[12,13],[13,14],[14,15],[15,16],[17,18],[18,19],[19,20],[20,21],[21,22],[22,17],[23,24],[24,25],[25,26],[26,27],[27,28],[28,23],[29,30],[30,31],[31,32],[32,33],[34,35],[35,36],[36,37],[38,39],[39,40],[40,41],[41,42],[43,44],[44,45],[45,46],[46,47],[48,49],[49,50],[50,51],[51,52],[52,53],[53,54],[54,55],[55,56],[56,57],[57,58],[58,59],[59,48],[60,61],[61,62],[62,63],[63,64],[64,65],[65,66],[66,67],[67,60]]},"labels":[{"label":"chin","mask":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]},{"label":"leye","mask":[17,18,19,20,21,22]},{"label":"reye","mask":[23,24,25,26,27,28]},{"label":"leyebrow","mask":[29,30,31,32,33]},{"label":"nose","mask":[34,35,36,37,38,39,40,41,42]},{"label":"reyebrow","mask":[43,44,45,46,47]},{"label":"mouth","mask":[48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67]}],"version":2} | |
# assume you got the landmarks | |
pts = img.landmarks[land].lms.h_points()[:2,:].T | |
lpts = [] | |
for do in desired_order: | |
for i in face_parts[do]: | |
lpts.append(pts[i].tolist()) | |
lands['landmarks']['points'] = lpts | |
# save | |
ofile = "%s/landmarks/%s_ibug68.ljson" % (os.path.dirname(ofname), os.path.basename(ofname)) | |
if not os.path.exists(os.path.dirname(ofile)): os.mkdir(os.path.dirname(ofile)) | |
with open(ofile, 'w') as f: | |
json.dump(lands, f) | |
return lands | |
def save_landmarker_frames(indir, vname): | |
if not os.path.exists(os.path.join(indir, vname, "landmarks")): os.mkdir(os.path.join(indir, vname, "landmarks")) | |
frame_nums = range(3,46,6) | |
for fr in frame_nums: | |
infile = "%s/%s/%s_fr%03i.jpg" % (indir, vname, vname, fr) | |
img = mio.import_image(infile) | |
save_landmarker(img, 'PTS', infile) | |
return |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment