Flex
3 天以前 b8034ea8d5eac3eb346ec18f905b4a79cd9fdc13
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
// 引入face.js
import * as faceapi from 'face-api.js';
import { reject } from 'lodash-es';
import { resolve } from 'path';
// 创建初始化标记,防止重复初始化
let isModelsLoaded = false;
// 类型定义
type DetectionResult = {
    hasFace: boolean;
    error?: string;
};
 
/**
 * 人脸检测方法封装
 * @param imageUrls 要检测的图片路径数组
 * @param options 人脸检测配置项
 * @returns Promise<boolean> 检测到任意人脸立即返回true,全部无脸返回false
 */
export const useFaceDetection = () => {
    // 加载本地模型
    const loadModels = async () => {
        if (!isModelsLoaded) {
            await faceapi.loadSsdMobilenetv1Model("/models/ssd_mobilenetv1")
            await faceapi.loadFaceLandmarkModel('/models/face_landmark_68')
            await faceapi.loadFaceLandmarkTinyModel('/models/face_landmark_68_tiny')
            isModelsLoaded = true
        }
    }
 
    // 整体检测方法
    const detectFacesInImages = async (
        imageUrls: string[]
    ): Promise<boolean> => {
        try {
            await loadModels();
            for (const url of imageUrls) {
                try {
                    const result = await processSingleImage(url)
                    if (result.hasFace) return true; //有人脸 
                } catch (error) {
                    console.log(`图片检测失败:${url}`, error)
                    continue;
                }
            }
            return false;
        } catch (error) {
            console.log('人脸初始化失败', error)
            return false;
        }
    }
 
 
    // 单个图片处理
    const processSingleImage = (url: string): Promise<DetectionResult> => {
        return new Promise((resolve, reject) => {
            const img = new Image();
            img.src = url
            img.crossOrigin = "anonymous"; // 修正拼写错误
            img.onload = async () => {
                console.log("load")
                try {
                    const FaceImg = faceapi.detectAllFaces(img).withFaceLandmarks();
                    resolve({ hasFace: (await FaceImg).length > 0 });
                } catch (error) {
                    reject(error);
                }
            };
            img.onerror = (error) => {
                console.log(`图片加载失败:${url}`);
                console.log(error);
                resolve({
                    hasFace: false,
                    error: `图片加载失败:${url}`,
                });
            };
        });
    };
 
    return { detectFacesInImages }
 
}