如何将Gradio应用转换为Flask API?

我正在尝试将Gradio应用转换为Flask API。在Gradio应用中,使用了诸如Image、Text等组件。我需要将这些组件转换为请求表单数据。然而,我在处理图像时遇到了困难。我需要一些帮助。

这是我的代码。cloth_image = gr.Image(label="Your label...", type="pil") cloth_mask_image = gr.Image(label="Your label...", type="pil")

如何通过预处理cloth_image = request.files['cloth_image']来获得与gr.Image组件相同的返回值?


回答:

如果您只需要在服务器上使用图像(作为PIL),那么您可以直接使用

from PIL import Imagecloth_image = Image.open( request.files["cloth_image"] )

因为files["cloth_image"].read()方法,所以它可以被视为文件对象,而Image.open()可以使用文件对象而不是文件名。

您可以在pillownumpy(以及opencv)之间进行转换

# 从pillow到numpy/opencvarr = numpy.array(cloth_image)# 从numpy/opencv到pillowcloth_image = Image.fromarray(arr)

opencv可能需要在RGBBGR之间转换颜色)


最简工作代码:

from flask import Flask, requestfrom PIL import Imageapp = Flask(__name__)@app.route('/', methods=['GET', 'POST'])def index():    if request.method == 'POST':        if "cloth_image" in request.files:            img = request.files["cloth_image"]  # 它有方法 .read() 所以可以被视为文件对象            cloth_image = Image.open(img)  # 它可以使用文件对象而不是文件名            # ... 处理图像 ...    return """    <form method="POST" enctype="multipart/form-data">    <input type="file" name="cloth_image">    <button type="submit">Send</button>    </form>"""if __name__ == '__main__':    app.run()

但是,如果您需要将其发送回去,那么您可能需要使用io.BytesIO将图像保存到内存中的文件对象中,将其转换为base64,并以以下方式显示

html = '<img src="data:image/png;base64,{}">'.format(data)

更复杂的代码,可以获取图像,绘制矩形并将其发送回浏览器。

from flask import Flask, requestfrom PIL import Image, ImageDrawimport ioimport base64app = Flask(__name__)@app.route('/', methods=['GET', 'POST'])def index():    img = 'empty'        if request.method == 'POST':        if "image" in request.files:            print(request.files)            # 获取图像            img = request.files["image"]   # 它有方法 .read()            # 读取到pillow            image = Image.open(img)            # 绘制一些内容            draw = ImageDraw.Draw(image)                                      # https://pillow.readthedocs.io/en/stable/reference/ImageDraw.html            draw.rectangle([(20,20), (280,280)], outline=(255,0,0), width=3)  # https://pillow.readthedocs.io/en/stable/reference/ImageDraw.html#PIL.ImageDraw.ImageDraw.rectangle            draw.text((15,5), "Hello World!")                                 # https://pillow.readthedocs.io/en/stable/reference/ImageDraw.html#PIL.ImageDraw.ImageDraw.text            # 转换为文件对象数据            obj = io.BytesIO()             # 在内存中保存文件以保存图像而不使用磁盘  #            image.save(obj, format='png')  # 保存到文件(BytesIO)                           # https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.save            obj.seek(0)            # 转换为base64            data = obj.read()              # 从文件(BytesIO)获取数据            data = base64.b64encode(data)  # 转换为base64字节            data = data.decode()           # 转换字节为字符串            # 转换为带嵌入图像的<img>            img = '<img src="data:image/png;base64,{}">'.format(data)    return '<form method="POST" enctype="multipart/form-data"><input type="file" name="image"><button type="submit">Send</button></form><br>' + imgif __name__ == '__main__':    app.run()

如果您需要在不重新加载页面情况下使用它,那么您可能需要使用JavaScript。但我跳过了这个问题。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注