我正在尝试使用Flask和深度人脸库制作一个人脸识别API。但我无法打开图像,这给了我不同的错误。请给我一个解决方案。
代码:
@app.route('/detect', methods=['POST'])
def recognize():
image_path = request.files.get('image')
try:
analysis = DeepFace.analyze(image_path)
return jsonify(analysis)
except Exception as e:
return jsonify({'error': str(e)})
错误
"error": "object of type 'FileStorage' has no len()"
尝试打开图像
with open(image_path, 'r') as image:
analysis = DeepFace.analyze(image)
return jsonify(analysis)
我得到错误
{"errors": "expected str, bytes or os.PathLike object, not FileStorage"}
我认为image_path
持有类型为FileStorage
的对象,该对象知道文件的位置,而不持有实际的图像数据。首先你需要加载图像文件,然后尝试分析它
werkzeugFileStorage
对象有几个方法,正如我在另一个答案中所记录的那样。
听起来你需要先将图像保存到一个临时位置,然后再进行分析。
我会在你的服务器上创建一个名为uploads
的目录,然后在应用程序配置中设置:
app.config['UPLOAD_FOLDER'] = 'uploads'
然后在路由中,使用uuid.uuid4
函数创建一个临时文件名。类似于:
from uuid import uuid4
@app.route('/detect', methods=['POST'])
def recognize():
tmp_fname = os.path.join(app.config['UPLOAD_FOLDER'], uuid4().__str__())
image = request.files['image']
image.save(tmp_fname)
try:
analysis = DeepFace.analyze(tmp_fname)
return jsonify(analysis)
except Exception as e:
return jsonify({'error': str(e)})
这会将保存的映像保留在文件系统中,因此您可能希望对此目录进行一些清理,或者在运行分析后执行类似os.remove('tmp_fname')
的操作。
我不确定Deepface.analyze
是否接受流作为它的第一个参数。README建议它只接受作为字符串的文件名。您可以尝试使用Deepface.analyze(image.stream)
来避免保存临时文件(将所有内容都保存在内存中(,但这可能不受支持。