第一部分:获取服务器端源码


要开始搭建人脸识别系统,首先需要从虹软视觉开放平台获取服务器端Server源码。访问虹软官网并登录后,在产品服务页面找到"ArcFace Linux Pro"产品。点击进入产品详情页,在资源下载区域可以找到"人脸识别服务端DEMO"的下载链接。这个ZIP压缩包包含了基于Java的示例代码,是后续开发的基础。

需要注意的是,源码下载可能需要先完成实名认证,这个过程通常需要1个工作日。

第二部分:获取SDK包试用授权


在同一产品页面下方,可以找到ArcFace LinuxPro的下载链接。根据服务器的操作系统和CPU架构(如x86_64或ARM)选择对应的版本。SDK包内包含动态链接库文件(.so或.dll)和必要的头文件。

下载SDK后,还需要申请试用授权。在虹软控制台的"我的应用"页面,创建新的测试应用,系统会自动生成APP ID和SDK Key,搭配申请到的激活码,可以激活SDK的。这三个信息需要妥善保管。试用版通常有90天的有效期,适合开发和测试使用。

将下载的SDK包解压到指定目录,如/home/arcsoft_demo/arcsoft_sdk。其中lib目录下的动态库文件需要复制到系统库路径,或者设置LD_LIBRARY_PATH环境变量指向这些库文件。

虹软视觉开放平台


第三部分:阅读Server源码项目文档


解压后的源码包中包含README.md文件,这是项目的使用指南。文档详细说明了开发遇所需的软件工具。特别要注意的是文档中关于配置文件的说明,其中application.properties文件需要填写从虹软平台获取的APPID、SDKKey和activekey。
文档还解释了项目的两种激活方式:在线激活和离线激活。在线激活需要网络连接,而离线激活则依赖事先生成的激活文件。对于大多数开发场景,推荐使用在线激活方式。此外,文档还说明了人脸注册图片的存储路径设置和初始化时的清空选项等重要配置项。

第四部分:部署与初步体验


完成上述准备后,可以开始部署服务。首先修改application.properties文件,填写正确的激活配置信息以及图片存储路径。如果是Linux系统,还需要修改pom.xml中的平台配置为linux-x86_64。

使用Maven编译项目后,通过java -jar命令启动服务。默认情况下,服务会监听8089端口。启动成功后,可以通过访问http://服务器IP:8089来体验基础功能。系统初始化时会自动加载指定路径下的人脸图片,图片文件名将作为用户标识。

Linux Pro Server提供全面的人脸识别解决方案示例,支持实时人脸检测、属性分析、1:1图片比对并返回相似度、动态识别的video模式。

第五部分:核心代码分析与应用扩展

1、人脸识别功能的核心实现--FaceEngineService

它封装了人脸检测、特征提取和比对等基础操作。该类采用了对象池模式管理FaceEngine实例,有效提高了资源利用率。开发者可以基于这个服务类,实现更复杂的人脸识别场景,比如在视频流中实时追踪特定人员。

// 1. 人脸检测

List<FaceInfo> detectFaces(ImageInfo imageInfo)

// 2. 注册人脸特征到引擎

registerFaceFeature2Engine(int searchId, String tag, byte[] faceFeature)

// 3. 1:1人脸比对

Float compareFace(ImageInfo imageInfo1, ImageInfo imageInfo2)

// 4. 人脸特征提取

byte[] extractFaceFeature(ImageInfo imageInfo, FaceInfo faceInfo, ExtractType extractType)

// 5. 属性分析(年龄/性别/活体)

List<LivenessInfo> getLiveness(ImageInfo imageInfo, List<FaceInfo> faceInfos)

//6. 人脸识别

UserCompareInfo faceRecognition(byte[] faceFeature, float passRate)

// 7. 多线程批量比对

ExecutorCompletionService<List<UserCompareInfo>> completionService = 
    new ExecutorCompletionService<>(executor);
completionService.submit(new CompareFaceTask(userList, targetFeature, threshold));

2、用户数据的管理模块--FaceService

包括人脸特征的注册、更新和查询。它实现了系统启动时自动加载人脸库的功能,并保持内存特征库与数据库的同步。在实际应用中,可以扩展这部分代码,实现更灵活的用户管理策略,例如按组织架构分组管理用户。


//1、用户注册(带人脸特征)

public void addUser(String name, byte[] faceFeature) {
        UserInfo userInfo = userInfoMapper.selectOne(Wrappers.<UserInfo>lambdaQuery().eq(UserInfo::getName, name));
        if (userInfo == null) {
            UserInfo userInfoInsert = new UserInfo();
            userInfoInsert.setName(name);
            userInfoInsert.setFaceFeature(faceFeature);
            userInfoMapper.insert(userInfoInsert);
            faceEngineService.registerFaceFeature2Engine(userInfoInsert.getId(), name, faceFeature);

        } else {
            UserInfo userInfoUpdate = new UserInfo();
            userInfoUpdate.setId(userInfo.getId());
            userInfoUpdate.setName(name);
            userInfoUpdate.setFaceFeature(faceFeature);
            userInfoMapper.updateById(userInfoUpdate);
            faceEngineService.removeFaceFeature2Engine(userInfo.getId());
            faceEngineService.registerFaceFeature2Engine(userInfo.getId(), name, faceFeature);
        }
}

// 2. 从图片注册用户

private void register(String userName, File file, InputStream image) {
    ImageInfo rgbData = (file != null) ? ImageFactory.getRGBData(file) : ImageFactory.getRGBData(image);
    List<FaceInfo> faces = faceEngineService.detectFaces(rgbData);
    if (!faces.isEmpty()) {
        byte[] feature = faceEngineService.extractFaceFeature(rgbData, faces.get(0), ExtractType.REGISTER);
        addUser(userName, feature);  // 存储到DB并注册到引擎
    }
}

// 3. 初始化系统预设人脸

public void initSystemFace() {
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        try {
            org.springframework.core.io.Resource[] resources = resolver.getResources("classpath*:static/images/*"); // 递归获取 static 目录下的所有文件
            for (org.springframework.core.io.Resource resource : resources) {
                InputStream inputStream = resource.getInputStream();
                register(resource.getFilename(), null, inputStream);
            }
        } catch (IOException e) {
            log.error("", e);
        }


}

// 4. 启动时加载本地人脸库

@PostConstruct
    public void loadImage2Engine() {
        if ("true".equals(faceImageClear)) {
            userInfoMapper.delete(null);
        }

        initSystemFace();

        File file = new File(testImagePath);
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            log.info("开始加载本地人脸图片到引擎中");
            for (File imageFile : files) {
                String name = imageFile.getName();
                if (name.endsWith(".jpg") || name.endsWith(".png")) {
                    String userName = name.substring(0, name.lastIndexOf("."));
                    register(userName, imageFile, null);
                }
            }
            log.info("加载本地人脸图片到引擎中完成");
        }
}

3、处理视频流数据模块--VideoPlayerService

它使用FFmpeg进行视频帧的抓取和编码,并在每帧画面中集成人脸识别结果。对于需要实时视频分析的场景,可以参考这个实现,开发定制化的视频监控解决方案。

// 1. 视频流处理初始化

FrameGrabber grabber = ...; // 视频源配置
grabber.setOption("buffer_size", "1020000");  // 缓冲区设置
grabber.setOption("rw_timeout", "15000000");  // 超时设置
grabber.start();

// 2. 视频转码配置

FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputStream, width, height, 0);
recorder.setFormat("flv");  // 输出格式
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);  // 视频编码
recorder.setFrameRate(grabber.getFrameRate());  // 帧率同步
recorder.setVideoBitrate(grabber.getVideoBitrate());  // 码率设置
recorder.start();

// 3. 实时视频处理循环

FacePreview faceEngine = new FacePreview();  // 人脸处理引擎
while (true) {
    Frame frame = grabber.grab();  // 抓取视频帧
    if (frame == null) break;

// 4. 人脸识别处理

    IplImage image = converter.convert(frame);
    if (image != null) {
        faceEngine.preview(image);  // 执行人脸检测/识别
        frame = converter.convert(image);  // 回写处理结果
    }

// 5. 流媒体输出

    recorder.record(frame);  // 编码输出帧
    servletOutputStream.write(outputStream.toByteArray());  // 推送至客户端
}

基于这些核心模块,开发者可以根据实际需求进行特色功能开发。例如,在智能考勤系统中增加活体检测功能,防止照片欺骗;在VIP识别场景中实现优先比对逻辑;或者在安防监控系统中集成实时告警机制。系统良好的架构设计使得这些扩展开发变得可行且高效。

通过以上五个步骤,开发者可以完成从零开始搭建一个功能完善的服务器端人脸识别系统,并根据实际需求进行定制化开发。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐