虹软_虹软算法 - CSDN
精华内容
参与话题
  • 程序需要先选择需要对比的人脸文件夹,生成识别文件(需要一段时间),后面再打开程序直接读取生成的文件就可以快速进行人脸对比,千人毫秒响应,虹软ID KEY需要自行申请 下载 评论留邮箱也可,看见都会私发的 积分...

    Qt 人脸识别体温检测软件(界面酷炫)

    截图
    在这里插入图片描述
    在这里插入图片描述

    用到的函数库
    MySQL
    OpenCV
    虹软
    Qt
    使用
    程序需要先选择需要对比的人脸文件夹,生成识别文件(需要一段时间),后面再打开程序直接读取生成的文件就可以快速进行人脸对比,千人毫秒响应,虹软ID KEY需要自行申请

    下载
    评论留邮箱也可,看见都会私发的
    积分下载

    展开全文
  • SDK版本: 配置环境:win10 64位 +visual studio2015(2019也可) PS:前期尝试用VScode配置没配置成功,由于SDK有UI界面展示,需要MFC库支持,在用VScode配置时一直卡在MFC库上面,查阅微软官方论坛好像说...

    SDK版本:

    配置环境:win10 64位 +visual studio2015(2019也可)

    PS:前期尝试用VScode配置没配置成功,由于SDK有UI界面展示,需要MFC库支持,在用VScode配置时一直卡在MFC库上面,查阅微软官方论坛好像说VScode一般用来编辑code,不太支持开发,总之没尝试成功,建议小伙伴直接用visual studio 避免怕坑;同时官方建议版本为visual studio2013+,这里我只尝试了2015和2019都可以

    第一步:注册虹软视觉平台,下载所需的SDK版本,由于我下载的是windows的C++版本,所以后续只针对该版本配置说明。文件包含如下:

    注:其中示例代码中包含两个调用方法,编译时需要注释掉一个否则会编译报错。

    下载后需要记录生成的appId和sdkId,在如下界面位置:

    第二步:复制samplecode文件夹下面的.cpp文件到demo的底层目录下,同时将appId和sdkId填入samplecode.cpp和setting.ini文件,其中setting.ini可用记事本打开

    第三步:仔细阅读官方的pdf说明文档,按照pdf文档说明配置,官方说明如下:

    这里1和2我已经前面执行过了;3和4按照官方说明操作,复制文件到对应目录,.lib文件在第一步中的lib文件夹下面。需要说明的是复制文件到对应目录时可能对应目录已经含有该文件,没关系执行覆盖即可。5和7是容易出错的地方我会在下面重点说明,这里先不管。6中原官方文档应该是错了,也可能别的版本可以这样配置,总之本篇对应的版本按第二步配置即可

    第四步:用visual studio2015打开demo目录下的.sln项目文件(这里我用的vs2015):

    注:项目打开时会校验文件所依赖的库,可能会提示vs安装对应的库,按照提示安装直到完成

    第五步:编译,建议选择release编译+x64,注意一定要选择x64,因为下载的是64位sdk,debug编译会报如下错误,在vs2019中也报这个错误,百度了一番没解决掉。

    首次编译可能会报一些opencv相关的.dll找不到的问题,不要紧,此时就是官方pdf文件中的第5步,复制对应sdk和opencv的库到对应的目录,具体为:编译时候会在Arcfacedemo的目录下生成编译文件夹,如果是Realse模式编译会生成Realse文件夹,debug模式编译会生成Debug文件夹

    将pdf中的第五步中的所有.dll和lib文件复制到Release文件夹下(这里我是Release编译,建议选择此项,避免怕坑),如下:

    复制后Release包含文件如下:(这里官方PDF说明复制几个特定文件,为方便我直接复制了所有,并不会影响结果)

    复制完成后重新编译,此时可能会报**120d.dll相关的错误,查阅资料后推测是因为官方是用vs2013编译生成的项目,vs2013依赖*120d.dll,此时只需下载对应的.dll放入Release文件夹下即可,如上面截图红框内的msvcp120d.dll和msvcr120.dll,放一个网盘链接::https://pan.baidu.com/s/1nvN3atF 密码:11ak,感谢原作者,

    源问题链接:https://blog.csdn.net/qq_17783559/article/details/78988082

    第六步:编译完成无报错,之后运行调试成功后界面如下:(这里需要指出的是如果是在线激活,机器只要联网运行的时候就自动激活了无需额外操作)

    第七步:激活后就可以进行注册人脸识别体验demo了,具体模块和接口可以参考官方pdf文档

    展开全文
  • 虹软人脸识别-SpringBoot集成

    千次阅读 2020-09-03 15:17:04
    人工智能时代的到来,相信大家已耳濡目染,虹软免费,离线开放的人脸识别 SDK,正推动着全行业进入刷脸时代。为了方便开发者接入,虹软提供了多种语言,多种平台的人脸识别SDK的支持,使用场景广泛。产品主要功能有...

    一、前言

    人工智能时代的到来,相信大家已耳濡目染,虹软免费离线开放的人脸识别 SDK,正推动着全行业进入刷脸时代。为了方便开发者接入,虹软提供了多种语言,多种平台的人脸识别SDK的支持,使用场景广泛。产品主要功能有:人脸检测、追踪、特征提取、特征比对、属性检测,活体检测,图像质量检测等。此外,虹软提供的是基于本地算法特征的离线识别SDK,提供全平台的离线支持。
    作为一名刚接触人脸识别的初学者,对于虹软极为简洁,方便的SDK接入充满了好奇,想试图应用到web领域,而如今Java最火的web框架非SpringBoot莫属。但对于Java语言,虹软官网暂时还没有提供基于SpringBoot的集成Demo,因此便尝试写个将Java的人脸识别SDK和SpringBoot进行集成的样例,并写此文章进行记录,向广大初学开发者作分享。
    此Demo采用Maven作为项目管理工具,并基于Windows x64,Java 8 以及 SpringBoot 2.1.6,SDK是基于虹软人脸识别 SDK3.0。

    二、项目结构

    SDK依赖Jar包 可从虹软官网获取 点击”免费获取” , ”登录“后 选择 具体“平台/版本/语言“ 获取。
    在这里插入图片描述

    三、项目依赖

    ​ pom.xml 依赖包括

    • SpringBoot-Web依赖
    • SpringBoot-Devtools热部署依赖
    • SpringBoot-Freemarker依赖,
    • Hutool,Fastjson, Lombok,Commons-pool2,Guava
    • 虹软人脸识别SDK依赖Jar包
    • SpringBoot-Maven插件
    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
    </dependency>
    
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
    </dependency>
    
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>
    
    <dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>4.6.1</version>
    </dependency>
    
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.59</version>
    </dependency>
    
    <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.6.0</version>
    </dependency>
    
    <dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>26.0-jre</version>
    </dependency>
    
    <dependency>
    <groupId>com.arcsoft.face</groupId>
    <artifactId>arcsoft-sdk-face</artifactId>
    <version>3.0.0.0</version>
    <scope>system</scope>
    <systemPath>${basedir}/lib/arcsoft-sdk-face-3.0.0.0.jar</systemPath>
    </dependency>
    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
    <includeSystemScope>true</includeSystemScope>
    <fork>true</fork>
    </configuration>
    </plugin>
    </plugins>
    </build>

    四、项目流程

    在这里插入图片描述

    五、效果展示

    Application启动类 右击 选择 Run Application 即可运行程序,待程序启动完成后,访问 http://127.0.0.1:8089/
    在这里插入图片描述

    六、核心代码说明

    1. application.properties 配置说明
    #上传文件 最大值限制
    spring.servlet.multipart.max-file-size=100MB
    #请求 最大值限制
    spring.servlet.multipart.max-request-size=100MB
    #请求头 最大值限制
    server.max-http-header-size=2MB
    #请求体 最大值限制
    server.tomcat.max-http-post-size=50MB
    #项目访问端口
    server.port=8089
    #人脸识别引擎库路径
    config.arcface-sdk.sdk-lib-path=d:/arcsoft_lib
    #sdk appId
    config.arcface-sdk.app-id=9iSfMeAhj********************Kes2TpSrd
    #sdk sdkKey
    config.arcface-sdk.sdk-key=BuRTH3hGs9*******************yP9xu6fiFG7G
    #人脸识别 引擎池大小
    config.arcface-sdk.detect-pool-size=5
    #人脸比对 引擎池大小
    config.arcface-sdk.compare-pool-size=5
    #关闭freemarker模板引擎缓存
    spring.freemarker.cache=false
    #模板引擎更新延迟设置为0
    spring.freemarker.settings.template_update_delay=0

    ​ 其中 人脸识别引擎库,APP_ID,SDK_KEY 可通过虹软官网”开发者中心“,进行 “登录”后 在“我的应用“中进行获取。

    2. 项目实体类说明

    1)UserRamCache 人脸信息存储类

    public class UserRamCache {
    private static  ConcurrentHashMap<String, UserInfo> userInfoMap = new ConcurrentHashMap<>();
    public static void addUser(UserInfo userInfo) {
            userInfoMap.put(userInfo.getFaceId(), userInfo);
    }
    public static void removeUser(String faceId) {
            userInfoMap.remove(faceId);
    }
    public static List<UserInfo> getUserList() {
            List<UserInfo> userInfoList = Lists.newLinkedList();
    for (UserInfo value : userInfoMap.values()) {
                userInfoList.add(value);
    }
    return userInfoList;
    }
    @Data
    public static class UserInfo {
    //人脸Id
    private String faceId;
    //人脸名称
    private String name;
    //人脸特征值
    private byte[] faceFeature;
    }
    }

    此类拥有一个 UserInfo的内部类,用于封装人脸信息,userInfoMap以人脸名称为key,UserInfo对象为Value 存储 并提供相应增/删/查功能的方法。
    2)ProcessInfo 人脸检测实体类

    public class ProcessInfo {
    //年龄
    private int age;
    //性别
    private int gender;
    //是否活体
    private int liveness;
    }

    3)UserCompareInfo 人脸识别实体类 此类继承自 人脸信息存储类的人脸信息类(内部类)

    public class UserCompareInfo extends UserRamCache.UserInfo {
    //人脸比对后的相似值
    private Float similar;
    }

    4)FaceDetectResDTO 人脸检测DTO封装类

    public class FaceDetectResDTO {
    //人脸框
    private Rect rect;
    //人脸角度
    private int orient;
    //人脸Id
    private int faceId = -1;
    //年龄
    private int age = -1;
    //性别
    private int gender = -1;
    //是否为活体
    private int liveness = -1;
    }

    5)FaceRecognitionResDTO 人脸识别DTO封装类

    public class FaceRecognitionResDTO {
    //人脸框
    private Rect rect;
    //人脸名称
    private String name;
    //人脸比对相似值
    private float similar;
    }
    3. FaceEngineFactory类 源码说明

    ​ 此类继承自BasePooledObjectFactory抽象类,为FaceEngine对象池。
    1)成员变量说明

    //SDK引擎库的路径
    private String libPath;
    //SDK APP_ID
    private String appId;
    //SDK SDK_KEY
    private String sdkKey;
    //SDK 激活码
    private String activeKey;
    //引擎配置类
    private EngineConfiguration engineConfiguration;

    2)create()方法

    @Override
    public FaceEngine create() {
        FaceEngine faceEngine = new FaceEngine(libPath);
    int activeCode = faceEngine.activeOnline(appId, sdkKey);
    if (activeCode != ErrorInfo.MOK.getValue() && activeCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
            log.error("引擎激活失败" + activeCode);
    throw new BusinessException(ErrorCodeEnum.FAIL, "引擎激活失败" + activeCode);
    }
    int initCode = faceEngine.init(engineConfiguration);
    if (initCode != ErrorInfo.MOK.getValue()) {
            log.error("引擎初始化失败" + initCode);
    throw new BusinessException(ErrorCodeEnum.FAIL, "引擎初始化失败" + initCode);
    }
    return faceEngine;
    }
    1. 参数说明:无
    2. 返回结果:FaceEngine人脸识别引擎
    3. 代码流程解读:
      此方法,通过libPath(SDK引擎库的路径)实例化FaceEngine对象,再根据APP_IDSDK_KEY调用activeOnline()方法激活引擎 (联网状态下)
      成功激活引擎后,根据EngineConfiguration引擎配置类 调用init()方法初始化引擎 。

    3)wrap()方法

    public PooledObject<FaceEngine> wrap(FaceEngine faceEngine) {
    return new DefaultPooledObject<>(faceEngine);
    }
    1. 参数说明:FaceEngine人脸识别引擎
    2. 返回结果:PooledObject包装类
    3. 代码流程解读:
      此方法,通过PooledObject包装器对象 将faceEngine进行包装,便于维护引擎的状态。

    4)destroyObject()方法

    public void destroyObject(PooledObject<FaceEngine> p) throws Exception {
        FaceEngine faceEngine = p.getObject();
    int result = faceEngine.unInit();
    super.destroyObject(p);
    }
    1. 参数说明:PooledObject包装类
    2. 返回结果:无
    3. 代码流程解读:
      此方法,从PooledObject包装器对象中获取faceEngine引擎,随后卸载引擎。
    4. FaceEngineServiceImpl类 源码说明

    1)成员变量说明

    @Value("${config.arcface-sdk.sdk-lib-path}")
    public String sdkLibPath;
    
    @Value("${config.arcface-sdk.app-id}")
    public String appId;
    
    @Value("${config.arcface-sdk.sdk-key}")
    public String sdkKey;
    
    @Value("${config.arcface-sdk.detect-pool-size}")
    public Integer detectPooSize;
    
    @Value("${config.arcface-sdk.compare-pool-size}")
    public Integer comparePooSize;
    
    private ExecutorService compareExecutorService;
    
    //通用人脸识别引擎池
    private GenericObjectPool<FaceEngine> faceEngineGeneralPool;
    
    //人脸比对引擎池
    private GenericObjectPool<FaceEngine> faceEngineComparePool;

    ​ 此类的成员变量可通过@Value()注解获取配置文件中的相应配置。
    2)init()方法

    @PostConstruct
    public void init() {
        GenericObjectPoolConfig detectPoolConfig = new GenericObjectPoolConfig();
        detectPoolConfig.setMaxIdle(detectPooSize);
        detectPoolConfig.setMaxTotal(detectPooSize);
        detectPoolConfig.setMinIdle(detectPooSize);
        detectPoolConfig.setLifo(false);
        EngineConfiguration detectCfg = new EngineConfiguration();
        FunctionConfiguration detectFunctionCfg = new FunctionConfiguration();
    //开启人脸检测功能
        detectFunctionCfg.setSupportFaceDetect(true);
    //开启人脸识别功能
        detectFunctionCfg.setSupportFaceRecognition(true);
    //开启年龄检测功能
        detectFunctionCfg.setSupportAge(true);
    //开启性别检测功能
        detectFunctionCfg.setSupportGender(true);
    //开启活体检测功能
        detectFunctionCfg.setSupportLiveness(true);
        detectCfg.setFunctionConfiguration(detectFunctionCfg);
    //图片检测模式,如果是连续帧的视频流图片,那么改成VIDEO模式
        detectCfg.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
    //人脸旋转角度
        detectCfg.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY);
    //底层库算法对象池
        faceEngineGeneralPool = new GenericObjectPool(new FaceEngineFactory(sdkLibPath, appId, sdkKey, null, detectCfg), detectPoolConfig);
    
    //初始化特征比较线程池
        GenericObjectPoolConfig comparePoolConfig = new GenericObjectPoolConfig();
        comparePoolConfig.setMaxIdle(comparePooSize);
        comparePoolConfig.setMaxTotal(comparePooSize);
        comparePoolConfig.setMinIdle(comparePooSize);
        comparePoolConfig.setLifo(false);
        EngineConfiguration compareCfg = new EngineConfiguration();
        FunctionConfiguration compareFunctionCfg = new FunctionConfiguration();
    //开启人脸识别功能
        compareFunctionCfg.setSupportFaceRecognition(true);
        compareCfg.setFunctionConfiguration(compareFunctionCfg);
    //图片检测模式,如果是连续帧的视频流图片,那么改成VIDEO模式
        compareCfg.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
    //人脸旋转角度
        compareCfg.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY);
    //底层库算法对象池
        faceEngineComparePool = new GenericObjectPool(new FaceEngineFactory(sdkLibPath, appId, sdkKey, null, compareCfg), comparePoolConfig);
        compareExecutorService = Executors.newFixedThreadPool(comparePooSize);
    }
    1. 参数说明:无
    2. 返回结果:无
    3. 代码流程解读:
      @PostConstruct注解:Spring在实例化该Bean之后 立刻去执行此方法。在此方法中,首先去实例化通用人脸识别引擎池配置对象并设置其对应属性,之后实例化EngineConfiguration(设置图像检测模式、人脸旋转角度)和FunctionConfiguration(用于功能配置,开启引擎相应功能,被EngineConfiguration所依赖),最后调FaceEngineFactory的构造方法去初始化引擎并获取对象池。人脸比对引擎池 同理。
      3)detectFaces()方法 人脸检测
    @Override
    public List<FaceInfo> detectFaces(ImageInfo imageInfo) {
      
      FaceEngine faceEngine = null;
        try {
            faceEngine = faceEngineGeneralPool.borrowObject();
            if (faceEngine == null) {
                throw new BusinessException(ErrorCodeEnum.FAIL, "获取引擎失败");
            }
            
            //人脸检测得到人脸列表
            List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
            //人脸检测
            int errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
            if (errorCode == 0) {
                return faceInfoList;
            } else {
                log.error("人脸检测失败,errorCode:" + errorCode);
            } 
            
        } catch (Exception e) {
            log.error("", e);
        } finally {
            if (faceEngine != null) {
                //释放引擎对象
                faceEngineGeneralPool.returnObject(faceEngine);
            }
        }    
        
        return null;
    }
    1. 参数说明:ImageInfo图像信息
    2. 返回结果:List<FaceInfo> 人脸信息列表
    3. 代码流程解读:
      此方法,根据传入的ImageInfo图像信息,通过faceEngine引擎调用detectFaces()方法检测人脸信息(所需参数: 图像数据,图像宽度(4的倍数),图片高度,图像的颜色格式,存放检测到的人脸信息List),随后回收引擎对象。
      注:detectFaces该功能依赖初始化的模式选择,初始化中detectFaceOrientPrioritydetectFaceScaleValdetectFaceMaxNum参数的设置,对能否检测到人脸以及检测到几张人脸都有决定性的作用。
      4)extractFaceFeature()方法 人脸特征值提取
    @Override
    public byte[] extractFaceFeature(ImageInfo imageInfo, FaceInfo faceInfo) {
    
      FaceEngine faceEngine = null;
      try {
            faceEngine = faceEngineGeneralPool.borrowObject();
            if (faceEngine == null) {
                throw new BusinessException(ErrorCodeEnum.FAIL, "获取引擎失败");
            }
    
            FaceFeature faceFeature = new FaceFeature();
            //提取人脸特征
            int errorCode = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfo, faceFeature);
            if (errorCode == 0) {
                return faceFeature.getFeatureData();
            } else {
                log.error("特征提取失败,errorCode:" + errorCode);
            }   
      } catch (Exception e) {
         log.error("", e);
      } finally {
            if (faceEngine != null) {
                //释放引擎对象
                faceEngineGeneralPool.returnObject(faceEngine);
            }
        }   
        return null;
    }
    1. 参数说明:ImageInfo图像信息,FaceInfo人脸信息
    2. 返回结果:人脸特征值 字节数组
    3. 代码流程解读:
      此方法,根据传入的ImageInfo图像信息数据和FaceInfo人脸信息 通过faceEngine引擎调用extractFaceFeature()方法获取人脸特征数据(所需参数:图像数据,图像宽度(4的倍数),图像高度,图像的颜色格式,人脸信息,存放提取到的人脸特征信息),随后回收引擎对象。
      注:extractFaceFeature()方法依赖detectFaces成功检测到人脸,将检测到的人脸,取单张人脸信息和使用的图像信息 传入该接口进行特征提取。
      5)compareFace()方法 人脸相似度比对
    @Override
    public Float compareFace(ImageInfo imageInfo1, ImageInfo imageInfo2) {
    
       List<FaceInfo> faceInfoList1 = detectFaces(imageInfo1);
       List<FaceInfo> faceInfoList2 = detectFaces(imageInfo2);
      
       if (CollectionUtil.isEmpty(faceInfoList1) || CollectionUtil.isEmpty(faceInfoList2)) {
           throw new BusinessException(ErrorCodeEnum.FAIL,"未检测到人脸");
       }
    
       byte[] feature1 = extractFaceFeature(imageInfo1, faceInfoList1.get(0));
       byte[] feature2 = extractFaceFeature(imageInfo2, faceInfoList2.get(0));
    
       FaceEngine faceEngine = null;
       try {
           faceEngine = faceEngineGeneralPool.borrowObject();
           if (faceEngine == null) {
               throw new BusinessException(ErrorCodeEnum.FAIL, "获取引擎失败");
           }
    
           FaceFeature faceFeature1 = new FaceFeature();
           faceFeature1.setFeatureData(feature1);
           FaceFeature faceFeature2 = new FaceFeature();
           faceFeature2.setFeatureData(feature2);
           //提取人脸特征
           FaceSimilar faceSimilar = new FaceSimilar();
           int errorCode = faceEngine.compareFaceFeature(faceFeature1, faceFeature2, faceSimilar);
           if (errorCode == 0) {
               return faceSimilar.getScore();
           } else {
               log.error("特征提取失败,errorCode:" + errorCode);
           }
    
       } catch (Exception e) {
           log.error("", e);
       } finally {
           if (faceEngine != null) {
               //释放引擎对象
               faceEngineGeneralPool.returnObject(faceEngine);
           }
       }  
       
       return null;
    }
    1. 参数说明:需要比对的两个 ImageInfo图像信息
    2. 返回结果:人脸比对相似值
    3. 代码流程解读:
      此方法,根据传入的两个ImageInfo图像信息分别调用detectFaces()方法获取各自人脸信息,成功检测到人脸信息后,再调用extractFaceFeature()方法提取各自人脸特征值,成功获取到人脸特征值后,根据两个特征值再通过faceEngine引擎调用compareFaceFeature()方法进行比对(所需参数:人脸特征值1,人脸特征值2,比对模型,存放比对相似值结果), 最后获取人脸相似值返回 并回收引擎对象。
      6)CompareFaceTask

    FaceEngineServiceImpl的一个成员内部类,其实现Callable接口,用于完成线程任务

    private class CompareFaceTask implements Callable<List<UserCompareInfo>> {
        //存储的人脸信息列表
        private List<UserRamCache.UserInfo> userInfoList;
        //目标特征值
        private FaceFeature targetFaceFeature;
        //相似度预期值
        private float passRate;
    
        public CompareFaceTask(List<UserRamCache.UserInfo> userInfoList, FaceFeature targetFaceFeature, float passRate) {
            this.userInfoList = userInfoList;
            this.targetFaceFeature = targetFaceFeature;
            this.passRate = passRate;
        }
    
        @Override
        public List<UserCompareInfo> call() throws Exception {
            FaceEngine faceEngine = null;
            List<UserCompareInfo> resultUserInfoList = Lists.newLinkedList();//识别到的人脸列表
            try {
                faceEngine = faceEngineComparePool.borrowObject();
                for (UserRamCache.UserInfo userInfo : userInfoList) {
                    FaceFeature sourceFaceFeature = new FaceFeature();
                    sourceFaceFeature.setFeatureData(userInfo.getFaceFeature());
                    FaceSimilar faceSimilar = new FaceSimilar();
                    faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
                   if (faceSimilar.getScore() > passRate) {//相似值大于配置预期,加入到识别到人脸的列表
                        UserCompareInfo info = new UserCompareInfo();
                        info.setName(userInfo.getName());
                        info.setFaceId(userInfo.getFaceId());
                        info.setSimilar(faceSimilar.getScore());
                        resultUserInfoList.add(info);
                    }
                }
             } catch (Exception e) {
                logger.error("", e);
             } finally {
                if (faceEngine != null) {
                    faceEngineComparePool.returnObject(faceEngine);
                }
            }
            return resultUserInfoList;
           }
     }
    1. 参数说明:无
    2. 返回结果:List<UserCompareInfo>人脸识别实体类列表
    3. 代码流程解读:
      call()方法中遍历userInfoList中每个UserInfo获取特征值,并结合目标特征值 通过faceEngine引擎调用compareFaceFeature()方法获取相似度大小 ,将获取到的相似度大小和预期相似度进行比较,若大于配置的预期值,则加入到识别到人脸的列表,最后回收引擎对象。

    7)faceRecognition()方法 人脸识别

    @Override
    public List<UserCompareInfo> faceRecognition(byte[] faceFeature, List<UserRamCache.UserInfo> userInfoList, float passRate) {
        List<UserCompareInfo> resultUserInfoList = Lists.newLinkedList();//识别到的人脸列表
    
        FaceFeature targetFaceFeature = new FaceFeature();
        targetFaceFeature.setFeatureData(faceFeature);
       
        List<List<UserRamCache.UserInfo>> faceUserInfoPartList = Lists.partition(userInfoList, 1000);//分成1000一组,多线程处理
        CompletionService<List<UserCompareInfo>> completionService = new ExecutorCompletionService(compareExecutorService);
        for (List<UserRamCache.UserInfo> part : faceUserInfoPartList) {
            completionService.submit(new CompareFaceTask(part, targetFaceFeature, passRate));
        }
    
        for (int i = 0; i < faceUserInfoPartList.size(); i++) {
            List<UserCompareInfo> faceUserInfoList = null;
            try {
                faceUserInfoList = completionService.take().get();
            } catch (InterruptedException | ExecutionException e) {
            }
            if (CollectionUtil.isNotEmpty(userInfoList)) {
                resultUserInfoList.addAll(faceUserInfoList);
            }
        }
    
        resultUserInfoList.sort((h1, h2) -> h2.getSimilar().compareTo(h1.getSimilar()));//从大到小排序
        return resultUserInfoList;
    }
    1. 参数说明:人脸特征值 字节数组,List<UserRamCache.UserInfo>存储的人脸信息列表,相似度预期值
    2. 返回结果:List<UserCompareInfo>人脸识别实体类列表
    3. 代码流程解读:
      此方法,根据传入的人脸特征值以及UserRamCache.UserInfo列表,先将UserRamCache.UserInfo分为每1000一组,再通过多线程处理,即上述CompareFaceTask类,处理完之后再将结果合并,按从大到小排序后返回。

    8)process()方法 人脸属性检测

    @Override
    public List<ProcessInfo> process(ImageInfo imageInfo, List<FaceInfo> faceInfoList) {
       FaceEngine faceEngine = null;
       try {
           //获取引擎对象
           faceEngine = faceEngineGeneralPool.borrowObject();
           if (faceEngine == null) {
               throw new BusinessException(ErrorCodeEnum.FAIL, "获取引擎失败");
           }
    
           int errorCode = faceEngine.process(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList, FunctionConfiguration.builder().supportAge(true).supportGender(true).supportLiveness(true).build());
           if (errorCode == 0) {
               List<ProcessInfo> processInfoList = Lists.newLinkedList();
    
               //性别列表
               List<GenderInfo> genderInfoList = new ArrayList<GenderInfo>();
               faceEngine.getGender(genderInfoList);
    
               //年龄列表
               List<AgeInfo> ageInfoList = new ArrayList<AgeInfo>();
               faceEngine.getAge(ageInfoList);
               //活体结果列表
               List<LivenessInfo> livenessInfoList = new ArrayList<LivenessInfo>();
               faceEngine.getLiveness(livenessInfoList);
    
               for (int i = 0; i < genderInfoList.size(); i++) {
                   ProcessInfo processInfo = new ProcessInfo();
                   processInfo.setGender(genderInfoList.get(i).getGender());
                   processInfo.setAge(ageInfoList.get(i).getAge());
                   processInfo.setLiveness(livenessInfoList.get(i).getLiveness());
                   processInfoList.add(processInfo);
               }
               return processInfoList;
               }
       } catch (Exception e) {
           logger.error("", e);
       } finally {
           if (faceEngine != null) {
               //释放引擎对象
               faceEngineGeneralPool.returnObject(faceEngine);
           }
       }
       return null;
       }
    1. 参数说明:ImageInfo图像信息,List<FaceInfo>人脸信息列表
    2. 返回结果:List<ProcessInfo>人脸检测实体类列表
    3. 代码流程解读:
      此方法,根据传入的ImageInfo图像信息以及检测到的FaceInfo人脸信息列表,通过faceEngine引擎调用process()方法(所需参数:图像数据,图片宽度(4的倍数),图像高度,图像的颜色空间格式,人脸信息列表,需检测的属性),之后可从faceEngine对象获取 性别,年龄,是否活体等结果的列表,并将一系列列表结果遍历 设置于ProcessInfo对象返回,随后回收引擎对象。
      注:process()支持检测AGEGENDERFACE3DANGLELIVENESS四种属性,若想检测这些属性,须在初始化引擎接口中对想要检测的属性进行设置。
    5. FaceController类 源码说明

    1)initFace()方法:初始化注册人脸

    @PostConstruct
    public void initFace() throws FileNotFoundException {
        Map<String, String> fileMap = Maps.newHashMap();
        fileMap.put("zhao1", "赵丽颖");
        fileMap.put("yang1", "杨紫");
    
        for (String f : fileMap.keySet()) {
            ClassPathResource resource = new ClassPathResource("static/images/" + f +  ".jpg");
            InputStream inputStream = null;
            try {
                inputStream = resource.getInputStream();
            } catch (IOException e) {
            }
            ImageInfo rgbData = ImageFactory.getRGBData(inputStream);
            List<FaceInfo> faceInfoList = faceEngineService.detectFaces(rgbData);
            if (CollectionUtil.isNotEmpty(faceInfoList)) {
                byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfoList.get(0));
                UserRamCache.UserInfo userInfo = new UserCompareInfo();
                userInfo.setFaceId(f);
                userInfo.setName(fileMap.get(f));
                userInfo.setFaceFeature(feature);
                UserRamCache.addUser(userInfo);
            }
        }
    
        log.info("http://127.0.0.1:"+ port +"/");
    }
    1. 参数说明:无
    2. 返回结果:无
    3. 代码流程解读:
      @PostConstruct注解表示Spring在实例化该Bean之后 立刻去执行此方法。首先去加载static/images/下的图片资源将其解析为ImageInfo类型的RGB图像信息数据,之后依次调用FaceEngineService类的detectFaces()extractFaceFeature()方法提取人脸特征值,最后将人脸相关数据设置于UserRamCache.UserInfo对象中(此Demo仅将数据暂存于内存中,用户可根据需要,自行创建数据库相关表并持久化于磁盘中)。

    2)faceAdd()方法 添加人脸

    @RequestMapping(value = "/faceAdd", method = RequestMethod.POST)
    @ResponseBody
    public Response faceAdd(String file, String faceId, String name) {
       return null;
      }
    1. 参数说明:浏览器上传的图片信息,人脸Id,人脸名
    2. 返回结果:Json格式
    3. 代码流程解读:
      此方法,可用于添加更多人脸信息,根据用户需要自行完善。

    3)faceRecognition()方法 人脸识别

    @RequestMapping(value = "/faceRecognition", method = RequestMethod.POST)
    @ResponseBody
    public Response<List<FaceRecognitionResDTO>> faceRecognition(String image) {
    
        List<FaceRecognitionResDTO> faceRecognitionResDTOList = Lists.newLinkedList();
        byte[] bytes = Base64Util.base64ToBytes(image);
        ImageInfo rgbData = ImageFactory.getRGBData(bytes);
        List<FaceInfo> faceInfoList = faceEngineService.detectFaces(rgbData);
        if (CollectionUtil.isNotEmpty(faceInfoList)) {
            for (FaceInfo faceInfo : faceInfoList) {
                FaceRecognitionResDTO faceRecognitionResDTO = new FaceRecognitionResDTO();
                faceRecognitionResDTO.setRect(faceInfo.getRect());
                byte[] feature = faceEngineService.extractFaceFeature(rgbData, faceInfo);
                if (feature != null) {
                    List<UserCompareInfo> userCompareInfos = faceEngineService.faceRecognition(feature, UserRamCache.getUserList(), 0.8f);
                    if (CollectionUtil.isNotEmpty(userCompareInfos)) {
                        faceRecognitionResDTO.setName(userCompareInfos.get(0).getName());
                        faceRecognitionResDTO.setSimilar(userCompareInfos.get(0).getSimilar());
                    }
                }
                faceRecognitionResDTOList.add(faceResDTOList);
          }
       }
       return Response.newSuccessResponse(faceRecognitionResDTOList);
       }
    1. 参数说明:浏览器上传的图片信息
    2. 返回结果:Json格式 List<FaceRecognitionResDTO>人脸识别DTO列表
    3. 代码流程解读:
      此方法,先将请求上传的(base64编码后)的图片解析为ImageInfo类型的RGB图像信息数据,再依次调用FaceEngineService类的detectFaces()extractFaceFeature()faceRecognition()方法 与先前存于内存中的人脸信息进行比对,获取相似度最大的人脸信息,并将结果设置于FaceRecognitionResDTO后返回。

    4)detectFaces() 方法 人脸检测

    @RequestMapping(value = "/detectFaces", method = RequestMethod.POST)
    @ResponseBody
    public Response<List<FaceDetectResDTO>> detectFaces(String image) {
         
      byte[] bytes = Base64Util.base64ToBytes(image);
      ImageInfo rgbData = ImageFactory.getRGBData(bytes);
      List<FaceDetectResDTO> faceDetectResDTOS = Lists.newLinkedList();
      List<FaceInfo> faceInfoList = faceEngineService.detectFaces(rgbData);
      if (CollectionUtil.isNotEmpty(faceInfoList)) {
           List<ProcessInfo> process = faceEngineService.process(rgbData, faceInfoList);
    
           for (int i = 0; i < faceInfoList.size(); i++) {
               FaceDetectResDTO faceDetectResDTO = new FaceDetectResDTO();
               FaceInfo faceInfo = faceInfoList.get(i);
               faceDetectResDTO.setRect(faceInfo.getRect());
               faceDetectResDTO.setOrient(faceInfo.getOrient());
               faceDetectResDTO.setFaceId(faceInfo.getFaceId());
               if (CollectionUtil.isNotEmpty(process)) {
                  ProcessInfo processInfo = process.get(i);
                  faceDetectResDTO.setAge(processInfo.getAge());
                  faceDetectResDTO.setGender(processInfo.getGender());
                  faceDetectResDTO.setLiveness(processInfo.getLiveness());
            }
            faceDetectResDTOS.add(faceDetectResDTO);
          }
       }
       return Response.newSuccessResponse(faceDetectResDTOS);
    }
    1. 参数说明:浏览器上传的图片信息
    2. 返回结果:Json格式List<FaceDetectResDTO>人脸检测DTO列表
    3. 代码流程解读:
      此方法,先将请求上传的(base64编码后)的图片解析为ImageInfo类型的RGB图像信息数据,再依次调用FaceEngineService类的detectFaces() process()方法获取人脸检测数据(年龄,性别,是否活体),并将结果设置于FaceDetectResDTO后返回。

    5)compareFaces()方法 人脸比对

    @RequestMapping(value = "/compareFaces", method = RequestMethod.POST)
    @ResponseBody
    public Response<Float> compareFaces(String image1, String image2) {
    
         byte[] bytes1 = Base64Util.base64ToBytes(image1);
        byte[] bytes2 = Base64Util.base64ToBytes(image2);
        ImageInfo rgbData1 = ImageFactory.getRGBData(bytes1);
        ImageInfo rgbData2 = ImageFactory.getRGBData(bytes2);
    
        Float similar = faceEngineService.compareFace(rgbData1, rgbData2);
        return Response.newSuccessResponse(smilar);
    }
    1. 参数说明:两张浏览器上传的图片信息
    2. 返回结果:人脸比对相似值
    3. 代码流程解读:
      此方法,先将请求上传的(base64编码后)的图片解析为ImageInfo类型的RGB图像信息数据,之后通过FaceEngineService类的compareFace()方法进行人脸比对,获取人脸相似值并返回。

    七、源码下载

    若有想一起学习虹软SDK,感受人脸识别奥秘的同学,可通过点击此链接获取Demo源码。

    展开全文
  • 自2016年以来,随着国内移动互联网的迅速普及,以抖音、快手、西瓜等为代表的短视频平台,如雨后春笋般诞生,带动了中国短视频市场爆发式增长。据中商产业研究院报告,2019年中国短视频行业市场规模为1006.52亿元,...

    自2016年以来,随着国内移动互联网的迅速普及,以抖音、快手、西瓜等为代表的短视频平台,如雨后春笋般诞生,带动了中国短视频市场爆发式增长。据中商产业研究院报告,2019年中国短视频行业市场规模为1006.52亿元,同比增长达到了115.45%。 


    短视频市场主要包含两个方面,一个是内容市场,即短视频的商业制作;另一个是营销市场,即通过短视频或短视频平台产生的广告收入等。两者总体构成了短视频流量变现的主要方面,并在很大程度上推动了信息流营销市场和信息流内容市场快速增长。随着5G网络的大范围普及,更低的流量成本、更优的用户体验,将使短视频内容和展现形式更多元,更容易获取及可负担,短视频市场预计将会迎来新一轮的发展机遇期。


    在此风口之下,钛灵AI市场携手火山引擎、极链科技、相芯科技、虹软等15家文娱产业AI公司,面向短视频市场,提供全链路的人工智能解决方案。

    丰富的解决方案,提供全生命周期AI服务

    一个视频从无到有,会经历视频采集、审核筛选、生产制作、分析管理、发布体验五个阶段。在这条完整的产业链上,钛灵AI市场整合多方合作AI企业的成熟技术,借助人工智能帮助短视频相关企业在行业全面竞争和新一轮发展机遇期来临前提前布局,进一步发展和巩固在细分领域市场的优势。目前,钛灵AI市场已与15家泛娱乐相关AI技术服务商达成合作意向,就短视频生产的不同阶段提出相应的解决方案。


    在视频采集和生产制作阶段基于人脸和人体识别跟踪核心技术,可提供AI防抖、主体识别和跟随等解决方案。另外还有10+美妆维度、虚拟形象生成、动态贴图、智能换脸、画质增强等目前短视频领域流行的技术实现方案;在审核筛选阶段,钛灵AI市场合作伙伴极链科技的视频结构化数据AI引擎,能够对视频内容进行审核、理解、溯源等,目前已有芒果TV等多家在使用。


    短视频制作公司有庞大的视频素材库分析整理需求,而钛灵AI市场已有完整的AI解决方案投入到实际案例中,对于视频中人物、场景、物品、台词NLP等维度进行深度标注和分析,结合传播数据可以帮助更好地调整内容方向和策略,辅助再创作。AI配音功能可以将文字自动生成音频,解决了很多初创影视公司、个人或者工作室的成本问题;AI变音让短视频变得更加丰富有趣。


    另外,钛灵AI市场认为AI识别检测声纹将是继指纹、人脸识别后的下一个人类重要ID,与相关合作AI企业正探索如何将其应用于短视频产业不同场景下。 


    对于一些视频播放平台,钛灵AI市场同样有成熟的AI解决方案面向平台的用户及创作者。例如,马赛克及弹幕防挡可提升用户观影体验;AI虚拟形象和智慧广告植入可以帮助创作者更好地直播,以及平台变现。

    钛灵AI市场,助力短视频生态

    可见,AI创新技术已经渗透到短视频的各个环节,极大地提高了生产效率。钛灵AI市场作为一站式算法交易及产品化平台,将这些AI能力进行统一的标准化“封装”,在保证安全性的同时降低了采购成本,成为短视频行业中能够提供AI技术和实践能力的开放型服务平台。


    AI技术推动了短视频市场的快速发展,而短视频想要更好地将技术融入产品中,则需要更多的打磨。钛灵AI市场将以平台内聚揽的算法资源为出发点,不断实现场景范围内的泛娱乐智能化,并探索更多新的赛道和场景,助力短视频生态蓬勃发展。

    展开全文
  • 虹软公司提供免费离线人脸识别,对于开发者提供了比较友好、完整的可配置demo。但是如需直接体验功能,还需要花一点时间去完成项目配置等一系列操作,对于初学者、不怎么熟悉整个项目的人来说报各种错误也是常有的。...
  • 注册成为虹软开发者 进入虹软AI开发平台,注册账号,然后填写个人信息 登陆后进入应用管理 点击创建应用 填写信息: 接下来添加sdk 选择sdk , 人脸识别选择ArcFace 选择人脸识别sdk的版本,点击确定添加sdk ...
  • 虹软人脸识别2.0踩坑记录

    千次阅读 2019-03-06 11:23:46
    我是服务端集成虹软识别,除去文档介绍得那些,还有一个看不见得问题,就是win和liunx 得参数类型区别, 就因为一个参数类型错误,就报参数错误,结果使劲排查都没找到原因, /** * 人脸检测模式常量 * * @author ...
  • 虹软公司是一家具有硅谷背景的图像处理公司,除了人脸技术以外,还有多项图像及视频处理技术。 ​​【本文最后附有免费SDK 下载链接】虹软公司是一家具有硅谷背景的图像处理公司,除了人脸技术以外,还有多项图像及...
  • 奇怪的虹软

    千次阅读 2010-12-04 17:20:00
    好奇怪啊,和虹软的招聘要的条件一样,可连个笔试的机会都没有。后来看看,他们只到几个城市进行了宣讲会,当然没有北京。估计因为这个,压根就不问了,毕竟要有笔试等过程。像另外一家一样,问我在北京还是...
  • 人工智能领域最近几年的发展可以说是如火如荼,这里面既有创业者的磨刀霍霍,也有资本的一路执着狂跟,还有学生和程序员群体的热情追随。回顾人工智能领域从2012年的星星之火,到15年左右的疯狂态势,再到18年理性的...
  • 作为生物识别技术的一种,搭载人脸识别功能的各类智能化产品已应用得非常普遍。但从产品体验而言,用户的感受却不尽相同。比如有能够在自行车骑行状态下,无需下车实现快速无感通行的小区人脸识别闸机。...
  • 参考链接:https://blog.csdn.net/sxy102829/article/details/14284001?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc...
  • 因为这篇博客开始写的时候是2018.3,到现在有一年多了,而虹软的sdk发生了很大的变化,所以我这里重新把博客写一遍。 多谢各位看官在这一年对该篇博客的关注。 1.账号注册 首先在虹软开发者网站上注册(用手机...
  • 虹软面试

    千次阅读 2007-10-18 23:07:00
    (A,B都是这次参加应聘的同学,和我同一个实验室) 你所在的实验室,你认为还有谁适合来虹软工作?(我推荐了C和D) 你能够把A,C,D排一个次序吗? 二面,主要是技术。 描述一下做过的最大的项目。
  • 虹软人脸识别集成到项目中

    千次阅读 2018-06-21 16:49:33
    libs下载 http://www.arcsoft.com.cn/ai/usercenter/index demo下载 https://github.com/asdfqwrasdf/ArcFaceDemo 总结 https://blog.csdn.net/wesker8080/article/details/76696529
  • C# 配合虹软免费API的人工识别DEMO

    千次阅读 2018-09-23 14:53:58
    导航虹软人脸识别API申请密钥下载API配置API申明API结构体和方法DEMO 虹软人脸识别API 申请虹软API https://ai.arcsoft.com.cn/product/arcface.html 虽说是免费的用谁的都无所谓, 但最好还是自己申请一个… 申请...
  • 2018虹软笔试题(算法方向)

    千次阅读 2018-05-05 09:43:20
    1.A是m*n的矩阵,B是n*m的矩阵,那么现在有(AB)x=0,讨论m、n和解x的情况(非零解、无解)2.a是A的特征向量,那么(PAP^(-1))的特征向量是什么3.牛吃草(28头牛吃9天,25头牛吃12天,22头牛吃几天,答案可能是18天)4...
  • 2018虹软笔试(开发方向)

    千次阅读 2018-05-05 09:43:13
    一、选择(简单) 二、填空 1.分东西,拿到第100个的就赢了,只能拿2个到十个,问第一个人拿几个肯定可以赢2.补代码充3.c++函数传值的方法哪三个4.模板类写法三、编程1.给定一个带空格的字符串,空格很多,比如 a...
  • 虹软人脸识别2.0踩坑

    千次阅读 2019-04-23 15:46:36
    项目启动报错:java.lang.UnsatisfiedLinkError: /usr/lib/libarcsoft_face_engine_jni.so: libarcsoft_face_engine.so: cannot open shared object file: No such file or directory Dockerfile: ...
  • C# 人脸识别Demo(基于虹软免费SDK)完整版

    千次下载 热门讨论 2020-07-30 23:32:08
    C# 人脸识别 虹软免费SDK 原版高清下载,完整版 基于虹软最新的免费SDK写的C# 人脸识别的Demo,包含人脸检测,人脸对比,人脸检索功能.有关此Demo的详细信息可以阅读博客 ...
1 2 3 4 5 ... 20
收藏数 2,150
精华内容 860
关键字:

虹软