自:Python知识圈
各类无次数限制的免费API接口整理,主要是聚合数据上和API Store上的一些,还有一些其他的。
聚合数据提供30大类,160种以上基础数据API服务,国内最大的基础数据API服务,下面就罗列一些免费的各类API接口。
早知道这些API,我就不到处爬爬爬了...
手机号码归属地API接口:
https://www.juhe.cn/docs/api/id/11
历史上的今天API接口:
https://www.juhe.cn/docs/api/id/63
股票数据API接口:
https://www.juhe.cn/docs/api/id/21
全国WIFI接口:
https://www.juhe.cn/docs/api/id/18
星座运势接口:
https://www.juhe.cn/docs/api/id/58
黄金数据接口:
https://www.juhe.cn/docs/api/id/29
语音识别接口:
https://www.juhe.cn/docs/api/id/134
周公解梦接口:
https://www.juhe.cn/docs/api/id/64
天气预报API接口:
https://www.juhe.cn/docs/api/id/73
身份证查询API接口:
https://www.juhe.cn/docs/api/id/38
笑话大全API接口:
https://www.juhe.cn/docs/api/id/95
邮编查询接口:
https://www.juhe.cn/docs/api/id/66
老黄历接口:
https://www.juhe.cn/docs/api/id/65
网站安全检测接口:
https://www.juhe.cn/docs/api/id/19
手机固话来电显示接口:
https://www.juhe.cn/docs/api/id/72
基金财务数据接口:
https://www.juhe.cn/docs/api/id/28
成语词典接口:
https://www.juhe.cn/docs/api/id/157
新闻头条接口:
https://www.juhe.cn/docs/api/id/235
IP地址接口:
https://www.juhe.cn/docs/api/id/1
问答机器人接口:
https://www.juhe.cn/docs/api/id/112
汇率API接口:
https://www.juhe.cn/docs/api/id/80
电影票房接口:
https://www.juhe.cn/docs/api/id/44
万年历API接口:
https://www.juhe.cn/docs/api/id/177
NBA赛事接口:
https://www.juhe.cn/docs/api/id/92
IP地址查询
http://apistore.baidu.com/apiworks/servicedetail/114.html
频道新闻API_易源
http://apistore.baidu.com/apiworks/servicedetail/688.html
微信热门精选 :
http://apistore.baidu.com/apiworks/servicedetail/632.html
天气查询
http://apistore.baidu.com/apiworks/servicedetail/112.html
中国和世界天气预报
http://apistore.baidu.com/apiworks/servicedetail/478.html
股票查询
http://apistore.baidu.com/apiworks/servicedetail/115.html
身份证查询:
http://apistore.baidu.com/apiworks/servicedetail/113.html
美女图片
http://apistore.baidu.com/apiworks/servicedetail/720.html
音乐搜索
http://apistore.baidu.com/apiworks/servicedetail/1020.html
图灵机器人
http://apistore.baidu.com/apiworks/servicedetail/736.html
汇率转换
http://apistore.baidu.com/apiworks/servicedetail/119.html
节假日
http://apistore.baidu.com/apiworks/servicedetail/1116.html
pullword在线分词服务
http://apistore.baidu.com/apiworks/servicedetail/143.html
去哪儿网火车票
http://apistore.baidu.com/apiworks/servicedetail/697.html
笑话大全
http://apistore.baidu.com/apiworks/servicedetail/864.html
银行卡查询服务
http://apistore.baidu.com/apiworks/servicedetail/735.html
语音合成
http://apistore.baidu.com/apiworks/servicedetail/867.html
宅言API-动漫台词接口
http://apistore.baidu.com/apiworks/servicedetail/446.html
去哪儿景点门票查询
http://apistore.baidu.com/apiworks/servicedetail/140.html
手机号码归属地
http://apistore.baidu.com/apiworks/servicedetail/794.html
体育新闻
http://apistore.baidu.com/apiworks/servicedetail/711.html
手机归属地查询
http://apistore.baidu.com/apiworks/servicedetail/709.html
科技新闻
http://apistore.baidu.com/apiworks/servicedetail/1061.html
空气质量指数
http://apistore.baidu.com/apiworks/servicedetail/116.html
天狗健康菜谱
http://apistore.baidu.com/apiworks/servicedetail/987.html
热门游记列表
http://apistore.baidu.com/apiworks/servicedetail/520.html
天狗药品查询
http://apistore.baidu.com/apiworks/servicedetail/916.html
汉字转拼音
http://apistore.baidu.com/apiworks/servicedetail/1124.html
国际新闻
http://apistore.baidu.com/apiworks/servicedetail/823.html
彩票
http://apistore.baidu.com/apiworks/servicedetail/164.html
微信精选
http://apistore.baidu.com/apiworks/servicedetail/863.html
天狗健康资讯
http://apistore.baidu.com/apiworks/servicedetail/888.html
兴趣点检索
http://apistore.baidu.com/apiworks/servicedetail/182.html
用药参考
http://apistore.baidu.com/apiworks/servicedetail/754.html
天狗健康知识
http://apistore.baidu.com/apiworks/servicedetail/899.html
奇闻趣事
http://apistore.baidu.com/apiworks/servicedetail/633.html
花边新闻
http://apistore.baidu.com/apiworks/servicedetail/768.html
天狗医院大全
http://apistore.baidu.com/apiworks/servicedetail/988.html
生活健康
http://apistore.baidu.com/apiworks/servicedetail/989.html
一些其他的API接口
豆瓣开放
https://developers.douban.com/wiki/
淘宝开放平台
http://open.taobao.com/
图灵语音
http://www.tuling123.com/help/h_cent_andriodsdk.jhtml
讯飞语音
http://www.xfyun.cn/robots/solution
马化腾的微信开放平台(对应的还有腾讯开放平台)
https://open.weixin.qq.com/
融云IM
https://developer.rongcloud.cn/signin
百度开发者中心
http://developer.baidu.com/
人脸识别
http://www.faceplusplus.com.cn/
高德地图:
http://lbs.amap.com/
蜻蜓FM:
http://open.qingting.fm
读音:派框架,官网:https://www.phalapi.net/
PhalApi是一个PHP轻量级开源接口框架,致力于快速开发接口服务。支持HTTP/SOAP/RPC等协议,可用于搭建接口/微服务/RESTful接口/Web Services。承诺永久免费,可用于商业用途。
它支持自动生成接口文档、自动进行参数校验、自动生成单元测试代码、自动拥有CURD数据接口、自动安装程序,让接口开发更简单、更高效、更专业。
PhalApi官网截图:
使用PhalApi开源接口框架,能快速开发编写你的API接口,并能自动生成在线接口文档。
在线示例:
PhalApi会根据你编写的接口的参数配置和代码注释,自动实时生成在线接口文档。接口列表页效果类似如下:
PhalApi还支持在线接口测试、请求示例说明、生成离线版HTML接口文档、实时更新。接口文档详情页效果类似如下:
使用composer创建项目的命令,可实现一键安装。
$ composer create-project phalapi/phalapi
温馨提示:关于composer的使用,请参考Composer 中文网 / Packagist 中国全量镜像。
或者,也可以进行手动安装。将此Git项目代码下载解压后,进行可选的composer更新,即:
$ composer update
Nginx配置
如果使用的是Nginx,可参考以下配置。
server {
listen 80;
server_name dev.phalapi.net;
# 将根目录设置到public目录
root /path/to/phalapi/public;
charset utf-8;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# 根据当前环境,选择合适的通讯方式
# fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
配置时需要将网站根目录设置到public目录,配置保存后重启nginx。
温馨提示:推荐将访问根路径指向/path/to/phalapi/public。
如何使用的是MySQL数据库,参考修改./config/dbs.php数据库配置。
return array(
/**
* DB数据库服务器集群 / database cluster
*/
'servers' => array(
'db_master' => array( // 服务器标记 / database identify
'type' => 'mysql', // 数据库类型,暂时只支持:mysql, sqlserver / database type
'host' => '127.0.0.1', // 数据库域名 / database host
'name' => 'phalapi', // 数据库名字 / database name
'user' => 'root', // 数据库用户名 / database user
'password' => '', // 数据库密码 / database password
'port' => 3306, // 数据库端口 / database port
'charset' => 'UTF8', // 数据库字符集 / database charset
'pdo_attr_string' => false, // 数据库查询结果统一使用字符串,true是,false否
'driver_options' => array( // PDO初始化时的连接选项配置
// 若需要更多配置,请参考官方文档:https://www.php.net/manual/zh/pdo.constants.php
),
),
),
// 更多代码省略……
);
最后,需要给runtime目录添加写入权限。
在PhalApi,你可以通过service参数(短名字是s参数)指定需要调用的接口服务。例如,访问默认接口服务。
http://dev.phalapi.net/?s=App.Site.Index
接口请求后结果输出类似如下:
{
"ret": 200,
"data": {
"title": "Hello PhalApi",
"version": "2.4.2",
"time": 1501079142
},
"msg": ""
}
对应执行的PHP代码在./src/app/Api/Site.php文件,源码片段如下:
<?php
namespace App\Api;
use PhalApi\Api;
/**
* 默认接口服务类
* @author: dogstar <chanzonghuang@gmail.com> 2014-10-04
*/
class Site extends Api {
public function getRules() {
return array(
'index' => array(
'username' => array('name' => 'username', 'default' => 'PhalApi', 'desc' => '用户名'),
),
);
}
/**
* 默认接口服务
* @desc 默认接口服务,当未指定接口服务时执行此接口服务
* @return string title 标题
* @return string content 内容
* @return string version 版本,格式:X.X.X
* @return int time 当前时间戳
* @exception 400 非法请求,参数传递错误
*/
public function index() {
return array(
'title' => 'Hello ' . $this->username,
'version' => PHALAPI_VERSION,
'time' => $_SERVER['REQUEST_TIME'],
);
}
}
运行效果,截图如下:
自动生成的接口文档详情页局部截图如下:
修改./public/init.php文件,可设置当前语言。
// 翻译语言包设定-简体中文
\PhalApi\SL('zh_cn');
// Setting language to English
\PhalApi\SL('en');
专为PHPer准备的优雅而详细的开发文档,基本都能在文档找到你要的答案,请看:PhalApi 2.x 开发文档,http://docs.phalapi.net/#/v2.0/。
文档使用markdown编写,文档页面截图如下:
开发文档大纲:
PhalApi 2.x 开发文档
前言
前言
如何升级PhalApi?
一、快速开发
1.1下载与安装
1.2 运行Hello World
1.3 如何请求接口服务
1.4 接口响应与在线调试
1.5 Api接口层
1.6 DataApi通用数据接口
1.7 Domain领域层与ADM模式
1.8 Model数据层与数据库操作
1.9 DataModel数据基类
1.10 单元测试
1.11 自动加载和PSR-4
1.12 接口文档
1.13 初始化
二、数据库
2.1 数据库连接
2.2 数据库与NotORM
2.3 数据库使用和查询
2.4 数据库分库分表策略
2.5 连接多个数据库
2.6 打印和保存SQL语句
2.7 定制你的Model基类
三、高级专题
3.1 接口参数
3.2 配置
3.3 日志
3.4 缓存
3.5 过滤器(接口签名)
3.6 COOKIE
3.7 加密
3.8 国际化
3.9 CURL请求
3.10 工具和杂项
3.11 DI服务汇总
3.12 扩展类库
3.13 SDK包的使用
3.14 脚本命令
3.15 MQ队列
3.16 错误处理
B站首发,第一课~第十一课,配套有每节课的视频知识点大纲。
http://docs.phalapi.net/#/v2.0/video_1
视频课程:
PhalApi 2020视频教程
第一课 B站首发,2020视频教程开讲啦!
第二课 视频教程 - 下载和安装
第三课 视频教程 - Hello World
第四课 视频教程 - 如何请求接口服务
第五课 视频教程 - 接口响应与在线调试
第六课 视频教程 - Api接口层
第七课 视频教程 - Domain领域业务层与ADM模式解说
第八课 视频教程 - Model数据层与数据库连接
第九课 视频教程 - 测试驱动开发与PHPUnit
第十课 视频教程 - 自动加载和PSR-4
第十一课 视频教程 - 接口文档
视频教程 - 十分钟体验PhalApi Pro,让PHP接口开发更有趣!
视频教程 - 茶店应用实战
电子书:《初识PhalApi:探索接口服务开发的技艺》
作者:黄禅宗
图灵社区链接:https://www.ituring.com.cn/book/2405
大纲:
献词
前言
第一部分 探索
第1章 遇见PhalApi
第2章 基础入门
第3章 高级主题
第4章 不只是编码
第二部分 项目案例
第5章 全新的创业项目
第6章 重写历史遗留项目
第7章 一个极致的项目
第三部分 再进一步
第8章 PhalApi完美诠释
第9章 如何有效设计接口框架
第10章 开源这条路
附录A 接口服务文档模板
致谢
电子书:《良质!PHP企业级系统开发》
作者:黄禅宗
图灵社区链接:https://www.ituring.com.cn/book/2664
大纲:
推荐序
前言
献辞
第一部分 重新定义项目开发
第 1 章 软件开发本质论
第 2 章 选择高起点
第 3 章 向世界发布你的代码
第二部分 PHP高级编程
第 4 章 回归原生态
第 5 章 PHPUnit单元测试新解
第三部分 PHP企业级系统开发
第 6 章 核心基础模块设计
第 7 章 大型网站开发范式
第 8 章 高可用接口服务系统
第 9 章 极致的管理后台系统
第 10 章 深藏不露的计划任务系统
第四部分 追求卓越
第 11 章 如何成为明星员工
第 12 章 赢在角色转换
致谢
如果对PhalApi开源框架的内部实现、源代码和技术架构感兴趣,可以查看以下子项目。
PhalApi 2.x 版本的系统架构如下:
温馨提示:以上扩展需要先通过composer安装再使用。更多扩展类库的使用和开发,请参考文档:PhalApi框架扩展类库:http://docs.phalapi.net/#/v2.0/library。
温馨提示:应用插件和composer扩展的区别在于,应用插件颗粒度更大,功能更具体,可能不仅有数据库、接口、界面、还可能配合其他终端,并且不受composer的规范约束,是PhalApi自主发明和设计的开发方式。更多请参考:第三方应用插件开发教程:http://docs.phalapi.net/#/v2.0/how-to-dev-plugin。
以下产品均使用了PhalApi开源框架,并为官方自主研发的产品,欢迎个人/团队/企业使用。
接口大师-即刻搭建您的接口开放平台(原名:PhalApi专业版)
产品官网:http://pro.phalapi.net/
果创云-后端低代码开发平台
产品官网:http://yesapi.cn/
YesDev协作云-在线协作你的全部项目
产品官网:https://www.yesdev.cn/
2.x 版本系统架构
主要分为三层:
其中,各自的composer和github项目分别是:
项目 | composer | github |
phalapi/phalapi | phalapi/phalapi | phalapi/phalapi |
扩展类库 | 由广大开发人员共同维护、分享,composer建议统一注册到phalapi。 | 由广大开发人员共同维护、分享,源代码可维护在开发者各自的Github仓库。 |
核心框架 | phalapi/kernal | phalapi/kernal |
框架核心部分UML静态结构图
PhalApi 2.x 版本的核心框架部分的UML静态结构图,高清版如下所示:
首先,绿色部分的PhalApi\PhalApi类是整个接口系统的访问入口,也就是项目应用系统、客户端使用的关键所在。相关的调用代码,可以参考统一入口文件的实现代码片段。
$pai = new \PhalApi\PhalApi();
$pai->response()->output();
只需要两行代码,便可完成对接口服务的请求响应。
其次,是黄色部分的Api、Domain和Model这三层,也就是我们常说的ADM分层架构。这部分,需要开发人员关注,因为这也是具体项目开发需要自己实现的部分。
最后,是红色部分的DI依赖注入,也是整个框架的核心所在。不仅在核心框架中使用频率最高,乃至在项目应用中也会经常被用到。
核心执行流程时序图
PhalApi 2.x 版本的核心执行流程时序图,与1.x 版本基本一致,可以看出,不管技术如何升级,PhalApi的最初的核心时序流程仍保持着活力。唯一变化的是各个类名。
Gitee码云 - PhalApi开源接口框架(1.7k Star)
代码链接:https://gitee.com/dogstar/PhalApi
Github - PhalApi开源接口框架(1.4 Star)
代码链接:https://github.com/phalapi/phalapi
2021年7月发布更新了 PhalApi 2.17.2 版本。
PhalApi 2.17.2 版本
[BUG修复]
1、SQL记录,只提取部分必要的参数,避免全部记录,以及避免记录密码等敏感信息到日志文件
2、翻译和DataApi参数说明补充
3、DataModel调用不存在方法时的异常提示信息,去掉多余的美元符号
4、在线接口文档模板判断调整,避免出现warning
更多历史版本更新日记,请查看:
http://docs.phalapi.net/#/v2.0/changelog
自IT Next,作者:Vincent Mühler,机器之心编译,参与:Geek AI、张倩。
本文将为大家介绍一个建立在「tensorflow.js」内核上的 javascript API——「face-api.js」,它实现了三种卷积神经网络架构,用于完成人脸检测、识别和特征点检测任务,可以在浏览器中进行人脸识别。
号外!号外!现在人们终于可以在浏览器中进行人脸识别了!本文将为大家介绍「face-api.js」,这是一个建立在「tensorflow.js」内核上的 javascript 模块,它实现了三种卷积神经网络(CNN)架构,用于完成人脸检测、识别和特征点检测任务。
像往常一样,我们将查看一个简单的代码示例,这将使你能立即通过短短几行代码中的程序包开始了解这个 API。让我们开始吧!
我们已经有了「face-recognition.js」,现在又来了另一个同样的程序包?
如果你阅读过本文作者另一篇关于「node.js」环境下进行人脸识别的文章《Node.js + face-recognition.js : Simple and Robust Face Recognition using Deep Learning》(Node.js + face-recognition.js:通过深度学习实现简单而鲁棒的人脸识别)(https://medium.com/@muehler.v/node-js-face-recognition-js-simple-and-robust-face-recognition-using-deep-learning-ea5ba8e852),你就会知道他在之前组装过一个类似的程序包,例如「face-recgnition.js」,从而为「node.js」引入了人脸识别功能。
起初,作者并没有预见到 JavaScript 社区对与人脸识别程序包的需求程度如此之高。对许多人而言,「face-recognition.js」似乎是一个不错的、能够免费试用的开源选项,它可以替代由微软或亚马逊等公司提供的付费人脸识别服务。但是作者曾多次被问道:是否有可能在浏览器中运行完整的人脸识别的工作流水线?
多亏了「tensorflow.js」,这种设想最终变为了现实!作者设法使用「tf.js
」内核实现了部分类似的工具,它们能得到和「face-recognition.js」几乎相同的结果,但是作者是在浏览器中完成的这项工作!而且最棒的是,这套工具不需要建立任何的外部依赖,使用它非常方便。并且这套工具还能通过 GPU 进行加速,相关操作可以使用 WebGL 运行。
这足以让我相信,JavaScript 社区需要这样的一个为浏览器环境而编写的程序包!可以设想一下你能通过它构建何种应用程序。
如何利用深度学习解决人脸识别问题
如果想要尽快开始实战部分,那么你可以跳过这一章,直接跳到代码分析部分去。但是为了更好地理解「face-api.js」中为了实现人脸识别所使用的方法,我强烈建议你顺着这个章节阅读下去,因为我常常被人们问到这个问题。
为简单起见,我们实际想要实现的目标是在给定一张人脸的图像时,识别出图像中的人。为了实现这个目标,我们需要为每一个我们想要识别的人提供一张(或更多)他们的人脸图像,并且给这些图像打上人脸主人姓名的标签作为参考数据。现在,我们将输入图像和参考数据进行对比,找到与输入图像最相似的参考图像。如果有两张图像都与输入足够相似,那么我们输出人名,否则输出「unknown」(未知)。
听起来确实是个好主意!然而,这个方案仍然存在两个问题。首先,如果我们有一张显示了多人的图像,并且我们需要识别出其中所有的人,将会怎样呢?其次,我们需要建立一种相似度度量手段,用来比较两张人脸图像。
人脸检测
我们可以从人脸检测技术中找到第一个问题的答案。简单地说,我们将首先定位输入图像中的所有人脸。「face-api.js」针对人脸检测工作实现了一个 SSD(Single Shot Multibox Detector)算法,它本质上是一个基于 MobileNetV1 的卷积神经网络(CNN),在网络的顶层加入了一些人脸边框预测层。
该网络将返回每张人脸的边界框,并返回每个边框相应的分数,即每个边界框表示一张人脸的概率。这些分数被用于过滤边界框,因为可能存在一张图片并不包含任何一张人脸的情况。请注意,为了对边界框进行检索,即使图像中仅仅只有一个人,也应该执行人脸检测过程。
人脸特征点检测及人脸对齐
在上文中,我们已经解决了第一个问题!然而,我想要指出的是,我们需要对齐边界框,从而抽取出每个边界框中的人脸居中的图像,接着将其作为输入传给人脸识别网络,因为这样可以使人脸识别更加准确!
为了实现这个目标,「face-api.js」实现了一个简单的卷积神经网络(CNN),它将返回给定图像的 68 个人脸特征点:
从特征点位置上看,边界框可以将人脸居中。你可以从下图中看到人脸检测结果(左图)与对齐后的人脸图像(右图)的对比:
人脸识别
现在,我们可以将提取出的对齐后的人脸图像输入到人脸识别网络中,该网络基于一个类似于 ResNet-34 的架构,基本上与 dlib(https://github.com/davisking/dlib/blob/master/examples/dnn_face_recognition_ex.cpp)中实现的架构一致。该网络已经被训练去学习出人脸特征到人脸描述符的映射(一个包含 128 个值的特征向量),这个过程通常也被称为人脸嵌入。
现在让我们回到最初对比两张人脸图像的问题:我们将使用每张抽取出的人脸图像的人脸描述符,并且将它们与参考数据的人脸描述符进行对比。更确切地说,我们可以计算两个人脸描述符之间的欧氏距离,并根据阈值判断两张人脸图像是否相似(对于 150*150 的图像来说,0.6 是一个很好的阈值)。使用欧氏距离的效果惊人的好,当然,你也可以选用任何一种分类器。下面的 gif 动图可视化了通过欧氏距离比较两张人脸图像的过程:
至此,我们已经对人脸识别的理论有所了解。接下来让我们开始编写一个代码示例。
是时候开始编程了!
在这个简短的示例中,我们将看到如何一步步地运行人脸识别程序,识别出如下所示的输入图像中的多个人物:
导入脚本
首先,从 dist/face-api.js 获得最新的版本(https://github.com/justadudewhohacks/face-api.js/tree/master/dist),或者从 dist/face-api.min.js 获得缩减版,并且导入脚本:
<script src="face-api.js"></script>
如果你使用 npm 包管理工具,可以输入如下指令:
npm i face-api.js
加载模型数据
你可以根据应用程序的要求加载你需要的特定模型。但是如果要运行一个完整的端到端的示例,我们还需要加载人脸检测、人脸特征点检测和人脸识别模型。相关的模型文件可以在代码仓库中找到,链接如下:https://github.com/justadudewhohacks/face-api.js/tree/master/weights。
其中,模型的权重已经被量化,文件大小相对于初始模型减小了 75%,使你的客户端仅仅需要加载所需的最少的数据。此外,模型的权重被分到了最大为 4 MB 的数据块中,使浏览器能够缓存这些文件,这样它们就只需要被加载一次。
模型文件可以直接作为你的 web 应用中的静态资源被使用,或者你可以将它们存放在另外的主机上,通过指定的路径或文件的 url 链接来加载。假如你将它们与你在 public/models 文件夹下的资产共同存放在一个 models 目录中:
const MODEL_URL = '/models'
await faceapi.loadModels(MODEL_URL)
或者,如果你仅仅想要加载特定的模型:
const MODEL_URL = '/models'
await faceapi.loadFaceDetectionModel(MODEL_URL)
await faceapi.loadFaceLandmarkModel(MODEL_URL)
await faceapi.loadFaceRecognitionModel(MODEL_URL)
从输入图像中得到对所有人脸的完整描述
该神经网络可以接收 HTML 图像、画布、视频元素或张量(tensor)作为输入。为了检测出输入图像中分数(score)大于最小阈值(minScore)的人脸边界框,我们可以使用下面的简单操作:
const minConfidence = 0.8
const fullFaceDescriptions = await faceapi.allFaces(input, minConfidence)
一个完整的人脸描述符包含了检测结果(边界框+分数),人脸特征点以及计算出的描述符。正如你所看到的,「faceapi.allFaces」在底层完成了本文前面的章节所讨论的所有工作。然而,你也可以手动地获取人脸定位和特征点。如果这是你的目的,你可以参考 github repo 中的几个示例。
请注意,边界框和特征点的位置与原始图像/媒体文件的尺寸有关。当显示出的图像尺寸与原始图像的尺寸不相符时,你可以简单地通过下面的方法重新调整它们的大小:
const resized = fullFaceDescriptions.map(fd => fd.forSize(width, height))
我们可以通过将边界框在画布上绘制出来对检测结果进行可视化:
fullFaceDescription.forEach((fd, i) => {
faceapi.drawDetection(canvas, fd.detection, { withScore: true })
})
可以通过下面的方法将人脸特征点显示出来:
fullFaceDescription.forEach((fd, i) => {
faceapi.drawLandmarks(canvas, fd.landmarks, { drawLines: true })
})
通常,我会在 img 元素的顶层覆盖一个具有相同宽度和高度的绝对定位的画布(想获取更多信息,请参阅 github 上的示例)。
人脸识别
当我们知道了如何得到给定的图像中所有人脸的位置和描述符后,我们将得到一些每张图片显示一个人的图像,并且计算出它们的人脸描述符。这些描述符将作为我们的参考数据。
假设我们有一些可以用的示例图片,我们首先从一个 url 链接处获取图片,然后使用「faceapi.bufferToImage」从它们的数据缓存中创建 HTML 图像元素:
// fetch images from url as blobs
const blobs = await Promise.all(
['sheldon.png' 'raj.png', 'leonard.png', 'howard.png'].map(
uri => (await fetch(uri)).blob()
)
)
// convert blobs (buffers) to HTMLImage elements
const images = await Promise.all(blobs.map(
blob => await faceapi.bufferToImage(blob)
))
接下来,在每张图像中,正如我们之前对输入图像所做的那样,我们对人脸进行定位、计算人脸描述符:
const refDescriptions = await Promsie.all(images.map(
img => (await faceapi.allFaces(img))[0]
))
const refDescriptors = refDescriptions.map(fd => fd.descriptor)
现在,我们还需要做的就是遍历我们输入图像的人脸描述符,并且找到参考数据中与输入图像距离最小的描述符:
const sortAsc = (a, b) => a - b
const labels = ['sheldon', 'raj', 'leonard', 'howard']
const results = fullFaceDescription.map((fd, i) => {
const bestMatch = refDescriptors.map(
refDesc => ({
label: labels[i],
distance: faceapi.euclideanDistance(fd.descriptor, refDesc)
})
).sort(sortAsc)[0]
return {
detection: fd.detection,
label: bestMatch.label,
distance: bestMatch.distance
}
})
正如前面提到的,我们在这里使用欧氏距离作为一种相似度度量,这样做的效果非常好。我们在输入图像中检测出的每一张人脸都是匹配程度最高的。
最后,我们可以将边界框和它们的标签一起绘制在画布上,显示检测结果:
// 0.6 is a good distance threshold value to judge
// whether the descriptors match or not
const maxDistance = 0.6
results.forEach(result => {
faceapi.drawDetection(canvas, result.detection, { withScore: false })
const text = `${result.distance < maxDistance ? result.className : 'unkown'} (${result.distance})`
const { x, y, height: boxHeight } = detection.getBox()
faceapi.drawText(
canvas.getContext('2d'),
x,
y + boxHeight,
text
)
})
至此,我希望你对如何使用这个 API 有了一个初步的认识。同时,我也建议你看看文中给出的代码仓库中的其它示例。好好地把这个程序包玩个痛快吧!
*请认真填写需求信息,我们会在24小时内与您取得联系。