Ejemplo n.º 1
0
def main():
    parser = argparse.ArgumentParser()
    lfwDefault = os.path.expanduser(
        "~/openface/data/lfw/dlib.affine.sz:96.OuterEyesAndNose")
    parser.add_argument('--lfwAligned', type=str,
                        default=lfwDefault,
                        help='Location of aligned LFW images')
    parser.add_argument('--networkModel', type=str, help="Path to Torch network model.",
                        default=os.path.join(openfaceModelDir, 'nn4.small2.v1.t7'))
    parser.add_argument('--largeFont', action='store_true')
    parser.add_argument('workDir', type=str,
                        help='The work directory where intermediate files and results are kept.')
    args = parser.parse_args()
    # print(args)

    if args.largeFont:
        font = {'family': 'normal', 'size': 20}
        mpl.rc('font', **font)

    mkdirP(args.workDir)

    print("Getting lfwPpl")
    lfwPplCache = os.path.join(args.workDir, 'lfwPpl.pkl')
    lfwPpl = cacheToFile(lfwPplCache)(getLfwPplSorted)(args.lfwAligned)

    print("Eigenfaces Experiment")
    cls = cv2.createEigenFaceRecognizer()
    cache = os.path.join(args.workDir, 'eigenFacesExp.pkl')
    eigenFacesDf = cacheToFile(cache)(opencvExp)(lfwPpl, cls)

    print("Fisherfaces Experiment")
    cls = cv2.createFisherFaceRecognizer()
    cache = os.path.join(args.workDir, 'fisherFacesExp.pkl')
    fishFacesDf = cacheToFile(cache)(opencvExp)(lfwPpl, cls)

    print("LBPH Experiment")
    cls = cv2.createLBPHFaceRecognizer()
    cache = os.path.join(args.workDir, 'lbphExp.pkl')
    lbphFacesDf = cacheToFile(cache)(opencvExp)(lfwPpl, cls)

    print("OpenFace CPU/SVM Experiment")
    net = openface.TorchNeuralNet(args.networkModel, 96, cuda=False)
    cls = SVC(kernel='linear', C=1)
    cache = os.path.join(args.workDir, 'openface.cpu.svm.pkl')
    openfaceCPUsvmDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)

    print("OpenFace GPU/SVM Experiment")
    net = openface.TorchNeuralNet(args.networkModel, 96, cuda=True)
    cache = os.path.join(args.workDir, 'openface.gpu.svm.pkl')
    openfaceGPUsvmDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)

    plotAccuracy(args.workDir, args.largeFont,
                 eigenFacesDf, fishFacesDf, lbphFacesDf,
                 openfaceCPUsvmDf, openfaceGPUsvmDf)
    plotTrainingTime(args.workDir, argrs.largeFont,
                     eigenFacesDf, fishFacesDf, lbphFacesDf,
                     openfaceCPUsvmDf, openfaceGPUsvmDf)
    plotPredictionTime(args.workDir, args.largeFont,
                       eigenFacesDf, fishFacesDf, lbphFacesDf,
                       openfaceCPUsvmDf, openfaceGPUsvmDf)
Ejemplo n.º 2
0
def download(person, url, bb):
    imgName = os.path.basename(url)
    rawPersonPath = os.path.join(args.raw, person)
    rawImgPath = os.path.join(rawPersonPath, imgName)
    alignedPersonPath = os.path.join(args.aligned, person)
    alignedImgPath = os.path.join(alignedPersonPath, hashlib.md5(imgName).hexdigest()+".png")

    mkdirP(rawPersonPath)
    mkdirP(alignedPersonPath)

    if not os.path.isfile(rawImgPath):
        urlF = urllib2.urlopen(url)
        with open(rawImgPath, 'wb') as f:
            f.write(urlF.read())

    if not os.path.isfile(alignedImgPath):
        bgr = cv2.imread(rawImgPath)
        if bgr is None:
            return

        rgb = cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)

        dlibBB = dlib.rectangle(*bb)
        outRgb = align.align(96, rgb,
                             bb=dlibBB,
                             landmarkIndices=landmarkIndices)

        if outRgb is not None:
            outBgr = cv2.cvtColor(outRgb, cv2.COLOR_RGB2BGR)
            cv2.imwrite(alignedImgPath, outBgr)
def download(person, url, bb):
    imgName = os.path.basename(url)
    rawPersonPath = os.path.join(args.raw, person)
    rawImgPath = os.path.join(rawPersonPath, imgName)
    alignedPersonPath = os.path.join(args.aligned, person)
    alignedImgPath = os.path.join(alignedPersonPath,
                                  hashlib.md5(imgName).hexdigest() + ".png")

    mkdirP(rawPersonPath)
    mkdirP(alignedPersonPath)

    if not os.path.isfile(rawImgPath):
        urlF = urllib2.urlopen(url, timeout=5)
        with open(rawImgPath, 'wb') as f:
            f.write(urlF.read())

    if not os.path.isfile(alignedImgPath):
        bgr = cv2.imread(rawImgPath)
        if bgr is None:
            return

        rgb = cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)

        dlibBB = dlib.rectangle(*bb)
        outRgb = align.align(96,
                             rgb,
                             bb=dlibBB,
                             landmarkIndices=landmarkIndices)

        if outRgb is not None:
            outBgr = cv2.cvtColor(outRgb, cv2.COLOR_RGB2BGR)
            cv2.imwrite(alignedImgPath, outBgr)
Ejemplo n.º 4
0
def main():
    parser = argparse.ArgumentParser()

    parser.add_argument('--lfwDlibAligned', type=str,
                        help='Location of Dlib aligned LFW images')
    parser.add_argument('--lfwMtcnnAligned', type=str,
                    help='Location of MTCNN aligned LFW images')
    parser.add_argument('--largeFont', action='store_true')
    parser.add_argument('workDir', type=str,
                        help='The work directory where intermediate files and results are kept.')
    args = parser.parse_args()
    # print(args)

    if args.largeFont:
        font = {'family': 'normal', 'size': 20}
        mpl.rc('font', **font)

    mkdirP(args.workDir)

    # get ytf feature pickles
    #print("Getting OpenFace YTF features")
    #cache = os.path.join(args.workDir, 'facenet.ytf.features.pkl')
    #openface_ytf = cacheToFile(cache)(getFacenetFeatures)(facenetModelDir, args.lfwMtcnnAligned)

    #print("Getting Facenet YTF features")
    #cache = os.path.join(args.workDir, 'openface.ytf.features.pkl')
    #facenet_ytf = cacheToFile(cache)(getOpenfaceFeatures)(openfaceModelPath, args.lfwDlibAligned)

    ytf_dlib = get_dataset(args.lfwDlibAligned)
    ytf_mtcnn = get_dataset(args.lfwMtcnnAligned)


    print("OpenFace SVM Experiment")
    net = openface.TorchNeuralNet(openfaceModelPath, 96, cuda=False)
    cls = SVC(C=1, kernel='linear')
    cache = os.path.join(args.workDir, 'openface.cpu.svm.pkl')
    openfaceCPUsvmDf = cacheToFile(cache)(openfaceExp)(ytf_dlib, net, cls)

    print("OpenFace LinearSVC Experiment")
    net = openface.TorchNeuralNet(openfaceModelPath, 96, cuda=False)
    cls = LinearSVC(C=1, multi_class='ovr')
    cache = os.path.join(args.workDir, 'openface.cpu.linearsvm.pkl')
    openfaceCPUlinearsvmDf = cacheToFile(cache)(openfaceExp)(ytf_dlib, net, cls)

    print("Facenet SVM Experiment")
    cls = SVC(C=1, kernel='linear')
    cache = os.path.join(args.workDir, 'facenet.svm.pkl')
    facenetsvmDf = cacheToFile(cache)(facenetExp)(ytf_mtcnn, facenetModelDir, cls)

    print("Facenet LinearSVC Experiment")
    cls = LinearSVC(C=1, multi_class='ovr')
    cache = os.path.join(args.workDir, 'facenet.linearsvm.pkl')
    facenetlinearsvmDf = cacheToFile(cache)(facenetExp)(ytf_mtcnn, facenetModelDir, cls)


    plotAccuracy(args.workDir, args.largeFont, openfaceCPUsvmDf, openfaceCPUlinearsvmDf, facenetsvmDf, facenetlinearsvmDf)
    plotTrainingTime(args.workDir, args.largeFont, openfaceCPUsvmDf, openfaceCPUlinearsvmDf, facenetsvmDf, facenetlinearsvmDf)
    plotPredictionTime(args.workDir, args.largeFont, openfaceCPUsvmDf, openfaceCPUlinearsvmDf, facenetsvmDf, facenetlinearsvmDf)
Ejemplo n.º 5
0
def main():
    parser = argparse.ArgumentParser()

    parser.add_argument('--lfwDlibAligned',
                        type=str,
                        help='Location of Dlib aligned LFW images')
    parser.add_argument('--lfwMtcnnAligned',
                        type=str,
                        help='Location of MTCNN aligned LFW images')
    parser.add_argument('--largeFont', action='store_true')
    parser.add_argument(
        'workDir',
        type=str,
        help='The work directory where intermediate files and results are kept.'
    )
    args = parser.parse_args()
    # print(args)

    if args.largeFont:
        font = {'family': 'normal', 'size': 20}
        mpl.rc('font', **font)

    mkdirP(args.workDir)

    print("Getting lfwPpl")
    lfwPplCache = os.path.join(args.workDir, 'lfwPpl.pkl')
    lfwPpl = cacheToFile(lfwPplCache)(getLfwPplSorted)(args.lfwDlibAligned)

    print("OpenFace LinearSVC Experiment")
    net = openface.TorchNeuralNet(openfaceModelPath, 96, cuda=False)
    cls = LinearSVC(C=1, multi_class='ovr')
    cache = os.path.join(args.workDir, 'openface.cpu.linearsvm.pkl')
    openfaceCPUlinearsvmDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)

    print("Getting lfwMtcnnPpl")
    lfwMtcnnPplCache = os.path.join(args.workDir, 'lfwMtcnnPpl.pkl')
    lfwMtcnnPpl = cacheToFile(lfwMtcnnPplCache)(getLfwPplSorted)(
        args.lfwMtcnnAligned)

    print("Facenet LinearSVC Experiment")
    cls = LinearSVC(C=1, multi_class='ovr')
    cache = os.path.join(args.workDir, 'facenet.linearsvm.pkl')
    facenetlinearsvmDf = cacheToFile(cache)(facenetExp)(lfwMtcnnPpl,
                                                        facenetModelDir, cls)

    plotAccuracy(args.workDir, args.largeFont, openfaceCPUlinearsvmDf,
                 facenetlinearsvmDf)
    plotTrainingTime(args.workDir, args.largeFont, openfaceCPUlinearsvmDf,
                     facenetlinearsvmDf)
    plotPredictionTime(args.workDir, args.largeFont, openfaceCPUlinearsvmDf,
                       facenetlinearsvmDf)
Ejemplo n.º 6
0
def main():
    parser = argparse.ArgumentParser()

    parser.add_argument('--lfwDlibAligned', type=str,
                        help='Location of Dlib aligned LFW images')
    parser.add_argument('--lfwMtcnnAligned', type=str,
                    help='Location of MTCNN aligned LFW images')
    parser.add_argument('--largeFont', action='store_true')
    parser.add_argument('workDir', type=str,
                        help='The work directory where intermediate files and results are kept.')
    args = parser.parse_args()
    # print(args)

    if args.largeFont:
        font = {'family': 'normal', 'size': 20}
        mpl.rc('font', **font)

    mkdirP(args.workDir)

    print("Getting lfwPpl")
    lfwPplCache = os.path.join(args.workDir, 'lfwPpl.pkl')
    lfwPpl = cacheToFile(lfwPplCache)(getLfwPplSorted)(args.lfwDlibAligned)

    print("OpenFace LinearSVC Experiment")
    net = openface.TorchNeuralNet(openfaceModelPath, 96, cuda=False)
    cls = LinearSVC(C=1, multi_class='ovr')
    cache = os.path.join(args.workDir, 'openface.cpu.linearsvm.pkl')
    openfaceCPUlinearsvmDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)


    print("Getting lfwMtcnnPpl")
    lfwMtcnnPplCache = os.path.join(args.workDir, 'lfwMtcnnPpl.pkl')
    lfwMtcnnPpl = cacheToFile(lfwMtcnnPplCache)(getLfwPplSorted)(args.lfwMtcnnAligned)

    print("Facenet LinearSVC Experiment")
    cls = LinearSVC(C=1, multi_class='ovr')
    cache = os.path.join(args.workDir, 'facenet.linearsvm.pkl')
    facenetlinearsvmDf = cacheToFile(cache)(facenetExp)(lfwMtcnnPpl, facenetModelDir, cls)


    plotAccuracy(args.workDir, args.largeFont, openfaceCPUlinearsvmDf, facenetlinearsvmDf)
    plotTrainingTime(args.workDir, args.largeFont, openfaceCPUlinearsvmDf, facenetlinearsvmDf)
    plotPredictionTime(args.workDir, args.largeFont, openfaceCPUlinearsvmDf, facenetlinearsvmDf)
Ejemplo n.º 7
0
def peopleIntroducing(ros_srv):
    name = ros_srv.name
    num_images = ros_srv.num_images
    NAME_DIR = os.path.join(DATASET_DIR, 'raw', name)
    helper.mkdirP(NAME_DIR)

    image_type = '.jpg'

    image_labels = os.listdir(NAME_DIR)
    add_image_labels = []
    i = 1
    k = 0
    j = num_images
    number = []
    for label in image_labels:
        number.append(int(label.replace(image_type, '')))

    number.sort()
    n = 1
    while j > 0:
        if k < len(number):
            n = number[k] + 1
            if number[k] == i:
                k += 1
            else:
                add_image_labels.append((str(i) + image_type))
                j -= 1
            i += 1

        else:
            add_image_labels.append(str(n) + image_type)
            j -= 1
            n += 1

    num_images = ros_srv.num_images

    i = 0
    while i < num_images:
        try:
            ros_image = rospy.wait_for_message(image_topic, Image, 1000)
        except (ROSException, ROSInterruptException) as e:
            print(e)
            break

        rgb_image = BRIDGE.imgmsg_to_cv2(ros_image, desired_encoding="bgr8")

        face_recognition_ros.image_width = ros_image.width
        face_recognition_ros.image_height = ros_image.height

        face = face_recognition_ros.detectLargestFace(rgb_image)
        s_rgb_image = rgb_image.copy()
        if face != None:
            bb = face_recognition_ros.dlibRectangle2RosBoundingBox(face)
            color = (0, 255, 0)
            cv2.rectangle(s_rgb_image, (bb.minX, bb.minY),
                          (bb.minX + bb.width, bb.minY + bb.height), color, 2)

        cv2.imshow("Person", s_rgb_image)

        regressiveCounter(3)

        if face != None:
            rospy.logwarn('Picture ' + add_image_labels[i] + ' was  saved.')
            cv2.imwrite(os.path.join(NAME_DIR, add_image_labels[i]), rgb_image)
            i += 1
        else:
            rospy.logerr("The face was not detected.")

    cv2.destroyAllWindows()

    classifier_training = FaceClassifierTraining()
    classifier_training.classifier_type = ros_srv.classifier_type
    classifier_training.classifier_name = 'classifier_' + ros_srv.classifier_type + '_' + name + '.pkl'

    return classifierTraining(classifier_training)
Ejemplo n.º 8
0
def main():
    parser = argparse.ArgumentParser()

    parser.add_argument('--lfwDlibAligned', type=str,
                        help='Location of Dlib aligned LFW images')
    parser.add_argument('--lfwMtcnnAligned', type=str,
                    help='Location of MTCNN aligned LFW images')
    parser.add_argument('--largeFont', action='store_true')
    parser.add_argument('workDir', type=str,
                        help='The work directory where intermediate files and results are kept.')
    args = parser.parse_args()
    # print(args)

    if args.largeFont:
        font = {'family': 'normal', 'size': 20}
        mpl.rc('font', **font)

    mkdirP(args.workDir)

    print("Getting lfwPpl")
    lfwPplCache = os.path.join(args.workDir, 'lfwPpl.pkl')
    lfwPpl = cacheToFile(lfwPplCache)(getLfwPplSorted)(args.lfwDlibAligned)



    print("Eigenfaces Experiment")
    cls = cv2.createEigenFaceRecognizer()
    cache = os.path.join(args.workDir, 'eigenFacesExp.pkl')
    eigenFacesDf = cacheToFile(cache)(opencvExp)(lfwPpl, cls)

    print("Fisherfaces Experiment")
    cls = cv2.createFisherFaceRecognizer()
    cache = os.path.join(args.workDir, 'fisherFacesExp.pkl')
    fishFacesDf = cacheToFile(cache)(opencvExp)(lfwPpl, cls)

    print("LBPH Experiment")
    cls = cv2.createLBPHFaceRecognizer()
    cache = os.path.join(args.workDir, 'lbphExp.pkl')
    lbphFacesDf = cacheToFile(cache)(opencvExp)(lfwPpl, cls)

    print("OpenFace SVM Experiment")
    net = openface.TorchNeuralNet(openfaceModelPath, 96, cuda=False)
    cls = SVC(C=1, kernel='linear')
    cache = os.path.join(args.workDir, 'openface.cpu.svm.pkl')
    openfaceCPUsvmDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)

    print("OpenFace LinearSVC Experiment")
    net = openface.TorchNeuralNet(openfaceModelPath, 96, cuda=False)
    cls = LinearSVC(C=1, multi_class='ovr')
    cache = os.path.join(args.workDir, 'openface.cpu.linearsvm.pkl')
    openfaceCPUlinearsvmDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)

    #print("OpenFace GaussianNB Experiment")
    #net = openface.TorchNeuralNet(openfaceModelPath, 96, cuda=False)
    #cls = GaussianNB()
    #cache = os.path.join(args.workDir, 'openface.cpu.gaussiannb.pkl')
    #openfaceCPUgaussiannbDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)

    print("Getting lfwMtcnnPpl")
    lfwMtcnnPplCache = os.path.join(args.workDir, 'lfwMtcnnPpl.pkl')
    lfwMtcnnPpl = cacheToFile(lfwMtcnnPplCache)(getLfwPplSorted)(args.lfwMtcnnAligned)

    print("Facenet LinearSVC Experiment")
    cls = LinearSVC(C=1, multi_class='ovr')
    cache = os.path.join(args.workDir, 'facenet.linearsvm.pkl')
    facenetlinearsvmDf = cacheToFile(cache)(facenetExp)(lfwMtcnnPpl, facenetModelDir, cls)


    #print("OpenFace GPU/SVM Experiment")
    #net = openface.TorchNeuralNet(args.networkModel, 96, cuda=True)
    #cache = os.path.join(args.workDir, 'openface.gpu.svm.pkl')
    #openfaceGPUsvmDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)


    # TODO add Facenet and other models, openbr?


    plotAccuracy(args.workDir, args.largeFont,
                    eigenFacesDf, fishFacesDf, lbphFacesDf,
                    openfaceCPUsvmDf, openfaceCPUlinearsvmDf, facenetlinearsvmDf)
    plotTrainingTime(args.workDir, args.largeFont,
                        eigenFacesDf, fishFacesDf, lbphFacesDf,
                        openfaceCPUsvmDf, openfaceCPUlinearsvmDf, facenetlinearsvmDf)
    plotPredictionTime(args.workDir, args.largeFont,
                        eigenFacesDf, fishFacesDf, lbphFacesDf,
                        openfaceCPUsvmDf, openfaceCPUlinearsvmDf, facenetlinearsvmDf)
Ejemplo n.º 9
0
def main():
    parser = argparse.ArgumentParser()

    parser.add_argument('--lfwDlibAligned',
                        type=str,
                        help='Location of Dlib aligned LFW images')
    parser.add_argument('--lfwMtcnnAligned',
                        type=str,
                        help='Location of MTCNN aligned LFW images')
    parser.add_argument('--largeFont', action='store_true')
    parser.add_argument(
        'workDir',
        type=str,
        help='The work directory where intermediate files and results are kept.'
    )
    args = parser.parse_args()
    # print(args)

    if args.largeFont:
        font = {'family': 'normal', 'size': 20}
        mpl.rc('font', **font)

    mkdirP(args.workDir)

    print("Getting lfwPpl")
    lfwPplCache = os.path.join(args.workDir, 'lfwPpl.pkl')
    lfwPpl = cacheToFile(lfwPplCache)(getLfwPplSorted)(args.lfwDlibAligned)

    print("Eigenfaces Experiment")
    cls = cv2.createEigenFaceRecognizer()
    cache = os.path.join(args.workDir, 'eigenFacesExp.pkl')
    eigenFacesDf = cacheToFile(cache)(opencvExp)(lfwPpl, cls)

    print("Fisherfaces Experiment")
    cls = cv2.createFisherFaceRecognizer()
    cache = os.path.join(args.workDir, 'fisherFacesExp.pkl')
    fishFacesDf = cacheToFile(cache)(opencvExp)(lfwPpl, cls)

    print("LBPH Experiment")
    cls = cv2.createLBPHFaceRecognizer()
    cache = os.path.join(args.workDir, 'lbphExp.pkl')
    lbphFacesDf = cacheToFile(cache)(opencvExp)(lfwPpl, cls)

    print("OpenFace SVM Experiment")
    net = openface.TorchNeuralNet(openfaceModelPath, 96, cuda=False)
    cls = SVC(C=1, kernel='linear')
    cache = os.path.join(args.workDir, 'openface.cpu.svm.pkl')
    openfaceCPUsvmDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)

    print("OpenFace LinearSVC Experiment")
    net = openface.TorchNeuralNet(openfaceModelPath, 96, cuda=False)
    cls = LinearSVC(C=1, multi_class='ovr')
    cache = os.path.join(args.workDir, 'openface.cpu.linearsvm.pkl')
    openfaceCPUlinearsvmDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)

    #print("OpenFace GaussianNB Experiment")
    #net = openface.TorchNeuralNet(openfaceModelPath, 96, cuda=False)
    #cls = GaussianNB()
    #cache = os.path.join(args.workDir, 'openface.cpu.gaussiannb.pkl')
    #openfaceCPUgaussiannbDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)

    print("Getting lfwMtcnnPpl")
    lfwMtcnnPplCache = os.path.join(args.workDir, 'lfwMtcnnPpl.pkl')
    lfwMtcnnPpl = cacheToFile(lfwMtcnnPplCache)(getLfwPplSorted)(
        args.lfwMtcnnAligned)

    print("Facenet LinearSVC Experiment")
    cls = LinearSVC(C=1, multi_class='ovr')
    cache = os.path.join(args.workDir, 'facenet.linearsvm.pkl')
    facenetlinearsvmDf = cacheToFile(cache)(facenetExp)(lfwMtcnnPpl,
                                                        facenetModelDir, cls)

    #print("OpenFace GPU/SVM Experiment")
    #net = openface.TorchNeuralNet(args.networkModel, 96, cuda=True)
    #cache = os.path.join(args.workDir, 'openface.gpu.svm.pkl')
    #openfaceGPUsvmDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)

    # TODO add Facenet and other models, openbr?

    plotAccuracy(args.workDir, args.largeFont, eigenFacesDf, fishFacesDf,
                 lbphFacesDf, openfaceCPUsvmDf, openfaceCPUlinearsvmDf,
                 facenetlinearsvmDf)
    plotTrainingTime(args.workDir, args.largeFont, eigenFacesDf, fishFacesDf,
                     lbphFacesDf, openfaceCPUsvmDf, openfaceCPUlinearsvmDf,
                     facenetlinearsvmDf)
    plotPredictionTime(args.workDir, args.largeFont, eigenFacesDf, fishFacesDf,
                       lbphFacesDf, openfaceCPUsvmDf, openfaceCPUlinearsvmDf,
                       facenetlinearsvmDf)
Ejemplo n.º 10
0
def main():
    parser = argparse.ArgumentParser()

    parser.add_argument('--lfwDlibAligned', type=str,
                        help='Location of Dlib aligned LFW images')
    parser.add_argument('--lfwMtcnnAligned', type=str,
                    help='Location of MTCNN aligned LFW images')
    parser.add_argument('--largeFont', action='store_true')
    parser.add_argument('workDir', type=str,
                        help='The work directory where intermediate files and results are kept.')
    args = parser.parse_args()
    # print(args)

    if args.largeFont:
        font = {'family': 'normal', 'size': 20}
        mpl.rc('font', **font)

    mkdirP(args.workDir)

    eigenFacesDf = None
    fishFacesDf = None
    lbphFacesDf = None
    openfaceCPUsvmDf = None
    openfaceCPUlinearsvmDf = None
    facenetlinearsvmDf = None

    print("Getting lfwPpl")
    lfwPplCache = os.path.join(args.workDir, 'lfwPpl.pkl')
    lfwPpl = cacheToFile(lfwPplCache)(getLfwPplSorted)(args.lfwDlibAligned)

    print("Getting lfwMtcnnPpl")
    lfwMtcnnPplCache = os.path.join(args.workDir, 'lfwMtcnnPpl.pkl')
    lfwMtcnnPpl = cacheToFile(lfwMtcnnPplCache)(getLfwPplSorted)(args.lfwMtcnnAligned)

    def eigenfaces():
        print("Eigenfaces Experiment")
        global eigenFacesDf
        cls = cv2.createEigenFaceRecognizer()
        cache = os.path.join(args.workDir, 'eigenFacesExp.pkl')
        eigenFacesDf = cacheToFile(cache)(opencvExp)(lfwPpl, cls)

    def fisherfaces():
        print("Fisherfaces Experiment")
        global fishFacesDf
        cls = cv2.createFisherFaceRecognizer()
        cache = os.path.join(args.workDir, 'fisherFacesExp.pkl')
        fishFacesDf = cacheToFile(cache)(opencvExp)(lfwPpl, cls)

    def lbph():
        print("LBPH Experiment")
        global lbphFacesDf
        cls = cv2.createLBPHFaceRecognizer()
        cache = os.path.join(args.workDir, 'lbphExp.pkl')
        lbphFacesDf = cacheToFile(cache)(opencvExp)(lfwPpl, cls)

    def openfacesvm():
        print("OpenFace SVM Experiment")
        global openfaceCPUsvmDf
        net = openface.TorchNeuralNet(openfaceModelPath, 96, cuda=False)
        cls = SVC(C=1, kernel='linear')
        cache = os.path.join(args.workDir, 'openface.cpu.svm.pkl')
        openfaceCPUsvmDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)

    def openfacelinsvm():
        print("OpenFaceLinearSVC Experiment")
        global openfaceCPUlinearsvmDf
        net = openface.TorchNeuralNet(openfaceModelPath, 96, cuda=False)
        cls = LinearSVC(C=1, multi_class='ovr')
        cache = os.path.join(args.workDir, 'openface.cpu.linearsvm.pkl')
        openfaceCPUlinearsvmDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)

    def facenetlinsvm():
        print("Facenet LinearSVC Experiment")
        global facenetlinearsvmDf
        cls = LinearSVC(C=1, multi_class='ovr')
        cache = os.path.join(args.workDir, 'facenet.linearsvm.pkl')
        facenetlinearsvmDf = cacheToFile(cache)(facenetExp)(lfwMtcnnPpl, facenetModelDir, cls)

    threads = []

    t1 = Thread(target=eigenfaces, args=())
    t2 = Thread(target=fisherfaces, args=())
    t3 = Thread(target=lbph, args=())
    t4 = Thread(target=openfacesvm, args=())
    t5 = Thread(target=openfacelinsvm, args=())
    t6 = Thread(target=facenetlinsvm, args=())

    threads.append(t1)
    threads.append(t2)    
    threads.append(t3)
    threads.append(t4)
    threads.append(t5)
    threads.append(t6)

    # Start all threads
    for x in threads:
        x.start()

    # Wait for all of them to finish
    for x in threads:
        x.join()


    plotAccuracy(args.workDir, args.largeFont,
                    eigenFacesDf, fishFacesDf, lbphFacesDf,
                    openfaceCPUsvmDf, openfaceCPUlinearsvmDf, facenetlinearsvmDf)
    plotTrainingTime(args.workDir, args.largeFont,
                        eigenFacesDf, fishFacesDf, lbphFacesDf,
                        openfaceCPUsvmDf, openfaceCPUlinearsvmDf, facenetlinearsvmDf)
    plotPredictionTime(args.workDir, args.largeFont,
                        eigenFacesDf, fishFacesDf, lbphFacesDf,
                        openfaceCPUsvmDf, openfaceCPUlinearsvmDf, facenetlinearsvmDf)
def main():
    parser = argparse.ArgumentParser()

    parser.add_argument('--lfwDlibAligned', type=str,
                        help='Location of Dlib aligned LFW images')
    parser.add_argument('--lfwMtcnnAligned', type=str,
                    help='Location of MTCNN aligned LFW images')
    parser.add_argument('--largeFont', action='store_true')
    parser.add_argument('workDir', type=str,
                        help='The work directory where intermediate files and results are kept.')
    args = parser.parse_args()
    # print(args)

    if args.largeFont:
        font = {'family': 'normal', 'size': 20}
        mpl.rc('font', **font)

    mkdirP(args.workDir)

    openfaceCPUsvmDf = None
    openfaceCPUlinearsvmDf = None
    openfacegaussiannbDf = None
    openfacedectreeDf = None
    openfacelogregDf = None

    facenetsvmDf = None
    facenetlinearsvmDf = None
    facenetgaussiannbDf = None
    facenetdectreeDf = None
    facenetlogregDf = None


    print("Getting lfwPpl")
    lfwPplCache = os.path.join(args.workDir, 'lfwPpl.pkl')
    lfwPpl = cacheToFile(lfwPplCache)(getLfwPplSorted)(args.lfwDlibAligned)

    print("Getting lfwMtcnnPpl")
    lfwMtcnnPplCache = os.path.join(args.workDir, 'lfwMtcnnPpl.pkl')
    lfwMtcnnPpl = cacheToFile(lfwMtcnnPplCache)(getLfwPplSorted)(args.lfwMtcnnAligned)


    def openfacesvm():
        print("OpenFace SVM Experiment")
        global openfaceCPUsvmDf
        net = openface.TorchNeuralNet(openfaceModelPath, 96, cuda=False)
        cls = SVC(C=1, kernel='linear')
        cache = os.path.join(args.workDir, 'openface.cpu.svm.pkl')
        openfaceCPUsvmDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)

    def openfacelinsvm():
        print("OpenFace LinearSVC Experiment")
        global openfaceCPUlinearsvmDf
        net = openface.TorchNeuralNet(openfaceModelPath, 96, cuda=False)
        cls = LinearSVC(C=1, multi_class='ovr')
        cache = os.path.join(args.workDir, 'openface.cpu.linearsvm.pkl')
        openfaceCPUlinearsvmDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)

    def openfacegaussiannb():
        print("OpenFace GaussianNB Experiment")
        global openfacegaussiannbDf
        net = openface.TorchNeuralNet(openfaceModelPath, 96, cuda=False)
        cls = GaussianNB()
        cache = os.path.join(args.workDir, 'openface.cpu.gaussiannb.pkl')
        openfacegaussiannbDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)

    def openfacedectree():
        print("OpenFace DecisionTree Experiment")
        global openfacedectreeDf
        net = openface.TorchNeuralNet(openfaceModelPath, 96, cuda=False)
        cls = DecisionTreeClassifier(max_depth=20)
        cache = os.path.join(args.workDir, 'openface.cpu.dectree.pkl')
        openfacedectreeDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)

    def openfacelogreg():
        print("OpenFace DecisionTree Experiment")
        net = openface.TorchNeuralNet(openfaceModelPath, 96, cuda=False)
        cls = LogisticRegression(C=1, multi_class ='ovr')
        cache = os.path.join(args.workDir, 'openface.cpu.logreg.pkl')
        openfacelogregDf = cacheToFile(cache)(openfaceExp)(lfwPpl, net, cls)


    def facenetsvm():
        print("Facenet SVM Experiment")
        global facenetsvmDf
        cls = SVC(C=1, kernel='linear')
        cache = os.path.join(args.workDir, 'facenet.svm.pkl')
        facenetsvmDf = cacheToFile(cache)(facenetExp)(lfwMtcnnPpl, facenetModelDir, cls)

    def facenetlinsvm():
        print("Facenet LinearSVC Experiment")
        global facenetlinearsvmDf
        cls = LinearSVC(C=1, multi_class='ovr')
        cache = os.path.join(args.workDir, 'facenet.linearsvm.pkl')
        facenetlinearsvmDf = cacheToFile(cache)(facenetExp)(lfwMtcnnPpl, facenetModelDir, cls)

    def facenetgaussiannb():
        print("Facenet GaussianNB Experiment")
        global facenetgaussiannbDf
        cls = GaussianNB()
        cache = os.path.join(args.workDir, 'facenet.gaussiannb.pkl')
        facenetgaussiannbDf = cacheToFile(cache)(facenetExp)(lfwMtcnnPpl, facenetModelDir, cls)

    def facenetdectree():
        print("Facenet DecisionTree Experiment")
        global facenetdectreeDf
        cls = DecisionTreeClassifier(max_depth=20)
        cache = os.path.join(args.workDir, 'facenet.dectree.pkl')
        facenetdectreeDf = cacheToFile(cache)(facenetExp)(lfwMtcnnPpl, facenetModelDir, cls)

    def facenetlogreg():
        print("Facenet LogisticRegression Experiment")
        cls = LogisticRegression(C=1, multi_class ='ovr')
        cache = os.path.join(args.workDir, 'facenet.logreg.pkl')
        facenetlogregDf = cacheToFile(cache)(facenetExp)(lfwMtcnnPpl, facenetModelDir, cls)

    threads = []

    
    t1 = Thread(target=openfacesvm, args=())
    t2 = Thread(target=openfacelinsvm, args=())
    t3 = Thread(target=openfacegaussiannb, args=())
    t4 = Thread(target=openfacedectree, args=())
    t5 = Thread(target=openfacelogreg, args=())

    t6 = Thread(target=facenetsvm, args=())
    t7 = Thread(target=facenetlinsvm, args=())
    t8 = Thread(target=facenetgaussiannb, args=())
    t9 = Thread(target=facenetdectree, args=())
    t10 = Thread(target=facenetlogreg, args=())

    threads.append(t1)
    threads.append(t2)    
    threads.append(t3)
    threads.append(t4)
    threads.append(t5)
    threads.append(t6)
    threads.append(t7)
    threads.append(t8)
    threads.append(t9)
    threads.append(t10)
    
    # Start all threads
    for x in threads:
        x.start()

    # Wait for all of them to finish
    for x in threads:
        x.join()


    plotAccuracy(args.workDir, args.largeFont,
                    openfaceCPUsvmDf, openfaceCPUlinearsvmDf, openfacegaussiannbDf,
                    openfacedectreeDf, openfacelogregDf, facenetsvmDf, facenetlinearsvmDf, facenetgaussiannbDf, facenetdectreeDf, facenetlogregDf)
    plotTrainingTime(args.workDir, args.largeFont,
                    openfaceCPUsvmDf, openfaceCPUlinearsvmDf, openfacegaussiannbDf,
                    openfacedectreeDf, openfacelogregDf, facenetsvmDf, facenetlinearsvmDf, facenetgaussiannbDf, facenetdectreeDf, facenetlogregDf)
    plotPredictionTime(args.workDir, args.largeFont,
                    openfaceCPUsvmDf, openfaceCPUlinearsvmDf, openfacegaussiannbDf,
                    openfacedectreeDf, openfacelogregDf, facenetsvmDf, facenetlinearsvmDf, facenetgaussiannbDf, facenetdectreeDf, facenetlogregDf)