如何在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
相关产品推荐
相关产品推荐

