在编写flask接口封装人脸识别能力的时候,出现了一些问题

在写一个flask的接口时,我调用post的图片为我实现功能(两张图片的相似度比对),但是我有点想不到我应该怎么写才能调用到
import json
import cv2
from PIL import Image
import numpy as np
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
from modelscope.outputs import OutputKeys
from flask import request
from flask import jsonify
from flask import Flask,make_response
import base64
face_recognition = pipeline(Tasks.face_recognition, model='damo/cv_ir101_facerecognition_cfglint')
def face_recognition(get_img1,get_img2):
    get_img1 = image1
    get_img2 = image2
    emb1 = face_recognition(get_img1)[OutputKeys.IMG_EMBEDDING]
    emb2 = face_recognition(get_img2)[OutputKeys.IMG_EMBEDDING]
    sim = np.dot(emb1[0], emb2[0])
    return (f'Face cosine similarity={sim:.3f}, get_img1:{get_img1}  get_img2:{get_img2}')
app = Flask(__name__)
@app.route("/",methods=["POST"])
def first_post():
    my_json = {"msg": None
                }
    data = request.get_data()
    if not data:
        my_json["msg"] = "No data obtained!"
        return jsonify(msg="缺少参数")
    try:
        data=json.loads(data)
        image1=data["image1"].encode()
        image2=data["image2"].encode()
    except Exception as e:
        print(e)
        return jsonify(msg="出错了,请查看是否正确访问")
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=6000, debug=True, use_reloader=False)

api文件
import os
import sys
import time
import json
import base64
import requests
url = "http://0.0.0.0:6000"
base64_data=None
base64_data = base64.b64encode(base64_data,encoding="utf-8")
base64_data = base64_data.decode()
data={
    'image1':None,
    'image2':None
}
start_time = time.time()
response = requests.post(url, data=json.dumps(data))
end_time = time.time()
print("time:", end_time-start_time)
print(response.text)
face_recognition中的两个image爆红 但是程序可以跑,只是就算给它post了两张图片,最后依然会显示“出错了,请查看是否正确访问"
暂时没什么思路 可以做成全局变量的方式吗?
给它post的两张图片能够正确接受并且给我返回我需要的相似度的值

##你的函数中参数传错了,而且你并没有返回计算相似度的结果。我没有你的模型,用的自己的计算可以正常返回

img

修改后的你试一下。有问题再看下


# -*- coding: utf-8 -*-


import json
import cv2
from PIL import Image
import numpy as np
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
from modelscope.outputs import OutputKeys
from flask import request
from flask import jsonify
from flask import Flask,make_response
import base64
face_recognition = pipeline(Tasks.face_recognition, model='damo/cv_ir101_facerecognition_cfglint')
def face_recognition(image1,image2):
    get_img1 = image1
    get_img2 = image2
    emb1 = face_recognition(get_img1)[OutputKeys.IMG_EMBEDDING]
    emb2 = face_recognition(get_img2)[OutputKeys.IMG_EMBEDDING]
    sim = np.dot(emb1[0], emb2[0])
    return (f'Face cosine similarity={sim:.3f}, get_img1:{get_img1}  get_img2:{get_img2}')
app = Flask(__name__)
@app.route("/",methods=["POST"])
def first_post():
    my_json = {"msg": None
                }
    data = request.get_data()
    if not data:
        my_json["msg"] = "No data obtained!"
        return jsonify(msg="缺少参数")
    try:
        data=json.loads(data)
        image1=data["image1"].encode()
        image2=data["image2"].encode()
        return face_recognition(image1,image2)
    except Exception as e:
        print(e)
        return jsonify(msg="出错了,请查看是否正确访问")
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=6000, debug=True, use_reloader=False)
api文件
import os
import sys
import time
import json
import base64
import requests
url = "http://0.0.0.0:6000"
base64_data=None
base64_data = base64.b64encode(base64_data,encoding="utf-8")
base64_data = base64_data.decode()
data={
    'image1':None,
    'image2':None
}
start_time = time.time()
response = requests.post(url, data=json.dumps(data))
end_time = time.time()
print("time:", end_time-start_time)
print(response.text)

在你的代码中,你需要将传入的图片信息进行解码。

在调用 face_recognition 函数时,你需要将图片解码后传入函数。

例如:

image1 = base64.b64decode(data["image1"].encode())
image2 = base64.b64decode(data["image2"].encode())

sim = face_recognition(image1, image2)

另外,你需要修改 face_recognition 函数,将 get_img1 和 get_img2 改为 image1 和 image2。

例如:

def face_recognition(image1, image2):
emb1 = face_recognition(image1)[OutputKeys.IMG_EMBEDDING]
emb2 = face_recognition(image2)[OutputKeys.IMG_EMBEDDING]
sim = np.dot(emb1[0], emb2[0])
return (f'Face cosine similarity={sim:.3f}, get_img1:{image1} get_img2:{image2}')

另外,你还需要在 api 文件中修改 base64_data 的赋值方式。

例如:

with open("image1.jpg", "rb") as f:
base64_data = base64.b64encode(f.read())
base64_data = base64_data.decode()

data = {
'image1': base64_data,
'image2': base64_data
}

最后,你需要将 face_recognition 函数的返回值进行处理,返回给 api 调用的程序。

例如:

sim = face_recognition(image1, image2)
return jsonify(sim)

Flask+人脸识别—将人脸识别的结果呈现在网页中
可以借鉴下
https://blog.csdn.net/ke9700w1011/article/details/124919053


@app.route('/face/upload',methods=['POST','GET'])
def rec_face():
    if request.method == 'POST':
        file = request.files['file']
        if file and allowed_file(file.filename):
            rec_face_result = rec_faceTask(file)
            app.logger.info("file %s",file)
            if rec_face_result is None:
                return '未匹配到对应人脸'
            return rec_face_result
        else:
            return '非法文件'
    else:
        return '非法请求'

比对

def rec_faceTask(file):
    return compare(getImageFaceEncodingData(file))

file_path_or_stream 为路径或者文件参数都可以


# 从图像中获取人脸数据
def getImageFaceEncodingData(file_path_or_stream):
    image_data = face_recognition.load_image_file(file_path_or_stream)
    face_data = face_recognition.face_encodings(image_data,None,1,'large')
    if len(face_data) == 0:
        return None    
    else:
        return face_data
face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)

你的api代码中图像是base64编码的,而你的后面服务代码中接收base64图片后并未解码成img对象,故此直接调用face_recognition函数报错

face_recognition中的两个image爆红,需要解码然后传入函数。python部分红是可以跑的,只是给定变量可能是null,也可能是跳出

在 Flask 应用中,可以使用 request.form 来获取表单数据,或者使用 request.get_data() 来获取原始的请求数据。但是,这些数据通常都是字符串类型的,需要将其解码成图像数据。可以使用 Python 的 base64 模块来将图像数据编码成 base64 编码的字符串,然后在请求中将图像数据作为 base64 字符串发送,在 Flask 应用中再将其解码成图像数据。

在的 Flask 应用中,需要在 first_post 函数的开头添加一个步骤来解码请求中的 base64 编码的图像数据,然后将其转换为图像数据(例如使用 numpy 模块或 OpenCV 模块)。然后就可以将这两张图像数据作为参数传递给 face_recognition 函数,并计算相似度。

在 Flask 应用中,可以使用 return jsonify(result=result) 的方式将结果以 JSON 格式返回给客户端。也可以使用 make_response 函数来创建响应对象,然后设置响应对象的 data 属性来设置响应数据。

例如,可以将 face_recognition 函数的返回值赋值给一个变量 result,然后使用如下代码将结果返回给客户端:

Copy code
response = make_response(jsonify(result=result))
return response
关于将变量设置为全局变量的问题,我不建议这样做。在 Flask 应用中,应该尽量避免使用全局变量,因为它们可能导致程序的可维护性和可测试性降低。

你这里定义了一个 face_recognition 函数,用来进行人脸识别。但是在函数内部没有使用到传入的参数 get_img1 和 get_img2。可以将这两个参数的值赋给变量 get_img1 和 get_img2,然后再使用它们进行人脸识别。

在 first_post 函数中解析的 image1 和 image2 是字符串,需要将它们转换为图像格式(例如 numpy 数组),才能在后续的人脸识别中使用。可以使用 Python 图像处理库(例如 OpenCV 或 Pillow)来将字符串转换为图像格式。