93 lines
3.0 KiB
Python
93 lines
3.0 KiB
Python
# OpenFace batch-represent tests.
|
|
#
|
|
# Copyright 2015-2016 Carnegie Mellon University
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
|
|
import os
|
|
import shutil
|
|
import tempfile
|
|
import sys
|
|
|
|
import numpy as np
|
|
np.set_printoptions(precision=2)
|
|
import pandas as pd
|
|
import scipy
|
|
import scipy.spatial
|
|
|
|
from subprocess import Popen, PIPE
|
|
|
|
openfaceDir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
|
|
modelDir = os.path.join(openfaceDir, 'models')
|
|
|
|
exampleImages = os.path.join(openfaceDir, 'images', 'examples')
|
|
lfwSubset = os.path.join(openfaceDir, 'data', 'lfw-subset')
|
|
|
|
|
|
def test_batch_represent():
|
|
assert os.path.isdir(
|
|
lfwSubset), "Get lfw-subset by running ./data/download-lfw-subset.sh"
|
|
|
|
workDir = tempfile.mkdtemp(prefix='OpenFaceBatchRep-')
|
|
|
|
cmd = [sys.executable, os.path.join(openfaceDir, 'util', 'align-dlib.py'),
|
|
os.path.join(lfwSubset, 'raw'), 'align', 'outerEyesAndNose',
|
|
os.path.join(workDir, 'aligned')]
|
|
p = Popen(cmd, stdout=PIPE, stderr=PIPE, universal_newlines=True)
|
|
(out, err) = p.communicate()
|
|
print(out)
|
|
print(err)
|
|
assert p.returncode == 0
|
|
|
|
cmd = [sys.executable, os.path.join(openfaceDir, 'util', 'align-dlib.py'),
|
|
os.path.join(lfwSubset, 'raw'), 'align', 'outerEyesAndNose',
|
|
os.path.join(workDir, 'aligned')]
|
|
p = Popen(cmd, stdout=PIPE, stderr=PIPE, universal_newlines=True)
|
|
(out, err) = p.communicate()
|
|
print(out)
|
|
print(err)
|
|
assert p.returncode == 0
|
|
|
|
cmd = ['th', './batch-represent/main.lua',
|
|
'-data', os.path.join(workDir, 'aligned'),
|
|
'-outDir', os.path.join(workDir, 'reps')]
|
|
p = Popen(cmd, stdout=PIPE, stderr=PIPE, universal_newlines=True)
|
|
(out, err) = p.communicate()
|
|
print(out)
|
|
print(err)
|
|
assert p.returncode == 0
|
|
|
|
fname = os.path.join(workDir, 'reps', 'labels.csv')
|
|
labels = pd.read_csv(fname, header=None).as_matrix()
|
|
fname = os.path.join(workDir, 'reps', 'reps.csv')
|
|
embeddings = pd.read_csv(fname, header=None).as_matrix()
|
|
|
|
brody1 = brody2 = None
|
|
for i, (cls, label) in enumerate(labels):
|
|
if "Brody_0001" in label:
|
|
brody1 = embeddings[i]
|
|
elif "Brody_0002" in label:
|
|
brody2 = embeddings[i]
|
|
|
|
assert brody1 is not None
|
|
assert brody2 is not None
|
|
print("brody1:", brody1)
|
|
print("brody2:", brody2)
|
|
|
|
cosDist = scipy.spatial.distance.cosine(brody1, brody2)
|
|
print('cosDist:', cosDist)
|
|
assert np.isclose(cosDist, 0.1568, atol=1e-4)
|
|
|
|
shutil.rmtree(workDir)
|