Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
|
@@ -192,7 +192,7 @@ def allow_call(min_interval_sec: float = 2.5) -> Tuple[bool, str]:
|
|
| 192 |
|
| 193 |
|
| 194 |
# =========================
|
| 195 |
-
# Model init
|
| 196 |
# =========================
|
| 197 |
base_path = "yisol/IDM-VTON"
|
| 198 |
|
|
@@ -242,7 +242,7 @@ pipe.unet_encoder = UNet_Encoder
|
|
| 242 |
|
| 243 |
|
| 244 |
# =========================
|
| 245 |
-
# Inference
|
| 246 |
# =========================
|
| 247 |
@spaces.GPU
|
| 248 |
def start_tryon(
|
|
@@ -395,15 +395,6 @@ button[aria-label="Settings"] {display:none !important;}
|
|
| 395 |
font-size: 14px;
|
| 396 |
}
|
| 397 |
|
| 398 |
-
.feedback-saving {
|
| 399 |
-
border: 1px solid #fde68a;
|
| 400 |
-
background: #fffbea;
|
| 401 |
-
color: #92400e;
|
| 402 |
-
border-radius: 12px;
|
| 403 |
-
padding: 10px 12px;
|
| 404 |
-
font-size: 14px;
|
| 405 |
-
}
|
| 406 |
-
|
| 407 |
.feedback-idle {
|
| 408 |
border: 1px dashed #d1d5db;
|
| 409 |
background: #ffffff;
|
|
@@ -416,7 +407,7 @@ button[aria-label="Settings"] {display:none !important;}
|
|
| 416 |
|
| 417 |
|
| 418 |
# =========================
|
| 419 |
-
# UX example image
|
| 420 |
# =========================
|
| 421 |
UX_EXAMPLE_IMG_PATH = "assets/photo_2026-02-26_14-56-24.jpg"
|
| 422 |
|
|
@@ -438,13 +429,7 @@ def refresh_catalog(gender: str):
|
|
| 438 |
files = list_garments(gender=gender)
|
| 439 |
items = build_gallery_items(files)
|
| 440 |
status = f"✅ Каталог: {gender} ({len(files)})" if files else f"⚠️ Каталог пуст: {gender}"
|
| 441 |
-
return
|
| 442 |
-
items,
|
| 443 |
-
files,
|
| 444 |
-
None,
|
| 445 |
-
status,
|
| 446 |
-
"👕 Выберите одежду ниже",
|
| 447 |
-
)
|
| 448 |
|
| 449 |
|
| 450 |
def on_gallery_select(files_list: List[str], evt: gr.SelectData):
|
|
@@ -564,14 +549,6 @@ def _feedback_idle_html():
|
|
| 564 |
"""
|
| 565 |
|
| 566 |
|
| 567 |
-
def _feedback_saving_html(action_text: str):
|
| 568 |
-
return f"""
|
| 569 |
-
<div class="feedback-saving">
|
| 570 |
-
{action_text} Сохраняем ваш отзыв...
|
| 571 |
-
</div>
|
| 572 |
-
"""
|
| 573 |
-
|
| 574 |
-
|
| 575 |
def _feedback_ok_html(action_text: str, has_comment: bool):
|
| 576 |
comment_text = " и комментарий" if has_comment else ""
|
| 577 |
return f"""
|
|
@@ -585,28 +562,21 @@ def submit_feedback_ui(is_like: bool, garment_name: str, comment: str):
|
|
| 585 |
action_text = "«Нравится»" if is_like else "«Не нравится»"
|
| 586 |
|
| 587 |
if not garment_name:
|
| 588 |
-
|
| 589 |
"⚠️ Сначала выполните примерку и выберите одежду",
|
| 590 |
_feedback_idle_html(),
|
| 591 |
gr.update(value=comment),
|
| 592 |
)
|
| 593 |
-
return
|
| 594 |
-
|
| 595 |
-
yield (
|
| 596 |
-
"💾 Сохраняем ваш отзыв...",
|
| 597 |
-
_feedback_saving_html(action_text),
|
| 598 |
-
gr.update(value=comment),
|
| 599 |
-
)
|
| 600 |
|
| 601 |
try:
|
| 602 |
save_feedback(is_like=is_like, garment_name=garment_name, comment=comment)
|
| 603 |
-
|
| 604 |
f"✅ Отзыв сохранён: {action_text}",
|
| 605 |
-
_feedback_ok_html(action_text, bool((comment or
|
| 606 |
gr.update(value=""),
|
| 607 |
)
|
| 608 |
except Exception as e:
|
| 609 |
-
|
| 610 |
f"❌ Ошибка сохранения отзыва: {type(e).__name__}: {str(e)[:200]}",
|
| 611 |
"""
|
| 612 |
<div class="feedback-idle">
|
|
@@ -617,6 +587,14 @@ def submit_feedback_ui(is_like: bool, garment_name: str, comment: str):
|
|
| 617 |
)
|
| 618 |
|
| 619 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 620 |
def tryon_ui(person_pil, selected_filename):
|
| 621 |
for msg in [
|
| 622 |
"🧵 Анализируем посадку ткани…",
|
|
@@ -696,9 +674,7 @@ def tryon_ui(person_pil, selected_filename):
|
|
| 696 |
)
|
| 697 |
|
| 698 |
|
| 699 |
-
#
|
| 700 |
-
# Boot
|
| 701 |
-
# =========================
|
| 702 |
ensure_garments_available()
|
| 703 |
_default_gender = "Женская"
|
| 704 |
_initial_files = list_garments(gender=_default_gender)
|
|
@@ -757,6 +733,7 @@ with gr.Blocks(title="Virtual Try-On Rendez-vous", css=CUSTOM_CSS) as demo:
|
|
| 757 |
|
| 758 |
with gr.Column(visible=False) as feedback_box:
|
| 759 |
gr.HTML('<div class="feedback-box">')
|
|
|
|
| 760 |
with gr.Row():
|
| 761 |
like_btn = gr.Button("👍 Нравится")
|
| 762 |
dislike_btn = gr.Button("👎 Не нравится")
|
|
@@ -791,14 +768,14 @@ with gr.Blocks(title="Virtual Try-On Rendez-vous", css=CUSTOM_CSS) as demo:
|
|
| 791 |
)
|
| 792 |
|
| 793 |
like_btn.click(
|
| 794 |
-
fn=
|
| 795 |
inputs=[selected_garment_state, feedback_comment],
|
| 796 |
outputs=[status, feedback_notice, feedback_comment],
|
| 797 |
concurrency_limit=1,
|
| 798 |
)
|
| 799 |
|
| 800 |
dislike_btn.click(
|
| 801 |
-
fn=
|
| 802 |
inputs=[selected_garment_state, feedback_comment],
|
| 803 |
outputs=[status, feedback_notice, feedback_comment],
|
| 804 |
concurrency_limit=1,
|
|
|
|
| 192 |
|
| 193 |
|
| 194 |
# =========================
|
| 195 |
+
# Model init (BASELINE)
|
| 196 |
# =========================
|
| 197 |
base_path = "yisol/IDM-VTON"
|
| 198 |
|
|
|
|
| 242 |
|
| 243 |
|
| 244 |
# =========================
|
| 245 |
+
# Inference (BASELINE params)
|
| 246 |
# =========================
|
| 247 |
@spaces.GPU
|
| 248 |
def start_tryon(
|
|
|
|
| 395 |
font-size: 14px;
|
| 396 |
}
|
| 397 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 398 |
.feedback-idle {
|
| 399 |
border: 1px dashed #d1d5db;
|
| 400 |
background: #ffffff;
|
|
|
|
| 407 |
|
| 408 |
|
| 409 |
# =========================
|
| 410 |
+
# UX example image
|
| 411 |
# =========================
|
| 412 |
UX_EXAMPLE_IMG_PATH = "assets/photo_2026-02-26_14-56-24.jpg"
|
| 413 |
|
|
|
|
| 429 |
files = list_garments(gender=gender)
|
| 430 |
items = build_gallery_items(files)
|
| 431 |
status = f"✅ Каталог: {gender} ({len(files)})" if files else f"⚠️ Каталог пуст: {gender}"
|
| 432 |
+
return items, files, None, status, "👕 Выберите одежду ниже"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 433 |
|
| 434 |
|
| 435 |
def on_gallery_select(files_list: List[str], evt: gr.SelectData):
|
|
|
|
| 549 |
"""
|
| 550 |
|
| 551 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 552 |
def _feedback_ok_html(action_text: str, has_comment: bool):
|
| 553 |
comment_text = " и комментарий" if has_comment else ""
|
| 554 |
return f"""
|
|
|
|
| 562 |
action_text = "«Нравится»" if is_like else "«Не нравится»"
|
| 563 |
|
| 564 |
if not garment_name:
|
| 565 |
+
return (
|
| 566 |
"⚠️ Сначала выполните примерку и выберите одежду",
|
| 567 |
_feedback_idle_html(),
|
| 568 |
gr.update(value=comment),
|
| 569 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 570 |
|
| 571 |
try:
|
| 572 |
save_feedback(is_like=is_like, garment_name=garment_name, comment=comment)
|
| 573 |
+
return (
|
| 574 |
f"✅ Отзыв сохранён: {action_text}",
|
| 575 |
+
_feedback_ok_html(action_text, bool((comment or "").strip())),
|
| 576 |
gr.update(value=""),
|
| 577 |
)
|
| 578 |
except Exception as e:
|
| 579 |
+
return (
|
| 580 |
f"❌ Ошибка сохранения отзыва: {type(e).__name__}: {str(e)[:200]}",
|
| 581 |
"""
|
| 582 |
<div class="feedback-idle">
|
|
|
|
| 587 |
)
|
| 588 |
|
| 589 |
|
| 590 |
+
def submit_like_feedback(garment_name: str, comment: str):
|
| 591 |
+
return submit_feedback_ui(True, garment_name, comment)
|
| 592 |
+
|
| 593 |
+
|
| 594 |
+
def submit_dislike_feedback(garment_name: str, comment: str):
|
| 595 |
+
return submit_feedback_ui(False, garment_name, comment)
|
| 596 |
+
|
| 597 |
+
|
| 598 |
def tryon_ui(person_pil, selected_filename):
|
| 599 |
for msg in [
|
| 600 |
"🧵 Анализируем посадку ткани…",
|
|
|
|
| 674 |
)
|
| 675 |
|
| 676 |
|
| 677 |
+
# boot
|
|
|
|
|
|
|
| 678 |
ensure_garments_available()
|
| 679 |
_default_gender = "Женская"
|
| 680 |
_initial_files = list_garments(gender=_default_gender)
|
|
|
|
| 733 |
|
| 734 |
with gr.Column(visible=False) as feedback_box:
|
| 735 |
gr.HTML('<div class="feedback-box">')
|
| 736 |
+
|
| 737 |
with gr.Row():
|
| 738 |
like_btn = gr.Button("👍 Нравится")
|
| 739 |
dislike_btn = gr.Button("👎 Не нравится")
|
|
|
|
| 768 |
)
|
| 769 |
|
| 770 |
like_btn.click(
|
| 771 |
+
fn=submit_like_feedback,
|
| 772 |
inputs=[selected_garment_state, feedback_comment],
|
| 773 |
outputs=[status, feedback_notice, feedback_comment],
|
| 774 |
concurrency_limit=1,
|
| 775 |
)
|
| 776 |
|
| 777 |
dislike_btn.click(
|
| 778 |
+
fn=submit_dislike_feedback,
|
| 779 |
inputs=[selected_garment_state, feedback_comment],
|
| 780 |
outputs=[status, feedback_notice, feedback_comment],
|
| 781 |
concurrency_limit=1,
|