aoding9/compreface-laravel-sdk

本sdk是基于compreface-javascript-sdk开发的laravel版本,仅做封装,将js改为laravel的写法,文档后半部分demo代码仍为js语法,参考前面即可

1.0 2024-04-30 02:32 UTC

This package is auto-updated.

Last update: 2024-09-30 03:16:30 UTC


README

CompreFace Laravel SDK使得将人脸识别集成到您的应用中更加简单。

注意:本sdk是基于compreface-javascript-sdk开发的laravel版本,仅做封装,将js改为laravel的写法,文档后半部分demo代码仍为js语法,参考前面即可

目录

要求

在使用我们的SDK之前,请确保您已在机器上安装了CompreFace和Nodejs。

  1. CompreFace(见以下兼容性矩阵)
  2. Nodejs(版本10+)

CompreFace 兼容性矩阵

说明

  • ✔ SDK支持CompreFace的所有功能。
  • 🟡 SDK与这个CompreFace版本兼容。如果CompreFace版本更新 - SDK将不支持CompreFace的新功能。如果CompreFace版本较旧 - 新SDK功能将失败。
  • ✘ 存在重大向后兼容性问题。不推荐使用这些版本一起使用

安装

要将CompreFace Laravel SDK添加到您的项目中,请在项目文件夹中运行以下命令

composer require aoding9/compreface-laravel-sdk

使用

初始化

要开始使用Laravel SDK,您需要发布SDK配置文件

php artisan vendor:publish --provider="Aoding9\CompreFace\CompreFaceServiceProvider"

然后您需要在config/compreFace.php或.env文件中设置urlport。默认情况下,如果您在本地机器上运行CompreFace,则分别为https://`8000。您可以在创建CompreFace时传递可选的options对象来设置默认参数,更多信息请参阅参考

# .env
COMPRE_FACE_SEVER=https://
COMPRE_FACE_PORT=8000

初始化CompreFace对象后,您需要使用人脸服务的api key初始化服务对象。您可以使用此服务对象来识别人脸。

但是,在识别之前,您需要首先将人脸添加到人脸集合中。为此,从服务对象获取人脸集合对象。

use Aoding9\CompreFace\CompreFace;

$compreFace = app(CompreFace::class);
$recognitionService = $compreFace->initFaceRecognitionService($api_key); // initialize service

$faceCollection = $recognitionService->getFaceCollection(); // use face collection to fill it with known faces
$list = $faceCollection->list();

$subjects = $recognitionService->getSubjects(); // use subjects object to work with subjects directely

$path_to_image = public_path("uploads/images/wujing2.jpg");

$options = [
    'limit'              => 0,
    //'det_prob_threshold' => 0.8,
    //'prediction_count'   => 1,
    //'face_plugins'       => "calculator,age,gender,landmarks",
    //'status'             => "true",
];

$recognize = $recognitionService->recognize($path_to_image, $options);
dd($recognize['result'][0]['subjects'][0]['subject'] ?? $recognize); // 0.98546;

将人脸添加到人脸集合中

以下是一个Laravel代码示例,展示了如何从您的文件系统中将图像添加到您的人脸集合中

$path_to_image = public_path("images/boy.jpg");
$name ='Tom';
$faceCollection->add($path_to_image, $name);

识别

此代码片段展示了如何识别未知人脸

$path_to_image = public_path("images/boy.jpg");

$recognitionService->recognize($path_to_image);

环境

注意:我们提供了3种上传图像到我们的SDK的方式。它们是url、blob和绝对路径(从本地机器)。

参考

CompreFace 全局对象

Global CompreFace 对象用于初始化与 CompreFace 的连接并设置选项的默认值。如果适用,默认值将用于每个服务方法。如果选项的值在全局对象中设置并作为函数参数传递,则将使用函数参数值。

构造函数

new CompreFace(server, port, options)

可能的选项

示例

$server = "https://";
$port = 8000;
$options = [
  'limit'=> 0, 
  'det_prob_threshold'=> 0.8, 
  'prediction_count'=> 1,
  'face_plugins'=> "calculator,age,gender,landmarks",
  'status'=> "true"
];

$compreFace = new CompreFace($server, $port, $options);

方法

  1. compreFace.initFaceRecognitionService(api_key)

初始化人脸识别服务对象。

示例

let recognitionService = compreFace.initFaceRecognitionService(api_key);
  1. compreFace.initFaceDetectionService(api_key)

初始化人脸检测服务对象。

示例

let detectionService = compreFace.initFaceDetectionService(api_key);
  1. compreFace.initFaceVerificationService(api_key)

初始化人脸验证服务对象。

示例

let verificationService = compreFace.initFaceVerificationService(api_key);

识别服务

人脸识别服务用于人脸识别。这意味着您首先需要将已知人脸上传到人脸集合中,然后识别其中未知的人脸。当您上传一个未知的人脸时,服务将返回与它最相似的人脸。此外,人脸识别服务支持验证端点以检查人脸集合中的人脸是否正确。更多信息,请参阅CompreFace 页面

从给定图像中识别人脸

recognitionService.recognize(image_location, options)

识别图像中的所有人脸。第一个参数是图像位置,它可以是 URL 或本地机器上的路径。

支持选项

响应

{
 "result" : [ {
   "age" : {
     "probability": 0.9308982491493225,
     "high": 32,
     "low": 25
   },
   "gender" : {
     "probability": 0.9898611307144165,
     "value": "female"
   },
   "mask" : {
     "probability": 0.9999470710754395,
     "value": "without_mask"
   },
   "embedding" : [ 9.424854069948196E-4, "...", -0.011415496468544006 ],
   "box" : {
     "probability" : 1.0,
     "x_max" : 1420,
     "y_max" : 1368,
     "x_min" : 548,
     "y_min" : 295
   },
   "landmarks" : [ [ 814, 713 ], [ 1104, 829 ], [ 832, 937 ], [ 704, 1030 ], [ 1017, 1133 ] ],
   "subjects" : [ {
     "similarity" : 0.97858,
     "subject" : "subject1"
   } ],
   "execution_time" : {
     "age" : 28.0,
     "gender" : 26.0,
     "detector" : 117.0,
     "calculator" : 45.0,
     "mask": 36.0
   }
 } ],
 "plugins_versions" : {
   "age" : "agegender.AgeDetector",
   "gender" : "agegender.GenderDetector",
   "detector" : "facenet.FaceDetector",
   "calculator" : "facenet.Calculator",
   "mask": "facemask.MaskDetector"
 }
}

示例

$image_location = public_path("images/team.jpg");
$options = {
    'limit'=> 0,
    'det_prob_threshold'=> 0.8,
    'prediction_count'=> 1,
    'face_plugins'=> "calculator,age,gender,landmarks",
    'status'=> "true"
}

$recognitionService->recognize($image_location, $options)

获取人脸集合

recognitionService.getFaceCollection()

返回人脸集合对象

人脸集合可以用于管理已知人脸,例如添加、列出或删除它们。

人脸识别是对人脸集合中保存的已知人脸进行的,因此在使用 recognize 方法之前,您需要至少将一个人脸保存到人脸集合中。

有关人脸集合和管理的更多信息请参阅此处

方法

添加示例主题

faceCollection.add(image_location, subject, options)

将图像添加到您的人脸集合中。

支持选项

响应

{
 "image_id": "string",
 "subject": "string"
}

示例

$image_location = public_path("images/boy.jpg");
$name = 'Tom';
$options = [
    'det_prob_threshold'=> 0.8
];

$faceCollection->add($image_location, $name, $options);

主题所有保存示例列表

faceCollection.list()

检索保存人脸集合中图像的列表

响应

{
  "faces": [
    {
      "image_id": "string",
      "subject": "string"
    }
  ]
}

示例

faceCollection.list()
    .then(response => {
        console.log(JSON.stringify(response));
    })
    .catch(error => {
        console.log(`Oops! There is problem: ${error}`)
    })

按名称删除主题的所有示例

faceCollection.delete_all_subject(subject)

根据给定的主题删除图像。

响应

{
    "deleted": <count>
}

示例

let subject = "Tom";

faceCollection.delete(subject)
    .then(response => {
        console.log(JSON.stringify(response));
    })
    .catch(error => {
        console.log(`Oops! There is problem ${error}`)
    })

按ID删除主题的示例

faceCollection.delete(image_id)

从人脸集合中删除图像。

响应

{
 "image_id": "string",
 "subject": "string"
}

示例

let image_id = "79ed78d8-f015-4947-b297-a24306ebbdad";

faceCollection.delete(image_id)
    .then(response => {
        console.log(JSON.stringify(response));
    })
    .catch(error => {
        console.log(`Oops! There is problem ${error}`)
    })

删除多个示例

faceCollection.delete_multiple_images(image_ids)

从人脸集合中删除图像。

响应

{
 "image_id": "string",
 "subject": "string"
}

示例

let image_id = "79ed78d8-f015-4947-b297-a24306ebbdad";

faceCollection.delete(image_id)
    .then(response => {
        console.log(JSON.stringify(response));
    })
    .catch(error => {
        console.log(`Oops! There is problem ${error}`)
    })

从给定图像中验证人脸

faceCollection.verify(image_path, image_id, options)

比较给定图像与您人脸集合中图像的相似度。

支持选项

响应

{
  "result" : [ {
    "age" : {
      "probability": 0.9308982491493225,
      "high": 32,
      "low": 25
    },
    "gender" : {
      "probability": 0.9898611307144165,
      "value": "female"
    },
    "mask" : {
      "probability": 0.9999470710754395,
      "value": "without_mask"
    },
    "embedding" : [ 9.424854069948196E-4, "...", -0.011415496468544006 ],
    "box" : {
      "probability" : 1.0,
      "x_max" : 1420,
      "y_max" : 1368,
      "x_min" : 548,
      "y_min" : 295
    },
    "landmarks" : [ [ 814, 713 ], [ 1104, 829 ], [ 832, 937 ], [ 704, 1030 ], [ 1017, 1133 ] ],
    "subjects" : [ {
      "similarity" : 0.97858,
      "subject" : "subject1"
    } ],
    "execution_time" : {
      "age" : 28.0,
      "gender" : 26.0,
      "detector" : 117.0,
      "calculator" : 45.0,
      "mask": 36.0
    }
  } ],
  "plugins_versions" : {
    "age" : "agegender.AgeDetector",
    "gender" : "agegender.GenderDetector",
    "detector" : "facenet.FaceDetector",
    "calculator" : "facenet.Calculator",
    "mask": "facemask.MaskDetector"
  }
}
let image_location = "../images/team.jpg";
let image_id = "79ed78d8-f015-4947-b297-a24306ebbdad";
let options = {
    limit: 0,
    det_prob_threshold: 0.8,
    prediction_count: 1,
    face_plugins: "calculator,age,gender,landmarks,mask",
    status: "true"
}

faceCollection.verify(image_location, image_id, options)
    .then(response => {
        console.log(JSON.stringify(response));
    })
    .catch(error => {
        console.log(`Oops! There is problem with verifying image ${error}`)
    })

获取主题

recognitionService.getSubjects()

返回主题对象

主题对象允许直接处理主题(不是通过主题示例)。

有关主题的更多信息请参阅此处

let subjects = recognitionService.getSubjects(); 

方法

添加主题

在人脸集合中创建一个新的主题。

subjects.add(subject)

响应

{
  "subject": "subject1"
}
let subjects = recognitionService.getSubjects();
subjects.add("John");

列出主题

返回与人脸集合相关的所有主题。

subjects.list()

响应

{
  "subjects": [
    "<subject_name1>",
    "<subject_name2>"
  ]
}
let subjects = recognitionService.getSubjects();
console.log(subjects.list());

重命名主题

重命名现有主题。如果新主题名称已存在,主题将被合并 - 所有来自旧主题名称的人脸都将重新分配给新名称的主题,旧主题将被删除。

subjects.rename(subject, new_name)

响应

{
  "updated": "true|false"
}
let subjects = recognitionService.getSubjects();
subjects.add("John");
console.log(subjects.list());
subjects.rename("John", "Jane");
console.log(subjects.list());

删除主题

删除现有主题及其所有保存的人脸。

subjects.delete(subject)

响应

{
  "subject": "subject1"
}
let subjects = recognitionService.getSubjects();
subjects.add("John");
console.log(subjects.list());
subjects.delete("John");
console.log(subjects.list());

删除所有主题

删除所有现有主题及其所有保存的人脸。

subjects.deleteAll()

响应

{
  "deleted": "<count>"
}
let subjects = recognitionService.getSubjects();
subjects.add("John");
subjects.add("Jane");
console.log(subjects.list());
subjects.deleteAll();
console.log(subjects.list());

人脸检测服务

人脸检测服务用于检测图像中的人脸。

方法

检测

detectionService.detect(image_location, options)

在图像上找到所有人脸。第一个参数是图像位置,它可以是 URL 或本地机器上的路径。

支持选项

响应

{
  "result" : [ {
    "age" : {
      "probability": 0.9308982491493225,
      "high": 32,
      "low": 25
    },
    "gender" : {
      "probability": 0.9898611307144165,
      "value": "female"
    },
    "mask" : {
      "probability": 0.9999470710754395,
      "value": "without_mask"
    },
    "embedding" : [ -0.03027934394776821, "...", -0.05117142200469971 ],
    "box" : {
      "probability" : 0.9987509250640869,
      "x_max" : 376,
      "y_max" : 479,
      "x_min" : 68,
      "y_min" : 77
    },
    "landmarks" : [ [ 156, 245 ], [ 277, 253 ], [ 202, 311 ], [ 148, 358 ], [ 274, 365 ] ],
    "execution_time" : {
      "age" : 30.0,
      "gender" : 26.0,
      "detector" : 130.0,
      "calculator" : 49.0,
      "mask": 36.0
    }
  } ],
  "plugins_versions" : {
    "age" : "agegender.AgeDetector",
    "gender" : "agegender.GenderDetector",
    "detector" : "facenet.FaceDetector",
    "calculator" : "facenet.Calculator",
    "mask": "facemask.MaskDetector"
  }
}

示例

let image_location = "../images/team.jpg";
let options = {
    limit: 0,
    det_prob_threshold: 0.8,
    face_plugins: "calculator,age,gender,landmarks",
    status: "true"
}

detectionService.detect(image_location, options)
    .then(response => {
        console.log(JSON.stringify(response));
    })
    .catch(error => {
        console.log(`Oops! There is problem with recognizing image ${error}`)
    })

人脸验证服务

人脸验证服务用于比较两个图像。源图像应仅包含一个人脸,它将与目标图像上的所有人脸进行比较。

方法

验证

verificationService.verify(source_image_location, target_image_location, options)

比较两个作为参数提供的图像。源图像应仅包含一个人脸,它将与其他图像中的人脸进行比较。前两个参数是图像位置,它可以是 URL 或本地机器上的路径。

支持选项

响应

{
  "result" : [{
    "source_image_face" : {
      "age" : {
        "probability": 0.9308982491493225,
        "high": 32,
        "low": 25
      },
      "gender" : {
        "probability": 0.9898611307144165,
        "value": "female"
      },
      "mask" : {
        "probability": 0.9999470710754395,
        "value": "without_mask"
      },
      "embedding" : [ -0.0010271212086081505, "...", -0.008746841922402382 ],
      "box" : {
        "probability" : 0.9997453093528748,
        "x_max" : 205,
        "y_max" : 167,
        "x_min" : 48,
        "y_min" : 0
      },
      "landmarks" : [ [ 92, 44 ], [ 130, 68 ], [ 71, 76 ], [ 60, 104 ], [ 95, 125 ] ],
      "execution_time" : {
        "age" : 85.0,
        "gender" : 51.0,
        "detector" : 67.0,
        "calculator" : 116.0,
        "mask": 36.0
      }
    },
    "face_matches": [
      {
        "age" : {
          "probability": 0.9308982491493225,
          "high": 32,
          "low": 25
        },
        "gender" : {
          "probability": 0.9898611307144165,
          "value": "female"
        },
        "mask" : {
          "probability": 0.9999470710754395,
          "value": "without_mask"
        },
        "embedding" : [ -0.049007344990968704, "...", -0.01753818802535534 ],
        "box" : {
          "probability" : 0.99975,
          "x_max" : 308,
          "y_max" : 180,
          "x_min" : 235,
          "y_min" : 98
        },
        "landmarks" : [ [ 260, 129 ], [ 273, 127 ], [ 258, 136 ], [ 257, 150 ], [ 269, 148 ] ],
        "similarity" : 0.97858,
        "execution_time" : {
          "age" : 59.0,
          "gender" : 30.0,
          "detector" : 177.0,
          "calculator" : 70.0,
          "mask": 36.0
        }
      }],
    "plugins_versions" : {
      "age" : "agegender.AgeDetector",
      "gender" : "agegender.GenderDetector",
      "detector" : "facenet.FaceDetector",
      "calculator" : "facenet.Calculator",
      "mask": "facemask.MaskDetector"
    }
  }]
}

示例

let source_image_location = "../images/boy.jpg";
let target_image_location = "../images/team.jpg";
let options = {
    limit: 0,
    det_prob_threshold: 0.8,
    face_plugins: "calculator,age,gender,landmarks",
    status: "true"
}

verificationService.verify(source_image_location, target_image_location, options)
    .then(response => {
        console.log(JSON.stringify(response));
    })
    .catch(error => {
        console.log(`Oops! There is problem with recognizing image ${error}`)
    })

贡献

贡献是开源社区如此令人惊叹的地方,可以学习、灵感和创造。您所做的任何贡献都将受到高度赞赏。

  1. 分支项目
  2. 创建功能分支(git checkout -b feature/AmazingFeature
  3. 提交您的更改(git commit -m '添加一些AmazingFeature'
  4. 将分支推送到远程(git push origin feature/AmazingFeature
  5. 打开Pull Request

在创建您的第一个贡献Pull Request之后,您将收到一个请求,要求您通过在Pull Request中评论特殊信息来签署我们的贡献者许可协议。

报告错误

请在此报告任何错误。

如果您正在报告错误,请指定

  • 您的操作系统名称和版本
  • 可能有助于故障排除的任何有关您本地设置的详细信息
  • 重现错误的详细步骤

提交反馈

向我们发送反馈的最佳方式是在https://github.com/exadel-inc/compreface-javascript-sdk/issues提交一个issue。

如果您正在提议一个功能,请

  • 详细说明它应该如何工作。
  • 尽可能缩小范围,以便更容易实现。

许可证信息

CompreFace JS SDK是在Apache 2.0许可证下发布的开源人脸识别SDK。