基于中科视拓的seetaface6封装的免费人脸识别项目后端接口
shentao
2025-09-22 6474cdddb5933d64efdf0207614be2596a7a3600
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package com.code2roc.fastface.util;
 
import com.code2roc.fastface.eums.FaceEnum;
import com.seeta.proxy.FaceDetectorProxy;
import com.seeta.proxy.FaceLandmarkerProxy;
import com.seeta.proxy.FaceRecognizerProxy;
import com.seeta.sdk.*;
import com.seeta.sdk.util.LoadNativeCore;
import com.seeta.sdk.util.SeetafaceUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
 
import javax.annotation.PostConstruct;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
 
@Component
public class SeetaFaceHepler {
    @Autowired
    private FaceDetectorProxy faceDetectorProxy;
    @Autowired
    private FaceRecognizerProxy faceRecognizerProxy;
    @Autowired
    private FaceLandmarkerProxy faceLandmarkerProxy;
    @Value("${face.modelPath}")
    private String modelPath;
    @Value("${face.dataBasePath}")
    private String dataBasePath;
    private FaceDatabase faceDatabase;
    private float CHECK_SIM = new Float(0.62);
 
    @PostConstruct
    public void init() throws Exception {
        Path tempDir = Paths.get(System.getProperty("user.dir"), modelPath);
        LoadNativeCore.LOAD_NATIVE(SeetaDevice.SEETA_DEVICE_CPU);
        faceDatabase = new FaceDatabase(new SeetaModelSetting(0, new String[]{tempDir + File.separator + "face_recognizer_light.csta"}, SeetaDevice.SEETA_DEVICE_CPU));
        File file = new File(Paths.get(System.getProperty("user.dir"), dataBasePath).toString());
        if (!file.exists()) {
            file.createNewFile();
        }
        faceDatabase.Load(Paths.get(System.getProperty("user.dir"), dataBasePath).toString());
    }
 
    public FaceEnum.CheckImageFaceStatus getFace(BufferedImage image) throws Exception {
        SeetaImageData imageData = SeetafaceUtil.toSeetaImageData(image);
        SeetaRect[] detects = faceDetectorProxy.detect(imageData);
        if (detects.length == 0) {
            return FaceEnum.CheckImageFaceStatus.NoFace;
        } else if (detects.length == 1) {
            return FaceEnum.CheckImageFaceStatus.OneFace;
        } else {
            return FaceEnum.CheckImageFaceStatus.MoreFace;
        }
    }
 
    public FaceEnum.CompareImageFaceStatus compareFace(BufferedImage source, BufferedImage compare) throws Exception {
        float[] sourceFeature = extract(source);
        float[] compareFeature = extract(compare);
        if (sourceFeature != null && compareFeature != null) {
            float calculateSimilarity = faceRecognizerProxy.calculateSimilarity(sourceFeature, compareFeature);
            System.out.printf("相似度:%f\n", calculateSimilarity);
            if (calculateSimilarity >= CHECK_SIM) {
                return FaceEnum.CompareImageFaceStatus.Same;
            } else {
                return FaceEnum.CompareImageFaceStatus.Different;
            }
        } else {
            return FaceEnum.CompareImageFaceStatus.LostFace;
        }
    }
 
    public long registFace(BufferedImage image) throws Exception {
        long result = -1;
        SeetaImageData imageData = SeetafaceUtil.toSeetaImageData(image);
        SeetaRect[] detects = faceDetectorProxy.detect(imageData);
        if (detects.length > 0) {
            SeetaPointF[] pointFS = faceLandmarkerProxy.mark(imageData, detects[0]);
            result = faceDatabase.Register(imageData, pointFS);
            faceDatabase.Save(Paths.get(System.getProperty("user.dir"), dataBasePath).toString());
        }
        return result;
 
 
    }
 
    public long queryFace(BufferedImage image) throws Exception {
        long result = -1;
        SeetaImageData imageData = SeetafaceUtil.toSeetaImageData(image);
        SeetaRect[] detects = faceDetectorProxy.detect(imageData);
        if (detects.length > 0) {
            SeetaPointF[] pointFS = faceLandmarkerProxy.mark(imageData, detects[0]);
            long[] index = new long[1];
            float[] sim = new float[1];
            result = faceDatabase.QueryTop(imageData, pointFS, 1, index, sim);
            if (result > 0) {
                float similarity = sim[0];
                if (similarity >= CHECK_SIM) {
                    result = index[0];
                } else {
                    result = -1;
                }
            }
        }
        return result;
    }
 
    public long deleteFace(long index) throws Exception {
        long result = faceDatabase.Delete(index);
        faceDatabase.Save(Paths.get(System.getProperty("user.dir"), dataBasePath).toString());
        return result;
    }
 
    private float[] extract(BufferedImage image) throws Exception {
        SeetaImageData imageData = SeetafaceUtil.toSeetaImageData(image);
        SeetaRect[] detects = faceDetectorProxy.detect(imageData);
        if (detects.length > 0) {
            SeetaPointF[] pointFS = faceLandmarkerProxy.mark(imageData, detects[0]);
            float[] features = faceRecognizerProxy.extract(imageData, pointFS);
            return features;
        }
        return null;
    }
 
    public void resetFaceDataBase() {
        faceDatabase.Clear();
    }
}