Barath05 commited on
Commit
5bb11b6
Β·
verified Β·
1 Parent(s): 39f8848

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +37 -18
app.py CHANGED
@@ -12,27 +12,42 @@ import cv2
12
  TRIPOSR_MODEL = "stabilityai/TripoSR"
13
 
14
  def photo_to_sketch(image):
 
15
  if image is None:
16
  return None
17
- img_array = np.array(image)
18
- if len(img_array.shape) == 3:
19
- gray = cv2.cvtColor(img_array, cv2.COLOR_RGB2GRAY)
20
- else:
21
- gray = img_array
22
- blurred = cv2.GaussianBlur(gray, (5, 5), 0)
 
 
 
 
 
23
  edges = cv2.Canny(blurred, 60, 150)
 
 
24
  sketch_np = 255 - edges
25
- return Image.fromarray(sketch_np).convert("RGB")
 
 
 
 
26
 
27
  def generate_3d_avatar(sketch_image, height, weight, muscle, gender, breast):
 
28
  if sketch_image is None:
29
  return None, None
30
 
 
31
  body = f"{gender}, {height} height, {weight} build, {muscle} muscles"
32
  if gender == "female":
33
  body += f", {breast} bust"
34
- prompt = f"clean black and white line drawing of {body}, full body, 3D model, rigged, sketch style"
35
 
 
36
  buffer = io.BytesIO()
37
  sketch_image.save(buffer, format="PNG")
38
  img_bytes = buffer.getvalue()
@@ -58,21 +73,24 @@ def generate_3d_avatar(sketch_image, height, weight, muscle, gender, breast):
58
  tmp.close()
59
 
60
  return f"data:model/gltf-binary;base64,{b64}", tmp.name
61
- except:
 
62
  if attempt == 2:
63
- raise gr.Error("3D generation failed – retry in 30s")
64
  time.sleep(15)
 
65
  return None, None
66
 
67
- # β€”β€”β€” UI (theme goes in launch(), NOT in Blocks!) β€”β€”β€”
 
68
  with gr.Blocks(title="SketchToLife") as demo:
69
  gr.Markdown("# SketchToLife – Photo β†’ Sketch β†’ Animated 3D Avatar (100% Free!)")
70
- gr.Markdown("Instant local sketch + TripoSR 3D β†’ rigged GLB download")
71
 
72
  with gr.Row():
73
  with gr.Column():
74
- inp = gr.Image(label="Upload any photo (people, dogs…)", type="pil", height=420)
75
- btn_sketch = gr.Button("Generate Sketch", variant="secondary")
76
  out_sketch = gr.Image(label="Your Sketch", height=420)
77
 
78
  with gr.Column():
@@ -83,15 +101,16 @@ with gr.Blocks(title="SketchToLife") as demo:
83
  g = gr.Radio(["male", "female", "neutral"], value="neutral", label="Gender")
84
  b = gr.Dropdown(["small", "medium", "large"], value="medium", label="Breast/Form")
85
 
86
- btn_3d = gr.Button("Generate 3D Model", variant="primary", size="lg")
87
 
88
  with gr.Row():
89
- model3d = gr.Model3D(label="Your 3D Model – rotate & zoom", height=520)
90
  download = gr.File(label="Download .GLB (Blender / Unity / Roblox / VRChat)")
91
 
92
- btn_sketch.click(photo_to_sketch, inputs=inp, outputs=out_sketch)
93
- btn_3d.click(generate_3d_avatar, inputs=[out_sketch, h, w, m, g, b], outputs=[model3d, download])
94
 
 
95
  demo.launch(
96
  theme=gr.themes.Soft(primary_hue="blue"),
97
  server_name="0.0.0.0",
 
12
  TRIPOSR_MODEL = "stabilityai/TripoSR"
13
 
14
  def photo_to_sketch(image):
15
+ """Instant local sketch – always returns PIL Image"""
16
  if image is None:
17
  return None
18
+
19
+ # Ensure we have a PIL Image
20
+ if isinstance(image, np.ndarray):
21
+ image = Image.fromarray(image.astype('uint8'))
22
+
23
+ # Convert to grayscale
24
+ gray = image.convert("L")
25
+ img_array = np.array(gray)
26
+
27
+ # Blur + Canny edges
28
+ blurred = cv2.GaussianBlur(img_array, (5, 5), 0)
29
  edges = cv2.Canny(blurred, 60, 150)
30
+
31
+ # White lines on black background
32
  sketch_np = 255 - edges
33
+ sketch_pil = Image.fromarray(sketch_np)
34
+
35
+ # Return as RGB (required for TripoSR)
36
+ return sketch_pil.convert("RGB")
37
+
38
 
39
  def generate_3d_avatar(sketch_image, height, weight, muscle, gender, breast):
40
+ """Generate rigged 3D model from sketch"""
41
  if sketch_image is None:
42
  return None, None
43
 
44
+ # Build prompt
45
  body = f"{gender}, {height} height, {weight} build, {muscle} muscles"
46
  if gender == "female":
47
  body += f", {breast} bust"
48
+ prompt = f"clean line drawing of {body}, full body standing pose, black and white sketch, 3D model, rigged"
49
 
50
+ # Save sketch to bytes
51
  buffer = io.BytesIO()
52
  sketch_image.save(buffer, format="PNG")
53
  img_bytes = buffer.getvalue()
 
73
  tmp.close()
74
 
75
  return f"data:model/gltf-binary;base64,{b64}", tmp.name
76
+
77
+ except Exception as e:
78
  if attempt == 2:
79
+ raise gr.Error("3D generation failed – retry in 30s (TripoSR is busy)")
80
  time.sleep(15)
81
+
82
  return None, None
83
 
84
+
85
+ # =============== UI (Theme in launch() – Gradio 6+ fix) ===============
86
  with gr.Blocks(title="SketchToLife") as demo:
87
  gr.Markdown("# SketchToLife – Photo β†’ Sketch β†’ Animated 3D Avatar (100% Free!)")
88
+ gr.Markdown("Works with **humans, dogs, cats, anything** β†’ Instant sketch + Rigged 3D download")
89
 
90
  with gr.Row():
91
  with gr.Column():
92
+ inp = gr.Image(label="Upload Photo", type="pil", height=420)
93
+ btn1 = gr.Button("Generate Clean Sketch", variant="secondary", size="lg")
94
  out_sketch = gr.Image(label="Your Sketch", height=420)
95
 
96
  with gr.Column():
 
101
  g = gr.Radio(["male", "female", "neutral"], value="neutral", label="Gender")
102
  b = gr.Dropdown(["small", "medium", "large"], value="medium", label="Breast/Form")
103
 
104
+ btn2 = gr.Button("Generate 3D Model", variant="primary", size="lg")
105
 
106
  with gr.Row():
107
+ view3d = gr.Model3D(label="Your 3D Model – Rotate & Zoom!", height=520)
108
  download = gr.File(label="Download .GLB (Blender / Unity / Roblox / VRChat)")
109
 
110
+ btn1.click(photo_to_sketch, inputs=inp, outputs=out_sketch)
111
+ btn2.click(generate_3d_avatar, inputs=[out_sketch, h, w, m, g, b], outputs=[view3d, download])
112
 
113
+ # Theme goes HERE in Gradio 6+
114
  demo.launch(
115
  theme=gr.themes.Soft(primary_hue="blue"),
116
  server_name="0.0.0.0",