Spaces:
Sleeping
Sleeping
File size: 3,308 Bytes
e5c238d 68780eb a97d8ed 68780eb cf06554 68780eb e5c238d 68780eb d2236a2 68780eb e5c238d 68780eb 6d771df 68780eb e5c238d 68780eb 6d771df 68780eb 6d771df 68780eb 6d771df 68780eb e5c238d 68780eb d2236a2 6d771df 68780eb 6d771df 68780eb d2236a2 68780eb d2236a2 68780eb d2236a2 68780eb d2236a2 6d771df 68780eb e5c238d 68780eb 6d771df 68780eb e5c238d 68780eb e5c238d 68780eb d529638 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
import os
import io
import base64
import tempfile
from flask import Flask, render_template, request, jsonify
import google.generativeai as genai
from google.generativeai import types
from PIL import Image
# Configure Gemini API key using an environment variable
genai.configure(api_key=os.getenv("GEMINI_API_KEY"))
# Initialize Flask app
app = Flask(__name__)
def save_image(image_data):
"""Save the image from a base64 string to a temporary file and return its path."""
# Expected format: "data:image/png;base64,...."
header, encoded = image_data.split(',', 1)
image_bytes = base64.b64decode(encoded)
image = Image.open(io.BytesIO(image_bytes))
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".png")
image.save(temp_file, "PNG")
return temp_file.name
def remove_object_from_image(image_path, object_type):
"""Use Gemini API to remove a specified object from the image."""
# Upload the image file to Gemini using the module-level function.
uploaded_file = genai.files.upload(file=image_path)
# Prepare the input parts:
# 1. The image file.
parts = [types.Part.from_uri(file_uri=uploaded_file.uri, mime_type="image/png")]
# 2. The Gemini magic text instructing removal.
if object_type:
parts.append(types.Part.from_text(text=f"Remove {object_type} from the image"))
contents = [types.Content(role="user", parts=parts)]
generate_content_config = types.GenerateContentConfig(
temperature=1,
top_p=0.95,
top_k=40,
max_output_tokens=8192,
response_modalities=["image", "text"],
safety_settings=[types.SafetySetting(category="HARM_CATEGORY_CIVIC_INTEGRITY", threshold="OFF")],
response_mime_type="text/plain",
)
result_image = None
# Use the module-level function to generate content.
for chunk in genai.models.generate_content_stream(
model="gemini-2.0-flash-exp-image-generation",
contents=contents,
config=generate_content_config,
):
if (chunk.candidates and chunk.candidates[0].content and
chunk.candidates[0].content.parts):
part = chunk.candidates[0].content.parts[0]
if part.inline_data:
file_name = "generated_output.png"
with open(file_name, "wb") as f:
f.write(part.inline_data.data)
result_image = file_name
return result_image
@app.route('/')
def index():
"""Render the main page."""
return render_template('index.html')
@app.route('/process', methods=['POST'])
def process_image():
"""Handle image processing via POST request."""
data = request.get_json()
image_data = data['image']
object_type = data['objectType']
# Save the uploaded image locally.
image_path = save_image(image_data)
try:
# Use Gemini to remove the object from the image.
result_image = remove_object_from_image(image_path, object_type)
return jsonify({'success': True, 'resultPath': result_image})
except Exception as e:
return jsonify({'success': False, 'message': str(e)})
if __name__ == '__main__':
# For local testing; in production, your hosting provider will manage the server.
app.run(host="0.0.0.0", port=7860) |