Files
insightface/cpp-package/inspireface/python/sample_feature_hub_crud.py

123 lines
4.7 KiB
Python
Raw Normal View History

2025-08-08 13:26:10 +08:00
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()