Skip to content

Instantly share code, notes, and snippets.

@czarrar
Created February 4, 2017 18:20
Show Gist options
  • Save czarrar/c5c18ed1c8560d79c1107e5aa0479ff8 to your computer and use it in GitHub Desktop.
Save czarrar/c5c18ed1c8560d79c1107e5aa0479ff8 to your computer and use it in GitHub Desktop.
Converting Landmarker JSON <=> PTS
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