mirror of
https://github.com/deepinsight/insightface.git
synced 2025-12-30 08:02:27 +00:00
123 lines
4.7 KiB
Python
123 lines
4.7 KiB
Python
|
|
import os
|
||
|
|
import inspireface as isf
|
||
|
|
import numpy as np
|
||
|
|
import os
|
||
|
|
|
||
|
|
import random
|
||
|
|
|
||
|
|
random.seed(43)
|
||
|
|
|
||
|
|
def gen_feature():
|
||
|
|
# Generate a random vector of length 512 and normalize it
|
||
|
|
vector = np.random.uniform(-1, 1, 512).astype(np.float32)
|
||
|
|
normalized_vector = vector / np.linalg.norm(vector)
|
||
|
|
return normalized_vector
|
||
|
|
|
||
|
|
def gen_similar_feature(feature):
|
||
|
|
noise_strength = 0.3
|
||
|
|
|
||
|
|
noise = np.random.uniform(-1, 1, len(feature)).astype(np.float32)
|
||
|
|
noise = noise / np.linalg.norm(noise)
|
||
|
|
|
||
|
|
similar_vector = feature + noise_strength * noise
|
||
|
|
|
||
|
|
similar_vector = similar_vector / np.linalg.norm(similar_vector)
|
||
|
|
|
||
|
|
return similar_vector
|
||
|
|
|
||
|
|
def case_feature_hub():
|
||
|
|
# Set db path
|
||
|
|
db_path = "test.db"
|
||
|
|
if os.path.exists(db_path):
|
||
|
|
os.remove(db_path)
|
||
|
|
# Configure the feature management system.
|
||
|
|
feature_hub_config = isf.FeatureHubConfiguration(
|
||
|
|
primary_key_mode=isf.HF_PK_AUTO_INCREMENT,
|
||
|
|
enable_persistence=True,
|
||
|
|
persistence_db_path=db_path,
|
||
|
|
search_threshold=0.48,
|
||
|
|
search_mode=isf.HF_SEARCH_MODE_EAGER,
|
||
|
|
)
|
||
|
|
ret = isf.feature_hub_enable(feature_hub_config)
|
||
|
|
assert ret, "Failed to enable FeatureHub."
|
||
|
|
|
||
|
|
embedding_list = []
|
||
|
|
for i in range(10):
|
||
|
|
# Generate a random embedding
|
||
|
|
embedding = gen_feature()
|
||
|
|
face_identity = isf.FaceIdentity(embedding, -1)
|
||
|
|
# Insert the face identity into the feature hub
|
||
|
|
ret, id = isf.feature_hub_face_insert(face_identity)
|
||
|
|
assert ret, "Failed to insert face identity."
|
||
|
|
print(f"Inserted face id: {id}")
|
||
|
|
embedding_list.append(embedding)
|
||
|
|
|
||
|
|
print(f"face count: {isf.feature_hub_get_face_count()}")
|
||
|
|
assert isf.feature_hub_get_face_count() == 10, "Failed to insert face identity."
|
||
|
|
|
||
|
|
# Search for the face identity
|
||
|
|
query_embedding = embedding_list[3]
|
||
|
|
search_result = isf.feature_hub_face_search(query_embedding)
|
||
|
|
assert search_result, "Failed to search for face identity."
|
||
|
|
# The auto-increment id is calculated starting from 1
|
||
|
|
assert search_result.similar_identity.id == 3 + 1, "Failed to search for face identity."
|
||
|
|
print(f"search confidence: {search_result.confidence}")
|
||
|
|
|
||
|
|
# Update the face identity
|
||
|
|
update_embedding = gen_feature()
|
||
|
|
update_face_identity = isf.FaceIdentity(update_embedding, search_result.similar_identity.id)
|
||
|
|
ret = isf.feature_hub_face_update(update_face_identity)
|
||
|
|
assert ret, "Failed to update face identity."
|
||
|
|
print(f"Updated face id: {search_result.similar_identity.id}")
|
||
|
|
|
||
|
|
# Search for the face identity again
|
||
|
|
search_result = isf.feature_hub_face_search(query_embedding)
|
||
|
|
assert search_result, "Failed to search for face identity."
|
||
|
|
assert search_result.similar_identity.id == -1, "Failed to update face identity."
|
||
|
|
print(f"search confidence: {search_result.confidence}, id: {search_result.similar_identity.id}")
|
||
|
|
|
||
|
|
# Delete the face identity
|
||
|
|
ret = isf.feature_hub_face_remove(4)
|
||
|
|
assert ret, "Failed to delete face identity."
|
||
|
|
print(f"Deleted face id: {4}")
|
||
|
|
|
||
|
|
# Search for the face identity again
|
||
|
|
search_result = isf.feature_hub_face_search(embedding_list[3])
|
||
|
|
assert search_result.similar_identity.id == -1, "Failed to delete face identity."
|
||
|
|
print(f"search confidence: {search_result.confidence}, id: {search_result.similar_identity.id}")
|
||
|
|
print(f"face count: {isf.feature_hub_get_face_count()}")
|
||
|
|
assert isf.feature_hub_get_face_count() == 9, "Failed to delete face identity."
|
||
|
|
|
||
|
|
|
||
|
|
# Top-k sample
|
||
|
|
# Set target face id = 9
|
||
|
|
target_face_id = 9
|
||
|
|
# Set k = 3
|
||
|
|
k = 4
|
||
|
|
# Gen k similar features
|
||
|
|
similar_features = []
|
||
|
|
for i in range(k):
|
||
|
|
similar_features.append(gen_similar_feature(embedding_list[target_face_id - 1]))
|
||
|
|
# Insert the similar features into the feature hub
|
||
|
|
expect_ids = []
|
||
|
|
for similar_feature in similar_features:
|
||
|
|
similar_face_identity = isf.FaceIdentity(similar_feature, -1)
|
||
|
|
ret, id = isf.feature_hub_face_insert(similar_face_identity)
|
||
|
|
assert ret, "Failed to insert similar face identity."
|
||
|
|
print(f"Inserted similar face id: {id}")
|
||
|
|
expect_ids.append(id)
|
||
|
|
# Insert the target face id
|
||
|
|
expect_ids.append(target_face_id)
|
||
|
|
print(f"expect ids: {expect_ids}")
|
||
|
|
# Search the top-k similar features
|
||
|
|
top_k_search_result = isf.feature_hub_face_search_top_k(embedding_list[target_face_id - 1], 1000)
|
||
|
|
assert len(top_k_search_result) == k + 1, "Failed to search for top-k similar features."
|
||
|
|
for result in top_k_search_result:
|
||
|
|
confidence, _id = result
|
||
|
|
print(f"search confidence: {confidence}, id: {_id}")
|
||
|
|
assert _id in expect_ids, "Failed to search for top-k similar features."
|
||
|
|
print(f"search confidence: {confidence}, id: {_id}")
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
case_feature_hub()
|