-
在后台支付设置里能不能增加支付方式种类,除了扫码方式外,可不可以增加人脸支付和指纹支付?还有就是在第三方登录方式中除了QQ,微博,微信三种外可不可以增加人脸识别和指纹登录?
-
又找不到包的警告,求助!!!
-
# MindX SDK+CenterFace动态分辨率模型推理 ## 1 介绍 [MindX SDK](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fsoftware%2Fmindx-sdk) 是华为推出的软件开发套件(SDK),提供极简易用、高性能的API和工具,助力昇腾AI处理器赋能各种应用场景。对于一个训练好的模型,在Mind SDK上仅需在stream流的pipeline配置文件中简单配置几行,便可使用内置的插件实现模型的前处理和后处理,完成常见的推理任务。本文将介绍如何在MindX SDK框架上实现动态分辨率模型的推理。(代码地址:https://gitee.com/ascend/mindxsdk-referenceapps/tree/master/contrib/CenterFace) **动态分辨率:**指模型转化为om格式在MindX SDK上进行推理时,通常模型输入的图片大小一般固定为ATC工具转化时所设定的值。如果所有尺寸的图片都缩放至同一大小,对于尺寸与模型输入差距过大的图片,模型推理的效果难以符合预期。因此在使用ATC工具转化模型时,开启动态分辨率的功能,配置多个档位以适配常见的图片尺寸,模型推理时根据图片大小选用合适的档位。 本案例推理采用[CenterFace](https://github.com/Star-Clouds/CenterFace)(一个轻量化的人脸检测模型,同时实现了人脸检测+关键点检测),考虑到API中已有的后处理插件基类,以及输出结果的特殊性,开发了两个后处理插件,其余均使用框架自带插件。 本文将涵盖以下内容:*模型推理流程*、*动态分辨率模型转换*、*模型后处理开发介绍*。 ## 2 开发工具准备 > MindX SDK模型开发须使用本地IDE工具连接昇腾服务器,使用本教程前,请确保以下环境正确安装。 - 在昇腾机器上安装MindX SDK,MindX SDK软件包安装[参考链接](https://support.huawei.com/enterprise/zh/doc/EDOC1100209684?section=j00h) - Cmake - 本地C++开发环境搭建,以下演示使用[CLion](https://www.jetbrains.com/clion/download/download-thanks.html?platform=windows) - 远程SSH工具,如MobaXterm,xshell,final shell(以下演示使用MobaXterm) ## 3 开发环境配置 请参考官方技术文档:[IDE开发环境搭建](https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/quick_start/1-2IDE开发环境搭建.md#/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/quick_start/Cmake介绍.md) ## 4 开发流程介绍 在MinX SDK上实现模型推理,通常包含以下几个步骤: - 准备好用于推理的模型。 - 使用ATC工具转换为om模型(转换过程根据模型的要求配置aipp做前处理)。 - 根据业务需求,编排steam流,编写主函数。 - 根据需要开发插件或后处理插件。 ## 5 开发 ### 5.1 准备模型 从CenterFace官方仓下载onnx模型([github下载链接](https://gitee.com/link?target=https%3A%2F%2Fgithub.com%2FStar-Clouds%2FCenterFace%2Fblob%2Fmaster%2Fmodels%2Fonnx%2Fcenterface.onnx)),无法访问github请使用[备用链接](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/CenterFaceWithDynamicResolution/centerface_offical.onnx)。 如果你的模型是其它格式,同样可以通过以下工具转化为MindX SDK使用的模型格式。 ### 5.2 动态分辨率模型转换 转换模型之前需要在昇腾服务器上安装和配置好ATC模型转换工具(模型转换工具相关介绍参考[链接](https://gitee.com/link?target=https%3A%2F%2Fsupport.huaweicloud.com%2Ftg-cannApplicationDev330%2Fatlasatc_16_0005.html))。如果服务器上已经具备ATC工具,但未配置环境变量,可参考如下配置: ```bash export install_path=/usr/local/Ascend/ascend-toolkit/latest export PATH=/usr/local/python3/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH export ASCEND_OPP_PATH=${install_path}/opp ``` 接着获取模型输入节点的名称,下载Netron,安装后使用Netron打开onnx模型  可以看到模型的输入节点名称为:`input.1` 使用SSH工具附带的ftp功能把下载好的onnx模型上传至昇腾服务器,cd进入模型存放的目录,执行如下命令: ```bash atc --model=centerface_offical.onnx --output=centerface_offical --dynamic_image_size="768,1024;800,800;1024,768;864,1120;1120,864;960,1216;1216,960;1056,1312;1312,1056;1152,1408;1408,1152;1248,1504;1504,1248;1344,1600;1600,1344;1440,1696;1696,1440;1536,1792;1792,1536;1632,1888;1888,1632;1728,1984;1984,1728;1824,2080;2080,1824" --soc_version=Ascend310 --input_shape="input.1:1,3,-1,-1" --input_format=NCHW --framework=5 --insert_op_conf=centerface_aipp.cfg ``` 以上命令转成具有多档位的动态分辨率模型,转成单档位可使用如下命令: ```bash atc --model=centerface_offical.onnx --output=centerface_offical --soc_version=Ascend310 --input_shape="input.1:1,3,800,800" --input_format=NCHW --framework=5 --insert_op_conf=centerface_aipp.cfg ``` 命令参数的解释如下: - --model 待转换模型存放的路径 - --output 模型输出路径及输出模型命名 - --soc_version 芯片版本 - --input_shape 模型输入节点名称和tensor形状,当配置动态分辨率属性时,图片宽高应设为-1 - --input_format 输入图片的数据格式 - --dynamic_image_size 动态分辨率属性,配置后模型可接受不同分辨率的输入 - --framework 原模型使用的框架 - --insert_op_conf aipp配置文件 > aipp配置文件为可选,作用在于对模型输入数据进行前处理,是根据模型的输入要求进行具体配置的。 > > 此处因MindX SDK图片解码器仅支持JPG图像,并且解码成YUV420sp,而CenterFace模型的输入格式为RGB888,因此配置了色域转换的相关属性。具体配置文件如下 ```yaml aipp_op{ aipp_mode: static crop: false input_format : YUV420SP_U8 #非动态分辨率请设置具体的宽高 src_image_size_h : 0 src_image_size_w : 0 csc_switch : true rbuv_swap_switch : false matrix_r0c0 : 256 matrix_r0c1 : 0 matrix_r0c2 : 359 matrix_r1c0 : 256 matrix_r1c1 : -88 matrix_r1c2 : -183 matrix_r2c0 : 256 matrix_r2c1 : 454 matrix_r2c2 : 0 input_bias_0 : 0 input_bias_1 : 128 input_bias_2 : 128 mean_chn_0 : 0 mean_chn_1 : 0 mean_chn_2 : 0 min_chn_0 : 0 min_chn_1 : 0 min_chn_2 : 0 var_reci_chn_0: 1.0 var_reci_chn_1: 1.0 var_reci_chn_2: 1.0 } ``` 开启动态分辨率属性后,经过ATC工具转化的模型,已具备接受多个分辨率输入的功能,通过修改pipeline中缩放插件的属性,即可改变模型输入的大小。 ### 5.3 项目创建与pipeline流程编排 #### 新建CLION项目  #### CmakeLists文件 ```cmake cmake_minimum_required(VERSION 3.10) project(CenterFace) add_compile_options(-fPIC -fstack-protector-all -g -Wl,-z,relro,-z,now,-z -pie -Wall) add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0 -Dgoogle=mindxsdk_private) set(CMAKE_BUILD_TYPE Debug) set(MX_SDK_HOME $ENV{MX_SDK_HOME}) #使用本地IDE运行请配置MX_SDK_HOME的绝对路径 if (NOT DEFINED ENV{MX_SDK_HOME}) string(REGEX REPLACE "(.*)/(.*)/(.*)/(.*)" "\\1" MX_SDK_HOME ${CMAKE_CURRENT_SOURCE_DIR}) message(STATUS "set default MX_SDK_HOME: ${MX_SDK_HOME}") else () message(STATUS "env MX_SDK_HOME: ${MX_SDK_HOME}") endif() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/") #需要用到的头文件 include_directories( ${MX_SDK_HOME}/include ${MX_SDK_HOME}/opensource/include ${MX_SDK_HOME}/opensource/include/opencv4 ) #链接的动态库 link_directories( ${MX_SDK_HOME}/lib ${MX_SDK_HOME}/opensource/lib ) add_executable(Main main.cpp ) target_link_libraries(Main glog mxbase mxpidatatype plugintoolkit streammanager cpprest mindxsdk_protobuf opencv_world ) ``` #### 主函数编写 ```C++ #include "MxBase/Log/Log.h" #include "MxBase/MemoryHelper/MemoryHelper.h" #include "MxStream/StreamManager/MxStreamManager.h" #include "opencv2/opencv.hpp" #include PostProcessBases/PostProcessDataType.h> #include #include int main(int argc, char *argv[]) { // 读取pipeline文件信息 std::string pipelineConfigPath = "pipeline配置文件路径"; std::string pipelineConfig = ReadPipelineConfig(pipelineConfigPath); if (pipelineConfig == "") { return APP_ERR_COMM_INIT_FAIL; } std::string streamName = "center_face"; // 新建一个流管理MxStreamManager对象并初始化 auto mxStreamManager = std::make_shared(); APP_ERROR ret = mxStreamManager->InitManager(); // 加载pipeline得到的信息,创建一个新的stream业务流 ret = mxStreamManager->CreateMultipleStreams(pipelineConfig); MxStream::MxstDataInput dataBuffer; // 将图片的信息读取到dataBuffer中 ret = readfile(fileName, dataBuffer); // 通过SendData函数传递输入信息到指定的工作元件模块 // streamName是pipeline文件中业务流名称;inPluginId为输入端口编号,对应输入元件的编号 ret = mxStreamManager->SendData(streamName, 0, dataBuffer); delete dataBuffer.dataPtr; // 获取Stream上后处理插件的处理结果 std::vector keyVec = {"mxpi_imagedecoder0", "mxpi_objectpostprocessor0", "mxpi_objectpostprocessor1"}; std::vector output =mxStreamManager->GetProtobuf(streamName, 0, keyVec); // mxpi_imagedecoder0图片解码插件输出信息 auto mxpiVision = std::static_pointer_cast(output[0].messagePtr); // mxpi_objectpostprocessor0 后处理插件1输出信息 auto objectList = std::static_pointer_cast(output[1].messagePtr); // mxpi_objectpostprocessor1 后处理插件2输出信息 auto keypointList = std::static_pointer_cast(output[2].messagePtr); // 把经过后处理之后的推理结果写入到图片中 SaveResult(mxpiVision, objectList, keypointList); mxStreamManager->DestroyAllStreams(); return 0; } ``` > 以上代码仅作主函数的大体逻辑展示 #### pipeline流程编排 模型的推理业务流程如下: 1. 使用StreamManager的api从外部把图片二进制数据送入appsrc插件。 2. 使用图像解码mxpi_imagedecoder对图片进行解码。 3. 通过图像缩放插件mxpi_imageresize将图形缩放至指定的分辨率档位。 4. 缩放后的图形输入模型推理插件mxpi_tensorinfer得到模型输出。 5. 把模型得到的四个输出送入两个后处理插件。 6. 人脸检测插件用来得到人脸检测框,关键点检测插件得到五个关键点。 7. 人脸检测框送入OSD可视化插件编码到原图中。 8. 最后两个后处理插件分支汇聚到appsink结束整个推理流程。  在pipeline的编排中,对于上图分叉的部分,使用了内置的tee插件接queue插件处理,使得两个后处理插件都能获得模型推理的输出数据。此外OSD可视化插件的输入用到了图像解码挂载的metadata,同样使用了tee插件接queue,图上并未标明。 对应的pipeline文件: ```json { "center_face": { "stream_config": { "deviceId": "0" }, "appsrc0": { "props": { "blocksize": "409600" }, "factory": "appsrc", "next": "mxpi_imagedecoder0" }, "mxpi_imagedecoder0": { "props": { "deviceId": "0" }, "factory": "mxpi_imagedecoder", "next": "mxpi_imageresizer0" }, "mxpi_imageresizer0": { "props": { "dataSource": "mxpi_imagedecoder0", "resizeHeight": "768", "resizeWidth": "1024" }, "factory": "mxpi_imageresize", "next": "tee0" }, "tee0": { "factory": "tee", "next": [ "queue0", "queue1" ] }, "queue0": { "props": { "max-size-buffers": "50" }, "factory": "queue", "next": "mxpi_tensorinfer0" }, "queue1": { "props": { "max-size-buffers": "50" }, "factory": "queue", "next": "mxpi_opencvosd0:0" }, "tee1": { "factory": "tee", "next": [ "queue2", "queue3" ] }, "queue2": { "props": { "max-size-buffers": "50" }, "factory": "queue", "next": "mxpi_objectpostprocessor0" }, "queue3": { "props": { "max-size-buffers": "50" }, "factory": "queue", "next": "mxpi_objectpostprocessor1" }, "mxpi_tensorinfer0": { "props": { "dataSource": "mxpi_imageresizer0", "modelPath": "../model/centerface_offical.om" }, "factory": "mxpi_tensorinfer", "next": "tee1" }, "mxpi_objectpostprocessor0": { "props": { "dataSource": "mxpi_tensorinfer0", "postProcessConfigPath": "../model/centerface.cfg", "postProcessLibPath": "../plugins/lib/plugins/libmxpi_centerfacepostprocessor.so" }, "factory": "mxpi_objectpostprocessor", "next": "mxpi_object2osdinstances0" }, "mxpi_objectpostprocessor1": { "props": { "dataSource": "mxpi_tensorinfer0", "postProcessConfigPath": "../model/centerface.cfg", "postProcessLibPath": "../plugins/lib/plugins/libmxpi_centerfacekeypointpostprocessor.so" }, "factory": "mxpi_keypointpostprocessor", "next": "mxpi_synchronize0:1" }, "mxpi_object2osdinstances0": { "props": { "colorMap": "128, 128, 255|200,200,200|0,128,255|255,128,0", "fontFace": "16", "fontScale": "0.5", "fontThickness": "1", "fontLineType": "16", "rectThickness": "1", "rectLineType": "16" }, "factory": "mxpi_object2osdinstances", "next": "mxpi_opencvosd0:1" }, "mxpi_opencvosd0": { "props": { "dataSourceImage": "mxpi_imagedecoder0", "dataSourceOsd": "mxpi_object2osdinstances0" }, "factory": "mxpi_opencvosd", "next": "mxpi_synchronize0:0" }, "mxpi_synchronize0": { "factory": "mxpi_synchronize", "next": "appsink0" }, "appsink0": { "props": { "blocksize": "4096000" }, "factory": "appsink" } } } ``` > 上述涉及的路径均使用相对路径,相对于main函数文件所在位置。 ### 5.4 后处理插件开发 后处理插件主要包含两个,一个对应人脸检测的功能,另一个对应人脸关键点。后处理插件需要对这模型的四个输出进行处理(包含热图、中心点偏移、目标框宽高和人脸五个关键点的相对目标框大小归一化后的偏移)得到各自的结果,以完成推理。 而后处理插件的开发一般根据自己的任务需求,先在api中寻找是否有已经实现好的基类,继承合适的基类可减少开发的任务量,如果没有便只能继承最基础的基类。通常包含以下几个步骤(下面以人脸检测后处理插件作为演示): #### 编写CMakeLists.txt 编写CMakeLists.txt,主要用于设置后处理动态库的目标文件以及链接相关的第三方库。每一个后处理插件都有一个CMakeLists.txt文件与之对应。编写后处理的CMakeLists.txt文件时,用户只需修改生成的后处理名和生成动态库的目标文件即可,延用原有的配置。人脸检测后处理插件的CMakeList.txt如下: ```cmake cmake_minimum_required(VERSION 3.10) project(mxpi_centerfacepostprocessor) add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0 -Dgoogle=mindxsdk_private) set(PLUGIN_NAME "mxpi_centerfacepostprocessor") set(TARGET_LIBRARY ${PLUGIN_NAME}) # 插件生成的位置 set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../lib/plugins) #在本地IDE上运行时请替换为MX_SDK_HOME的绝对路径,如set(MX_SDK_HOME /home/MindX_SDK/mxvision) set(MX_SDK_HOME $ENV{MX_SDK_HOME}) if (NOT DEFINED ENV{MX_SDK_HOME}) string(REGEX REPLACE "(.*)/(.*)/(.*)/(.*)" "\\1" MX_SDK_HOME ${CMAKE_CURRENT_SOURCE_DIR}) message(STATUS "set default MX_SDK_HOME: ${MX_SDK_HOME}") else () message(STATUS "env MX_SDK_HOME: ${MX_SDK_HOME}") endif() #包含的头文件 include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(${MX_SDK_HOME}/include) include_directories(${MX_SDK_HOME}/opensource/include) include_directories(${MX_SDK_HOME}/opensource/include/gstreamer-1.0) include_directories(${MX_SDK_HOME}/opensource/include/glib-2.0) include_directories(${MX_SDK_HOME}/opensource/lib/glib-2.0/include) #链接动态库 link_directories(${MX_SDK_HOME}/lib) link_directories(${MX_SDK_HOME}/opensource/lib) add_compile_options(-std=c++11 -fPIC -fstack-protector-all -pie -Wno-deprecated-declarations) add_compile_options("-DPLUGIN_NAME=${PLUGIN_NAME}") add_definitions(-DENABLE_DVPP_INTERFACE) add_library(${TARGET_LIBRARY} SHARED MxCenterfacePostProcessor.cpp MxCenterfacePostProcessor.h) target_link_libraries(${TARGET_LIBRARY} glib-2.0 gstreamer-1.0 gobject-2.0 gstbase-1.0 gmodule-2.0 glog) target_link_libraries(${TARGET_LIBRARY} mxpidatatype plugintoolkit mxbase mindxsdk_protobuf ) #target_link_libraries(${TARGET_LIBRARY} -Wl,-z,relro,-z,now,-z,noexecstack -s) ``` #### 实现人脸框检测的cpp文件 首先,根据任务类型,选择SDK已经支持的后处理基类去派生一个新的子类,这些后处理基类分别为目标检测,分类任务,语义分割,文本生成。这些基类都继承自相同的父类——PostProcessBase。人脸检测框后处理插件继承的类为ObjectPostProcessBase; ```c++ class MxCenterfacePostProcessor : public MxBase::ObjectPostProcessBase ``` **实现基类方法:** inti函数:  Process函数:  | 输入参数 | 解释 | | ----------------- | ------------------------------------------------------------ | | tensors | 上游插件的输出,当把后处理插件编排在模型推理插件之后,这里tensors便是模型的输出。 | | objectInfos | MxBase::ObjectInfo是api内置的目标框数据结构,后处理的结果需要存放在里面。 | | resizedImageInfos | 图片size信息,包含原图的宽高和resize之后的宽高,用于后处理逻辑的计算。 | | configParamMap | 从配置文件读取得到的map,在init函数读入。 | 在Process函数中,首先调用父类的CheckAndMoveTensors()接口,对tensors的形状进行校验并搬运内存至Host侧。然后再调用后处理业务函数,这里featLayerData包含单张图片四个输出对应void*指针,数据都是以一维数组形式存储,具体的数据size、type及数据含义需要参考论文原作者的实现。在CenterFace模型中,MxCenterfacePostProcessor后处理插件逻辑包括根据置信度筛选数据、计算出人脸框、使用nms算法对人脸框去重这一系列操作,最终将结果放入objInfo中。 后处理开发完成后,增加一个对外的接口如GetObjectInstance(),以便于让业务流中后处理插件的factory能加载生成的so文件。  > 这里对外接口根据继承的基类有不同名称,通常为Get+基类名称+Instance #### 生成插件 在Clion中点击运行按钮,即可生成对应so文件:  生成插件后即可在pipeline配置文件中使用,如下: ```json "mxpi_objectpostprocessor1": { "props": { "dataSource": "mxpi_tensorinfer0", "postProcessConfigPath": "../model/centerface.cfg", "postProcessLibPath": "../plugins/lib/plugins/libmxpi_centerfacekeypointpostprocessor.so" }, "factory": "mxpi_keypointpostprocessor", "next": "XXXX"} ``` factory为后处理插件基类对应插件的名字,后处理插件实际也是用的内置的插件,开发后处理插件相当于在插件的基础上编写,仅需关注业务的具体逻辑代码,如databuff的传递等其他操作由插件完成。 如果不知道factory该填什么,可以在MX_SDK_HOME/lib/plugins下查找。  ## 6 运行过程展示 ### 6.1 本地IDE运行 第一步:配置FaceDetectPostProcessor、KeyPointPostProcessor、C++中CMakeLists文件的SDK路径,  第二步:设置cmake编译的环境变量,编译插件。 在设置>构建、执行、部署>cmake界面,找到环境,配置如下: ```bash LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64/; ```  加载FaceDetectPostProcessor中的CMakeLists文件,第一次加载CmakeLists文件时,选择Load Cmake Project,之后重新加载选择Reload Cmake Project。  加载CmakeLists文件之后,首先在①号位置选择对应的插件,这里选择的是FaceDetectPostProcessor插件,点击②编译  点击之后,程序运行,运行完成会显示Finished,得到一个cmake-build-debug文件夹,并且远程会有编译生成的文件夹。  按以上方法将另一个插件KeyPointPostProcessor中CMakeLists文件进行编译,生成的插件都会存放在plugins目录下。  第三步:编译、运行main文件 接着加载main.cpp对应的CmakeLists,加载成功会自动生成Main的运行配置,准备图片test.jpg放置在C++目录下,编辑Main运行配置,添加程序实参,并配置环境变量,点击确定。   环境变量如下,其中的MX_SDK_HOME需要替换为昇腾服务器上的绝对路径。 ```bash MX_SDK_HOME=${SDK安装路径} LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64/ GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins ``` 然后点击运行。 成功运行后,可在远程的C++/result文件夹中查看结果。  ### 6.2 远程命令行运行 相对于本地运行,远程运行方式会更加简洁方便,具体参考以下操作 第一步:进入到远程文件夹  第二步:输入命令: ```bash bash build.sh ``` 此时它会自动将三个CMakeLists全部编译。  第三步:进入C++文件夹,输入命令运行run.sh文件,假如测试图片在run.sh同级目录,名字为test.jpg,测试命令如下: ```bash cd C++ bash run.sh test.jpg #这里相对路径是相对C++/Main可执行文件的。 #或者准备图片放置在文件夹下,以下命令会依次对文件夹下的图片进行检测。 bash run.sh images ```  第四步:在result文件中查看运行结果,刷新可以看到是否是刚刚运行生成的结果。  ## 7 常见问题 - 报错:$'\r': command not found 解决方案:原因是windows和linux换行符不一致,在CLion右下角将CRLF改成LF,然后上传到远程服务器。 
-
【功能模块】复现人脸检测例程报错,数据由摄像头输入,今天早上可以跑通,但是晚上再测试时,就出现了报错【截图信息】设置的ip如下:尝试更改过以上的两个ip,但是没有效果,请问要如何解决呢?早上才跑通的,晚上测试就不行了,也不大清楚是不是误改了哪里。十分感谢!【日志信息】(可选,上传日志内容或者附件)
-
根据技术人员演示,只要拿到一张人脸图片,运用深度合成的办法,就能让人脸动起来,以假乱真,轻松攻破一些人脸识别系统。在专业技术人员的眼中,目前大部分人脸识别技术的算法并不是牢不可破。(央视新闻)转载于CSDN
-
人脸识别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、【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
【功能模块】最后的最后还出错了........【操作步骤&问题现象】【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
基于主动学习和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 方案架构图  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实现代码 代码详看附件。 代码时序图:  # 4 方案部署 ## 4.1 部署流程图  ## 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)命名  ## 4.4 FUNCTIONGRAPH搭建 ### 4.4.1 创建委托 登录IAM控制台(https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/agencies) 1)创建委托  委托名称:自定义 委托类型:云服务 云服务:函数工作流functiongraph 持续时间:永久  2)选择策略 OBS:获取对象等基本操作权限 FRS:fullaccess APIG:fullaccess  3)设置最小授权范围,此处选择所有,实际可根据项目情况分配。  4)完成委托创建  ### 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文件在压缩包的根目录下。  将压缩好的文件,上传到**functiongraph**的**依赖包管理**。  依赖包名称:自定义 运行时语言:2.7 描述:自定义 上传方式:上传ZIP文件  ### 4.4.3 创建函数 1)进入functiongraph控制台创建函数。 Functiongraph版本:functiongraph v2 函数类型:事件函数 函数名称:自定义 所属应用:默认 委托名称:选择创建的委托(如无,请点击右边的 创建委托 前往创建,创建步骤参考4.4.1) 企业项目:自行选择 自定义函数:关闭 运行时语言:Python2.7 函数执行入口:Index.handler 代码上传方式:静默代码   ### 4.4.4 编辑函数代码 将示例代码复制进来,编辑相关默认变量的值 1)粘贴3.3节的代码至index.py中  2)根据自己项目情况,设置默认Region、endpoint、buketname的值,若4.4.6节不设置环境变量的值,将默认取此处的默认值。 如下默认是北京四  3)编辑完成后,点击保存  ### 4.4.5 添加依赖包 1)在函数菜单-代码页,点击添加-依赖代码包  2)在公共依赖包,搜索obs,勾选OBS-sdk  3)在私有依赖包,勾选前面步骤上传的frs-sdk,然后确定保存  ### 4.4.6 编辑环境变量 在函数菜单-配置页,添加环境变量:region、bucketname(OBS桶名)、endpoint 若此处不设置环境变量,则函数会使用4.4.4节代码设置的默认值。  ### 4.4.7 调试函数 1)点击配置测试事件  2)选择apig的事件模板,添加body的内容和queryStringParameters的userid,进行保存。  3)点击测试,运行完毕可查看执行结果。  ## 4.5 添加APIG ### 4.5.1 添加APIG触发器 1)在函数菜单-触发器页,点击创建触发器  触发器类型:API网关服务(APIG) API名称:自定义 分组:选择API分组(如无点击右边 创建分组 进行创建) 发布环境:RELEASE(如无点击右边 创建发布环境 进行创建) 安全认证:测试环境可选择None(后面可编辑进行更改) 请求协议:测试环境可选择HTTP(后面可编辑进行更改) 后端超时(毫秒):5000  2)创建完成后,在触发器页面会添加一个APIG触发器,提供访问URL  ### 4.5.2 编辑APIG 1)点击APIG触发器名称,前往APIG控制台,点击编辑  2)编辑基本信息 此处可更改安全认证,为方便调试,此处保持无认证  3)定义API请求 此处需添加API的请求参数-用户标识,用于functiongraph中,取在OBS人脸照片库中的员工照片。  4)定义后端服务 添加后端服务参数,跟前面的入参做一个映射。 因为是在functiongraph创建的APIG,故此处已自动绑定functiongraph的函数为后端服务,故基础定义保持默认即可。  5)返回结果基础定义 返回结果的响应示例,暂设置为空即可,点击完成。  ### 4.5.3 调试API 1)API详情页,点击调试,跳转到API调试页面  2)输入相关请求参数,发起请求,进行调试。  ### 4.5.4 发布API 编辑完成后的API,需要进行发布,公网才可访问   ## 4.6 绑定独立域名 子域名仅供开发测试使用,每天最多访问1000次。如需开发服务,则需为API所在分组绑定独立域名。 ### 4.6.1 添加记录集 1、登录云解析控制台(也可使用其他平台,已完成ICP备案的域名),选择域名解析》公网域名,点击需要创建记录集的域名名称。  2、添加记录集  填写以下信息 主机记录:域名前缀,如face-test 类型:选择CNAME – 将域名指向另外一个域名 别名:默认即可 线路类型:默认即可 TTL(秒):默认即可 值:填写要指向的别名(此处为APIG上的子域名)  添加成功   ### 4.6.2 添加自定义域名 1、在API详情页-总览,点击添加增加自定义域名。  2、跳转到API所在分组的域名管理控制台,点击绑定独立域名  3、输入前面创建的记录集,点击确定。(如果是刚添加的记录集需刷新,约等5分钟)  添加完后,即可在公网通过自定义域名,访问APIG。  ## 4.7 问题记录 1、并发测试API时,发现偶现以下错误 错误1:人脸比对传入的base64字符串无法识别  错误2:数据传输被提前终止了  问题定位:因函数中的存储到本地的文件用的是同一个路径,并发操作时出现异步的同时占用一个路径,从而导致文件有丢失或文件转码有误 解决方案:给函数中的文件路径配置上时间戳,避免并发操作时,交叉操作同一个文件。 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模型对视频流数据做推理。
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签