import uuid import gradio as gr from model_utils import generate_caption from classify_utils import parse_caption_to_category from db_utils import save_full_pipeline_result, get_upload_history def format_history(history_res): rows = history_res.data or [] if not rows: return "Chưa có lịch sử upload." lines = [] for r in rows: captions = r.get("captions") or [] cls = r.get("classification_results") or [] cap_text = captions[0]["caption_text"] if captions else "-" cat_text = cls[0]["predicted_category"] if cls else "-" lines.append(f"- {r.get('uploaded_at', '')}: {cap_text} → {cat_text}") return "\n".join(lines) def process_upload(image, device_id_state): if image is None: return "Vui lòng tải ảnh lên.", "", "", device_id_state, "" # Sinh device_id 1 lần cho phiên hiện tại nếu chưa có if not device_id_state: device_id_state = str(uuid.uuid4()) tmp_path = "/tmp/upload_tmp.jpg" image.save(tmp_path) # 1. Sinh caption caption = generate_caption(tmp_path) # 2. Phân loại category, is_ambiguous = parse_caption_to_category(caption) # 3. Lưu vào Supabase save_full_pipeline_result( device_id=device_id_state, image_local_path=tmp_path, generated_caption=caption, predicted_category=category, is_ambiguous=is_ambiguous, ) # 4. Lấy lại lịch sử để hiển thị history_res = get_upload_history(device_id_state) history_display = format_history(history_res) return caption, category, ("Có" if is_ambiguous else "Không"), device_id_state, history_display with gr.Blocks(title="Fashion Caption & Classification Demo") as demo: gr.Markdown("# Demo: Sinh caption & phân loại sản phẩm thời trang") gr.Markdown("Model: BLIP-base (student, distilled qua AT + WSLD) — dataset Fashion-200k") device_id_state = gr.State(value="") with gr.Row(): with gr.Column(): image_input = gr.Image(type="pil", label="Tải ảnh sản phẩm") submit_btn = gr.Button("Sinh caption & phân loại", variant="primary") with gr.Column(): caption_output = gr.Textbox(label="Caption sinh ra") category_output = gr.Textbox(label="Loại sản phẩm dự đoán") ambiguous_output = gr.Textbox(label="Kết quả mơ hồ (ambiguous)?") gr.Markdown("### Lịch sử upload (trong phiên hiện tại)") history_output = gr.Textbox(label="", lines=8, interactive=False) submit_btn.click( fn=process_upload, inputs=[image_input, device_id_state], outputs=[caption_output, category_output, ambiguous_output, device_id_state, history_output], ) if __name__ == "__main__": demo.launch()