最近在设计功能的过程中,涉及到了人脸比对等算法;于是上网查询了人脸算法的相关文章和第三方技术厂商,发现需要花钱买服务(这很正常毕竟研发需要耗费很大的成本),可惜我只用于学习,不太想花钱;后面和小伙伴一起get到了一个开源(apache 2.0开源协议)人脸算法服务,很nice; 现分享如下:
以下均在win10专业版下操作 !!!
以下均在win10专业版下操作 !!!
以下均在win10专业版下操作 !!!
第一步:你需要安装配置Docker操作如下;
控制面板 --- 程序 --- 启用或关闭Windows功能 --- 选择Hyper-v并确定和重启电脑。(原因:docker面向linux系统,所以需要Hyper-V 提供硬件虚拟化;详细了解请自行百度)
进入这个网址
https://www.docker.com/products/docker-desktop
下载这个安装包(这个过程可能会失败几次,多下载几次)
安装好是这样的(当然不可能这么顺利,期间会报错的;常见报错见:附件1)
附件1:
问题1:
解决方法:点击链接下载、安装;重启docker应用;
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
问题2:设置中的配置可能需要改一下,如下
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
------------第一步 结束----------------------------------------------------------------------------------------------------
第二步:人脸算法服务;
进入这个链接:
https://gitee.com/mirrors/compreface
接下来,按照指引操作即可
点击API说明,进去,就是具体的接口了;使用postman+下面我发的前端页面,配合测试。
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
function video() {
let video = document.getElementById("live");
let canvas = document.getElementById("canvas");
let canvas2 = document.getElementById("canvas2");
let ctx = canvas.getContext('2d');
let ctx2 = canvas2.getContext('2d');
let apiKey = document.getElementById("apiKey").value;
navigator.mediaDevices.getUserMedia({
video: {width: 640, height: 480}
}).then(function (stream) {
video.srcObject = stream;
document.addEventListener("next_frame", draw);
const evt = new Event("next_frame", {"bubbles": true, "cancelable": false});
document.dispatchEvent(evt);
});
function draw() {
ctx.drawImage(video, 0, 0, 640, 480);
canvas.toBlob(function (blob) {
blob.name = "blob.jpeg"
let fd = new FormData();
fd.append('file', blob, "blob.jpeg");
fetch('http://localhost:8000/api/v1/recognition/recognize',
{
method: "POST",
headers: {
"x-api-key": apiKey
},
body: fd
}
).then(r => r.json()).then(
function (data) {
const evt = new Event("next_frame", {"bubbles": true, "cancelable": false});
document.dispatchEvent(evt);
ctx2.clearRect(0, 0, 640, 480);
ctx2.drawImage(video, 0, 0, 640, 480);
if (!data.result) {
return;
}
let box = data.result[0].box;
let name = data.result[0].subjects[0].subject;
ctx2.lineWidth = 3;
ctx2.strokeStyle = 'green';
ctx2.strokeRect(box.x_min, box.y_min, box.x_max - box.x_min, box.y_max - box.y_min);
ctx2.font = '24px serif';
ctx2.strokeText(name, box.x_min, box.y_min - 20);
});
}, 'image/jpeg', 0.95);
}
}
</script>
<title>test</title>
</head>
<body>
<label for="apiKey">API key:</label><input id="apiKey" />
<button onclick="video()">video</button>
<video id="live" width="640" height="480" autoplay style="display:none;"></video>
<canvas width="640" id="canvas" height="480" style="display:none;"></canvas>
<canvas width="640" id="canvas2" height="480"></canvas>
</body>
</html>
------------第二步 结束----------------------------------------------------------------------------------------------------
我的思路是:单独部署这个人脸算法服务(单独服务器部署,不要和重要应用放在同一个服务器),然后应用调取使用;
欢迎批评指正...