├── .gitignore ├── LICENSE ├── README.md ├── SUMMARY.md ├── composer.json ├── config └── laravel-ai.php ├── docs ├── baidu │ ├── README.md │ ├── face.md │ └── faceset.md ├── faceset.md └── tencent │ ├── face.md │ └── faceset.md └── src ├── AiManager.php ├── AiServiceProvider.php └── Facades └── Ai.php /.gitignore: -------------------------------------------------------------------------------- 1 | vendor 2 | composer.lock 3 | .idea 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 crisenchou 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # laravel-ai 2 | 使用laravel ai优雅的调用ai客户端 3 | 4 | ## 安装 5 | 6 | ~~~ 7 | composer require "crisen/laravel-ai":"^1.0.0" 8 | ~~~ 9 | 10 | 非laravel版本,[点击这里](https://github.com/crisenchou/ai) 11 | 12 | ### 配置 13 | 14 | app.php中 15 | 16 | ~~~ 17 | 18 | //注册服务提供者 19 | 'providers' => [ 20 | 21 | ..... 22 | 23 | Crisen\LaravelAi\AiServiceProvider::class, 24 | 25 | ]; 26 | 27 | // 注册facades 28 | 'aliases' => [ 29 | 30 | .... 31 | 32 | 'Ai' => Crisen\LaravelAi\Facades\Ai::class, 33 | ] 34 | ~~~ 35 | 36 | ## 发布资源 37 | 38 | ~~~ 39 | artisan vendor:publish --provider=Crisen\LaravelAi\AiServiceProvider 40 | ~~~ 41 | 42 | ### 配置 43 | 44 | ai.php 45 | 46 | ~~~ 47 | return [ 48 | 49 | 'default' => 'baidu', 50 | 51 | 'drivers' => [ 52 | 'baidu' => [ 53 | 'app_id' => 'your appid', // 百度appid 54 | 'api_key' => 'your api key', // 百度apikey 55 | 'secret_key' => 'your api secret' // 百度secret key 56 | ], 57 | 'tencent' => [ 58 | 'app_id' => 'your appid', // 腾讯appid 59 | 'app_key' => 'your secret id', // 腾讯appid 60 | ] 61 | ] 62 | ]; 63 | ~~~ 64 | 65 | 66 | 67 | ### 使用简介 68 | 69 | ~~~php+HTML 70 | namespace someNameSpace; 71 | 72 | use Crisen\LaravelAi\Facades\Ai; 73 | 74 | .... 75 | 76 | class SomeController{ 77 | 78 | public function facesetAdd(){ 79 | //人脸检索 80 | $res = Ai::face() 81 | ->url("http://domaon.com/someimgae.jpeg") 82 | ->detect(); 83 | dd($res); 84 | } 85 | } 86 | ~~~ 87 | 88 | 89 | 90 | ## 更多使用方法 91 | 92 | - [详细文档](http://ai.crisen.org) 93 | 94 | ## 支持的驱动 95 | 96 | - 百度AI 97 | - 腾讯AI 98 | 99 | ## LICENSE 100 | 101 | [MIT](LICENSE) 102 | 103 | -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Summary 2 | 3 | * [简介](README.md) 4 | * [百度AI](docs/baidu/RADEMD.md) 5 | - [人脸库管理](docs/baidu/faceset.md) 6 | - [人脸识别](docs/baidu/face.md) 7 | * [腾讯AI](docs/tencent/README.md) 8 | - [人脸库管理](docs/tencent/faceset.md) 9 | - [人脸识别](docs/tencent/face.md) 10 | 11 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "crisen/laravel-ai", 3 | "description": "优雅的laravel ai客户端", 4 | "keywords": [ 5 | "人脸识别", 6 | "人脸库", 7 | "ai client", 8 | "laravel ai" 9 | ], 10 | "require": { 11 | "laravel/framework": "^5.4", 12 | "crisen/ai": "^1.0.0" 13 | }, 14 | "require-dev": { 15 | "phpunit/phpunit": "^6.0" 16 | }, 17 | "license": "MIT", 18 | "authors": [ 19 | { 20 | "name": "crisenchou", 21 | "email": "crisen@crisen.org" 22 | } 23 | ], 24 | "autoload": { 25 | "psr-4": { 26 | "Crisen\\LaravelAi\\": "src/", 27 | "Crisen\\LaravelAi\\Tests\\": "tests/" 28 | } 29 | }, 30 | "minimum-stability": "dev" 31 | } 32 | -------------------------------------------------------------------------------- /config/laravel-ai.php: -------------------------------------------------------------------------------- 1 | 'baidu', 13 | 14 | 15 | 'drivers' => [ 16 | 'baidu' => [ 17 | 'app_id' => 'your appid', // 百度appid 18 | 'api_key' => 'your api key', // 百度apikey 19 | 'secret_key' => 'your secret key' // 百度secret key 20 | ], 21 | ] 22 | ]; -------------------------------------------------------------------------------- /docs/baidu/README.md: -------------------------------------------------------------------------------- 1 | # 百度AI客户端 2 | 3 | ## 选择接口类型 4 | 5 | ~~~ 6 | // 获取人脸识别路由 7 | $gateway = Ai::face(); 8 | // 获取人脸库路由 9 | $gateway = Ai::faceset(); 10 | .... 11 | ~~~ 12 | 13 | ## 必选图片参数优化 14 | 15 | > 百度ai的图像参数有三种 base64 ,url,face_token 这里为了调用方便 因为进行了封装 16 | 17 | ~~~ 18 | // 以图片url的形式进行调用 19 | $url = 'http://domain/someimg.jpg'; 20 | $gateway->url($url); 21 | // 以base64编码图片进行调用 22 | $code = 'Y3Jpc2VuY2hvdQ=='; 23 | $gateway->base64($code); 24 | // 以本地路径 25 | $path = 'path/to/some_img.jpg'; 26 | $gateway->path($path); 27 | // 以百度ai的face token 28 | $faceToken = 'face token'; 29 | $gateway->faceToken($path); 30 | ~~~ 31 | 32 | ## 调用动作 33 | 34 | ~~~ 35 | use Ai; 36 | 37 | // 如调用人脸检测 38 | $res = Ai::face()->url($url)->detect(); 39 | ~~~ 40 | 41 | ## 兼容官方的可选参数格式 42 | 43 | ~~~ 44 | // 图片检索 45 | $url = 'http://domain/someimg.jpg'; 46 | Ai::face()->url($url)->detect([ 47 | 'face_field' => 'age', 48 | 'max_face_num' => '10', 49 | 'face_type' => 'LIVE' 50 | ]); 51 | 52 | ~~~ 53 | 54 | ## 返回数据处理 55 | 56 | ~~~ 57 | $url = 'http://domain/someimg.jpg'; 58 | $res = $ai->face()->url($url)->detect([ 59 | 'face_field' => 'age', 60 | 'max_face_num' => '10', 61 | 'face_type' => 'LIVE' 62 | ]); 63 | if($res->success()){ 64 | dump($res->toArray()); 65 | }else{ 66 | // do something with exception 67 | } 68 | ~~~ 69 | 70 | -------------------------------------------------------------------------------- /docs/baidu/face.md: -------------------------------------------------------------------------------- 1 | # 人脸识别 2 | 3 | 4 | 5 | ## 人脸检测 6 | 7 | ~~~ 8 | 9 | // 使用base64编码图片进行检索 10 | $code = "image base64 code"; 11 | $res = Ai::face()->base64($code)->detect() 12 | 13 | // 使用url图片地址 14 | $url = "http://domain/someimg.jpg"; 15 | $res = Ai::face()->url($url)->detect(); 16 | 17 | // 使用 本地文件路径 18 | $path = 'path/to/file.jpg'; 19 | $res = Ai::face()->path($url)->detect(); 20 | 21 | // 兼容官方原生参数 22 | $params = [ 23 | 'face_field' => 'age,beauty,expression,face_shape', 24 | 'max_face_num' => 1, 25 | 'face_type' => 'LIVE' 26 | ]; 27 | $url = "http://domain/someimg.jpg"; 28 | $res = Ai::face()->url($url)->detect($params); 29 | 30 | if($res->success()){ 31 | dump($res->toArray()); 32 | } 33 | ~~~ 34 | 35 | 36 | 37 | ## 人脸对比 38 | 39 | ~~~ 40 | // 使用url图片进行对比 41 | $res = Ai::face()->url('http://domain/some.jpg')->match(); 42 | 43 | // 使用base64编码图片进行对比 44 | $res = Ai::face()->base64('Y3Jpc2VuY2hvdQ==')->match(); 45 | 46 | // 使用本地路径进行对比 47 | $res = Ai::face()->path('/path/to/some.jpg')->match(); 48 | 49 | // 兼容官方可选参数 50 | $res = Ai::face()->path('/path/to/some.jpg')->match([ 51 | 'face_type' => 'LIVE', 52 | 'quality_control' => 'NONE' 53 | 'liveness_control' => 'NONE' 54 | ]); 55 | 56 | if($res->success()){ 57 | dump($res->toArray()); 58 | } 59 | 60 | ~~~ 61 | 62 | ## 人脸搜索 63 | 64 | > 1:n 搜索 65 | 66 | ~~~ 67 | // 以url图片进行搜索 68 | $res = Ai::face()->url('http://domain/some.jpg')->groupList('some_group')->search(); 69 | // 以base64编码在多个组中进行搜索 70 | $res = Ai::face()->base64('Y3Jpc2VuY2hvdQ==')->groupList([ 71 | 'group1','group2','group3' 72 | ])->search(); 73 | // 以本地图片路径进行搜索 74 | $res = Ai::face()->path('/path/to/some.jpg')->groupList('some_group')->search(); 75 | 76 | // 兼容官方可选参数 77 | $res = Ai::face()->path('/path/to/some.jpg')->groupList('some_group')->search([ 78 | 'quality_control' => 'NONE', 79 | 'liveness_control' => 'NONE', 80 | 'user_id' => 'some_user', 81 | 'max_user_num' => '1' 82 | ]); 83 | 84 | if($res->success()){ 85 | dump($res->toArray()); 86 | } 87 | 88 | ~~~ 89 | 90 | > m:n搜搜 91 | 92 | ~~~ 93 | // 以url图片进行搜索 94 | $res = Ai::face()->url('http://domain/some.jpg')->groupList('some_group')->multiSearch(); 95 | // 以base64编码在多个组中进行搜索 96 | $res = Ai::face()->base64('Y3Jpc2VuY2hvdQ==')->groupList([ 97 | 'group1','group2','group3' 98 | ])->search(); 99 | // 以本地图片路径进行搜索 100 | $res = Ai::face()->path('/path/to/some.jpg')->groupList('some_group')->search(); 101 | 102 | // 兼容官方可选参数 103 | $res = Ai::face()->path('/path/to/some.jpg')->groupList('some_group')->search([ 104 | 'max_face_num' => '10', 105 | 'match_threshold' => '80', 106 | 'quality_control' => 'NONE', 107 | 'liveness_control' => 'NONE', 108 | 'max_user_num' => '20', 109 | ]); 110 | 111 | if($res->success()){ 112 | dump($res->toArray()); 113 | } 114 | 115 | ~~~ 116 | 117 | 118 | 119 | ## 身份验证 120 | 121 | ~~~ 122 | 123 | // 以网络图片地址进行验证 124 | $res = Ai::face()->url('http://domain/id_card.jpg')->verify([ 125 | 'id_card_number' => 'id_number',//身份证号 126 | 'name' => 'name' // 名字 注意中文名字需要utf8格式 127 | ]); 128 | // 以本地路径进行验证 129 | $res = Ai::face()->path('/path/to/id_card.jpg')->verify([ 130 | 'id_card_number' => 'id_number',//身份证号 131 | 'name' => 'name' // 名字 132 | ]); 133 | 134 | // 以图片base64编码进行验证 135 | $res = Ai::face()->base64('Y3Jpc2VuY2hvdQ==c')->verify([ 136 | 'id_card_number' => 'id_number',//身份证号 137 | 'name' => 'name' // 名字 138 | ]); 139 | 140 | // 以face token 进行验证 141 | $res = Ai::face()->faceToken('face token')->verify([ 142 | 'id_card_number' => 'id_number',//身份证号 143 | 'name' => 'name' // 名字 144 | ]); 145 | 146 | 147 | if($res->success()){ 148 | dump($res->toArray()); 149 | } 150 | 151 | ~~~ 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | -------------------------------------------------------------------------------- /docs/baidu/faceset.md: -------------------------------------------------------------------------------- 1 | # 人脸库管理 2 | 3 | ## 人脸注册 4 | 5 | 人脸注册的路由为facesetUser() 6 | 7 | ~~~ 8 | // 注册url形式的图片 9 | $imgUrl = 'http://domain/someimg.jpg'; 10 | $group = 'some_group'; //百度ai人脸库必选参数 11 | $user = 'some_user'; 12 | Ai::facesetUser()->url($imgUrl)->group($group)->user($user)->add(); 13 | 14 | //注册base64编码后的图片 15 | $code = 'Y3Jpc2VuY2hvdQ=='; 16 | Ai::facesetUser()->base64($code)->group($group)->user($user)->add(); 17 | 18 | // 注册本地文件 19 | $path = 'path/to/someimg.jpg'; 20 | Ai::facesetUser()->path($path)->group($group)->user($user)->add(); 21 | 22 | // 使用可选参数 23 | Ai::facesetUser()->path($path)->group($group)->user($user)->add([ 24 | 'user_info' => 'user info', 25 | 'quality_control' => 'NONE', 26 | 'liveness' => 'NONE' 27 | ]); 28 | ~~~ 29 | 30 | ## 人脸更新 31 | 32 | 人脸更新的路由为facesetUser() 33 | 34 | ~~~ 35 | // 以图片base64编码进行更新 36 | $code = 'Y3Jpc2VuY2hvdQ=='; 37 | Ai::facesetUser()->base64($code)->group($group)->user($user)->update(); 38 | 39 | // 以图片url进行更新 40 | Ai::facesetUser() 41 | ->url('http://domain/some.jpg') 42 | ->group($group) 43 | ->user($user) 44 | ->update(); 45 | 46 | // 以图片路径进行更新 47 | Ai::facesetUser() 48 | ->path('path/ti/some.jpg') 49 | ->group($group) 50 | ->user($user) 51 | ->update(); 52 | 53 | // 以face_token 进行更新 54 | Ai::facesetUser()->faceToken('facetoken')->group($group)->user($user)->update(); 55 | 56 | // 兼容官方可选参数 57 | Ai::facesetUser() 58 | ->path('path/ti/some.jpg') 59 | ->group($group) 60 | ->user($user) 61 | ->update([ 62 | 'user_info' => 'user info', 63 | 'quality_control' => 'NONE', 64 | 'liveness' => 'NONE' 65 | ]); 66 | ~~~ 67 | 68 | ## 人脸删除 69 | 70 | > 人脸删除的路由是faceset 和人脸注册的不一致 71 | 72 | ~~~ 73 | $group = 'some_group'; 74 | $user = 'some_user'; 75 | $faceToken = 'face_token'; // 人脸注册时 返回的图片唯一标志 是人脸删除的必选参数 76 | $res = Ai::faceset()->group($group)->user($user)->faceToken($faceToken )->delete(); 77 | if($res->success()){ 78 | //do something 79 | } 80 | ~~~ 81 | 82 | ## 用户信息查询 83 | 84 | ~~~ 85 | // 查询特定group的信息 86 | Ai::facesetUser()->user('some_user')->group('some_group')->get(); 87 | 88 | // 查询所有group的信息 89 | Ai::facesetUser()->group()->user('some_user')->get(); 90 | ~~~ 91 | 92 | 93 | 94 | ## 获取用户人脸列表 95 | 96 | 用于获取一个用户的全部人脸列表 97 | 98 | ~~~ 99 | // 获取全部列表 100 | $res = Ai::faceset()->group('some_group')->user('some_user')->get(); 101 | 102 | //获取部分列表 103 | $res = Ai::faceset() 104 | ->group('some_group') 105 | ->user('some_user') 106 | ->get([ 107 | 'start' => '0', 108 | 'length' => '1000' 109 | ]); 110 | 111 | // 接收返回数据 112 | if($res->success()){ 113 | dump($res->toArray()); 114 | } 115 | ~~~ 116 | 117 | 118 | 119 | ## 获取用户列表 120 | 121 | 用于查询指定用户组中的用户列表。 122 | 123 | ~~~ 124 | 125 | $res = Ai::facesetGroup()->group('some_group')->users(); 126 | if($res->success()){ 127 | dump($res->toArray()); 128 | } 129 | ~~~ 130 | 131 | ## 复制用户 132 | 133 | 用于将已经存在于人脸库中的用户**复制到一个新的组** 134 | 135 | ~~~ 136 | $res = Ai::facesetUser()->user()->copy($src, $dest); 137 | if($res->success()){ 138 | // do something 139 | } 140 | ~~~ 141 | 142 | ## 删除用户 143 | 144 | 用于将用户从某个组中删除 145 | 146 | ~~~ 147 | //删除某个组的用户 148 | Ai::facesetUser()->user('some_user')->group('some_group')->delete(); 149 | 150 | //删除所有组的用户 151 | Ai::facesetUser()->user('some_user')->group()->delete(); 152 | ~~~ 153 | 154 | ## 创建用户组 155 | 156 | 用于创建一个空的用户组,如果用户组已存在 则返回错误 157 | 158 | ~~~ 159 | $res = Ai::facesetGroup()->group('other_group')->add(); 160 | if($res->success()){ 161 | // create group successful 162 | } 163 | ~~~ 164 | 165 | ## 删除用户组 166 | 167 | 删除用户组下所有的用户及人脸,如果组不存在 则返回错误 168 | 169 | > 注:组内的人脸数量如果大于500条,会在后台异步进行删除。在删除期间,无法向该组中添加人脸。1秒钟可以删除20条记录,相当于一小时可以将7万人的人脸组删除干净。 170 | 171 | ~~~ 172 | Ai::facesetGroup()->group('some_group')->delete(); 173 | ~~~ 174 | 175 | ## 组列表查询 176 | 177 | ~~~ 178 | //查询所有信息 179 | $res = Ai::facesetGroup()->get(); 180 | 181 | //查询部分信息 182 | $res = Ai::facesetGroup()->get([ 183 | 'start' => 0, 184 | 'length' => 100, 185 | ]); 186 | 187 | if($res->success()){ 188 | dump($res->toArray()); 189 | } 190 | ~~~ 191 | 192 | -------------------------------------------------------------------------------- /docs/faceset.md: -------------------------------------------------------------------------------- 1 | # 人脸库管理 2 | 3 | ## 用户组 4 | 5 | 6 | 7 | ## 用户 8 | 9 | 10 | 11 | ## 用户人脸 12 | 13 | -------------------------------------------------------------------------------- /docs/tencent/face.md: -------------------------------------------------------------------------------- 1 | # 人脸识别 2 | 3 | 参数说明,腾讯ai仅支持base64编码后的图片,并且最大为1m,但是当前package提供了三种调用方式 4 | 5 | 所有支持image参数的接口 均可以用此方式来传递image参数 6 | 7 | ~~~ 8 | // base64 code调用 9 | $code = 'image base64 code'; 10 | Ai::face()->base64($code)->detect(); 11 | 12 | // 图片url 13 | $url = 'http://domain.com/some.jpg'; 14 | Ai::face()->url($url)->detect(); 15 | 16 | // 本地文件路径 17 | $path = 'path/to/some.jpg'; 18 | Ai::face()->path($path )->detect(); 19 | ~~~ 20 | 21 | 22 | 23 | | 名称 | 路由 | 参数 | 24 | | -------------- | ----------- | ------------------------- | 25 | | 人脸检测与分析 | detect | image,mode | 26 | | 多人脸检测 | multiDetect | image | 27 | | 跨年龄人脸识别 | crosssAge | source_image,target_image | 28 | | 五官定位 | shape | image | 29 | | 人脸对比 | compare | source_image,target_image | 30 | | 人脸验证 | verify | image,person_id | 31 | 32 | 33 | 34 | ## 人脸检测与分析 35 | 36 | ~~~ 37 | $code = 'image base64 code'; 38 | $res = Ai::face()->base64($base64Code)->detect(['mode' => 0]); 39 | if($res-success()){ 40 | var_dump($res->toArray()); 41 | } 42 | ~~~ 43 | 44 | 45 | 46 | ## 多人脸检测 47 | 48 | ~~~ 49 | $url = 'http://domain.com/some.jpg'; 50 | $res = Ai::face()->url($url)->multiDetect(); 51 | if($res-success()){ 52 | dump($res->toArray()); 53 | } 54 | ~~~ 55 | 56 | 57 | 58 | ## 跨年龄人脸识别 59 | 60 | ~~~ 61 | $sourceImgCode = 'source base64 code'; 62 | $destImgCode = 'dest base64 code'; 63 | $res = Ai::face()->crosssAge([ 64 | 'source_image' => $sourceImgCode, 65 | 'target_image' => $destImgCode 66 | ]); 67 | if($res-success()){ 68 | dump($res->toArray()); 69 | } 70 | ~~~ 71 | 72 | ## 五官定位 73 | 74 | ~~~ 75 | $path = 'path/to/some.jpg'; 76 | $res = Ai::face()->path($path)->shape(); 77 | if($res-success()){ 78 | dump($res->toArray()); 79 | } 80 | 81 | ~~~ 82 | 83 | ## 人脸对比 84 | 85 | ~~~ 86 | $sourceImgCode = 'source base64 code'; 87 | $destImgCode = 'dest base64 code'; 88 | $res = Ai::face()->compare([ 89 | 'source_image' => $sourceImgCode, 90 | 'target_image' => $destImgCode 91 | ]); 92 | if($res-success()){ 93 | dump($res->toArray()); 94 | } 95 | ~~~ 96 | 97 | ## 人脸验证 98 | 99 | ~~~ 100 | $path = 'path/to/some.jpg'; 101 | $res = Ai::face()->path($path)->verify([ 102 | 'person_id' => 'person0' 103 | ]); 104 | if($res-success()){ 105 | dump($res->toArray()); 106 | } 107 | 108 | ~~~ 109 | 110 | -------------------------------------------------------------------------------- /docs/tencent/faceset.md: -------------------------------------------------------------------------------- 1 | # 人脸库管理 2 | 3 | 路由列表信息 4 | 5 | | 名称 | 网关 | 路由 | 参数 | 6 | | ---------------- | ------------ | ------ | ------------------------------------------------------------ | 7 | | 增加人脸 | faceset | add | image,person_id,tag [查看参数详情](https://ai.qq.com/doc/addface.shtml) | 8 | | 删除人脸 | faceset | delete | person_id,face_ids | 9 | | 获取人脸信息 | faceset | get | face_id | 10 | | 用户组列表 | facesetGroup | get | | 11 | | 用户组个体列表 | facesetGroup | users | group_id | 12 | | 个体创建 | facesetUser | add | group_ids,person_id,image,person_name | 13 | | 获取个体信息 | facesetUser | get | person_id | 14 | | 更新个体信息 | facesetUser | update | person_id,person_name,tag | 15 | | 删除个体 | facesetUser | delete | person_id | 16 | | 获取个体人脸列表 | facesetUser | faces | person_id | 17 | | 人脸搜索 | face | search | image,group_id,topn | 18 | 19 | ## 增加人脸 20 | 21 | ~~~ 22 | $path = 'path/to/some.jpg'; 23 | $res = Ai::faceset()->path($path)->add(); 24 | if($res->success()){ 25 | dump(res->toArray()); 26 | } 27 | ~~~ 28 | 29 | ## 删除人脸 30 | 31 | ~~~ 32 | // 删除人脸时 需要先获取个体人脸列表 获取到face_ids 然后调用删除人脸即可删除 33 | $path = 'path/to/some.jpg'; 34 | $res = Ai::faceset()->path($path)->delete([ 35 | 'person_id' => 'person0', 36 | 'face_ids' => '2214731677930908309' 37 | ]); 38 | if($res->success()){ 39 | dump(res->toArray()); 40 | } 41 | ~~~ 42 | 43 | ## 获取人脸信息 44 | 45 | ~~~ 46 | $res = Ai::faceset()->delete([ 47 | 'face_id' => '2214731677930908309' 48 | ]); 49 | if($res->success()){ 50 | dump(res->toArray()); 51 | } 52 | ~~~ 53 | 54 | ## 用户组列表 55 | 56 | ~~~ 57 | $res = Ai::facesetGroup()->get(); 58 | 59 | if($res->success()){ 60 | dump(res->toArray()); 61 | } 62 | 63 | ~~~ 64 | 65 | 66 | 67 | ## 用户组个体列表 68 | 69 | ~~~ 70 | $res = Ai::facesetGroup()->users([ 71 | 'group_id' => 'group0' 72 | ]); 73 | 74 | if($res->success()){ 75 | dump(res->toArray()); 76 | } 77 | ~~~ 78 | 79 | 80 | 81 | ## 个体创建 82 | 83 | ~~~ 84 | $path = 'path/to/some.jpg'; 85 | 86 | $res = Ai::facesetUser()->path($path)->add([ 87 | 'group_ids' => 'group0', 88 | 'person_id' => 'person0', 89 | 'person_name' => 'crisen' 90 | ]); 91 | 92 | if($res->success()){ 93 | dump(res->toArray()); 94 | } 95 | 96 | 97 | 98 | ~~~ 99 | 100 | ## 获取个体信息 101 | 102 | ~~~ 103 | $path = 'path/to/some.jpg'; 104 | 105 | $res = Ai::facesetUser()->get([ 106 | 'person_id' => 'person0' 107 | ]); 108 | 109 | if($res->success()){ 110 | dump(res->toArray()); 111 | } 112 | 113 | ~~~ 114 | 115 | 116 | 117 | ## 更新个体信息 118 | 119 | ~~~ 120 | $res = Ai::facesetUser()->update([ 121 | 'person_id' => 'person0', 122 | 'person_name' => 'crisen', 123 | 'tag' => 'a coder' 124 | ]); 125 | 126 | if($res->success()){ 127 | dump(res->toArray()); 128 | } 129 | ~~~ 130 | 131 | 132 | 133 | ## 删除个体 134 | 135 | ~~~ 136 | 137 | $res = Ai::facesetUser()->delete([ 138 | 'person_id' => 'person0', 139 | ]); 140 | 141 | if($res->success()){ 142 | dump(res->toArray()); 143 | } 144 | 145 | ~~~ 146 | 147 | 148 | 149 | ## 获取个体列表 150 | 151 | ~~~ 152 | $res = Ai::facesetUser()->faces([ 153 | 'person_id' => 'person0', 154 | ]); 155 | 156 | if($res->success()){ 157 | dump(res->toArray()); 158 | } 159 | 160 | ~~~ 161 | 162 | 163 | 164 | ## 人脸搜索 165 | 166 | ~~~ 167 | $path = 'path/to/some.jpg'; 168 | 169 | $res = Ai::face()->path($path)->search([ 170 | 'group_id' => 'person0', 171 | 'topn' => 5 172 | ]); 173 | 174 | if($res->success()){ 175 | dump(res->toArray()); 176 | } 177 | 178 | ~~~ 179 | 180 | -------------------------------------------------------------------------------- /src/AiManager.php: -------------------------------------------------------------------------------- 1 | app = $app; 26 | $this->factory = $factory; 27 | } 28 | 29 | 30 | /** 31 | * @param string $name 32 | * @return mixed 33 | */ 34 | public function driver($name = '') 35 | { 36 | $name = $name ?: $this->getDefaultDriver(); 37 | 38 | $drivers = $this->app['config']['ai.drivers']; 39 | 40 | if (is_null($driver = Arr::get($drivers, $name))) { 41 | throw new InvalidArgumentException("Driver [{$name}] not configured"); 42 | } 43 | 44 | return $this->makeDriver($name, $driver); 45 | } 46 | 47 | 48 | /** 49 | * @return mixed 50 | */ 51 | protected function getDefaultDriver() 52 | { 53 | return $this->app['config']['ai.default']; 54 | } 55 | 56 | 57 | /** 58 | * @param $name 59 | * @param $config 60 | * @return mixed 61 | */ 62 | protected function makeDriver($name, $config) 63 | { 64 | return $this->factory->make($name, $config); 65 | } 66 | 67 | } -------------------------------------------------------------------------------- /src/AiServiceProvider.php: -------------------------------------------------------------------------------- 1 | publishes([ 24 | dirname(__DIR__) . '/config/laravel-ai.php' => config_path('ai.php'), 25 | ]); 26 | } 27 | 28 | 29 | public function register() 30 | { 31 | $this->mergeConfigFrom( 32 | dirname(__DIR__) . '/config/laravel-ai.php', 'ai' 33 | ); 34 | 35 | 36 | $this->app->singleton('ai.factory', function ($app) { 37 | return new DriverFactory(); 38 | }); 39 | 40 | $this->app->singleton('ai', function ($app) { 41 | return new AiManager($app, $app['ai.factory']); 42 | }); 43 | 44 | $this->app->singleton('ai.default', function ($app) { 45 | return $app['ai']->driver(); 46 | }); 47 | } 48 | 49 | 50 | } 51 | 52 | -------------------------------------------------------------------------------- /src/Facades/Ai.php: -------------------------------------------------------------------------------- 1 |