Openface搭建(图片对比)
注:之前搭建的windows失败,因为最终发现openface开源代码中的torch_neural_net.py的某一路径并不是windows的文件路径,所以直接改用最简便的docker使用。
实现需求目标:
实现两张照片对人脸进行比对判断是否为同一个人
openface环境搭建步骤
安装docker
docker自动化安装
官方的一键安装方式:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
国内 daocloud一键安装命令:
curl -sSL https://get.daocloud.io/docker | sh
Docker手动安装
待补充~~~~~
Docker启动
启动Docker的命令:
sudo systemctl start docker
拉取openface镜像
拉取openface镜像命令
docker pull bamos/openface
注:应为openface国内镜像拉去慢,可使用该方式解决
利用阿里云方式解决docker拉取出现的Client.Timeout exceeded while awaiting headers的问题
查询镜像命令
docker images
启动镜像
docker run -p 9000:9000 -p 8000:8000 -t -i bamos/openface /bin/bash
查询容器
docker ps
进入容器
sudo docker attach id or name (填写自己的容器id或者name)
容器内操作:
进入 /root/openface/demos
cd /root/openface/demos
compare.py便是两个图片对比算法
利用宿主机原有的文件cp到docker的命令
docker cp 宿主的文件地址 容器id:/root/openface/目标文件夹
图片进行对比
python compare.py ./images/xxx.jpg ./images/xxx.jpg
因为两个照片相同,差别是0 ,阈值大概是0.5 大于标识不同的人, 小于0.5标识是同一个人。
代码添加
应为目标需求是写个接口实现上传两张图片进行对比判断所以添加以下python代码在openface的demos文件夹下
from flask import Flask, request, jsonify
from io import BytesIO
import numpy as np
import cv2
import os
import openface
app = Flask(__name__)
fileDir = os.path.dirname(os.path.realpath(__file__))
modelDir = os.path.join(fileDir, '..', 'models')
dlibModelDir = os.path.join(modelDir, 'dlib')
openfaceModelDir = os.path.join(modelDir, 'openface')
align = openface.AlignDlib(os.path.join(dlibModelDir, "shape_predictor_68_face_landmarks.dat"))
net = openface.TorchNeuralNet(os.path.join(openfaceModelDir, 'nn4.small2.v1.t7'), 96)
def getRep(image_bytes):
bgrImg = cv2.imdecode(np.frombuffer(image_bytes.read(), np.uint8), cv2.IMREAD_COLOR)
rgbImg = cv2.cvtColor(bgrImg, cv2.COLOR_BGR2RGB)
bb = align.getLargestFaceBoundingBox(rgbImg)
alignedFace = align.align(96, rgbImg, bb, landmarkIndices=openface.AlignDlib.OUTER_EYES_AND_NOSE)
rep = net.forward(alignedFace)
return rep
@app.route('/compare_images', methods=['POST'])
def compare_images():
try:
image1 = request.files['image1']
image2 = request.files['image2']
rep1 = getRep(BytesIO(image1.read()))
rep2 = getRep(BytesIO(image2.read()))
# distance = np.linalg.norm(rep1 - rep2)
distance = np.dot(rep1 - rep2, rep1 - rep2)
result = {
# 'distance': round(float(distance), 3),
# 'distance': float(distance),
'distance': "{:.2f}".format(distance),
'result': 'Pass' if distance <= 0.5 else 'No Pass'
}
return jsonify(result)
except Exception as e:
return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000, debug=True)
然后通过启动该文件
python compareapi1.py
最后进行端口测试
本文来自博客园,作者:陈步汀,转载请注明原文链接:https://www.cnblogs.com/chenbuting/p/17848078.html