You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel控制器中集成faceapi人脸识别脚本(API场景)

如何将前端人脸识别对比逻辑集成到Laravel API控制器中?

我需要把这段基于faceapi的前端人脸识别对比脚本,改成Laravel控制器的公共方法。项目是无视图的API服务,只供React Native调用,请问怎么实现?

const imageUpload = document.getElementById('imageUpload')
Promise.all([
    faceapi.nets.faceRecognitionNet.loadFromUri('/models'),
    faceapi.nets.faceLandmark68Net.loadFromUri('/models'),
    faceapi.nets.ssdMobilenetv1.loadFromUri('/models'),
    faceapi.nets.tinyFaceDetector.loadFromUri('/models')
]).then(start)

async function start() {
  document.body.append('Loaded')
  imageUpload.addEventListener('change', async () => {
    image = await faceapi.bufferToImage(imageUpload.files[0])
    const descriptions = []
    const detections1 = await faceapi.detectAllFaces(image).withFaceLandmarks().withFaceDescriptors();
    const faceMatcher = new faceapi.FaceMatcher(detections1, 0.6)

    var a = 0;
    const images = [];
    for (var i = 100; i <= 618; i++) {
      let image = 0;
      let img = new Image();
      img.src = 'test/' + i + '.jpeg';
      image = i + '.jpeg';

      const results = await faceapi.detectAllFaces(img).withFaceLandmarks().withFaceDescriptors()
      results.forEach(fd => {
        const bestMatch = faceMatcher.findBestMatch(fd.descriptor)
        if (bestMatch.label == "person 1") {
          images[a] = image;
          a++;
        }
      })
    }
  })
}

实现步骤

1. 替换后端依赖

前端faceapi无法直接在Laravel(PHP后端)运行,需改用PHP人脸识别库,推荐使用face-recognition/face-recognition(基于dlib):

composer require face-recognition/face-recognition

注意:该库需要系统提前安装dlib、OpenCV等依赖,自行查阅对应库的系统环境配置说明。

2. 准备模型与图片目录

  • 将人脸识别预训练模型放入storage/app/models目录,确保目录可读写
  • 把待对比的图片(原脚本中test目录下的100-618.jpeg)放入storage/app/test目录

3. 添加API路由

在routes/api.php中配置POST路由:

Route::post('/face-match', 'App\Http\Controllers\FaceRecognitionController@matchFaces');

4. 编写控制器方法

创建FaceRecognitionController并实现核心对比逻辑:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use FaceRecognition\FaceRecognition;
use Illuminate\Support\Facades\Storage;

class FaceRecognitionController extends Controller
{
    public function matchFaces(Request $request)
    {
        // 验证上传图片
        $request->validate([
            'image' => 'required|image|mimes:jpeg,png,jpg|max:2048',
        ]);

        // 初始化人脸识别实例
        $fr = new FaceRecognition();
        $fr->setModelPath(storage_path('app/models'));

        // 处理上传图片并提取人脸特征
        $tempPath = $request->file('image')->store('temp');
        $uploadedFaceDesc = $fr->getFaceDescriptors(storage_path('app/' . $tempPath));

        if (empty($uploadedFaceDesc)) {
            Storage::delete($tempPath);
            return response()->json([
                'success' => false,
                'message' => '未检测到人脸'
            ], 400);
        }

        // 遍历本地图片进行对比
        $matchedImages = [];
        $testDir = storage_path('app/test');

        for ($i = 100; $i <= 618; $i++) {
            $imgPath = $testDir . "/{$i}.jpeg";
            if (!file_exists($imgPath)) continue;

            $faceDescs = $fr->getFaceDescriptors($imgPath);
            foreach ($faceDescs as $desc) {
                // 阈值0.6与原脚本保持一致
                $distance = $fr->compareFaceDescriptors($uploadedFaceDesc[0], $desc);
                if ($distance <= 0.6) {
                    $matchedImages[] = "{$i}.jpeg";
                    break;
                }
            }
        }

        // 清理临时文件
        Storage::delete($tempPath);

        // 返回结果
        return response()->json([
            'success' => true,
            'matched_images' => $matchedImages
        ]);
    }
}

5. 配置权限

确保存储目录有读写权限:

chmod -R 755 storage/app/

6. React Native调用示例

使用axios发起带图片的POST请求:

import axios from 'axios';
import { ImagePicker, Platform } from 'react-native';

async function matchFace() {
  const pickerResult = await ImagePicker.launchImageLibraryAsync({
    mediaTypes: ImagePicker.MediaTypeOptions.Images,
    quality: 0.8,
  });

  if (pickerResult.cancelled) return;

  const formData = new FormData();
  formData.append('image', {
    uri: Platform.OS === 'android' ? pickerResult.uri : pickerResult.uri.replace('file://', ''),
    type: 'image/jpeg',
    name: 'face_upload.jpg',
  });

  try {
    const res = await axios.post('https://你的API域名/api/face-match', formData, {
      headers: { 'Content-Type': 'multipart/form-data' },
    });
    console.log('匹配成功的图片:', res.data.matched_images);
  } catch (err) {
    console.error('请求失败:', err.response?.data || err.message);
  }
}

补充说明

  • 若本地库安装困难,可替换为第三方人脸识别API(如百度AI、腾讯AI),避免环境依赖问题
  • 批量对比图片时建议加入队列处理,防止请求超时
  • 务必给API接口添加身份验证(如Sanctum、Passport),避免未授权调用

内容的提问来源于stack exchange,提问作者Pedro Gonçalves

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:15:39