Image-To-Story / app.py
kartik91's picture
image to story
6dc5be7 verified
raw
history blame
2.8 kB
from transformers import pipeline
from langchain_core.runnables import RunnableLambda
from langchain_huggingface import HuggingFacePipeline
from PIL import Image
pipe1 = pipeline("object-detection", model="facebook/detr-resnet-50")
pipe2 = pipeline("image-to-text", model="nlpconnect/vit-gpt2-image-captioning")
repo_id = "mistralai/Mistral-7B-Instruct-v0.2"
llm = HuggingFacePipeline.from_model_id(
model_id=repo_id,
task="text-generation",
pipeline_kwargs={"max_length": 100,"temperature":0.5},
)
def reduce_add(a):
ll=dict()
for i in a:
if i['score'] > 0.89:
if i['label'] not in ll.keys():
ll[i['label']] = 1
else:
ll[i['label']]+=1
return "there are \n"+', \n'.join([str(i[1])+' '+i[0] for i in ll.items() ])
def image_segmentation_tool(image: str):
# image = Image.open(image_path)
segmentation_results = pipe1(image)
if reduce_add(segmentation_results) == "there are \n":
raise Passs()
return reduce_add(segmentation_results)
def image_caption_tool(image: str):
# image = Image.open(image_path)
segmentation_results = pipe2(image)
if segmentation_results[0]["generated_text"] == "":
raise Passs("no result found use different image to create story")
return segmentation_results[0]["generated_text"]
from langchain_core.prompts import PromptTemplate
def story_generation_tool(segmentation_results):
prompt_template = """
You are a storyteller. Based on the following segmentation results, create a story:
{segmentation_results}
Story:
"""
prompt = PromptTemplate.from_template(prompt_template)
story = prompt | llm
return story.invoke(input={"segmentation_results":segmentation_results})
# def translation_tool(english_text):
# prompt_template = """
# You are a translator. Translate the following English text to Hindi:
# {english_text}
# Translation:
# """
# prompt = PromptTemplate.from_template(prompt_template)
# translation = prompt | llm
# return translation.invoke(input={"english_text": english_text})
runnable = RunnableLambda(image_segmentation_tool).with_fallbacks([RunnableLambda(image_caption_tool)])
runnable2 = RunnableLambda(story_generation_tool)
# runnable3 = RunnableLambda(translation_tool)
chain = runnable | runnable2
import gradio as gr
title = "Image to short Story Generator"
description = """
Upload an image, and this app will generate a short story based on the image.
"""
def sepia(input_img):
sepia_img=chain.invoke(input_img)
return sepia_img
demo = gr.Interface(sepia, gr.Image(type='pil'), "textarea",title=title,
description=description,live=True
)
if __name__ == "__main__":
demo.launch()