-
【功能模块】复现人脸检测例程报错,数据由摄像头输入,今天早上可以跑通,但是晚上再测试时,就出现了报错【截图信息】设置的ip如下:尝试更改过以上的两个ip,但是没有效果,请问要如何解决呢?早上才跑通的,晚上测试就不行了,也不大清楚是不是误改了哪里。十分感谢!【日志信息】(可选,上传日志内容或者附件)
-
根据技术人员演示,只要拿到一张人脸图片,运用深度合成的办法,就能让人脸动起来,以假乱真,轻松攻破一些人脸识别系统。在专业技术人员的眼中,目前大部分人脸识别技术的算法并不是牢不可破。(央视新闻)转载于CSDN
-
什么是人脸识别人脸识别是将未知个体的人脸与存储记录数据库中的图像进行比较的任务。映射可以是一对一或一对多,这取决于我们是在运行人脸验证还是人脸识别。在本教程中,我们感兴趣的是构建一个面部识别系统,该系统将验证图像(通常称为探测图像)是否存在于预先存在的面部数据库(通常称为评估集)中。直觉建立这样一个系统涉及四个主要步骤:1.检测图像中的人脸可用的人脸检测模型包括MTCNN、FaceNet、Dlib等。2.裁剪和对齐人面OpenCV库提供了此步骤所需的所有工具。3.查找每个面的向量表示由于程序不能直接处理jpg或png文件,我们需要某种方法将图像转换为数字。在本教程中,我们将使用Insightface模型为人脸创建多维(512-d)嵌入,从而封装与人脸相关的有用语义信息。要使用单个库处理所有三个步骤,我们将使用insightface。特别是,我们将使用Insightface的ArcFace模型。InsightFace是一个开源的深度人脸分析模型,用于人脸识别、人脸检测和人脸对齐任务。4.比较嵌入一旦我们将每个唯一的人脸转换成一个向量,比较特征就归结为比较相应的嵌入。我们将利用这些嵌入来训练scikit-learn模型。另外,如果你想继续,代码可以在Github上找到:https://github.com/V-Sher/Face-Search。安装程序创建虚拟环境(可选):python3 -m venv face_search_env激活此环境:source face_search_env/bin/activate此环境中的必要安装:pip install mxnet==1.8.0.post0pip install -U insightface==0.2.1pip install onnx==1.10.1pip install onnxruntime==1.8.1更重要的是,完成pip安装insightface后:从onedrive下载antelope模型版本。(它包含两个预训练的检测和识别模型)。把它放在*~/.insightface/models/下,所以在~/.insightface/models/antelope.onnx*上有onnx模型。这是正确完成设置后的外观:如果你查看antelope目录,你会发现用于人脸检测和识别的两个onnx模型:注意:自从上周insightface 0.4.1的最新版本发布以来,安装并不像我希望的那样简单(至少对我来说)。因此,我将在本教程中使用0.2.1。将来,我将相应地更新Github上的代码。如果你被卡住了,请看这里的说明。数据集我们将使用Kaggle上提供的Yale人脸数据集,该数据集包含15个人的大约165张灰度图像(即每个人大概11张唯一图像)。这些图像由各种表情、姿势和照明组成。获得数据集后,继续将其解压缩到项目中新创建的数据目录中(请参阅Github上的项目目录结构)开始如果你想继续,可以在Github上找到Jupyter笔记本:https://github.com/V-Sher/Face-Search/blob/main/notebooks/face-search-yale.ipynb。导入import osimport pickleimport numpy as npfrom PIL import Imagefrom typing import Listfrom tqdm import tqdmfrom insightface.app import FaceAnalysisfrom sklearn.neighbors import NearestNeighbors加载Insightface模型安装insightface后,我们必须调用app=FaceAnalysis(name="model_name")来加载模型。由于我们将onnx模型存储在antelope目录中:app = FaceAnalysis(name="antelope")app.prepare(ctx_id=0, det_size=(640, 640))生成Insightface嵌入使用insightface模型为图像生成嵌入非常简单。例如:# 为图像生成嵌入img_emb_results = app.get(np.asarray(img))img_emb = img_emb_results[0].embeddingimg_emb.shape------------OUTPUT---------------(512,)数据集在使用此数据集之前,我们必须修复目录中文件的扩展名,使文件名以.gif结尾。(或.jpg、.png等)。例如,以下代码段将文件名subject01.glasses更改为subject01_glasses.gif。# 修复扩展名YALE_DIR = "../data/yalefaces"files = os.listdir(YALE_DIR)[1:]for i, img in enumerate(files):# print("original name: ", img)new_ext_name = "_".join(img.split(".")) + ".gif"# print("new name: ", new_ext_name)os.rename(os.path.join(YALE_DIR, img), os.path.join(YALE_DIR, new_ext_name))接下来,我们将数据分为评估集和探测集:每个受试者90%或10张图像将成为评估集的一部分,每个受试者剩余的10%或1张图像将用于探测集中。为了避免采样偏差,将使用名为create_probe_eval_set的辅助函数随机选择每个对象的探测图像。它将包含属于特定主题的11个图像(文件名)的列表作为输入,并返回长度为1和10的两个列表。前者包含用于探测集的文件名,而后者包含用于评估集的文件名。def create_probe_eval_set(files: List):# 选择0和len(files)-1之间的随机索引random_idx = np.random.randint(0,len(files))probe_img_fpaths = [files[random_idx]]eval_img_fpaths = [files[idx] for idx in range(len(files)) if idx != random_idx]return probe_img_fpaths, eval_img_fpaths生成嵌入create_probe_eval_set返回的两个列表都按顺序送到名为generate_embs的助手函数。对于列表中的每个文件名,它读取灰度图像,将其转换为RGB,计算相应的嵌入,最后返回嵌入以及图像标签。def generate_embs(img_fpaths: List[str])embs_set = list()embs_label = list()for img_fpath in img_fpaths: # 读取灰度图 img = Image.open(os.path.join(YALE_DIR, img_fpath)) img_arr = np.asarray(img) # 将灰度转换为RGB im = Image.fromarray((img_arr * 255).astype(np.uint8)) rgb_arr = np.asarray(im.convert('RGB')) # 生成Insightface嵌入 res = app.get(rgb_arr) # 将emb添加到eval set embs_set.append(res) # 添加标签到eval_label set embs_label.append(img_fpath.split("_")[0]) return embs_set, embs_label现在我们有了一个生成嵌入的框架,让我们继续使用generate_embs()为探测和评估集创建嵌入。# 排序文件files = os.listdir(YALE_DIR)files.sort()eval_set = list()eval_labels = list()probe_set = list()probe_labels = list()IMAGES_PER_IDENTITY = 11for i in tqdm(range(1, len(files), IMAGES_PER_IDENTITY), unit_divisor=True): # 忽略在files[0]的README.txt文件# print(i)probe, eval = create_probe_eval_set(files[i:i+IMAGES_PER_IDENTITY])# 存储eval embs和标签eval_set_t, eval_labels_t = generate_embs(eval)eval_set.extend(eval_set_t)eval_labels.extend(eval_labels_t)# 存储探测embs和标签probe_set_t, probe_labels_t = generate_embs(probe)probe_set.extend(probe_set_t)probe_labels.extend(probe_labels_t)需要考虑的几件事:os.listdir返回的文件是完全随机的,因此第3行的排序很重要。不带排序和带排序的os.listdir输出:[可选]如果我们使用sklearn提供的分层训练测试功能,我们本可以替换create_probe_eval_set函数,去掉forloop,并简化上述代码段中的几行。然而,在本教程中,我将清晰性置于代码简单性之上。通常情况下,insightface无法检测到人脸,并随后为其生成空嵌入。这解释了为什么probe_setor eval_set列表中的某些条目可能为空。重要的是我们要过滤掉它们,只保留非空值。为此,我们创建了另一个名为filter_empty_embs的助手函数:def filter_empty_embs(img_set: List, img_labels: List[str]):# 在insightface无法生成嵌入的地方过滤filtering where insightface could not generate an embeddinggood_idx = [i for i,x in enumerate(img_set) if x]if len(good_idx) == len(img_set): clean_embs = [e[0].embedding for e in img_set] clean_labels = img_labels else: # 保留good_idx clean_labels = np.array(img_labels)[good_idx] clean_set = np.array(img_set, dtype=object)[good_idx] # 生成embs clean_embs = [e[0].embedding for e in clean_set]return clean_embs, clean_labels它将图像集(probe_set或eval_set)作为输入,并删除insightface无法生成嵌入的元素(参见第6行)。随后,它还会更新标签(probe_labels或eval_labels)(请参见第7行),以使集合和标签具有相同的长度。最后,对于评估集和探测集中,我们可以获得512维嵌入:evaluation_embs, evaluation_labels = filter_empty_embs(eval_set, eval_labels)probe_embs, probe_labels = filter_empty_embs(probe_set, probe_labels)assert len(evaluation_embs) == len(evaluation_labels)assert len(probe_embs) == len(probe_labels)有了这两套设备,我们现在可以使用Sklearn库中实现的一种流行的无监督学习方法来构建人脸识别系统。创建人脸识别系统我们使用.fit训练最近邻模型,评估嵌入为X。这是一种用于无监督最近邻学习的简洁技术。注:一般来说,距离可以是任何度量单位,如欧几里德、曼哈顿、余弦、闵可夫斯基等。# 最近邻学习方法nn = NearestNeighbors(n_neighbors=3, metric="cosine")nn.fit(X=evaluation_embs)# 保存模型到磁盘filename = 'faceID_model.pkl'with open(filename, 'wb') as file:pickle.dump(nn, file)# 过了一段时间…# 从磁盘加载模型# with open(filename, 'rb') as file:# pickle_model = pickle.load(file)因为我们正在实施一种无监督的学习方法,请注意,我们没有将任何标签传递给fit方法,即评估标签。我们在这里所做的就是将评估集中的人脸嵌入映射到一个潜在空间中。为什么??简单回答:通过提前将训练集存储在内存中,我们可以在推理过程中加快搜索最近邻的速度。它是如何做到这一点的?简单回答:在内存中以优化的方式存储树是非常有用的,尤其是当训练集很大并且搜索新点的邻居时,计算成本会很高。基于邻域的方法被称为非泛化机器学习方法,因为它们只是“记住”其所有训练数据推理对于每个新的探测图像,我们可以通过使用nn.neights方法搜索其前k个邻域来确定它是否存在于评估集中。例如,# 测试图像的实例推理dists, inds = nn.kneighbors(X = probe_img_emb.reshape(1,-1), n_neighbors = 3, return_distances = True )如果评估集中返回索引(IND)处的标签与图像的原始/真实标签完全匹配,则我们知道我们在验证系统中找到了自己的脸。我们已经将上述逻辑包装到print_ID_results方法中。它将探测图像路径、评估集标签和详细标志作为输入,以指定是否应显示详细结果。def print_ID_results(img_fpath: str, evaluation_labels: np.ndarray, verbose: bool = False): img = Image.open(img_fpath)img_emb = app.get(np.asarray(img))[0].embedding# 从KNN获取预测dists, inds = nn.kneighbors(X=img_emb.reshape(1,-1), n_neighbors=3, return_distance=True)# 获取邻居的标签pred_labels = [evaluation_labels[i] for i in inds[0]]# 检查dist是否大于0.5,如果是,打印结果no_of_matching_faces = np.sum([1 if d <=0.6 else 0 for d in dists[0]])if no_of_matching_faces > 0: print("Matching face(s) found in database! ") verbose = Trueelse: print("No matching face(s) not found in database!") # 打印标签和相应的距离 if verbose: for label, dist in zip(pred_labels, dists[0]):print(f"Nearest neighbours found in the database have labels {label} and is at a distance of {dist}")这里需要注意的几个重要事项:IND包含评估标签集中最近邻的索引(第6行)。例如,inds=[[2,0,11]]意味着评估中索引=2处的标签被发现最靠近探测图像,然后是索引=0处的标签。因为对于任何图像,nn.neighbors都会返回非空响应。我们要过滤一些,如果返回的距离小于或等于0.6(行12),我们只考虑这些结果。(请注意,0.6的选择完全是任意的)。例如,继续上面的例子,其中Inds= [[2,0,11 ] ]和例子= [[ 0.4,0.6,0.9 ] ],我们将只考虑在索引=2和索引=0,因为最后一个邻居的距离太大。作为一个快速的健康检查,让我们看看当我们输入婴儿的脸作为探测图像时系统的响应。正如所料,它显示没有找到匹配的脸!但是,我们将verbose设置为True,因此我们可以在数据库中看到其伪近邻的标签和距离,所有这些都非常大(>0.8)。人脸识别系统的评价测试此系统是否良好的方法之一是查看前k个邻居中存在多少相关结果。相关结果是真实标签与预测标签匹配的结果。该度量通常称为k处的精确度,其中k是预先确定的。例如,从探测集中选择一个图像(或者更确切地说是一个嵌入),其真实标签为“subject01”。如果nn.Neighers为该图像返回的前两个pred_labels为['subject01','subject01'],则表示k处的精度(p@k)k=2时为100%。类似地,如果pred_labels中只有一个值等于“subject05”,p@k将是50%,依此类推…dists, inds = nn.kneighbors(X=probe_embs_example.reshape(1, -1),n_neighbors=2, return_distance=True)pred_labels = [evaluation_labels[i] for i in inds[0] ]pred_labels----- OUTPUT ------['002', '002']让我们继续计算整个探测集上p@k的平均值:# 探测集上的推理dists, inds = nn.kneighbors(X=probe_embs, n_neighbors=2, return_distance=True)# 计算平均p@kp_at_k = np.zeros(len(probe_embs))for i in range(len(probe_embs)):true_label = probe_labels[i]pred_neighbr_idx = inds[i]pred_labels = [evaluation_labels[id] for id in pred_neighbr_idx]pred_is_labels = [1 if label == true_label else 0 for label in pred_labels]p_at_k[i] = np.mean(pred_is_labels)p_at_k.mean()------ OUTPUT --------0.990%!还可以,但肯定可以继续改进。
-
人脸识别Demo已经可以跑通,现在想根据这个例程,仍然使用Presenterserver,只是把功能从人脸识别更改为手势识别,应该更改那些地方呢?人脸识别用的是这个cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/multi_channels_rtsp · Ascend/samples - 码云 - 开源中国 (gitee.com)
-
【功能模块】【操作步骤&问题现象】1、执行bash sample_run.sh2、显示 No module named 'cameracapture'【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
近日,中国内地女演员孙莉的手机在识别其女儿时,成功解锁。通过孙莉微博了解,其使用的手机为iPhone 12 Pro Max。(图片来源于“多妈7788”微博)据了解,iPhone 12系列手机依旧延用颇受好评的Face ID功能,用户只需将前置摄像头对准面部,就能轻松实现刷脸解锁、支付等操作,而Face ID主要采用了3D结构光技术。3D结构光是将激光散斑图像投射到物体表面,由摄像头接收采集物体表面反射的信息,根据物体造成的光信号变化计算出物体位置和深度信息,识别精度能达到0.5mm,甚至更高的精度。简单来说,这项技术通过发射具有一定结构特征的光线,投射到用户面部。再通过摄像头感知面部的散斑,从而描绘出你面部的结构。这些散斑主要反馈的是面部特征的深度信息,所以相当于给用户的脸建了一个3D模型。基于这一特征,在金融领域中,3D结构光也得到进一步的应用:支付宝率先与3D结构光企业达成合作,并研发出基于3D结构光的刷脸支付。但对于苹果而言,其在不断强调个人隐私的情况下,号称Face ID是最安全的系统,但在本次事件中,却依旧出现被解锁等问题。而相类似的问题并不少——在iPhone X刚使用Face ID时,就已经出现母子之间可以相互识别并解锁的问题。
-
【功能模块】在运行时protobuf报错检查依赖项发现没问题【操作步骤&问题现象】1、报错信息。protobuf依赖项信息2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
【功能模块】最后的调试了结果又报错了。。。运行多路人脸识别案例报错信息如下:【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
【功能模块】最后的最后还出错了........【操作步骤&问题现象】【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
【功能模块】https://gitee.com/ascend/samples/tree/master/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera参考的是这个多线程样例,对样例进行了一些修改,使用了rtsp流做为输入,网络摄像头修改ip地址后使用网线直连开发板。【操作步骤&问题现象】1、presenter输出的摄像机画面有数秒的延迟且帧数不稳定,同样的问题在多线程下的另一个样例中https://gitee.com/ascend/samples/tree/master/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/multi_channels_rtsp也出现了。2、运行无报错,且能够正常地检测出人脸,但对人脸的识别功能有问题,在presenter页面注册一个人脸后会把所有的人都识别为同一个目标,推测是特征提取或者特征匹配的部分有问题。求助:上述两个问题的产生原因和解决思路【日志信息】(可选,上传日志内容或者附件)
-
基于主动学习和Wi-Fi感知的人体识别系统赵广智, 周志鹏, 龚伟, 陈绍青, 周浩泉1 中国科学技术大学,安徽 合肥 230026摘要基于深度学习和Wi-Fi感知的人体行为识别系统已逐步成为主流的研究方向,在近年来得到了长足的发展。然而,现有的系统严重依赖于大量带标记样本以达到良好的识别精度。这导致了大量的人力成本用于标记数据,同时现有系统也难以应用于实际场景。针对该问题,提出一种将主动学习应用于Wi-Fi感知的人体行为识别系统——ALSensing。该系统是第一个将主动学习和Wi-Fi人体行为识别相结合的系统,能够利用有限数量的已标记训练样本构建一个性能良好的行为识别器。利用商用的Wi-Fi设备实现了ALSensing系统,并且使用6个不同场景的实际数据集评估了它的性能。实验结果显示,ALSensing 利用 3.7%的已标记训练样本能够达到 52.83%的识别精度,利用 15%的已标记训练样本能够达到 58.97%的识别精度,而利用现有基于深度学习的人体行为识别系统测量的参考基准在100%的已标记训练样本的情况下达到62.19%的识别精度。可见,ALSensing能够实现与现有基于深度学习的人体行为识别系统接近的识别精度,但是所需要的已标记训练样本的数量大幅度减少。关键词: 主动学习 ; 人体行为识别 ; Wi-Fi0 引言人体行为识别系统已经逐渐成为一个计算机科学的重要研究课题,相关研究成果也逐步地应用于生产生活的各个方面,如运动追踪[1]、辅助生活[2]、安全监控[3]以及医疗健康[4]等。人体行为识别系统通过分析包含人体行为的数据达到辨识人类活动的目的,进而辅助人类解决各类实际问题。因此,人体行为识别系统可以被粗略的划分为感知人体行为,即利用视觉、传感器等设备采集包含人体行为的数据,以及辨识人体行为,即使用手工建模、机器学习模型等方法判断输入数据的对应行为。目前的人体行为识别系统,根据不同的感知方式,可以大致分为以下3类。1) 基于视觉的人体行为识别系统此类系统利用摄像头等视觉设备采集包含人体行为的视频数据进而辨识人体行为。文献[5]以帧为单位,将每帧视频划分为多个区域,生成更细致的人体骨骼图运动轨迹,进而识别人体行为。然而,此类系统存在 3 个明显的缺陷。第一,辨识精度受光源影响。当存在障碍物遮挡或者可见光较弱时,摄像头等视觉设备受环境光源的影响较大,难以获得可靠的数据,从而降低辨识的精度。第二,存在潜在的隐私风险。以摄像机作为感知的方式,被监测人员或者场景的真实状况可能会暴露在多个环节,存在涉及个人隐私的风险,可部署场景因此受限。第三,模型性能非常依赖已标记训练样本数量。在视频数据中,针对同一个目标的同一个动作,不同的着装或不同的场景均会影响辨识的精度,因此需要大量已标记训练数据保证模型性能。2) 基于可穿戴设备的人体行为识别系统此类系统主要通过目标人员穿戴的专用传感器设备(如加速度计、温度计、压力计等)感知人体行为。文献[6]利用腕带传感设备感知目标人员的行为活动,将单个人的行为组合视为个人的独特标识,从而识别目标人员身份。此类系统相比于基于视觉的人体行为识别系统,不受环境光源的束缚,能够获得诸如运动轨迹、温度等更加丰富的数据信息,但是依然存在3个局限。第一,系统的部署成本较高。此类系统采集人体行为数据需要目标人员穿戴专用的传感器设备,这些设备增加了部署的经济成本较高。第二,设备有依赖性与局限性。一套传感器设备通常专用于某一任务或者某一场景,更换任务或者更换场景时,则需要更换设备。第三,系统需要频繁维护电源。某些小型的基于可穿戴设备的人体行为识别系统,在工作时需要频繁地交互数据,因此,电能消耗迅速,需要经常补充或更换电源。3) 基于无线信号的人体行为识别系统此类系统利用目标人员存在或者运动对无线信号的信号强度、信道质量等参数造成的影响区分相应的动作。文献[7]利用射频信号监测用户的睡眠姿势,避免不良睡姿引发的病情恶化。此类系统相比于基于视觉、可穿戴设备的人体行为识别系统,放宽了对环境光源、专用设备的要求,避免了个人隐私问题,降低了部署成本。无线信号中的 Wi-Fi 信号,部署广泛、应用普遍,能够有效减少系统的经济成本。另外,Wi-Fi信号可以是正交频分复用(OFDM, orthogonal frequency division multiplexing)信号,能提供更准确的行为信息。针对上述分析,综合考虑系统的部署成本和实际应用,本文尝试利用 Wi-Fi 信号作为此工作的行为感知媒介。在采集到行为数据后,人体行为识别系统的下一步工作则是通过分析数据特征辨识对应的人体行为。在早期的人体行为识别系统研究工作中,一般采用手工特征提取和传统机器学习统计模型相结合的方式分辨对应的人体行为[8]。然而,此类方法需要工作人员具备对应数据领域的专业知识,如处理视频数据需要视频处理的相关知识,处理无线信号数据需要信号处理领域的相关知识,这严重阻碍了人体行为识别系统的发展。随着深度学习的出现,许多人体行为识别系统研究工作尝试利用深度学习模型自动地从原始数据提取数据特征、辨识对应的人体行为,这使得人体行为识别系统得到了迅速发展[9]。然而,目前大多数基于深度学习的人体行为识别系统都需要大量的已标记训练样本来更新模型参数,从而保证良好的辨识精度。这既需要花费巨大的人力标注数据,又不便于系统在实际环境部署。换而言之,对已标记训练样本的大量需求极大地限制了人体行为识别系统从研究到应用的转化。本文受到主动学习思想的启发,尝试利用主动学习作为人体行为识别系统的辨识模型,以便解决当前对已标记训练样本的需求问题。因此,本文提出了一个名为ALSensing(active learning sensing)的人体行为识别系统,它能够实现与现有基于深度学习的人体行为识别系统接近的精度,但所需要的已标记训练样本数量减少90%左右。本文的主要贡献有以下3个方面。1) 本文是第一个将主动学习思想和Wi-Fi人体行为识别相结合的工作。这不仅为解决现有基于深度学习的人体行为识别系统发展受已标记训练样本数量限制的问题提供了思路,而且为主动学习提供了新的应用部署场景。2) 本文提出了ALSensing系统,并利用商业设备实现了ALSensing系统,它兼顾主动学习和Wi-Fi人体行为识别的优势,能够实现与现有基于深度学习的人体行为识别系统相当的精度,但所需要的已标记训练样本大幅度减少。3) 本文利用6个真实环境的数据集量化地评价了ALSensing系统的性能。在相同的数据集下, ALSensing利用3.7%的已标记训练样本能够达到52.83%的识别精度,利用15%的已标记训练样本能够达到58.97%的识别精度,而利用现有基于深度学习的人体行为识别系统测量的参考基准在100%的已标记训练样本的情况下为 62.19%的识别精度。1 结束语综上所述,ALSensing系统能够有效地解决当前人体行为识别系统对已标记训练样本数量的需求问题。本文是第一个将主动学习和Wi-Fi人体行为识别相结合的工作,而且使用商用的 Wi-Fi 设备实现了ALSensing系统。同时,本文也利用真实的实验量化地评估了ALSensing系统的性能。另外,相信在未来的工作中,数据增强处理、改变模型框架等方法能够进一步提升ALSensing系统性能,使ALSensing系统更易于移植到其他任务。另外,感谢中国科学技术大学信息科学实验中心提供的软硬件服务。2 原文链接http://www.infocomm-journal.com/wlw/article/2022/2096-3750/2096-3750-6-1-00044.shtml
-
【功能模块】【操作步骤&问题现象】1、可以的话请问需要怎样的环境,我运行不成功这个!【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
> **摘要:** 通过结合华为云的人脸识别、functiongraph、OBS、APIG等云服务,来达成考勤打卡时调用一个API即可检测是否本人现场打卡的效果。 # 1 背景 使用APP进行打卡时,为避免非本人及非真人现场打卡的情况出现,想结合华为云的人脸识别能力,通过调用API,达成可检测是否本人且真人现场打卡的效果。 # 2 云服务介绍 **华为云FRS:** 人脸识别服务(Face Recognition Service),能够在图像中快速检测人脸、分析人脸关键点信息、获取人脸属性、实现人脸的精确比对和检索。该服务可应用于身份验证、电子考勤、客流分析等场景。[产品页面](https://www.huaweicloud.com/product/face.html) **华为云FunctionGraph:** 函数工作流(FunctionGraph)是一项基于事件驱动的函数托管计算服务。通过函数工作流,只需编写业务函数代码并设置运行的条件,无需配置和管理服务器等基础设施,函数以弹性、免运维、高可靠的方式运行。[产品页面](https://www.huaweicloud.com/product/functiongraph.html) **华为云APIG:** API网关(API Gateway)是为企业开发者及合作伙伴提供的高性能、高可用、高安全的API托管服务, 帮助企业轻松构建、管理和部署不同规模的API。简单、快速、低成本、低风险的实现内部系统集成、成熟业务能力开放及业务能力变现。[产品页面](https://www.huaweicloud.com/product/apig.html) **华为云OBS:** 对象存储服务(Object Storage Service,OBS)是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力,使用时无需考虑容量限制,并且提供多种存储类型供选择,满足客户各类业务场景诉求。[产品页面](https://www.huaweicloud.com/product/obs.html) **华为云DNS:** 云解析服务(Domain Name Service)提供高可用,高扩展的权威DNS服务和DNS管理服务,把人们常用的域名或应用资源转换成用于计算机连接的IP地址,从而将最终用户路由到相应的应用资源上。此服务默认开通,免费使用。[产品页面](https://www.huaweicloud.com/product/dns.html) # 3 方案设计 ## 3.1 方案简述 通过APIG调用functiongraph函数,在functiongraph上完成人脸识别-活体检测、人脸识别-人脸比对等API的调用,并将响应结果通过API返回给APP。实现APP调用一次API即可完成人脸识别的功能。 1. 人脸识别服务的人脸比对功能,可实现检测是否其本人打卡。 2. 人脸识别服务的活体检测功能,可实现检测是否活人打卡。 3. 使用Functiongraph的函数,APP端只需考虑调用一个API,且只需考虑人脸识别的总体输入和返回结果。 4. Functiongraph由APIG来调用,利用APPkey、APPsecret及HTTPS,解决了APP端调用的安全认证等问题。 5. OBS桶用来存储人脸照片,通过约定的用户标识做文件存储路径,易于管理和使用。 ## 3.2 方案架构图 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649814141153226420.png) 0. 初始化:前置准备工作,新建一个OBS桶做人脸库,将员工的人脸照片存放到人脸库,并把以user-id 或自定义字段作为路径,标识员工。 1. 员工登录APP后,进行人脸识别时,将通过APIG来调用functionGraph,上传关键信息:摄像头捕获的照片或视频、员工的人脸库标识(user-id)。 2. functionGraph调用活体检测API,传入照片/视频(根据需求选择动作活体检测/静默活体检测,推荐静默活体检测)。 *注:本方案采用静默活体检测方式,APP端上传的照片提前转换为base64格式* 3. 活体检测API返回响应:有confidence、picture(base64)。 4. 在functionGraph中调用OBS接口,通过user-id从OBS人脸库获取库中的员工照片。 5. 通过代码将从OBS获取的照片文件,转换为base64格式。 6. 将两个base64格式的照片作为输入参数调用人脸比对API 。(备注:此处可根据需求,是否需要多次调用API,使用多个照片进行验证) 7. 人脸比对API返回包含了similarity的响应。 8. functionGraph将similarity、confidence传回给APP/后端。(备注:也可直接在functionGraph完成判定,返回人脸识别结果) ## 3.3 FUNCTIONGRAPH实现代码 代码详看附件。 代码时序图: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649814488411960282.png) # 4 方案部署 ## 4.1 部署流程图 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/14/1649899507333797041.png) ## 4.2 前置准备 1. 拥有已实名认证的华为云账号,开通云服务functiongraph、人脸比对、活体检测、OBS 2. 注册公网域名,完成ICP备案 ## 4.3 创建OBS人脸库 ### 4.3.1 创建OBS桶 参考帮助文档:https://support.huaweicloud.com/qs-obs/obs_qs_0007.html ,**创建私有桶** ### 4.3.2 上传对象 参考帮助文档: https://support.huaweicloud.com/qs-obs/obs_qs_0008.html ,上传对象,建立OBS人脸库。 要求:文件的路径使用用户标识(如userid)命名 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/14/1649899640398811639.png) ## 4.4 FUNCTIONGRAPH搭建 ### 4.4.1 创建委托 登录IAM控制台(https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/agencies) 1)创建委托 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/14/1649899732885166953.png) 委托名称:自定义 委托类型:云服务 云服务:函数工作流functiongraph 持续时间:永久 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/14/1649899750597558444.png) 2)选择策略 OBS:获取对象等基本操作权限 FRS:fullaccess APIG:fullaccess ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/14/1649899767926966037.png) 3)设置最小授权范围,此处选择所有,实际可根据项目情况分配。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/14/1649899774928735869.png) 4)完成委托创建 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/14/1649899867404942265.png) ### 4.4.2 上传FRS依赖包 因functiongraph公共的依赖包中,FRS-SDK不是最新的(无静默活体检测API),故我们需上传最新的FRS-SDK,作为依赖包。 1)从官网获取FRS-SDK下载路径 https://sdkcenter.developer.huaweicloud.com/?language=python 2)下载整个Python-v3的SDK https://github.com/huaweicloud/huaweicloud-sdk-python-v3 下载后解压,进入内部,找到frs后缀的SDK 进入SDK目录,在setup所在的目录,全部选择进行压缩。压缩成功后,需要确保setup文件在压缩包的根目录下。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649814638751732214.png) 将压缩好的文件,上传到**functiongraph**的**依赖包管理**。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/14/1649903203217237152.png) 依赖包名称:自定义 运行时语言:2.7 描述:自定义 上传方式:上传ZIP文件 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649814696951154585.png) ### 4.4.3 创建函数 1)进入functiongraph控制台创建函数。 Functiongraph版本:functiongraph v2 函数类型:事件函数 函数名称:自定义 所属应用:默认 委托名称:选择创建的委托(如无,请点击右边的 创建委托 前往创建,创建步骤参考4.4.1) 企业项目:自行选择 自定义函数:关闭 运行时语言:Python2.7 函数执行入口:Index.handler 代码上传方式:静默代码 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649814941371534605.png) ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649814959364933650.png) ### 4.4.4 编辑函数代码 将示例代码复制进来,编辑相关默认变量的值 1)粘贴3.3节的代码至index.py中 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649815148702147611.png) 2)根据自己项目情况,设置默认Region、endpoint、buketname的值,若4.4.6节不设置环境变量的值,将默认取此处的默认值。 如下默认是北京四 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649815207205184866.png) 3)编辑完成后,点击保存 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649815283696268862.png) ### 4.4.5 添加依赖包 1)在函数菜单-代码页,点击添加-依赖代码包 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649815316115834839.png) 2)在公共依赖包,搜索obs,勾选OBS-sdk ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649815339429434222.png) 3)在私有依赖包,勾选前面步骤上传的frs-sdk,然后确定保存 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649815379417857598.png) ### 4.4.6 编辑环境变量 在函数菜单-配置页,添加环境变量:region、bucketname(OBS桶名)、endpoint 若此处不设置环境变量,则函数会使用4.4.4节代码设置的默认值。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649815413162289842.png) ### 4.4.7 调试函数 1)点击配置测试事件 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649821478308479790.png) 2)选择apig的事件模板,添加body的内容和queryStringParameters的userid,进行保存。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649821506736161453.png) 3)点击测试,运行完毕可查看执行结果。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649821518351445875.png) ## 4.5 添加APIG ### 4.5.1 添加APIG触发器 1)在函数菜单-触发器页,点击创建触发器 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649821593903882753.png) 触发器类型:API网关服务(APIG) API名称:自定义 分组:选择API分组(如无点击右边 创建分组 进行创建) 发布环境:RELEASE(如无点击右边 创建发布环境 进行创建) 安全认证:测试环境可选择None(后面可编辑进行更改) 请求协议:测试环境可选择HTTP(后面可编辑进行更改) 后端超时(毫秒):5000 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649821732699612695.png) 2)创建完成后,在触发器页面会添加一个APIG触发器,提供访问URL ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649821758573719098.png) ### 4.5.2 编辑APIG 1)点击APIG触发器名称,前往APIG控制台,点击编辑 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649821804321942650.png) 2)编辑基本信息 此处可更改安全认证,为方便调试,此处保持无认证 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649821862934914048.png) 3)定义API请求 此处需添加API的请求参数-用户标识,用于functiongraph中,取在OBS人脸照片库中的员工照片。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649821956682838124.png) 4)定义后端服务 添加后端服务参数,跟前面的入参做一个映射。 因为是在functiongraph创建的APIG,故此处已自动绑定functiongraph的函数为后端服务,故基础定义保持默认即可。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649821987587401560.png) 5)返回结果基础定义 返回结果的响应示例,暂设置为空即可,点击完成。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649821998500947637.png) ### 4.5.3 调试API 1)API详情页,点击调试,跳转到API调试页面 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649822013633870426.png) 2)输入相关请求参数,发起请求,进行调试。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649822036638149952.png) ### 4.5.4 发布API 编辑完成后的API,需要进行发布,公网才可访问 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649830860600630664.png) ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649830873072611873.png) ## 4.6 绑定独立域名 子域名仅供开发测试使用,每天最多访问1000次。如需开发服务,则需为API所在分组绑定独立域名。 ### 4.6.1 添加记录集 1、登录云解析控制台(也可使用其他平台,已完成ICP备案的域名),选择域名解析》公网域名,点击需要创建记录集的域名名称。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649831019011659720.png) 2、添加记录集 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649831031572602181.png) 填写以下信息 主机记录:域名前缀,如face-test 类型:选择CNAME – 将域名指向另外一个域名 别名:默认即可 线路类型:默认即可 TTL(秒):默认即可 值:填写要指向的别名(此处为APIG上的子域名) ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649831113490488637.png) 添加成功 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649831132889309132.png) ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649831141076911472.png) ### 4.6.2 添加自定义域名 1、在API详情页-总览,点击添加增加自定义域名。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649831168240943988.png) 2、跳转到API所在分组的域名管理控制台,点击绑定独立域名 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649831177641240193.png) 3、输入前面创建的记录集,点击确定。(如果是刚添加的记录集需刷新,约等5分钟) ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649831186097321738.png) 添加完后,即可在公网通过自定义域名,访问APIG。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649831201007115239.png) ## 4.7 问题记录 1、并发测试API时,发现偶现以下错误 错误1:人脸比对传入的base64字符串无法识别 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649831323406596040.png) 错误2:数据传输被提前终止了 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649831343242361605.png) 问题定位:因函数中的存储到本地的文件用的是同一个路径,并发操作时出现异步的同时占用一个路径,从而导致文件有丢失或文件转码有误 解决方案:给函数中的文件路径配置上时间戳,避免并发操作时,交叉操作同一个文件。 2、APIG错误码请参考: https://support.huaweicloud.com/usermanual-apig/apig-ug-180530090.html 3、使用APIG触发functiongraph时,发现第一个api请求响应时间较长(2s多),后面的请求就较短了(约500ms)。 问题定位:超过一分钟无调用函数时,函数会销毁。再次进行函数调用时,需要重新启动实例,所以第一次调用时间会比较长。 解决方案:设置预留实例,来消除冷启动效果。预留实例是为指定函数版本单独预留的函数运行实例,不同于普通的函数实例,预留实例长期存活,可以达到消除函数冷启动的效果。 预留实例需要提交工单开通,详情请参考:https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0306.html # 5 后期思考 1、 本方案的人脸比对,只比对一次。若人脸库中,用户的库照片有多个,是否需要遍历对比,取总体对比的结果。如对比多次,需要考虑从OBS获取照片、人脸比对的API要多次调用,性能下降、费用提升等
-
我下载了modelzoo里面的ATC retinaface(FP16)模型,https://www.hiascend.com/zh/software/modelzoo/detail/1/7270b02a457d4c4ab262277a646517f9解压得到了里面的retinaface_bs1.om和retinaface_bs16.om。模型的输入格式如下:同时参考了Ascend/samples里面的人脸检测案例,使用人脸检测模型对树莓摄像头中的即时视频进行人脸检测,https://gitee.com/ascend/samples/tree/master/python/level2_simple_inference/2_object_detection/face_detection_camera将retinaface_bs1.om和retinaface_bs16.om模型放到了model文件夹下。将src/main.py中的模型做了替换。第4行的face_detection.om换成了retinaface_bs1.om第5、6行的数值改为了1000试跑了scripts/sample_run.sh报错如下在192.168.1.2:7007中,灯是绿的,但view中没有东西官方的案例测试成功,能正常显示请问retinaface模型是否能这样操作,我应该如何使用retinaface模型对视频流数据做推理。
-
【功能模块】https://gitee.com/ascend/samples/blob/master/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/README_CN.md【操作步骤&问题现象】1、根据 https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=184545&ordertype=2&page=1 准备好环境,并分别在开发和运行分设环境的x86主机 MindStdio编译,运行;以及在 开发与运行合设的200DK环境运行 命令行的编译,运行。2、【截图信息】(1)在开发和运行分设环境的x86主机 MindStdio编译,运行。编译成功:运行报错:(2)在 开发与运行合设的200DK环境运行 命令行的编译,运行编译:运行:好像是摄像头出错。具体是什么问题,还烦请专家协助。代码应该都是一套。只是分别在开发环境使用了交叉编译,以及在运行环境直接进行编译。【日志信息】(可选,上传日志内容或者附件)
上滑加载中
推荐直播
-
华为AI技术发展与挑战:集成需求分析的实战指南
2024/11/26 周二 18:20-20:20
Alex 华为云学堂技术讲师
本期直播将综合讨论华为AI技术的发展现状,技术挑战,并深入探讨华为AI应用开发过程中的需求分析过程,从理论到实践帮助开发者快速掌握华为AI应用集成需求的框架和方法。
去报名 -
华为云DataArts+DWS助力企业数据治理一站式解决方案及应用实践
2024/11/27 周三 16:30-18:00
Walter.chi 华为云数据治理DTSE技术布道师
想知道数据治理项目中,数据主题域如何合理划分?数据标准及主数据标准如何制定?数仓分层模型如何合理规划?华为云DataArts+DWS助力企业数据治理项目一站式解决方案和应用实践告诉您答案!本期将从数据趋势、数据治理方案、数据治理规划及落地,案例分享四个方面来助力企业数据治理项目合理咨询规划及顺利实施。
去报名
热门标签