无法使用人脸识别库识别人脸-face-api.js

时间:2019-04-24 07:09:24

标签: face-api

我正在使用https://justadudewhohacks.github.io/face-api.js/bbt_face_recognition/中的face-api.js。

除了人脸检测外,我还必须使用人脸识别,但是,我无法使用下面的代码来识别任何人脸。有人可以帮助我吗?

Below is a running copy that allows user to: 
- Detect face & Mark Faces
- Draw Landmark 

Objective: 
- Able to detect and mark face
- Able to recognize face from a list of images

1 个答案:

答案 0 :(得分:0)

<!DOCTYPE html>
<html>
    <head>
        <script src="face-api.js"></script>
        <script src="js/commons.js"></script>
        <script src="js/drawing.js"></script>
        <script src="js/faceDetectionControls.js"></script>
          <script src="js/bbt.js"></script>
        <link rel="stylesheet" href="styles.css">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/css/materialize.css">
        <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/js/materialize.min.js"></script>
    </head>
    <body>
        <div id="navbar"></div>
        <div class="center-content page-container">

            <div class="progress" id="loader">
                <div class="indeterminate"></div>
            </div>
            <div style="position: relative" class="margin">
                <video onloadedmetadata="onPlay(this)" id="inputVideo" autoplay muted></video>
                <canvas id="overlay" />
            </div>

            <div class="row side-by-side">

                <!-- face_detector_selection_control -->
                <div id="face_detector_selection_control" class="row input-field" style="margin-right: 20px;">
                    <select id="selectFaceDetector">
                        <option value="ssd_mobilenetv1">SSD Mobilenet V1</option>
                        <option value="tiny_face_detector">Tiny Face Detector</option>
                        <option value="mtcnn">MTCNN</option>
                    </select>
                    <label>Select Face Detector</label>
                </div>
                <!-- face_detector_selection_control -->

                <!-- fps_meter -->
                <div id="fps_meter" class="row side-by-side">
                    <div>
                        <label for="time">Time:</label>
                        <input disabled value="-" id="time" type="text" class="bold">
                        <label for="fps">Estimated Fps:</label>
                        <input disabled value="-" id="fps" type="text" class="bold">
                    </div>
                </div>
                <!-- fps_meter -->

            </div>


            <!-- ssd_mobilenetv1_controls -->
            <span id="ssd_mobilenetv1_controls">
                <div class="row side-by-side">
                    <div class="row">
                        <label for="minConfidence">Min Confidence:</label>
                        <input disabled value="0.5" id="minConfidence" type="text" class="bold">
                    </div>
                    <button
                        class="waves-effect waves-light btn"
                        onclick="onDecreaseMinConfidence()"
                        >
                        <i class="material-icons left">-</i>
                    </button>
                    <button
                        class="waves-effect waves-light btn"
                        onclick="onIncreaseMinConfidence()"
                        >
                        <i class="material-icons left">+</i>
                    </button>
                </div>
            </span>
            <!-- ssd_mobilenetv1_controls -->

            <!-- tiny_face_detector_controls -->
            <span id="tiny_face_detector_controls">
                <div class="row side-by-side">
                    <div class="row input-field" style="margin-right: 20px;">
                        <select id="inputSize">
                            <option value="" disabled selected>Input Size:</option>
                            <option value="128">128 x 128</option>
                            <option value="160">160 x 160</option>
                            <option value="224">224 x 224</option>
                            <option value="320">320 x 320</option>
                            <option value="416">416 x 416</option>
                            <option value="512">512 x 512</option>
                            <option value="608">608 x 608</option>
                        </select>
                        <label>Input Size</label>
                    </div>
                    <div class="row">
                        <label for="scoreThreshold">Score Threshold:</label>
                        <input disabled value="0.5" id="scoreThreshold" type="text" class="bold">
                    </div>
                    <button
                        class="waves-effect waves-light btn"
                        onclick="onDecreaseScoreThreshold()"
                        >
                        <i class="material-icons left">-</i>
                    </button>
                    <button
                        class="waves-effect waves-light btn"
                        onclick="onIncreaseScoreThreshold()"
                        >
                        <i class="material-icons left">+</i>
                    </button>
                </div>
            </span>
            <!-- tiny_face_detector_controls -->

            <!-- mtcnn_controls -->
            <span id="mtcnn_controls">
                <div class="row side-by-side">
                    <div class="row">
                        <label for="minFaceSize">Minimum Face Size:</label>
                        <input disabled value="20" id="minFaceSize" type="text" class="bold">
                    </div>
                    <button
                        class="waves-effect waves-light btn"
                        onclick="onDecreaseMinFaceSize()"
                        >
                        <i class="material-icons left">-</i>
                    </button>
                    <button
                        class="waves-effect waves-light btn"
                        onclick="onIncreaseMinFaceSize()"
                        >
                        <i class="material-icons left">+</i>
                    </button>
                </div>
            </span>
            <!-- mtcnn_controls -->



            <script>
                let forwardTimes = []
                let faceMatcher = null

                function updateTimeStats(timeInMs) {
                    forwardTimes = [timeInMs].concat(forwardTimes).slice(0, 30)
                    const avgTimeInMs = forwardTimes.reduce((total, t) => total + t) / forwardTimes.length
                    $('#time').val(`${Math.round(avgTimeInMs)} ms`)
                    $('#fps').val(`${faceapi.round(1000 / avgTimeInMs)}`)
                }

                async function onPlay() {
                    const videoEl = $('#inputVideo').get(0)
                    if (videoEl.paused || videoEl.ended || !isFaceDetectionModelLoaded())
                        return setTimeout(() => onPlay())
                    const options = getFaceDetectorOptions()
                    const ts = Date.now()
                    const result = await faceapi.detectSingleFace(videoEl, options).withFaceLandmarks()
                    updateTimeStats(Date.now() - ts)
                    if (result) {
                        //drawDetections(videoEl, $('#overlay').get(0), [result])
                        drawLandmarks(videoEl, $('#overlay').get(0), [result], true)
                    }
                    setTimeout(() => onPlay())
                }

                async function run() {
                    // load face detection model

                    await changeFaceDetector(TINY_FACE_DETECTOR)
                    await faceapi.loadFaceRecognitionModel('/')
                    await faceapi.loadFaceLandmarkModel('/')
                    changeInputSize(224)
                    // try to access users webcam and stream the images
                    // to the video element
                    faceMatcher = await createBbtFaceMatcher(1)

                    const stream = await navigator.mediaDevices.getUserMedia({video: {}})
                    const videoEl = $('#inputVideo').get(0)
                    videoEl.srcObject = stream

                    updateResults();
                }

                async function updateResults() {
                    if(!isFaceDetectionModelLoaded())
                    {
                        return
                    }

                    const videoEl = $('#inputVideo').get(0)

                     //receive full description of faces from input image
                    const options = getFaceDetectorOptions()
                    const results = await faceapi 
                            .detectAllFaces(videoEl, options)
                            .withFaceLandmarks()
                            .withFaceDescriptors()

                    drawFaceRecognitionResults(results)


                }

                function drawFaceRecognitionResults(results)
                {
                    const canvas = $('#inputVideo').get(0)
                      resizedResults = resizeCanvasAndResults($('#inputVideo').get(0), canvas, results)

                      const boxesWithText = resizedResults.map(({ detection, descriptor }) =>
                        new faceapi.BoxWithText(
                          detection.box,
                          faceMatcher.findBestMatch(descriptor).toString()//for string name
                        )
                      )

                    //draw bounding box
                    faceapi.drawDetection(canvas, boxesWithText)
                }

                $(document).ready(function () {
                    renderNavBar('#navbar', 'webcam_face_detection')
                    initFaceDetectionControls()
                    run()
                })
            </script>
    </body>
</html>