这是接口的代码:
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):
# emb1 = face_recognition(image1)[OutputKeys.IMG_EMBEDDING]
# emb2 = face_recognition(image2)[OutputKeys.IMG_EMBEDDING]
# sim = np.dot(emb1[0], emb2[0])
# sim=face_recognition(image1, image2)
# return jsonify(sim)
# return (f'Face cosine similarity={sim:.3f}, get_img1:{image1} get_img2:{image2}')
app = Flask(__name__)
app.config["JSON_AS_ASCII"] = False
def making_response(json_data):
response = make_response(jsonify(json_data))
response.headers['Content-Type'] = 'application/json;charset=UTF-8'
return response
@app.route("/",methods=["POST"])
def first_post():
my_json = {"msg": None,
"sim": None
}
data = request.get_data()
if not data:
my_json["msg"] = "No data obtained!"
try:
data=json.loads(data)
image1 = base64.b64decode(data["image1"].encode())
image2 = base64.b64decode(data["image2"].encode())
# image1_base64 = data["image1"].encode()
# image2_base64 = data["image2"].encode()
image1 = cv2.imdecode(np.frombuffer(image1, np.uint8), cv2.IMREAD_ANYCOLOR) #cv2.IMREAD_UNCHANGED
image2 = cv2.imdecode(np.frombuffer(image2, np.uint8), cv2.IMREAD_ANYCOLOR)
emb1 = face_recognition(image1)[OutputKeys.IMG_EMBEDDING]
emb2 = face_recognition(image2)[OutputKeys.IMG_EMBEDDING]
sim = np.dot(emb1[0], emb2[0])
print(sim)
my_json["msg"] = "successful!"
my_json["sim"] = sim
# face_recognition(image1,image2)
except Exception as e:
print(e)
my_json["msg"] = "出错了,请检查是否正确访问!"
response = making_response(my_json)
return response
response = make_response(jsonify(my_json))
response.headers['Content-Type'] = 'application/json;charset=UTF-8'
return response
if __name__ == "__main__":
app.run(host='0.0.0.0', port=12000, debug=True, use_reloader=False)
这是我测试用的代码:
import os
import time
import json
import base64
import random
import requests
IMG_FORMATS = ['bmp', 'jpg', 'jpeg', 'png', 'tif', 'tiff', 'dng', 'webp', 'mpo']
# 文件目录遍历,返回[fileP, fileN]
def get_filepaths(path):
pathlists = []
for root, dirs, files in os.walk(path):
for file in files:
pathlists.append([os.path.join(root, file), file])
return pathlists
class api_test:
def __init__(self):
self.url = "http://0.0.0.0:12000/" # nginx url
@staticmethod
def read_img_base64(p):
with open(p, 'rb') as f:
imgString = base64.b64encode(f.read())
base64_data = imgString.decode()
return base64_data
def send_post(self, img_path1,img_path2):
base64_data1 = self.read_img_base64(img_path1)
base64_data2 = self.read_img_base64(img_path2)
#image_name = str(img_path)
data = {
"image1": base64_data1,
"image2": base64_data2
}
session = requests.session()
start_time = time.time()
response = session.post(self.url, json.dumps(data)) # Json格式请求
end_time = time.time()
run_time = end_time - start_time
# logger.info('接口调用时间为:%s' % run_time)
# logger.info(response.status_code)
# logger.info(response.text)
session.close()
response.close()
if __name__ == "__main__":
# 开始单元测试
api = api_test()
# 单张图片测试
img_path1 = './样本.jpg'
img_path2 = './样本1.jpg'
res = api.send_post(img_path1,img_path2)
print(res)
######
Press CTRL+C to quit
/opt/conda/lib/python3.7/site-packages/mmdet/core/anchor/anchor_generator.py:333: UserWarning: ``grid_anchors`` would be deprecated soon. Please use ``grid_priors``
warnings.warn('``grid_anchors`` would be deprecated soon. '
/opt/conda/lib/python3.7/site-packages/mmdet/core/anchor/anchor_generator.py:370: UserWarning: ``single_level_grid_anchors`` would be deprecated soon. Please use ``single_level_grid_priors``
'``single_level_grid_anchors`` would be deprecated soon. '
127.0.0.1 - - [29/Dec/2022 11:20:27] "POST / HTTP/1.1" 500 -
这是print输出的结果:-0.11088603
这是测试代码得到的结果:None
PS:
这个模型是魔塔社区的模型 我用来练习使用的,如果各位需要测试使用的话可以直接去https://www.modelscope.cn/models/damo/cv_ir101_facerecognition_cfglint/summary 打开使用测试
你的函数没有返回值,没有return ,res 就是None
如果您在使用测试代码访问 Flask 接口时只能收到 "None",可能是因为 Flask 接口没有正确处理您的请求,或者在返回响应时出现了问题。下面是一些可能有帮助的建议:
在 Flask 接口代码中使用 print 语句调试,检查请求和响应的数据是否正确。例如,您可以打印 request.get_data() 的结果,以确保它正确获取了数据。
检查 Flask 接口代码中是否存在错误,例如语法错误或缺少必要的参数。使用 try-except 语句捕获错误,并在 except 块中打印错误信息,以了解问题的原因。
在 Flask 接口代码中检查返回响应的方式是否正确。例如,您可以使用 return 语句将数据返回给测试代码,也可以使用 jsonify 函数将数据转换为 JSON 格式并返回。
检查测试代码是否正确访问 Flask 接口,例如是否使用了正确的 URL 和请求方法。
希望这些建议能帮助您解决问题。
send_post函数没有返回值,在该函数最后加上
return json.loads(response)['sim']
看起来你的代码是没有问题的。您说的“在最后会出现一个"POST / HTTP/1.1" 500 -的信息”指的是服务器端返回的状态码为 500,表示服务器内部发生了错误。这可能是由于在调用 face_recognition 函数时出现了错误,导致服务器返回了 500 错误。
你可以尝试在调用 face_recognition 函数之前加上一个 try-except 语句,并在 except 块中打印出错误信息,以便更好地查看问题所在。
另外,你还可以尝试使用浏览器的开发者工具或者服务器日志来查看服务器端的错误信息,这可能有助于你找到问题的原因。
看下这篇实例【Flask用reqparse实现post方法时,parser.parse_args()的值为None的解决办法】,链接:https://blog.csdn.net/u010445540/article/details/52861197