# seeta-face6-java-sdk **Repository Path**: lufangliang/seeta-face6-java-sdk ## Basic Information - **Project Name**: seeta-face6-java-sdk - **Description**: 适用于Java语言的SeetaFace6SDK,支持windows x64和linux x64 - **Primary Language**: Java - **License**: BSD-3-Clause - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 8 - **Forks**: 2 - **Created**: 2024-04-21 - **Last Updated**: 2025-05-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: seetaface6, Java, Windows, Linux, amd64 ## README # SDK使用说明文档 > 软件作者:卢方亮 > > QQ/微信:327654444/lufangliang > > 电子邮箱:lufangliang1992@vip.qq.com > > 2024年4月27日 请您使用前仔细阅读此说明文档。 ## 前言 随着科技的进步,人脸识别技术在我们的日常生活中变得越来越重要,其应用场景也日益广泛。然而,尽管Java作为广泛使用的编程语言,在人脸识别领域的支持却并不尽如人意。现有的Java SDK在设计、应用和生命周期管理等方面都存在不足之处,难以满足日益增长的需求。 有鉴于此,我决定着手开发一款全新的Java SDK,以支持中科院的山世光老师开源的基于深度学习的[SeetaFace6Open](https://github.com/SeetaFace6Open)人脸识别引擎在Java语言中进行应用。我的目标是提供一个功能全面、设计优雅且易于管理的解决方案,以填补当前市场的空白,并助力开发者在Java环境中更加便捷地实现人脸识别功能。 此SDK默认使用Nvdia架构GPU的图形加速功能进行模型计算(如果你的设备支持),否则使用CPU作为模型计算设备。适用于64位的Windows或Linux操作系统,如需在其他环境使用,请联系作者提供支持。 ## 环境准备 * SDK编译环境为JDK11,低于此版本的JAVA运行时环境可能不受支持,使用前请确保升级你的JDK版本至[JDK11](https://www.oracle.com/cn/java/technologies/javase/jdk11-archive-downloads.html)(或更高)。 * 如果需要使用GPU图形加速,请下载[Nvdia CUDA Toolkit](https://developer.nvidia.com/cuda-downloads)和[Nvdia CUDNN](https://developer.nvidia.com/cudnn-downloads)。 ## 使用步骤 * 调用静态方法`SeetaFace6Application.initialize()`初始化应用,将自动检测使用CPU或GPU(优先)。 * 调用静态方法`SeetaFace6Application.xxxBuilder().build()`构建需要使用的模块对象,后续版本将提供对象池,以便在多线程场景下使用。 * JVM关闭时程序将自动清理相关模块占用的内存。 ## 典型示例 下面是结合opencv库,打开计算机上的默认摄像头并进行人脸检测的方法。这个方法将以红色显示摄像头捕捉到的每一帧画面中人脸置信程度最高的人脸(主要人脸)的姿态(yaw偏航角、pitch俯仰角、roll旋转角)、预测的性别和年龄信息,将以绿色显示捕捉到的其他人脸信息,并给出该人脸与主要人脸的相似度信息。 ```java import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.highgui.HighGui; import org.opencv.imgproc.Imgproc; import org.opencv.videoio.VideoCapture; import seetaface6.*; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; import java.text.DecimalFormat; public class SeetaFace6SDKDemo { static final String WINDOW_NAME = "人脸识别示例程序(连按ESC键退出)"; static final int fontHersheySimplex = Imgproc.FONT_HERSHEY_SIMPLEX; static final double fontScale = 0.5; static final int thickness = 1; static final Point faceScorePosition = new Point(5, 15); static final Point posePosition = new Point(5, 45); static final Point genderPosition = new Point(5, 75); static final Point agePosition = new Point(100, 75); static final Point similarityPosition = new Point(); static final Scalar green = new Scalar(0, 255, 0);//B,G,R static final Scalar red = new Scalar(0, 0, 255);//B,G,R static final DecimalFormat percentageFormat = new DecimalFormat("0.00%"); public static void main(String[] args) { System.load("D:/ThirdPartyLibraries/opencv/build/java/x64/opencv_java490.dll"); SeetaFace6Application.initialize(); VideoCapture camera = new VideoCapture(0); if (!camera.isOpened()) { System.err.println("Camera not opened."); return; } HighGui.namedWindow(WINDOW_NAME); Mat frame = new Mat(); FaceDetector faceDetector = SeetaFace6Application.faceDetectorBuilder().threshold(0.7).build(); FaceLandmarker faceLandmarker = SeetaFace6Application.faceLandmarkerBuilder().build(); FaceRecognizer faceRecognizer = SeetaFace6Application.faceRecognizerBuilder().build(); PoseAssessor poseAssessor = SeetaFace6Application.poseAssessorBuilder().build(); GenderPredictor genderPredictor = SeetaFace6Application.genderPredictorBuilder().build(); AgePredictor agePredictor = SeetaFace6Application.agePredictorBuilder().build(); Point rectTopLeft = new Point(); Point rectBottomRight = new Point(); while (true) { camera.read(frame); if (frame.empty()) { break; } BufferedImage bufferedImage = matToBufferedImage(frame); SeetaImageData seetaImageData = SeetaImageData.fromBufferedImage(bufferedImage); SeetaFaceInfo[] seetaFaceInfos = faceDetector.detect(seetaImageData); float[][] faceFeatureArrayMatrix = new float[seetaFaceInfos.length][]; for (int i = 0; i < seetaFaceInfos.length; i++) { SeetaFaceInfo faceInfo = seetaFaceInfos[i]; SeetaRect seetaRect = faceInfo.getPos(); SeetaPointF[] faceLandmarks = faceLandmarker.getFaceLandmarks(seetaImageData, seetaRect); int x = seetaRect.getX(); int y = seetaRect.getY(); int width = seetaRect.getWidth(); int height = seetaRect.getHeight(); rectTopLeft.set(new double[]{x, y}); rectBottomRight.set(new double[]{x + width, y + height}); faceFeatureArrayMatrix[i] = faceRecognizer.extractFaceFeatureArray(seetaImageData, faceLandmarks); if (i == 0) { Imgproc.putText(frame, "FaceConfidence: " + percentageFormat.format(faceInfo.getScore()), faceScorePosition, fontHersheySimplex, fontScale, red, thickness); Pose pose = poseAssessor.getPos(seetaImageData, seetaRect, faceLandmarks); Imgproc.putText(frame, pose.toString(), posePosition, fontHersheySimplex, fontScale, red, thickness); Gender gender = genderPredictor.predictGender(seetaImageData, faceLandmarks); Imgproc.putText(frame, gender.name(), genderPosition, fontHersheySimplex, fontScale, red, thickness); int age = agePredictor.predictAge(seetaImageData, faceLandmarks); Imgproc.putText(frame, age + " years old", agePosition, fontHersheySimplex, fontScale, red, thickness); Imgproc.rectangle(frame, rectTopLeft, rectBottomRight, red, thickness); } else { Imgproc.rectangle(frame, rectTopLeft, rectBottomRight, green, thickness); String similarity = percentageFormat.format(faceRecognizer.calculateSimilarity(faceFeatureArrayMatrix[0], faceFeatureArrayMatrix[i])); similarityPosition.set(new double[]{ Integer.valueOf(x + width / 2).doubleValue() - similarity.length() * 2.5, Integer.valueOf(y - 5).doubleValue() }); Imgproc.putText(frame, similarity, similarityPosition, fontHersheySimplex, fontScale, green, thickness); } } HighGui.imshow(WINDOW_NAME, frame); if ((char) HighGui.waitKey(30) == 27) { break; } } camera.release(); HighGui.destroyWindow(WINDOW_NAME); System.exit(0); } private static BufferedImage matToBufferedImage(Mat mat) { int type = mat.channels() > 1 ? BufferedImage.TYPE_3BYTE_BGR : BufferedImage.TYPE_BYTE_GRAY; BufferedImage image = new BufferedImage(mat.cols(), mat.rows(), type); byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); mat.get(0, 0, data); return image; } private static Mat bufferedImageToMat(BufferedImage bufferedImage) { Mat mat = new Mat(bufferedImage.getHeight(), bufferedImage.getWidth(), CvType.CV_8UC4); byte[] data = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData(); mat.put(0, 0, data); return mat; } } ``` ## 项目结构 ```shell JNI头文件目录 jni-headers/ | --AgePredictorJNI.h | --BrightnessAssessorJNI.h | --ClarityAssessorJNI.h | --EyeStateDetectorJNI.h | --FaceAntiSpoofingJNI.h | --FaceDetectorJNI.h | --FaceLandmarkerJNI.h | --FaceRecognizerJNI.h | --FaceTrackerJNI.h | --GenderPredictorJNI.h | --IntegrityAssessorJNI.h | --MaskDetectorJNI.h | --PoseAssessorJNI.h | --ResolutionAssessorJNI.h SDK核心模块 seetaface6-core/ | --pom.xml | --src/ --main/ | --java/ | --seetaface6/ 年龄预测器相关类 --AgePredictor.java --AgePredictorBuilder.java --AgePredictorProperty.java 评估结果类 --AssessmentResult.java 亮度评估器相关类 --BrightnessAssessor.java --BrightnessAssessorBuilder.java 清晰度评估器相关类 --ClarityAssessor.java --ClarityAssessorBuilder.java --ClarityAssessorProperty.java 眼睛状态枚举 --EyeState.java 眼睛状态检测器相关类 --EyeStateDetector.java --EyeStateDetectorBuilder.java --EyeStateDetectorProperty.java 静默活体评估器相关类 --FaceAntiSpoofing.java --FaceAntiSpoofingBuilder.java --FaceAntiSpoofingProperty.java 人脸检测器相关类 --FaceDetector.java --FaceDetectorBuilder.java --FaceDetectorProperty.java 人脸特特征点提取器相关类 --FaceLandmarker.java --FaceLandmarkerBuilder.java 人脸活体状态枚举 --FaceLivenessStatus.java 人脸识别场景枚举 --FaceRecognitionScenario.java 人脸识别器相关类 --FaceRecognizer.java --FaceRecognizerBuilder.java --FaceRecognizerProperty.java 人脸跟踪器相关类 --FaceTracker.java --FaceTrackerBuilder.java 性别枚举 --Gender.java 性别预测器相关类 --GenderPredictor.java --GenderPredictorBuilder.java --GenderPredictorProperty.java 人脸尺寸评估器相关类 --IntegrityAssessor.java --IntegrityAssessorBuilder.java 质量等级枚举 --Level.java 口罩检测器相关类 --MaskDetector.java --MaskDetectorBuilder.java Seetaface6模块抽象类 --NativeSeetaFace6Module.java 遮挡状态枚举类 --OccludedState.java 脸部姿态评估器相关类 --Pose.java --PoseAssessor.java --PoseAssessorBuilder.java --PoseAssessorProperty.java 人脸尺寸评估器相关类 --ResolutionAssessor.java --ResolutionAssessorBuilder.java SDK核心应用程序类 --SeetaFace6Application.java Seetaface6模块接口 --SeetaFace6Module.java Seetaface6模块构建器接口 --SeetaFace6ModuleBuilder.java Seetaface6异常类 --SeetaFaceException.java 人脸信息类 --SeetaFaceInfo.java 人脸口罩信息类 --SeetaFaceMaskInfo.java 图像数据类 --SeetaImageData.java Seetaface6模块设置类 --SeetaModelSetting.java 二位坐标类 --SeetaPointF.java 矩形类 --SeetaRect.java 跟踪人脸信息类 --SeetaTrackingFaceInfo.java SDK模块 seetaface6-java-sdk/ | --pom.xml | --src/ --main/ | --java/ | --seetaface6/ | --resources/ --META-INF/ --services/ --seetaface6.SeetaFace6LibraryLoader --seetaface6.SeetaFace6ModelLoader 库加载器接口模块 seetaface6-library-loader-api/ | --pom.xml | --src/ --main/ | --java/ | --seetaface6/ --SeetaDevice.java --SeetaFace6LibraryLoader.java --SeetaFace6LibraryLoadException.java Linux amd64运行时模块 seetaface6-linux-amd64-runtime/ | --pom.xml | --src/ --main/ | --java/ | --seetaface6/ --LinuxAmd64SeetaFace6LibraryLoader.java --LinuxAmd64SeetaFace6ModelLoader.java | --resources/ --seetaface6/ --library/ --linux/ --amd64/ --jni/ | --libAgePredictorJNI.so | --libBrightnessAssessorJNI.so | --libClarityAssessorJNI.so | --libEyeStateDetectorJNI.so | --libFaceAntiSpoofingJNI.so | --libFaceDetectorJNI.so | --libFaceLandmarkerJNI.so | --libFaceRecognizerJNI.so | --libFaceTrackerJNI.so | --libGenderPredictorJNI.so | --libPoseAssessorJNI.so | --libResolutionAssessorJNI.so --module/ | --libSeetaAgePredictor600.so | --libSeetaEyeStateDetector200.so | --libSeetaFaceAntiSpoofingX600.so | --libSeetaFaceDetector600.so | --libSeetaFaceLandmarker600.so | --libSeetaFaceRecognizer610.so | --libSeetaFaceTracking600.so | --libSeetaGenderPredictor600.so | --libSeetaPoseEstimation600.so | --libSeetaQualityAssessor300.so --seeta-authorize/ | --libSeetaAuthorize.so --tennis/ --cpu/ | --libtennis.so | --libtennis_haswell.so | --libtennis_pentium.so | --libtennis_sandy_bridge.so --gpu/ --libtennis.so 顶层加载器接口模块 seetaface6-loader-api/ | --pom.xml | --src/ --main/ | --java/ | --seetaface6/ --OperationSystem.java --SeetaFace6Loader.java --SeetaFace6LoaderUtils.java --SystemArch.java | --resources/ 模型文件加载器接口模块 seetaface6-model-loader-api/ | --pom.xml | --src/ --main/ | --java/ | --seetaface6/ --SeetaFace6ModelLoader.java --SeetaFace6ModelLoadException.java | --resources/ --seetaface6/ --model/ --age_predictor.csta --eye_state.csta --face_detector.csta --face_landmarker_mask_pts5.csta --face_landmarker_pts5.csta --face_landmarker_pts68.csta --face_recognizer.csta --face_recognizer_light.csta --face_recognizer_mask.csta --fas_first.csta --fas_second.csta --gender_predictor.csta --mask_detector.csta --pose_estimation.csta --quality_lbn.csta Windows amd64运行时模块 seetaface6-windows-amd64-runtime/ --pom.xml --src/ --main/ | --java/ | --seetaface6/ --WindowsAmd64SeetaFace6LibraryLoader.java --WindowsAmd64SeetaFace6ModelLoader.java | --resources/ --seetaface6/ --library/ --windows/ --amd64/ --jni/ | --AgePredictorJNI.dll | --BrightnessAssessorJNI.dll | --ClarityAssessorJNI.dll | --EyeStateDetectorJNI.dll | --FaceAntiSpoofingJNI.dll | --FaceDetectorJNI.dll | --FaceLandmarkerJNI.dll | --FaceRecognizerJNI.dll | --FaceTrackerJNI.dll | --GenderPredictorJNI.dll | --IntegrityAssessorJNI.dll | --MaskDetectorJNI.dll | --PoseAssessorJNI.dll | --ResolutionAssessorJNI.dll --module/ | --SeetaAgePredictor600.dll | --SeetaEyeStateDetector200.dll | --SeetaFaceAntiSpoofingX600.dll | --SeetaFaceDetector600.dll | --SeetaFaceLandmarker600.dll | --SeetaFaceRecognizer610.dll | --SeetaFaceTracking600.dll | --SeetaGenderPredictor600.dll | --SeetaMaskDetector200.dll | --SeetaPoseEstimation600.dll | --SeetaQualityAssessor300.dll --seeta-authorize/ | --SeetaAuthorize.dll --tennis/ --cpu/ | --tennis.dll | --tennis_haswell.dll | --tennis_pentium.dll | --tennis_sandy_bridge.dll --gpu/ --tennis.dll //生成JNI头的脚本 generate-jni-headers.bat pom.xml ```