Spaces:
Paused
Paused
Upload folder using huggingface_hub
Browse files- assets/in.jpg +0 -0
- assets/out.jpg +0 -0
- config.json +6 -0
- gradio_sketch2image.py +1 -1
- i2i_sk.py +124 -0
- image_base64.txt +1 -0
- in/in.png +0 -0
- out/generated_image.png +0 -0
- out/out.txt +0 -0
- output_image.png +0 -0
- processed/in.jpg +0 -0
- processed/sketch 02.png +0 -0
assets/in.jpg
ADDED
![]() |
assets/out.jpg
ADDED
![]() |
config.json
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"prompt": "A beautiful landscape",
|
3 |
+
"style_name": "Fantasy art",
|
4 |
+
"seed": 42,
|
5 |
+
"val_r": 0.4
|
6 |
+
}
|
gradio_sketch2image.py
CHANGED
@@ -379,4 +379,4 @@ with gr.Blocks(css="style.css") as demo:
|
|
379 |
image.change(run, inputs=inputs, outputs=outputs, queue=False, api_name=False)
|
380 |
|
381 |
if __name__ == "__main__":
|
382 |
-
demo.queue().launch(debug=True)
|
|
|
379 |
image.change(run, inputs=inputs, outputs=outputs, queue=False, api_name=False)
|
380 |
|
381 |
if __name__ == "__main__":
|
382 |
+
demo.queue().launch(debug=True)
|
i2i_sk.py
ADDED
@@ -0,0 +1,124 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from flask import Flask, request, jsonify
|
2 |
+
from io import BytesIO
|
3 |
+
import base64
|
4 |
+
from PIL import Image
|
5 |
+
import torch
|
6 |
+
import torchvision.transforms.functional as F
|
7 |
+
from torch.cuda.amp import autocast
|
8 |
+
from flask_cors import CORS # Import CORS
|
9 |
+
|
10 |
+
from src.pix2pix_turbo import Pix2Pix_Turbo
|
11 |
+
|
12 |
+
app = Flask(__name__)
|
13 |
+
CORS(app) # Enable CORS for all routes
|
14 |
+
|
15 |
+
# Configuration Variables
|
16 |
+
model_type = "sketch_to_image_stochastic"
|
17 |
+
output_format = "PNG"
|
18 |
+
desired_size = (768, 768) # Increased resolution for better quality
|
19 |
+
|
20 |
+
# Load the model when the app starts
|
21 |
+
print("Loading model...")
|
22 |
+
model = Pix2Pix_Turbo(model_type)
|
23 |
+
print("Model loaded successfully.")
|
24 |
+
|
25 |
+
# Example styles list (update this with your actual styles)
|
26 |
+
style_list = [
|
27 |
+
{"name": "Cinematic", "prompt": "cinematic still {prompt} . emotional, harmonious, vignette, highly detailed, high budget, bokeh, cinemascope, moody, epic, gorgeous, film grain, grainy"},
|
28 |
+
{"name": "3D Model", "prompt": "professional 3d model {prompt} . octane render, highly detailed, volumetric, dramatic lighting"},
|
29 |
+
{"name": "Anime", "prompt": "anime artwork {prompt} . anime style, key visual, vibrant, studio anime, highly detailed"},
|
30 |
+
{"name": "Digital Art", "prompt": "concept art {prompt} . digital artwork, illustrative, painterly, matte painting, highly detailed"},
|
31 |
+
{"name": "Photographic", "prompt": "cinematic photo {prompt} . 35mm photograph, film, bokeh, professional, 4k, highly detailed"},
|
32 |
+
{"name": "Pixel art", "prompt": "pixel-art {prompt} . low-res, blocky, pixel art style, 8-bit graphics"},
|
33 |
+
{"name": "Fantasy art", "prompt": "ethereal fantasy concept art of {prompt} . magnificent, celestial, ethereal, painterly, epic, majestic, magical, fantasy art, cover art, dreamy"},
|
34 |
+
{"name": "Neonpunk", "prompt": "neonpunk style {prompt} . cyberpunk, vaporwave, neon, vibes, vibrant, stunningly beautiful, crisp, detailed, sleek, ultramodern, magenta highlights, dark purple shadows, high contrast, cinematic, ultra detailed, intricate, professional"},
|
35 |
+
{"name": "Manga", "prompt": "manga style {prompt} . vibrant, high-energy, detailed, iconic, Japanese comic style"},
|
36 |
+
]
|
37 |
+
|
38 |
+
styles = {k["name"]: k["prompt"] for k in style_list}
|
39 |
+
|
40 |
+
def process_image(image, prompt, prompt_template, style_name, seed, val_r):
|
41 |
+
image = image.convert("RGB")
|
42 |
+
|
43 |
+
# Convert image to tensor and threshold, then convert to float
|
44 |
+
image_t = F.to_tensor(image) > 0.5
|
45 |
+
image_t = image_t.float()
|
46 |
+
|
47 |
+
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
48 |
+
|
49 |
+
with torch.no_grad(), autocast():
|
50 |
+
# Move the tensor to the appropriate device
|
51 |
+
c_t = image_t.unsqueeze(0).to(device).float()
|
52 |
+
torch.manual_seed(seed)
|
53 |
+
B, C, H, W = c_t.shape
|
54 |
+
noise = torch.randn((1, 4, H // 8, W // 8), device=device) # Ensure noise is on the same device
|
55 |
+
|
56 |
+
# Pass through the model
|
57 |
+
output_image = model(c_t, prompt, deterministic=False, r=val_r, noise_map=noise)
|
58 |
+
|
59 |
+
output_pil = F.to_pil_image(output_image[0].cpu() * 0.5 + 0.5)
|
60 |
+
return output_pil
|
61 |
+
|
62 |
+
@app.route('/process-image', methods=['POST'])
|
63 |
+
def process_image_route():
|
64 |
+
data = request.get_json()
|
65 |
+
|
66 |
+
# Debugging: Print the raw received data
|
67 |
+
print("Received JSON data:", data)
|
68 |
+
|
69 |
+
if not data or 'image' not in data:
|
70 |
+
print("Error: No image provided")
|
71 |
+
return jsonify({"error": "No image provided"}), 400
|
72 |
+
|
73 |
+
# Decode the base64 image (remove the prefix 'data:image/png;base64,' if present)
|
74 |
+
image_data = data['image']
|
75 |
+
print("Received base64 image data (truncated):", image_data[:100]) # Print first 100 chars of base64 data
|
76 |
+
|
77 |
+
if image_data.startswith('data:image/png;base64,'):
|
78 |
+
image_data = image_data.split(",")[1]
|
79 |
+
|
80 |
+
try:
|
81 |
+
image_bytes = base64.b64decode(image_data)
|
82 |
+
image = Image.open(BytesIO(image_bytes))
|
83 |
+
except Exception as e:
|
84 |
+
print("Error decoding base64 image:", str(e))
|
85 |
+
return jsonify({"error": "Invalid image data"}), 400
|
86 |
+
|
87 |
+
# Retrieve other parameters
|
88 |
+
prompt = data.get('prompt', 'a cat')
|
89 |
+
style_name = data.get('style_name', 'Fantasy art').strip() # Strip any leading/trailing whitespace
|
90 |
+
seed = int(data.get('seed', 42))
|
91 |
+
val_r = float(data.get('val_r', 0.8))
|
92 |
+
|
93 |
+
# Debug: print available styles
|
94 |
+
print(f"Available styles: {list(styles.keys())}")
|
95 |
+
print(f"Received style name: {style_name}")
|
96 |
+
|
97 |
+
# Case-insensitive lookup
|
98 |
+
style_name = next((key for key in styles if key.lower() == style_name.lower()), None)
|
99 |
+
if not style_name:
|
100 |
+
print(f"Error: Style '{data.get('style_name')}' not found")
|
101 |
+
return jsonify({"error": f"Style '{data.get('style_name')}' not found"}), 400
|
102 |
+
|
103 |
+
prompt_template = styles[style_name]
|
104 |
+
|
105 |
+
print(f"Using style: {style_name} with prompt: {prompt}")
|
106 |
+
|
107 |
+
# Process the image
|
108 |
+
try:
|
109 |
+
processed_image = process_image(image, prompt, prompt_template, style_name, seed, val_r)
|
110 |
+
except Exception as e:
|
111 |
+
print("Error processing image:", str(e))
|
112 |
+
return jsonify({"error": "Failed to process image"}), 500
|
113 |
+
|
114 |
+
# Convert the processed image to base64
|
115 |
+
img_io = BytesIO()
|
116 |
+
processed_image.save(img_io, format=output_format)
|
117 |
+
img_io.seek(0)
|
118 |
+
img_base64 = base64.b64encode(img_io.getvalue()).decode('utf-8')
|
119 |
+
|
120 |
+
print("Processed image successfully, sending back to client")
|
121 |
+
return jsonify({"image": img_base64})
|
122 |
+
|
123 |
+
if __name__ == "__main__":
|
124 |
+
app.run(host='0.0.0.0', port=5000)
|
image_base64.txt
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAAO7ElEQVR4nO3dW4hV9d/H8Tk4jmPJP8HCTNMMxUrxQJjhobpJCsyyg4csKDp4UXohQlEeULOLCCo6QFohmJkRY0mB2GCRgUph2kFFCwWFSprQDho5M89FsJ+NPPD8S2XtvT+v19X+/cA13wtdb9dae/au7+rqqgMgT0PRAwBQDAEACCUAAKEEACCUAACEEgCAUAIAEEoAAEIJAEAoAQAIJQAAoQQAIJQAAIQSAIBQAgAQSgAAQgkAQCgBAAglAAChBAAglAAAhBIAgFACABBKAABCCQBAKAEACCUAAKEEACCUAACEEgCAUAIAEEoAAEIJAEAoAQAIJQAAoQQAIJQAAIQSAIBQAgAQSgAAQgkAQCgBAAglAAChBAAglAAAVLe33357//79/+IPCgBAFbv77rtnzJhx5513zps379SpU//oz9Z3dXWdo7EAOHcWLVq0YcOGr776qrRz4sSJHj16/PdH6HYOpgLg3Fq2bNmyZcvO8CBuAQFUmaVLly5atOi0zdtuu62xsfEfHUcAAKrJwoULFy9efNrmvffeu3bt2qampn90KM8AAKrGqVOnrrjiigMHDpR2hg8fvmbNmiFDhvTs2fOfHs0zAICqsXDhwu+++660HD58+LZt284777x/dzS3gACqQ2dn56FDh8pv26xfv/5fn/3rBACgWnz66adbtmwpLfv06dOt2xndxREAgCrw/fffz50794cffijtzJ8//7LLLjuTY3oGAFDp9uzZM27cuOPHj5d2WlpahgwZ4goAoJZt3br1+uuvLz/719XVTZw4cfLkyWd4ZAEAqGivvPLKTz/9VL4zcODAJUuWnH/++Wd4ZAEAqGgtLS3ly7Fjx7a1tV177bVnfmQBAKgaLS0tr7/++uWXX35WjiYAABWte/fupdfNzc3lyzMkAACVa8eOHW1tbaVlc3NzQ8NZO297GyhAhfr222+nTp1a/t7/2bNnDxgw4Gwd3xUAQCXq6uo67ezf0tJy3XXXuQUEUOP27t178ODB0rJ///4vv/zylClTzuKPcAsIoBKtWLGi9B2/TU1Na9eunThx4tn9Ea4AACrRrl27Sq8nTZp01s/+dQIAUJlK3+/Y1NT0/PPPn4sfIQAAlWju3LlDhw7t27fvvHnzBg0adC5+hK+EBKhQu3fvPnbs2KhRo3r16nUuji8AAKHcAgIIJQAAoQQAIJQAAIQSAIBQAgAQSgAAQgkAQCgBAAglAAChBAAglAAAhBIAgFACABBKAABCCQBAKAEACCUAAKEEACCUAACEEgCAUAIAEEoAAEIJAEAoAQAIJQAAoQQAIJQAAIQSAIBQAgAQSgAAQgkAQCgBAAglAAChBAAglAAAhBIAgFACABBKAABCCQBAKAEACCUAAKEEACCUAACEEgCAUAIAEEoAAEIJAEAoAQAIJQAAoQQAIJQAAIQSAIjz888/79mzp729vehBKJgAQJa9e/dOnz599OjR99xzz/79+4sehyIJAGTZtGlTW1vbn3/++eGHH65atarocSiSAECQffv2PfXUU6XlL7/8UuAwFE4AIMisWbOOHj1aWvbp06fAYSicAECK1tbWXbt2lZaXXHLJzJkzC5yHwgkARHj33XdnzZrV0dHx97KhoWHlypUjRowodiqKJQBQ+9ra2h566KGTJ0+WdqZOnXrTTTcVOBKVoL6rq6voGYBz6OjRo+PHjy9/x2fv3r23b98+ZMiQAqeiErgCgFrW2dn5xhtvlJ/9L7744jVr1jj7U+cKAGpeU1PTqVOn/n7dv3//devWjR8/vtiRqBCuAKBmrVq1auTIkaUHv3V1dYMHD3b2p6Rb0QMAZ19HR8eKFSsWL1582iX+448/XtRIVCABgFrT0dGxcOHCp59++rT9m2++efLkyYWMRGXyDABqTVdXV0PD6Xd3L7jggh07dnj2SznPAKCmdHR03HHHHfX19aWdESNGfPnll9u3bx88eHCBg1GBXAFATXn00UdffPHF8p3jx4/36tWrqHmoZK4AoHbs3bt38+bN5TvTp09vaWkpah4qnABAjfjxxx/vu+++ffv2lXZmz569evXqbt2814P/mwBAjXjkkUe2bdtWvnPLLbc0NzcXNQ+Vz38NoBZ88803GzZsKC179OixYMGCadOmFTcRVcBDYKgFI0eO3L17d2k5bNiwPXv2FDgPVcEtIKh6a9asOXz4cPnO8uXLixqGKuIWEFS39evXP/zww3/88Udp57nnnrv99tsLHIlqIQBQxVpbW2fOnNnZ2Vna6du375QpUwociSriFhBUq02bNk2bNq387H/ppZdu2LDBb/zyX/IQGKrV1Vdf/cUXX5SWF1100caNG8eOHVvg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
|
in/in.png
ADDED
![]() |
out/generated_image.png
ADDED
![]() |
out/out.txt
ADDED
The diff for this file is too large to render.
See raw diff
|
|
output_image.png
ADDED
![]() |
processed/in.jpg
ADDED
![]() |
processed/sketch 02.png
ADDED
![]() |