diff --git a/.gitignore b/.gitignore index f0627d98ed0d87a41ecc53b1373a5c64d81b9652..86babfcf7b0fd59a61e897d5f9d03d3983ee0c49 100644 --- a/.gitignore +++ b/.gitignore @@ -104,5 +104,8 @@ ENV/ .idea/ logs/ 20170512-110547/ +20180402-114759/ +20180408-102900/ -*.sqlite \ No newline at end of file +*.sqlite +*.zip \ No newline at end of file diff --git a/app/api/users.py b/app/api/users.py index 22b38844a127a528e5c518179f508b819fafb934..e7f367be84faf1f2ec4656871f2f8639b476141e 100644 --- a/app/api/users.py +++ b/app/api/users.py @@ -65,8 +65,10 @@ def face_recognition(): x = np.array(x) y = np.array(y) LOG.info([embedding.shape, x.shape, y.shape]) - # results = compare.face_net_compare(embedding, x, y) - # user = User.query.filter_by(id=int(results[0])).first() - results = compare.face_net_compare(embedding, x, y) - user = User.query.filter_by(id=int(results)).first() + target = compare.face_net_compare(embedding, x, y) + if target == 0: + user = User() + user.from_dict({'id': 0, 'name': '无法识别', 'cell_phone_number': ''}) + else: + user = User.query.filter_by(id=int(target)).first() return jsonify(success=True, data=user.to_dict(), status_code=200) diff --git a/app/recognition/compare.py b/app/recognition/compare.py index 57f0d62247b7f34d7970466de93bea8d6d3d0079..44c038ed3ca91b581ae2a91a2b47ddee110d2526 100644 --- a/app/recognition/compare.py +++ b/app/recognition/compare.py @@ -1,30 +1,24 @@ -import numpy as np -'''from sklearn.neighbors import KNeighborsClassifier +"""from sklearn.neighbors import KNeighborsClassifier def face_net_compare(x, X, y, n=3): knn_classifier = KNeighborsClassifier(n_neighbors=n) knn_classifier.fit(X, y) - return knn_classifier.predict(x)''' - -def fac_net_compare(embeddings, x, y, threshold = 1.0): - mindis_id = 0; - cnt = 0; - list_dis = []; - for emb in embeddings: - dis = np.sqrt(np.sum(np.squre(np.subtract(emb, x)))); - list_dis.append(dis) - if(dis < list_dis[mindis_id]): - mindis_id = cnt; - ++cnt; - mindis = list_dis[mindis_id]; - if(mindis > threshold): - return y[mindis_id]; - else: - return y[mindis_id]; - - - + return knn_classifier.predict(x)""" +import numpy as np +def face_net_compare(embedding, x, y, threshold=0.5): + distances = [] + for i in range(len(x)): + distance = np.sqrt(np.sum(np.square(np.subtract(embedding, x[i])))) + distances.append(distance) + min_distance_id = np.argmin(distances) + assert isinstance(min_distance_id, np.int64), 'Type of min_distance_id is not int.' + min_distance = distances[min_distance_id] + print("distance = %.8f | minimum distance id = %d" % (min_distance, min_distance_id)) + if min_distance > threshold: + return 0 + else: + return y[min_distance_id] diff --git a/tests/test_face_net.py b/tests/test_face_net.py index ef8b42dc37bf73c4d43b6c11d80714523daca885..f847a46e1f0568c248220998d053aaae16795654 100644 --- a/tests/test_face_net.py +++ b/tests/test_face_net.py @@ -2,6 +2,7 @@ import unittest from pathlib import Path import numpy as np +import tensorflow.compat.v1 as tf from app.recognition.face_net import FaceNet from app.utils import file_utils @@ -13,8 +14,20 @@ MODEL_PATH_PREFIX = Path(__file__).parents[1] class FaceNetTestCase(unittest.TestCase): + def test_model_node(self): + model_path = str(MODEL_PATH_PREFIX / '20180402-114759' / '20180402-114759.pb') + with tf.gfile.FastGFile(model_path, "rb") as f: + graph_def = tf.GraphDef() + graph_def.ParseFromString(f.read()) + tf.import_graph_def(graph_def) + graph = tf.get_default_graph() + operations = graph.get_operations() + self.assertTrue(len(operations) > 0) + for operation in operations: + print(operation.name) + def test_model_exists(self): - model_path = MODEL_PATH_PREFIX / '20170512-110547' / '20170512-110547.pb' + model_path = MODEL_PATH_PREFIX / '20180402-114759' / '20180402-114759.pb' print(model_path) self.assertTrue(model_path.exists())