shikibu9419's picture
Fix full color bug
5513895
# from flask import Flask, request, jsonify, render_template, make_response
# from flask_cors import CORS
from fastapi import FastAPI, File, UploadFile, Form, Response
from fastapi.middleware.cors import CORSMiddleware
import uvicorn
import logging
import numpy as np
import cv2
from src.color_controls import control_kelvin, control_contrast, control_HSV
from src.cyano import Cyanotype
from src.prediction import predict_img, optimize_img, update_patch
from src.utils import cv_to_pil, pil_to_cv
app = FastAPI()
logger = logging.getLogger('uvicorn')
origins = [
"http://localhost",
"http://localhost:8081",
"https://digitalnaturegroup.github.io/critique-computational-alternative-process",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
def to_byte_response(img):
return cv2.imencode('.png', img)[1].tobytes()
# UPLOAD_FOLDER = './uploads'
# app = Flask(__name__, template_folder='/client', static_folder='/client')
#
# app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
#
# CORS(
# app,
# supports_credentials=True
# )
@app.get("/")
def read_root():
return {"status": "ok"}
@app.get("/api/health_check")
def health_check():
return {"status": "ok"}
@app.post('/api/process')
async def process(
hue: str = Form(...),
saturation: str = Form(...),
lightness: str = Form(...),
contrast: str = Form(...),
kelvin: str = Form(...),
img: UploadFile = File(...)
):
# logger.info(img)
# imgfile = request.files['img']
# img_array = np.asarray(bytearray(imgfile.stream.read()), dtype=np.uint8)
img_array = np.frombuffer(await img.read(), dtype=np.uint8)
img_array = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
logger.info(img)
logger.info(img_array)
logger.info(img_array.shape)
# data = request.form
hue_int = int(hue)
saturation_int = float(saturation)
lightness_int = float(lightness)
contrast_int = int(contrast)
kelvin_int = int(kelvin)
img_array = control_contrast(img_array, contrast_int)
img_array = control_HSV(img_array, hue_int, saturation_int, lightness_int)
img_pil = cv_to_pil(img_array)
img_pil = control_kelvin(img_pil, kelvin_int)
processed_img = pil_to_cv(img_pil)
return Response(content=to_byte_response(processed_img), media_type="image/png")
@app.post('/api/predict/{process_name}')
async def predict(
process_name: str,
img: UploadFile = File(...)
):
if not process_name in ['cyanotype_mono', 'cyanotype_full', 'salt', 'platinum']:
return { 'error': 'process name is invalid' }
img_array = np.frombuffer(await img.read(), dtype=np.uint8)
img_array = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
# if 'colorpatch' in request.files:
# patchfile = request.files['colorpatch']
# patch_array = np.asarray(bytearray(patchfile.stream.read()), dtype=np.uint8)
# colorpatch = cv2.imdecode(colorpatch_array, cv2.IMREAD_COLOR)
# update_patch(process_name, colorpatch)
predicted_img = predict_img(process_name, img_array)
return Response(content=to_byte_response(predicted_img), media_type="image/png")
@app.post('/api/optimize/{process_name}')
async def optimize(
process_name: str,
img: UploadFile = File(...)
):
if not process_name in ['cyanotype_mono', 'cyanotype_full', 'salt', 'platinum']:
return { 'error': 'process name is invalid' }
img_array = np.frombuffer(await img.read(), dtype=np.uint8)
img_array = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
# if 'colorpatch' in request.files:
# patchfile = request.files['colorpatch']
# patch_array = np.asarray(bytearray(patchfile.stream.read()), dtype=np.uint8)
# colorpatch = cv2.imdecode(colorpatch_array, cv2.IMREAD_COLOR)
# update_patch(process_name, colorpatch)
(opt_img, preview_img) = optimize_img(process_name, img_array)
h, w = preview_img.shape[:2]
preview_img = np.reshape(preview_img, (h, w, 3))
if process_name.endswith('full'):
opt_img = np.reshape(opt_img, (h, w, 3))
else:
opt_img = np.reshape(opt_img, (h, w, 1))
opt_img = np.array([[[i[0]] * 3 for i in j] for j in opt_img], dtype=np.uint8)
optimized_img = cv2.hconcat([opt_img, preview_img])
return Response(content=to_byte_response(optimized_img), media_type="image/png")
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)