|
import gradio as gr |
|
import sys |
|
import os |
|
|
|
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'dist')) |
|
|
|
|
|
try: |
|
import core_logic |
|
from core_logic import * |
|
data_manager = DataManager() |
|
except ImportError as e: |
|
print(f"Error: Obfuscated module not found: {e}") |
|
print("Current directory:", os.getcwd()) |
|
print("Files in dist:", os.listdir('dist') if os.path.exists('dist') else 'dist not found') |
|
sys.exit(1) |
|
|
|
def virtual_tryon(human_img, garment_img, garment_type, request: gr.Request): |
|
if human_img is None: |
|
raise gr.Error("Please upload a person image first!") |
|
|
|
if garment_img is None: |
|
raise gr.Error("Please upload a garment image first!") |
|
|
|
user_context = get_user_context(request) |
|
print(f"User context: {user_context}") |
|
|
|
current_attempts = data_manager.get_attempts(user_context) |
|
print(f"Current attempts for {user_context}: {current_attempts}") |
|
|
|
if current_attempts >= MAX_FREE_TRIALS: |
|
raise gr.Error( |
|
f"You've used {MAX_FREE_TRIALS} free daily credits. " |
|
f"Please visit https://miragic.ai/ to sign up for unlimited access!" |
|
) |
|
|
|
try: |
|
|
|
result_img = process_tryon_request(human_img, garment_img, garment_type) |
|
|
|
|
|
new_count = data_manager.increment_attempts(user_context) |
|
print(f"New attempt count for {user_context}: {new_count}") |
|
|
|
return result_img |
|
|
|
except Exception as e: |
|
print(f"Error in virtual_tryon: {str(e)}") |
|
raise e |
|
|
|
def create_footer(): |
|
return f""" |
|
<div style="text-align: center; margin-top: 30px; padding: 15px; border-radius: 8px;"> |
|
<p style="margin: 5px 0;">Β© 2025 {COMPANY_NAME}. All rights reserved.</p> |
|
<p style="margin: 5px 0;"> |
|
<a href="{COMPANY_URL}" target="_blank" style="color: #0984e3; text-decoration: none;">Website</a> | |
|
<a href="mailto:{CONTACT_EMAIL}" style="color: #0984e3; text-decoration: none;">Contact Us</a> | |
|
<a href="{COMPANY_URL}/privacy-policy" target="_blank" style="color: #0984e3; text-decoration: none;">Privacy Policy</a> |
|
</p> |
|
</div> |
|
""" |
|
|
|
def create_instructions(): |
|
return """ |
|
<div style="padding: 15px; border-radius: 8px; margin-bottom: 20px;"> |
|
<h2 style="margin-top: 0;">How to use:</h2> |
|
<ol style="color: #636e72;"> |
|
<li>Upload a clear photo of a person (front view works best)</li> |
|
<li>Upload an image of the garment you want to try on</li> |
|
<li>Click "Run Virtual Try-On" to see the result</li> |
|
</ol> |
|
<p style="margin-bottom: 0;"><strong>Tip:</strong> For best results, use images with plain backgrounds.</p> |
|
</div> |
|
""" |
|
|
|
|
|
css = """ |
|
footer {visibility: hidden} |
|
.banner { |
|
background-color: #f8f9fa; |
|
padding: 10px; |
|
border-radius: 5px; |
|
margin-bottom: 20px; |
|
text-align: center; |
|
} |
|
.button-gradient { |
|
background: linear-gradient(45deg, #ff416c, #ff4b2b, #ff9b00, #ff416c); |
|
background-size: 400% 400%; |
|
border: none; |
|
padding: 14px 28px; |
|
font-size: 16px; |
|
font-weight: bold; |
|
color: white; |
|
border-radius: 10px; |
|
cursor: pointer; |
|
transition: 0.3s ease-in-out; |
|
animation: gradientAnimation 2s infinite linear; |
|
box-shadow: 0 4px 10px rgba(255, 65, 108, 0.6); |
|
} |
|
@keyframes gradientAnimation { |
|
0% { background-position: 0% 50%; } |
|
100% { background-position: 100% 50%; } |
|
} |
|
.button-gradient:hover { |
|
transform: scale(1.05); |
|
box-shadow: 0 6px 15px rgba(255, 75, 43, 0.8); |
|
} |
|
.signup-container { |
|
text-align: center; |
|
padding: 20px; |
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
|
border-radius: 8px; |
|
margin-top: 20px; |
|
color: white; |
|
box-shadow: 0 4px 15px rgba(0,0,0,0.2); |
|
} |
|
.signup-container h3 { |
|
margin-bottom: 10px; |
|
color: white; |
|
} |
|
.signup-container p { |
|
margin-bottom: 15px; |
|
color: #f0f0f0; |
|
} |
|
.signup-button { |
|
background: linear-gradient(45deg, #ff416c, #ff4b2b); |
|
border: none; |
|
padding: 12px 25px; |
|
font-size: 16px; |
|
font-weight: bold; |
|
color: white; |
|
border-radius: 8px; |
|
text-decoration: none; |
|
display: inline-block; |
|
transition: all 0.3s ease; |
|
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); |
|
} |
|
.signup-button:hover { |
|
transform: translateY(-2px); |
|
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3); |
|
} |
|
.attempts-counter { |
|
background: #e3f2fd; |
|
padding: 10px; |
|
border-radius: 5px; |
|
margin: 10px 0; |
|
text-align: center; |
|
font-weight: bold; |
|
color: #1976d2; |
|
} |
|
#col-container { |
|
max-width: 1400px; |
|
margin: 0 auto; |
|
} |
|
.step-column { |
|
padding: 20px; |
|
border-radius: 8px; |
|
box-shadow: var(--card-shadow); |
|
margin: 10px; |
|
} |
|
.step-title { |
|
color: var(--primary-color); |
|
text-align: center; |
|
margin-bottom: 15px; |
|
} |
|
.image-preview { |
|
border-radius: 8px; |
|
overflow: hidden; |
|
box-shadow: var(--card-shadow); |
|
} |
|
.result-section { |
|
background-color: white; |
|
padding: 20px; |
|
border-radius: 8px; |
|
box-shadow: var(--card-shadow); |
|
} |
|
.footer { |
|
margin-top: 30px; |
|
text-align: center; |
|
} |
|
""" |
|
|
|
|
|
example_path = os.path.join(os.path.dirname(__file__), 'assets') |
|
|
|
human_examples = [ |
|
os.path.join(example_path, "human", f) for f in os.listdir(os.path.join(example_path, "human")) |
|
if f.endswith(('.jpg', '.jpeg', '.png')) |
|
] if os.path.exists(os.path.join(example_path, "human")) else [] |
|
|
|
garment_examples = [ |
|
os.path.join(example_path, "garment", f) for f in os.listdir(os.path.join(example_path, "garment")) |
|
if f.endswith(('.jpg', '.jpeg', '.png')) |
|
] if os.path.exists(os.path.join(example_path, "garment")) else [] |
|
|
|
with gr.Blocks(css=css, title=f"{COMPANY_NAME} Virtual Try-On", theme=gr.themes.Ocean()) as demo: |
|
gr.Markdown(""" |
|
<div style="display: flex; align-items: center;"> |
|
<img src="https://avatars.githubusercontent.com/u/211682198?s=200&v=4" style="width: 80px; margin-right: 20px;"/> |
|
<div> |
|
<h1 style="margin-bottom: 0;">Miragic Virtual Try-On π π</h1> |
|
<p style="margin-top: 0; color: #636e72;">Try on complete outfits with our AI-powered virtual try-on technology</p> |
|
</div> |
|
</div> |
|
""") |
|
|
|
|
|
gr.HTML(create_instructions()) |
|
|
|
with gr.Row(elem_id="col-container"): |
|
|
|
with gr.Column(elem_classes="step-column"): |
|
gr.HTML(""" |
|
<div class="step-title"> |
|
<span style="font-size: 24px;">1. Upload Person Image</span><br> |
|
</div> |
|
""") |
|
human_img = gr.Image( |
|
label="Person Image", |
|
sources='upload', |
|
type="numpy", |
|
elem_classes="image-preview", |
|
height=400 |
|
) |
|
if human_examples: |
|
gr.Examples( |
|
examples=human_examples, |
|
inputs=human_img, |
|
label="Example Person Images", |
|
examples_per_page=12 |
|
) |
|
|
|
|
|
with gr.Column(elem_classes="step-column"): |
|
gr.HTML(""" |
|
<div class="step-title"> |
|
<span style="font-size: 24px;">2. Upload Garment Image</span><br> |
|
</div> |
|
""") |
|
garment_img = gr.Image( |
|
label="Garment Image", |
|
sources='upload', |
|
type="numpy", |
|
elem_classes="image-preview", |
|
height=400 |
|
) |
|
|
|
garment_type = gr.Dropdown( |
|
choices=["Dress/Suit", "Top", "Bottom"], |
|
value="Dress/Suit", |
|
label="Garment Type", |
|
info="Select the type of garment you want to try on" |
|
) |
|
|
|
if garment_examples: |
|
gr.Examples( |
|
examples=garment_examples, |
|
inputs=garment_img, |
|
label="Example Garment Images", |
|
examples_per_page=12 |
|
) |
|
|
|
|
|
with gr.Column(elem_classes="step-column"): |
|
gr.HTML(""" |
|
<div class="step-title"> |
|
<span style="font-size: 24px;">3. Virtual Try-On Result</span><br> |
|
</div> |
|
""") |
|
result_img = gr.Image( |
|
label="Try-On Result", |
|
interactive=False, |
|
elem_classes="image-preview", |
|
height=400 |
|
) |
|
|
|
try_button = gr.Button( |
|
"Run Virtual Try-On π", |
|
elem_classes="button-gradient" |
|
) |
|
|
|
signup_prompt = gr.HTML( |
|
visible=True, |
|
value="""<div class="signup-container"> |
|
<h3>π Want unlimited generations?</h3> |
|
<p>Please sign up at Miragic.ai for unlimited access to all our AI tools!</p> |
|
<a href='https://miragic.ai/products/virtual-try-on' target='_blank' class="signup-button"> |
|
SignUp for Free π |
|
</a> |
|
</div>""" |
|
) |
|
|
|
if os.path.exists("assets/examples"): |
|
with gr.Row(): |
|
gr.Examples( |
|
examples=[ |
|
["assets/examples/model1.jpg", "assets/examples/garment1.png", "Dress/Suit", "assets/examples/result1.jpg"], |
|
["assets/examples/model2.png", "assets/examples/garment2.jpg", "Dress/Suit", "assets/examples/result2.jpg"], |
|
["assets/examples/model3.jpg", "assets/examples/garment3.jpg", "Dress/Suit", "assets/examples/result3.jpg"], |
|
], |
|
inputs=[human_img, garment_img, garment_type, result_img], |
|
label=None, |
|
examples_per_page=3 |
|
) |
|
|
|
|
|
try_button.click( |
|
fn=virtual_tryon, |
|
inputs=[human_img, garment_img, garment_type], |
|
outputs=result_img, |
|
api_name="virtual_tryon" |
|
) |
|
|
|
gr.HTML('<a href="https://visitorbadge.io/status?path=https%3A%2F%2Fhuggingface.co%2Fspaces%2FMiragic-AI%2FMiragic-Virtual-Try-On"><img src="https://api.visitorbadge.io/api/combined?path=https%3A%2F%2Fhuggingface.co%2Fspaces%2FMiragic-AI%2FMiragic-Virtual-Try-On&label=VISITORS&labelColor=%2337d67a&countColor=%23f47373&style=plastic&labelStyle=upper" /></a>') |
|
|
|
|
|
gr.HTML(create_footer()) |
|
|
|
if __name__ == "__main__": |
|
demo.launch( |
|
show_api=False, |
|
server_name="0.0.0.0", |
|
server_port=7860 |
|
) |