File size: 17,436 Bytes
21583b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
577df10
21583b0
1b3bb2f
577df10
21583b0
577df10
21583b0
 
577df10
 
95ec856
21583b0
 
 
 
577df10
21583b0
1b3bb2f
 
21583b0
 
 
 
 
 
 
577df10
21583b0
 
 
 
 
1b3bb2f
21583b0
 
010d2b7
21583b0
 
1b3bb2f
21583b0
 
 
 
 
 
 
 
 
 
 
 
 
 
1b3bb2f
21583b0
 
010d2b7
 
21583b0
 
010d2b7
21583b0
46574e1
21583b0
46574e1
21583b0
46574e1
21583b0
 
46574e1
21583b0
 
d46a5f8
21583b0
 
46574e1
21583b0
46574e1
21583b0
 
46574e1
21583b0
46574e1
21583b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11c3fc1
21583b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2bad595
21583b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2bad595
21583b0
 
 
 
2bad595
21583b0
 
 
 
 
 
 
 
 
 
 
 
577df10
21583b0
2bad595
21583b0
 
 
 
 
 
 
 
 
 
 
 
2bad595
21583b0
 
 
 
 
 
 
 
 
 
 
1b3bb2f
21583b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
577df10
21583b0
 
 
 
 
 
577df10
21583b0
 
 
 
 
 
 
 
 
4ab212d
a4ac8a1
 
21583b0
a4ac8a1
21583b0
 
a4ac8a1
21583b0
a4ac8a1
 
 
21583b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a4ac8a1
21583b0
a4ac8a1
 
 
 
 
 
 
 
 
21583b0
a4ac8a1
 
 
 
 
 
21583b0
 
 
4ab212d
a4ac8a1
577df10
21583b0
e4f59bb
4ab212d
a4ac8a1
4ab212d
 
21583b0
a4ac8a1
 
21583b0
a4ac8a1
 
 
 
 
 
 
 
 
 
 
21583b0
 
a4ac8a1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21583b0
1b3bb2f
4ab212d
1b3bb2f
a4ac8a1
1b3bb2f
21583b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2be9aff
21583b0
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
# from fastapi import FastAPI, File, UploadFile, Form
# from fastapi.responses import StreamingResponse
# from pydantic import BaseModel
# from typing import Optional
# import logging
# import os
# # import boto3
# import json
# # import shlex
# # import subprocess
# # import tempfile
# # import time
# # import base64
# # import gradio as gr
# # import numpy as np
# # import rembg
# # import spaces
# # import torch
# # from PIL import Image
# # from functools import partial
# # import io
# # import datetime

# app = FastAPI()


# # subprocess.run(shlex.split('pip install wheel/torchmcubes-0.1.0-cp310-cp310-linux_x86_64.whl'))

# # from tsr.system import TSR
# # from tsr.utils import remove_background, resize_foreground, to_gradio_3d_orientation



# # if torch.cuda.is_available():
# #     device = "cuda:0"
# # else:
# #     device = "cpu"

# # # torch.cuda.synchronize()


# # model = TSR.from_pretrained(
# #     "stabilityai/TripoSR",
# #     config_name="config.yaml",
# #     weight_name="model.ckpt",
# # )
# # model.renderer.set_chunk_size(124218)
# # model.to(device)

# # rembg_session = rembg.new_session()
# # ACCESS = os.getenv("ACCESS")
# # SECRET = os.getenv("SECRET")
# # bedrock = boto3.client(service_name='bedrock', aws_access_key_id = ACCESS, aws_secret_access_key = SECRET, region_name='us-east-1')
# # bedrock_runtime = boto3.client(service_name='bedrock-runtime', aws_access_key_id = ACCESS, aws_secret_access_key = SECRET, region_name='us-east-1')

# # def upload_file_to_s3(file_path, bucket_name, object_name=None):
# #     s3_client = boto3.client('s3',aws_access_key_id = ACCESS, aws_secret_access_key = SECRET, region_name='us-east-1')
    
# #     if object_name is None:
# #         object_name = file_path
    
# #     try:
# #         s3_client.upload_file(file_path, bucket_name, object_name)
# #     except FileNotFoundError:
# #         print(f"The file {file_path} was not found.")
# #         return False
# #     except NoCredentialsError:
# #         print("Credentials not available.")
# #         return False
# #     except PartialCredentialsError:
# #         print("Incomplete credentials provided.")
# #         return False
# #     except Exception as e:
# #         print(f"An error occurred: {e}")
# #         return False
    
# #     print(f"File {file_path} uploaded successfully to {bucket_name}/{object_name}.")
# #     return True


# # def gen_pos_prompt(text):
# #   instruction = f'''Your task is to create a positive prompt for image generation.

# #     Objective: Generate images that prioritize structural integrity and accurate shapes. The focus should be on the correct form and basic contours of objects, with minimal concern for colors.
    
# #     Guidelines:
    
# #     Complex Objects (e.g., animals, vehicles, Machines, Fictional Characters, Fantasy and Mythical Creatures, Historical or Cultural Artifacts, Humanoid Figures,Buildings and Architecture): For these, the image should resemble a toy object, emphasizing the correct shape and structure while minimizing details and color complexity.
    
# #     Example Input: A sports bike
# #     Example Positive Prompt: Simple sports bike with accurate shape and structure, minimal details, digital painting, concept art style, basic contours, soft lighting, clean lines, neutral or muted colors, toy-like appearance, low contrast.
    
# #     Example Input: A lion
# #     Example Positive Prompt: Toy-like depiction of a lion with a focus on structural accuracy, minimal details, digital painting, concept art style, basic contours, soft lighting, clean lines, neutral or muted colors, simplified features, low contrast.

# #     Input: The Spiderman with Wolverine Claws
# #     Positive Prompt: Toy-like depiction of Spiderman with Wolverine claws, emphasizing structural accuracy with minimal details, digital painting, concept art style, basic contours, soft lighting, clean lines, neutral or muted colors, simplified features, low contrast.
    
# #     Simple Objects (e.g., a tennis ball): For these, the prompt should specify a realistic depiction, focusing on the accurate shape and structure.
    
# #     Example Input: A tennis ball
# #     Example Positive Prompt: photorealistic, uhd, high resolution, high quality, highly detailed; A tennis ball
    
# #     Prompt Structure:
    
# #     Subject: Clearly describe the object and its essential shape and structure.
# #     Medium: Specify the art style (e.g., digital painting, concept art).
# #     Style: Include relevant style terms (e.g., simplified, toy-like for complex objects; realistic for simple objects).
# #     Resolution: Mention resolution if necessary (e.g., basic resolution).
# #     Lighting: Indicate the type of lighting (e.g., soft lighting).
# #     Color: Use neutral or muted colors with minimal emphasis on color details.
# #     Additional Details: Keep additional details minimal.


# #     ### MAXIMUM OUTPUT LENGTH SHOULD BE UNDER 30 WORDS ###

# #     Input: {text}
# #     Positive Prompt: 
# #     '''

# #   body = json.dumps({'inputText': instruction,
# #                      'textGenerationConfig': {'temperature': 0, 'topP': 0.01, 'maxTokenCount':1024}})
# #   response = bedrock_runtime.invoke_model(body=body, modelId='amazon.titan-text-express-v1')
# #   pos_prompt = json.loads(response.get('body').read())['results'][0]['outputText']
# #   return pos_prompt

# # def generate_image_from_text(pos_prompt, seed):
# #   new_prompt = gen_pos_prompt(pos_prompt)
# #   # print(new_prompt)
# #   # neg_prompt = '''Detailed, complex textures, intricate patterns, realistic lighting, high contrast, reflections, fuzzy surface, realistic proportions, photographic quality, vibrant colors, detailed background, shadows, disfigured, deformed, ugly, multiple, duplicate.'''
# #   neg_prompt = '''Out of frame, blurry, ugly, cropped, reflections, detailed background, shadows, disfigured, deformed, ugly, multiple, duplicate.'''
# #   # neg_prompt = '''Complex patterns, realistic lighting, high contrast, reflections, fuzzy, photographic, vibrant, detailed, shadows, disfigured, duplicate.'''
    
# #   parameters = {
# #       'taskType': 'TEXT_IMAGE',
# #       'textToImageParams': {'text': new_prompt,
# #                             'negativeText': neg_prompt},
# #       'imageGenerationConfig': {"cfgScale":8,
# #                                 "seed":int(seed),
# #                                 "width":1024,
# #                                 "height":1024,
# #                                 "numberOfImages":1
# #                                 }
# #   }
# #   request_body = json.dumps(parameters)
# #   response = bedrock_runtime.invoke_model(body=request_body, modelId='amazon.titan-image-generator-v2:0')
# #   response_body = json.loads(response.get('body').read())
# #   base64_image_data = base64.b64decode(response_body['images'][0])

# #   return Image.open(io.BytesIO(base64_image_data))


# # def check_input_image(input_image):
# #     if input_image is None:
# #         raise gr.Error("No image uploaded!")

# # def preprocess(input_image, do_remove_background, foreground_ratio):
# #     def fill_background(image):
# #         torch.cuda.synchronize()  # Ensure previous CUDA operations are complete
# #         image = np.array(image).astype(np.float32) / 255.0
# #         image = image[:, :, :3] * image[:, :, 3:4] + (1 - image[:, :, 3:4]) * 0.5
# #         image = Image.fromarray((image * 255.0).astype(np.uint8))
# #         return image

# #     if do_remove_background:
# #         torch.cuda.synchronize()
# #         image = input_image.convert("RGB")
# #         image = remove_background(image, rembg_session)
# #         image = resize_foreground(image, foreground_ratio)
# #         image = fill_background(image)
        
# #         torch.cuda.synchronize()
# #     else:
# #         image = input_image
# #         if image.mode == "RGBA":
# #             image = fill_background(image)
# #     torch.cuda.synchronize()  # Wait for all CUDA operations to complete
# #     torch.cuda.empty_cache()
# #     return image



# # # @spaces.GPU
# # def generate(image, mc_resolution, formats=["obj", "glb"]):
# #     torch.cuda.synchronize()
# #     scene_codes = model(image, device=device)
# #     torch.cuda.synchronize()
# #     mesh = model.extract_mesh(scene_codes, resolution=mc_resolution)[0]
# #     torch.cuda.synchronize()
# #     mesh = to_gradio_3d_orientation(mesh)
# #     torch.cuda.synchronize()
    
# #     mesh_path_glb = tempfile.NamedTemporaryFile(suffix=f".glb", delete=False)
# #     torch.cuda.synchronize()
# #     mesh.export(mesh_path_glb.name)
# #     torch.cuda.synchronize()
    
# #     mesh_path_obj = tempfile.NamedTemporaryFile(suffix=f".obj", delete=False)
# #     torch.cuda.synchronize()
# #     mesh.apply_scale([-1, 1, 1])
# #     mesh.export(mesh_path_obj.name)
# #     torch.cuda.synchronize()
# #     torch.cuda.empty_cache()
# #     return mesh_path_obj.name, mesh_path_glb.name

    

# # def run_example(text_prompt,seed ,do_remove_background, foreground_ratio, mc_resolution):
# #     image_pil = generate_image_from_text(text_prompt, seed)

# #     preprocessed = preprocess(image_pil, do_remove_background, foreground_ratio)
    
# #     mesh_name_obj, mesh_name_glb = generate(preprocessed, mc_resolution, ["obj", "glb"])
    
# #     return preprocessed, mesh_name_obj, mesh_name_glb

# # from gradio_client import Client
# # import requests
# # import json

# # client = Client("vibs08/flash-sd3-new",hf_token=os.getenv("token"))

# # url = 'https://vibs08-image-3d-fastapi.hf.space/process_image/'


# # def text2img(promptt):
# #   result = client.predict(
# #       prompt=promptt,
# #       seed=0,
# #       randomize_seed=False,
# #       guidance_scale=1,
# #       num_inference_steps=4,
# #       negative_prompt="deformed, distorted, disfigured, poorly drawn, bad anatomy, wrong anatomy, extra limb, missing limb, floating limbs, mutated hands and fingers, disconnected limbs, mutation, mutated, ugly, disgusting, blurry, amputation, NSFW, bad text",
# #       api_name="/infer"
# #   )
# #   return result


# # def three_d(prompt,seed,fr,mc,auth,text=None):
  
# #   file_path = text2img(prompt)
# #   payload = {
# #       'seed': seed,
# #       'enhance_image': False,
# #       'do_remove_background': True,
# #       'foreground_ratio': fr,
# #       'mc_resolution': mc,
# #       'auth': auth,
# #       'text_prompt': text
# #   }

# #   files = {
# #       'file': (file_path, open(file_path, 'rb'), 'image/png')
# #   }

# #   headers = {
# #       'accept': 'application/json'
# #   }

# #   response = requests.post(url, headers=headers, files=files, data=payload)

# #   return response.json()
# # @app.post("/process_text/")
# # async def process_image(
# #     text_prompt: str = Form(...),
# #     seed: int = Form(...),
# #     foreground_ratio: float = Form(...),
# #     mc_resolution: int = Form(...),
# #     auth: str = Form(...)
# # ):
    
# #     if auth == os.getenv("AUTHORIZE"):
# #         return three_d(text_prompt, seed, foreground_ratio, mc_resolution, auth)

# #     # else:
# #     #     return {"ERROR": "Too Many Requests!"}

# # #         preprocessed, mesh_name_obj, mesh_name_glb = run_example(text_prompt,seed ,do_remove_background, foreground_ratio, mc_resolution)
# # #         # preprocessed = preprocess(image_pil, do_remove_background, foreground_ratio)
# # #         # mesh_name_obj, mesh_name_glb = generate(preprocessed, mc_resolution)
# # #         timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S%f')
# # #         object_name = f'object_{timestamp}_1.obj'
# # #         object_name_2 = f'object_{timestamp}_2.glb'
# # #         object_name_3 = f"object_{timestamp}.png"
# # #         preprocessed_image_tempfile = tempfile.NamedTemporaryFile(suffix=".png", delete=False)
# # #         preprocessed.save(preprocessed_image_tempfile.name)
# # #         upload_file_to_s3(preprocessed_image_tempfile.name, 'framebucket3d', object_name_3)

    
# # #         if upload_file_to_s3(mesh_name_obj, 'framebucket3d',object_name) and upload_file_to_s3(mesh_name_glb, 'framebucket3d',object_name_2):
    
# # #             return {
# # #                 "img_path": f"https://framebucket3d.s3.amazonaws.com/{object_name_3}",
# # #                 "obj_path": f"https://framebucket3d.s3.amazonaws.com/{object_name}",
# # #                 "glb_path": f"https://framebucket3d.s3.amazonaws.com/{object_name_2}"

# # #             }
    
# # #         else:
# # #             return {"Internal Server Error": False}
# #     else:
# #         return {"Authentication":"Failed"}

# # if __name__ == "__main__":
# #     import uvicorn
# #     uvicorn.run(app, host="0.0.0.0", port=7860)


# from gradio_client import Client
# import requests
# import os

# # Initialize Gradio client with Hugging Face token
# client = Client("vibs08/flash-sd3-new", hf_token=os.getenv("token"))

# # URL for processing image via FastAPI
# url = 'https://vibs08-image-3d-fastapi.hf.space/process_image/'

# def text2img(promptt):
#     # Use the Gradio client to generate an image from text
#     result = client.predict(
#         prompt=promptt,  # Adjust the argument name based on the actual method signature
#         seed=0,
#         randomize_seed=False,
#         guidance_scale=1,
#         num_inference_steps=4,
#         negative_prompt="deformed, distorted, disfigured, poorly drawn, bad anatomy, wrong anatomy, extra limb, missing limb, floating limbs, mutated hands and fingers, disconnected limbs, mutation, mutated, ugly, disgusting, blurry, amputation, NSFW, bad text",
#         api_name="/infer"
#     )
    
#     # Assuming result is a file path or image data
#     return result

# def three_d(promptt, seed, fr, mc, auth, text=None):
#     file_path = text2img(promptt)  # Get the file path of the generated image
    
#     payload = {
#         'seed': seed,
#         'enhance_image': False,
#         'do_remove_background': True,
#         'foreground_ratio': fr,
#         'mc_resolution': mc,
#         'auth': auth,
#         'text_prompt': text
#     }
    
#     with open(file_path, 'rb') as image_file:
#         files = {
#             'file': (file_path, image_file, 'image/png')
#         }

#         headers = {
#             'accept': 'application/json'
#         }

#         response = requests.post(url, headers=headers, files=files, data=payload)
    
#     return response.json()

# from fastapi import FastAPI, Form

# app = FastAPI()

# @app.post("/process_text/")
# async def process_text(
#     text_prompt: str = Form(...),
#     seed: int = Form(...),
#     foreground_ratio: float = Form(...),
#     mc_resolution: int = Form(...),
#     auth: str = Form(...)
# ):
#     if auth == os.getenv("AUTHORIZE"):
#         return three_d(text_prompt, seed, foreground_ratio, mc_resolution, auth)
#     else:
#         return {"Authentication": "Failed"}

# if __name__ == "__main__":
#     import uvicorn
#     uvicorn.run(app, host="0.0.0.0", port=7860)



import gradio as gr
# from gradio_client import Client
import requests
import os

# # Initialize Gradio client with Hugging Face token
client = Client("vibs08/flash-sd3-new", hf_token=os.getenv("token"))

# URL for processing image via FastAPI
url = 'https://vibs08-image-3d-fastapi.hf.space/process_image/'

def text2img(prompt):
    # Use the Gradio client to generate an image from text
    result = client.predict(
        prompt=prompt,
        seed=0,
        randomize_seed=False,
        guidance_scale=1,
        num_inference_steps=4,
        negative_prompt="deformed, distorted, disfigured, poorly drawn, bad anatomy, wrong anatomy, extra limb, missing limb, floating limbs, mutated hands and fingers, disconnected limbs, mutation, mutated, ugly, disgusting, blurry, amputation, NSFW, bad text",
        api_name="/infer"
    )
    
    # Assuming result is a file path or image data
    return result

def three_d(prompt, seed, fr, mc, auth, text=None):
    file_path = text2img(prompt)  # Get the file path of the generated image
    
    payload = {
        'seed': seed,
        'enhance_image': False,
        'do_remove_background': True,
        'foreground_ratio': fr,
        'mc_resolution': mc,
        'auth': auth,
        'text_prompt': text
    }
    
    with open(file_path, 'rb') as image_file:
        files = {
            'file': (file_path, image_file, 'image/png')
        }

        headers = {
            'accept': 'application/json'
        }

        response = requests.post(url, headers=headers, files=files, data=payload)
    
    return response.json()

def process_input(text_prompt, seed, foreground_ratio, mc_resolution, auth):
    if auth == os.getenv("AUTHORIZE"):
        return three_d(text_prompt, seed, foreground_ratio, mc_resolution, auth)
    else:
        return {"Authentication": "Failed"}

# Create Gradio Interface
interface = gr.Interface(
    fn=process_input,
    inputs=[
        gr.Textbox(label="Text Prompt"),
        gr.Number(label="Seed"),
        gr.Number(label="Foreground Ratio"),
        gr.Number(label="MC Resolution"),
        gr.Textbox(label="Authorization Token", type="password")
    ],
    outputs="json",
    title="3D Image Generator",
    description="Generate 3D images from text prompts"
)

# Launch the Gradio Interface
if __name__ == "__main__":
    interface.launch()