在SQL中计算Deepface人脸嵌入的欧几里得距离?

0 投票
0 回答
29 浏览
提问于 2025-04-12 00:39
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进行距离计算,实际上是可以返回结果的。

这是我存储到数据库中的合影照片: angie_group.jpg

这是我用来查询的目标照片: angie_single.jpg

不幸的是,上面的代码没有找到任何结果,尽管应该有一个匹配(来自合影):

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 个回答

暂无回答

撰写回答