DPR / app.py
nagasurendra's picture
Update app.py
2552b80 verified
raw
history blame
4.67 kB
from transformers import BlipProcessor, BlipForConditionalGeneration
from PIL import Image
import gradio as gr
import torch
from datetime import datetime
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib import colors
# Load BLIP model and processor
processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-base")
model = BlipForConditionalGeneration.from_pretrained("Salesforce/blip-image-captioning-base")
model.eval()
device = "cuda" if torch.cuda.is_available() else "cpu"
model.to(device)
# Inference function to generate captions dynamically based on image content
def generate_captions_from_image(image):
if image.mode != "RGB":
image = image.convert("RGB")
# Preprocess the image and generate a caption
inputs = processor(image, return_tensors="pt").to(device, torch.float16)
output = model.generate(**inputs, max_new_tokens=50)
caption = processor.decode(output[0], skip_special_tokens=True)
return caption
# Function to save DPR text to a PDF file
def save_dpr_to_pdf(dpr_text, filename):
try:
# Create a PDF document
doc = SimpleDocTemplate(filename, pagesize=letter)
styles = getSampleStyleSheet()
# Define custom styles
title_style = ParagraphStyle(
name='Title',
fontSize=16,
leading=20,
alignment=1, # Center
spaceAfter=20,
textColor=colors.black,
fontName='Helvetica-Bold'
)
body_style = ParagraphStyle(
name='Body',
fontSize=12,
leading=14,
spaceAfter=10,
textColor=colors.black,
fontName='Helvetica'
)
# Build the PDF content
flowables = []
# Add title
flowables.append(Paragraph("Daily Progress Report", title_style))
# Split DPR text into lines and add as paragraphs
for line in dpr_text.split('\n'):
# Replace problematic characters for PDF
line = line.replace('\u2019', "'").replace('\u2018', "'")
if line.strip():
flowables.append(Paragraph(line, body_style))
else:
flowables.append(Spacer(1, 12))
# Build the PDF
doc.build(flowables)
return f"PDF saved successfully as {filename}"
except Exception as e:
return f"Error saving PDF: {str(e)}"
# Function to generate the daily progress report (DPR) text and save as PDF
def generate_dpr(files):
dpr_text = []
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# Add header to the DPR
dpr_text.append(f"Daily Progress Report\nGenerated on: {current_time}\n")
# Process each uploaded file (image)
for file in files:
# Open the image from file path
image = Image.open(file.name) # Using file.name for filepath
if image.mode != "RGB":
image = image.convert("RGB")
# Dynamically generate a caption based on the image
caption = generate_captions_from_image(image)
# Generate DPR section for this image with dynamic caption
dpr_section = f"\nImage: {file.name}\nDescription: {caption}\n"
dpr_text.append(dpr_section)
# Combine DPR text
dpr_output = "\n".join(dpr_text)
# Generate PDF filename with timestamp
pdf_filename = f"DPR_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.pdf"
# Save DPR text to PDF
pdf_result = save_dpr_to_pdf(dpr_output, pdf_filename)
# Return the DPR text and the PDF file path for download
return dpr_output + f"\n\n{pdf_result}", pdf_filename
# Gradio interface for uploading multiple files, displaying DPR, and downloading PDF
iface = gr.Interface(
fn=generate_dpr,
inputs=gr.Files(type="filepath", label="Upload Site Photos"), # Handle batch upload of images
outputs=[
gr.Textbox(label="Daily Progress Report"), # Display DPR text
gr.File(label="Download PDF") # Provide PDF download link
],
title="Daily Progress Report Generator",
description="Upload up to 10 site photos. The AI model will dynamically detect construction activities, materials, and progress and generate a text-based Daily Progress Report (DPR). The DPR will also be saved as a PDF, which you can download.",
allow_flagging="never" # Optional: Disable flagging
)
if __name__ == "__main__":
iface.launch()