註:之前搭建的windows失敗,因為最終發現openface開源代碼中的torch_neural_net.py的某一路徑並不是windows的文件路徑,所以直接改用最簡便的docker使用。 實現需求目標: 實現兩張照片對人臉進行比對判斷是否為同一個人 openface環境搭建步驟 安裝docke ...
註:之前搭建的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