Spaces:
Sleeping
Sleeping
# AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/04_openai_vision.ipynb. | |
# %% auto 0 | |
__all__ = ['SAMPLE_IMG_DIR', 'prompt1', 'extract_veg_ingredients', 'encode_image', 'format_image', 'get_gptv_completion'] | |
# %% ../nbs/04_openai_vision.ipynb 3 | |
import base64 | |
import json | |
import logging | |
import os | |
import statistics | |
import time | |
from functools import partial | |
from glob import glob | |
from logging.handlers import RotatingFileHandler | |
from pathlib import Path | |
import numpy as np | |
import requests | |
from PIL import Image | |
from openai import OpenAI | |
import constants | |
# %% ../nbs/04_openai_vision.ipynb 7 | |
SAMPLE_IMG_DIR = Path(f"{constants.ROOT_DIR}/assets/images/vegan_ingredients") | |
# %% ../nbs/04_openai_vision.ipynb 8 | |
def encode_image(image_path): | |
with open(image_path, "rb") as image_file: | |
return base64.b64encode(image_file.read()).decode("utf-8") | |
# %% ../nbs/04_openai_vision.ipynb 9 | |
# fmt: off | |
def format_image( | |
image: str, # Image file path | |
size: int = 300 | |
): | |
# fmt: on | |
img = Image.open(image) | |
width, height = img.size | |
ratio = min(size / width, size / height) | |
width_new, height_new = (round(width * ratio), round(height * ratio)) | |
width_new = int(np.round(width_new / 64.0)) * 64 | |
height_new = int(np.round(height_new / 64.0)) * 64 | |
img = img.resize((width_new, height_new)) | |
img = img.convert("RGB") | |
return img | |
# %% ../nbs/04_openai_vision.ipynb 17 | |
# https://platform.openai.com/docs/guides/vision/low-or-high-fidelity-image-understanding | |
def get_gptv_completion(prompt: str, img: str, detail="low"): | |
headers = { | |
"Content-Type": "application/json", | |
"Authorization": f"Bearer {os.environ['OPENAI_API_KEY']}", | |
} | |
payload = { | |
"model": "gpt-4o", | |
"messages": [ | |
{ | |
"role": "user", | |
"content": [ | |
{"type": "text", "text": prompt}, | |
{ | |
"type": "image_url", | |
"image_url": { | |
"url": f"data:image/jpeg;base64,{encode_image(img)}", | |
"detail": detail, | |
}, | |
}, | |
], | |
} | |
], | |
"max_tokens": 300, | |
} | |
response = requests.post( | |
"https://api.openai.com/v1/chat/completions", headers=headers, json=payload | |
) | |
return response.json()["choices"][0]["message"]["content"] | |
# %% ../nbs/04_openai_vision.ipynb 27 | |
prompt1 = "What vegan ingredients are in the image? Ouput as JSON list." | |
# %% ../nbs/04_openai_vision.ipynb 34 | |
extract_veg_ingredients = partial(get_gptv_completion, prompt1) | |