在SQL中计算Deepface人脸嵌入的欧几里得距离?
with conn:
cur = conn.cursor()
# compare
target_img = "angie_single.jpg"
target_represent = DeepFace.represent(img_path=target_img, model_name="Facenet", detector_backend="retinaface")[0]
target_embedding = target_represent["embedding"]
target_facial_area = target_represent["facial_area"]
target_statement = ""
for i, value in enumerate(target_embedding):
target_statement += 'select %d as dimension, %s as value' % (i, str(value)) #sqlite
if i < len(target_embedding) - 1:
target_statement += ' union all '
select_statement = f'''
select *
from (
select img_name, sum(subtract_dims) as distance_squared
from (
select img_name, (source - target) * (source - target) as subtract_dims
from (
select meta.img_name, emb.value as source, target.value as target
from face_meta meta left join face_embeddings emb
on meta.id = emb.face_id
left join (
{target_statement}
) target
on emb.dimension = target.dimension
)
)
group by img_name
)
where distance_squared < 100
order by distance_squared asc
'''
results = cur.execute(select_statement)
instances = []
for result in results:
print(result)
img_name = result[0]
distance_squared = result[1]
instance = []
instance.append(img_name)
instance.append(math.sqrt(distance_squared))
instances.append(instance)
result_df = pd.DataFrame(instances, columns = ['img_name', 'distance'])
print(result_df)
这里有没有人熟悉deepface库的?我正在看这篇文章,想开始我的人脸识别之旅,但遇到了一个我无法解决的问题(因为我在这方面的知识不够)。
我想做的事情:我有一张安吉丽娜·朱莉的合影。我已经为照片中的每个人创建了面部特征,并把它们存储在sqlite数据库里。现在我有一张安吉丽娜·朱莉单独的照片,我想把这张单独的脸和数据库中存储的照片及面部特征进行匹配。
问题是:计算欧几里得距离以在数据库中查找匹配项的sql命令没有返回任何结果(所以它认为数据库中没有安吉丽娜·朱莉的脸,其实是有的)。我觉得这个sql命令可能有问题,因为如果先把所有数据库数据加载到内存中,然后用纯python进行距离计算,实际上是可以返回结果的。
不幸的是,上面的代码没有找到任何结果,尽管应该有一个匹配(来自合影):
Empty DataFrame
Columns: [img_name, distance]
Index: []
如果我把所有数据库数据加载到内存中,然后用python(而不是sql)进行计算,就能找到匹配:
def findEuclideanDistance(row):
source = np.array(row['embedding'])
target = np.array(row['target'])
distance = (source - target)
return np.sqrt(np.sum(np.multiply(distance, distance)))
找到一个匹配:
img_name embedding target distance
0 angie_group.jpg [0.10850527882575989, 0.5568691492080688, 0.81... [-0.6434235572814941, 0.5883399248123169, 0.29... 8.263514
sql代码中缺少什么?为什么它没有匹配到任何东西?
相关问题:
0 个回答
暂无回答

