Spaces:
Sleeping
Sleeping
from fastapi import FastAPI, UploadFile, File | |
from transformers import pipeline | |
from fastai.vision.all import * | |
from PIL import Image | |
# NOTE - we configure docs_url to serve the interactive Docs at the root path | |
# of the app. This way, we can use the docs as a landing page for the app on Spaces. | |
app = FastAPI(docs_url="/") | |
pipe = pipeline("text2text-generation", model="google/flan-t5-small") | |
categories = ('Heart', 'Oblong', 'Oval', 'Round', 'Square') | |
learn = load_learner('model.pkl') | |
def generate(text: str): | |
""" | |
Using the text2text-generation pipeline from `transformers`, generate text | |
from the given input text. The model used is `google/flan-t5-small`, which | |
can be found [here](https://huggingface.co/google/flan-t5-small). | |
""" | |
output = pipe(text) | |
return {"output": output[0]["generated_text"]} | |
async def face_analyse(file: UploadFile = File(...)): | |
# Read the uploaded file content | |
request_object_content = await file.read() | |
try: | |
# Attempt to open the image | |
img = Image.open(io.BytesIO(request_object_content)) | |
except Exception as e: | |
return {"error": "Failed to open the image file. Make sure it is a valid image file."} | |
# Check if img is None or not | |
if img is None: | |
return {"error": "Failed to open the image file."} | |
try: | |
# Resize the image to 300x300 pixels | |
img = img.resize((300, 300)) | |
except Exception as e: | |
return {"error": "Failed to resize the image."} | |
try: | |
# Assuming 'learn' is your image classifier model | |
pred, idx, probs = learn.predict(img) | |
except Exception as e: | |
return {"error": "Failed to make predictions."} | |
# Assuming categories is a list of category labels | |
return dict(zip(categories, map(float, probs))) | |
# Initialize the Meta-Llama-3-70B-Instruct pipeline | |
llama_model_id = "meta-llama/Meta-Llama-3-70B-Instruct" | |
llama_pipeline = pipeline( | |
"text-generation", | |
model=llama_model_id, | |
model_kwargs={"torch_dtype": torch.bfloat16}, | |
device_map="auto", | |
) | |
def frame_details(text: str): | |
""" | |
Extract structured information from a given text about frames using the | |
Meta-Llama-3-70B-Instruct model. The model will output details like price, color, etc. | |
""" | |
messages = [ | |
{"role": "system", "content": "You are an api chatbot for frames and glasses who always responds with only a json. Extract the infomation given into a structured json for frame details"}, | |
{"role": "user", "content": text}, | |
] | |
terminators = [ | |
llama_pipeline.tokenizer.eos_token_id, | |
llama_pipeline.tokenizer.convert_tokens_to_ids("") | |
] | |
outputs = llama_pipeline( | |
messages, | |
max_new_tokens=256, | |
eos_token_id=terminators, | |
do_sample=True, | |
temperature=0.6, | |
top_p=0.9, | |
) | |
# Extract the last generated text from the output | |
generated_text = outputs[0]["generated_text"] | |
# Parse the generated text to extract structured information (this is an example and should be customized) | |
# Here, you would add your own logic to parse the generated text | |
# For now, we'll assume the generated text is in JSON format | |
try: | |
extracted_info = eval(generated_text) # It's recommended to use `json.loads` in a real application | |
except Exception as e: | |
return {"error": "Failed to parse the generated text."} | |
return extracted_info | |
if __name__ == "__main__": | |
import uvicorn | |
uvicorn.run(app, host="0.0.0.0", port=8000) |