Trato de hacer un código para la transferencia de estilo de imagen basado en fastapi.
Hice el código haciendo referencia a muchos artículos en Github y stack overflow, lo encontré efectivo para convertir el byte de la imagen en base64 y transmitirlo.
Entonces, diseñé el código de mi cliente, se codificó en base64 y envié una solicitud, y mi servidor la recibió perfectamente.
Sin embargo, enfrenté dificultades para restaurar bytes de imagen a ndarray.
Mi código me dice los siguientes errores:
image_array = np.frombuffer(base64.b64decode(image_byte)).reshape(image_shape) ValueError: cannot reshape array of size 524288 into shape (512,512,4)Este es mi código de cliente:
import base64 import requests import numpy as np import json from matplotlib.pyplot import imread from skimage.transform import resize if __name__ == '__main__': path_to_img = "my image path" image = imread(path_to_img) image = resize(image, (512, 512)) image_byte = base64.b64encode(image.tobytes()) data = {"shape": image.shape, "image": image_byte.decode()} response = requests.get('http://127.0.0.1:8000/myapp/v1/filter/a', data=json.dumps(data))y, Este es mi código de servidor:
import json import base64 import uvicorn import model_loader import numpy as np from fastapi import FastAPI from typing import Optional app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/myapp/v1/filter/a") async def style_transfer(data: dict): image_byte = data.get('image').encode() image_shape = tuple(data.get('shape')) image_array = np.frombuffer(base64.b64decode(image_byte)).reshape(image_shape) if __name__ == '__main__': uvicorn.run(app, port='8000', host="127.0.0.1")Por favor revisa mi código y dame algunos consejos. Realmente no sé lo que me estoy perdiendo.
Como se mencionó anteriormente aquí , aquí y aquí , se debe usar UploadFile para cargar archivos desde aplicaciones cliente. Por ejemplo:
lado del servidor:
@app.post("/upload") async def upload(file: UploadFile = File(...)): try: contents = await file.read() with open(file.filename, 'wb') as f: f.write(contents) except Exception: return {"message": "There was an error uploading the file"} finally: await file.close() return {"message": f"Successfuly uploaded {file.filename}"}lado del cliente:
import requests url = 'http://127.0.0.1:8000/upload' file = {'file': open('images/1.png', 'rb')} resp = requests.post(url=url, files=file) print(resp.json()) Sin embargo, si aún necesita enviar una imagen codificada en base64 , puede hacerlo como se describió anteriormente aquí (Opción 2). En el lado del cliente, puede codificar la imagen en base64 y enviarla mediante una solicitud POST de la siguiente manera:
with open("photo.png", "rb") as image_file: encoded_string = base64.b64encode(image_file.read()) payload ={"filename": "photo.png", "filedata": encoded_string} resp = requests.post(url=url, data=payload) En el lado del servidor, puede recibir la imagen usando un campo de Form y decodificar la imagen de la siguiente manera:
@app.post("/upload") async def upload(filename: str = Form(...), filedata: str = Form(...)): image_as_bytes = str.encode(filedata) # convert string to bytes img_recovered = base64.b64decode(image_as_bytes) # decode base64string try: with open("uploaded_" + filename, "wb") as f: f.write(img_recovered) except Exception: return {"message": "There was an error uploading the file"} return {"message": f"Successfuly uploaded {filename}"}