视频是不能 P 的系列:使用 Milvus 实现海量人脸快速检索

news/2024/11/30 2:50:49/

最近我一直在优化一个人脸识别项目,这个过程令我深感科学的尽头永远都是殊途同归。一年前,我使用 dlib 实现人脸识别时遇到了两个悬而未决的问题:一是因为人脸样本数目增加导致性能下降问题;二是如何快速地判断目标人脸是否在人脸样本中。然而,在经过虹软人脸识别 SDK 的折磨后,我意识到这两个问题实际上从未消失。它们总会在某个合适的时机突然跳出来,然后开始无声无息地敲打你的灵魂。果然,“出来混还是要还的”。现在重新审视这两个问题,我认为,它们本质上是1:1 和 1:N 的问题。在使用虹软人脸识别SDK的过程中,我遇到了一个非常棘手的难题,即:当目标人脸在人脸数据库中时,识别过程非常流畅;可当目标人脸不在人脸数据库中时,识别过程就异常卡顿。结合使用 dlib 做人脸识别的经验,我猜测魁祸首可能是频繁的特征对比。相比于输出一个枯燥的结论,我更喜欢梳理解决问题的思路。因此,这篇博客的主题是,利用 Milvus 实现海量人脸快速检索的实现过程。

从人脸识别到向量

故事应该从哪里讲起呢?我想,可以从人脸数据库这个角度来切入。当我们把人脸特征存储到 CSV 或者数据库中时,本质上是将 1:N 问题转化为 1:1 问题。因此,我们不得不遍历人脸数据库的每个样本,然后选取与目标人脸最相似或最匹配的那个。这意味着,人脸识别的效率将受到到样本数量和相似度/距离计算方法等因素的影响。以虹软人脸识别 SDK 为例,其免费版提供了 1:1 人脸特征对比的接口,付费版提供了 1:N 人脸特征对比的接口


http://www.ppmy.cn/news/55208.html

相关文章

内联函数\nullptr【C++初阶】

本文主要讲解内联函数相关知识点,随便讲讲指针空值nullptr 目录 前言 一、概念 二、特性 二、指针空值nullptr(与前文关系不大) 前言 在学习内联函数前,我们先回顾一下宏。 将下面的函数改为宏函数应该怎么改呢&#xff1…

Java多线程基础-7:wait() 和 notify() 用法解析

线程之间是抢占式执行的,线程调度是无序的、随机的,因此线程之间执行的先后顺序是难以预知的。但是,实际开发中,有时我们希望合理地协调多个线程间执行的先后顺序。 虽然 join() 算是一种控制顺序的方式,但它毕竟“功…

九款顶级AI工具推荐

ChatGPT OpenAI开发的最强对话系统 地址:chat.openai.com ChatGPT能够在同一个会话期间内回答上下文相关的后续问题。其在短时间内引爆全球的原因在于,在网友们晒出的截图中,ChatGPT不仅能流畅地与用户对话,甚至能写诗、撰文、编…

LeetCode笔记:Weekly Contest 342

LeetCode笔记:Weekly Contest 342 1. 题目一 1. 解题思路2. 代码实现 2. 题目二 1. 解题思路2. 代码实现 3. 题目三 1. 解题思路2. 代码实现 4. 题目四 1. 解题思路2. 代码实现 比赛链接:https://leetcode.com/contest/weekly-contest-342 1. 题目一 …

Pony ORM使用完整教程【附截图】

Pony ORM是一个Python的ORM框架,使用简单,支持多种数据库,如SQLite,MySQL和PostgreSQL等,可以通过Python代码与数据库交互。 下面是使用Pony ORM的完整教程: 安装 使用以下命令安装Pony ORM:…

【设计模式】七大设计原则--------单一职责原则

文章目录 1.案例1.1 原始案例1.2 改进一:类上遵循单一职责原则1.3 改进二:方法上遵循单一职责原则 2.小结 1.案例 1.1 原始案例 package com.sdnu.principle.singleresponsibility; //客户端 public class singleResponsibility {public static void m…

LeetCode——链表简单题题解

83. 删除排序链表中的重复元素 题目描述 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 输入:head [1,1,2] 输出:[1,2] 解题思路:用一个指向节点类型的指针保…

带你搞懂人工智能、机器学习和深度学习!

不少高校的小伙伴找我聊入门人工智能该怎么起步,如何快速入门,多长时间能成长为中高级工程师(聊下来感觉大多数学生党就是焦虑,毕业即失业,尤其现在就业环境这么差),但聊到最后,很多…