无法打开从request.files.get()获得的图像文件



我正在尝试使用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)来避免保存临时文件(将所有内容都保存在内存中(,但这可能不受支持。

最新更新