Mikhaylov Alexey
memory cache mask
d4adb6a
import gradio as gr
import requests
import zipfile
import io
from PIL import Image
import openai
import os
from scipy import ndimage
# from dotenv import load_dotenv
import numpy as np
import hashlib
import queue
# load_dotenv()
cache = dict()
que = queue.Queue(30)
def save_to_memory_cache(key, file):
print('save mask')
cache[key] = file
que.put(key)
if que.full():
rkey = que.get()
del cache[rkey]
def get_circle_footprint(size):
xx, yy = np.mgrid[0:size * 2, 0:size * 2]
fp = ((xx - size) ** 2 + (yy - size) ** 2) < (size) ** 2
return fp
def request_mask(img_path):
removebg_api_key = os.getenv('REMOVEBG_API_KEY')
response = requests.post(
'https://api.remove.bg/v1.0/removebg',
files={'image_file': open(img_path, 'rb')},
data={
'size': 'auto',
'format': 'zip'
},
headers={'X-Api-Key': removebg_api_key},
)
if response.status_code == requests.codes.ok:
zipFile = zipfile.ZipFile(io.BytesIO(response.content))
maskImFile = zipFile.read('alpha.png')
return maskImFile
else:
print("Error:", response.status_code, response.text)
return None
def get_file_hash(path):
with open(path, 'rb') as inputfile:
fh = hashlib.sha256()
fb = inputfile.read(65536)
while len(fb) > 0:
fh.update(fb)
fb = inputfile.read(65536)
return fh.hexdigest()
def process_image(prompt, img_path, mask_margin):
openai.api_key = os.getenv('OPENAI_API_KEY')
hsh = get_file_hash(img_path)
print('hash',hsh)
maskImFile = None
if hsh in cache:
maskImFile = cache[hsh]
else:
maskImFile = request_mask(img_path)
if maskImFile != None:
save_to_memory_cache(hsh, maskImFile)
else:
print('no mask received')
return 'https://i.imgur.com/DUd0OWN.png'
maskIm = Image.open(io.BytesIO(maskImFile))
alpha = maskIm.getchannel(0)
if mask_margin > 0:
inflated_alpha = ndimage.maximum_filter(input=np.array(
alpha), footprint=get_circle_footprint(mask_margin))
alpha = Image.fromarray(np.uint8(inflated_alpha))
maskIm.paste((255), [0, 0, maskIm.size[0], maskIm.size[1]])
maskIm.putalpha(alpha)
maskFile = io.BytesIO()
maskIm.save(maskFile, format='PNG')
maskFile.seek(0)
response = openai.Image.create_edit(
image=open(img_path, "rb"),
mask=maskFile,
prompt=prompt,
n=1,
size="512x512"
)
return response['data'][0]['url']
# demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo = gr.Interface(process_image, inputs=[
'text',
gr.Image(type='filepath', shape=(500, 500), label='image'),
gr.Slider(minimum=0, maximum=10, value=5, step=1, label="mask margin")
], outputs=["image"])
demo.launch()