diff --git a/fastAPI_tarot.py b/fastAPI_tarot.py index 564cd81..9bfb740 100644 --- a/fastAPI_tarot.py +++ b/fastAPI_tarot.py @@ -6,6 +6,8 @@ import numpy as np import cv2 from typing import Optional from contextlib import asynccontextmanager +import dashscope +from dashscope import MultiModalConversation import torch import matplotlib @@ -31,6 +33,10 @@ os.makedirs(RESULT_IMAGE_DIR, exist_ok=True) VALID_API_KEY = "123quant-speed" API_KEY_HEADER_NAME = "X-API-Key" +# Dashscope 配置 (Qwen-VL) +dashscope.api_key = 'sk-ce2404f55f744a1987d5ece61c6bac58' +QWEN_MODEL = 'qwen-vl-max' + # 定义 Header 认证 api_key_header = APIKeyHeader(name=API_KEY_HEADER_NAME, auto_error=False) @@ -264,6 +270,82 @@ def generate_and_save_result(image: Image.Image, inference_state, output_dir: st plt.close() return filename +def recognize_card_with_qwen(image_path: str) -> dict: + """ + 调用 Qwen-VL 识别塔罗牌 + """ + try: + # 确保路径是绝对路径并加上 file:// 前缀 + abs_path = os.path.abspath(image_path) + file_url = f"file://{abs_path}" + + messages = [ + { + "role": "user", + "content": [ + {"image": file_url}, + {"text": "这是一张塔罗牌。请识别它的名字(中文),并判断它是正位还是逆位。请以JSON格式返回,包含 'name' 和 'position' 两个字段。例如:{'name': '愚者', 'position': '正位'}。不要包含Markdown代码块标记。"} + ] + } + ] + + response = MultiModalConversation.call(model=QWEN_MODEL, messages=messages) + + if response.status_code == 200: + content = response.output.choices[0].message.content[0]['text'] + # 尝试解析简单的 JSON + import json + try: + # 清理可能存在的 markdown 标记 + clean_content = content.replace("```json", "").replace("```", "").strip() + result = json.loads(clean_content) + return result + except: + return {"raw_response": content} + else: + return {"error": f"API Error: {response.code} - {response.message}"} + + except Exception as e: + return {"error": f"识别失败: {str(e)}"} + +def recognize_spread_with_qwen(image_path: str) -> dict: + """ + 调用 Qwen-VL 识别塔罗牌牌阵 + """ + try: + # 确保路径是绝对路径并加上 file:// 前缀 + abs_path = os.path.abspath(image_path) + file_url = f"file://{abs_path}" + + messages = [ + { + "role": "user", + "content": [ + {"image": file_url}, + {"text": "这是一张包含多张塔罗牌的图片。请根据牌的排列方式识别这是什么牌阵(例如:圣三角、凯尔特十字、三张牌等)。如果看不出明显的正规牌阵,请返回“不是正规牌阵”。请以JSON格式返回,包含 'spread_name' 和 'description' 两个字段。例如:{'spread_name': '圣三角', 'description': '常见的时间流占卜法'}。不要包含Markdown代码块标记。"} + ] + } + ] + + response = MultiModalConversation.call(model=QWEN_MODEL, messages=messages) + + if response.status_code == 200: + content = response.output.choices[0].message.content[0]['text'] + # 尝试解析简单的 JSON + import json + try: + # 清理可能存在的 markdown 标记 + clean_content = content.replace("```json", "").replace("```", "").strip() + result = json.loads(clean_content) + return result + except: + return {"raw_response": content, "spread_name": "Unknown"} + else: + return {"error": f"API Error: {response.code} - {response.message}"} + + except Exception as e: + return {"error": f"牌阵识别失败: {str(e)}"} + # ------------------- API 接口 (强制依赖验证) ------------------- @app.post("/segment", dependencies=[Depends(verify_api_key)]) async def segment( @@ -398,6 +480,118 @@ async def segment_tarot( "scores": scores.tolist() if torch.is_tensor(scores) else scores }) +@app.post("/recognize_tarot", dependencies=[Depends(verify_api_key)]) +async def recognize_tarot( + request: Request, + file: Optional[UploadFile] = File(None), + image_url: Optional[str] = Form(None), + expected_count: int = Form(3) +): + """ + 塔罗牌全流程接口: 分割 + 矫正 + 识别 + 1. 检测是否包含指定数量的塔罗牌 (SAM3) + 2. 分割并透视矫正 + 3. 调用 Qwen-VL 识别每张牌的名称和正逆位 + """ + if not file and not image_url: + raise HTTPException(status_code=400, detail="必须提供 file (图片文件) 或 image_url (图片链接)") + + try: + if file: + image = Image.open(file.file).convert("RGB") + elif image_url: + image = load_image_from_url(image_url) + except Exception as e: + raise HTTPException(status_code=400, detail=f"图片解析失败: {str(e)}") + + processor = request.app.state.processor + + try: + inference_state = processor.set_image(image) + # 固定 Prompt 检测塔罗牌 + output = processor.set_text_prompt(state=inference_state, prompt="tarot card") + masks, boxes, scores = output["masks"], output["boxes"], output["scores"] + except Exception as e: + raise HTTPException(status_code=500, detail=f"模型推理错误: {str(e)}") + + # 核心逻辑:判断数量 + detected_count = len(masks) + + # 创建本次请求的独立文件夹 + request_id = f"{int(time.time())}_{uuid.uuid4().hex[:8]}" + output_dir = os.path.join(RESULT_IMAGE_DIR, request_id) + os.makedirs(output_dir, exist_ok=True) + + # 保存整体效果图 (无论是成功还是失败,都先保存一张主图) + try: + main_filename = generate_and_save_result(image, inference_state, output_dir=output_dir) + main_file_path = os.path.join(output_dir, main_filename) + main_file_url = str(request.url_for("static", path=f"results/{request_id}/{main_filename}")) + except: + main_filename = None + main_file_path = None + main_file_url = None + + # Step 0: 牌阵识别 (在判断数量之前或之后都可以,这里放在前面作为全局判断) + spread_info = {"spread_name": "Unknown"} + if main_file_path: + # 使用带有mask绘制的主图或者原始图? + # 使用原始图可能更好,不受mask遮挡干扰,但是main_filename是带mask的。 + # 我们这里暂时用原始图保存一份临时文件给Qwen看 + temp_raw_path = os.path.join(output_dir, "raw_for_spread.jpg") + image.save(temp_raw_path) + spread_info = recognize_spread_with_qwen(temp_raw_path) + + # 如果识别结果明确说是“不是正规牌阵”,是否要继续? + # 用户需求:“如果没有正确的牌阵则返回‘不是正规牌阵’” + # 我们将其放在返回结果中,由客户端决定是否展示警告 + + if detected_count != expected_count: + return JSONResponse( + status_code=400, + content={ + "status": "failed", + "message": f"检测到 {detected_count} 个目标,需要严格的 {expected_count} 张塔罗牌。请调整拍摄角度或背景。", + "detected_count": detected_count, + "spread_info": spread_info, + "debug_image_url": str(main_file_url) if main_file_url else None + } + ) + + # 数量正确,执行抠图 + 矫正 + try: + saved_objects = crop_and_save_objects(image, masks, boxes, output_dir=output_dir) + except Exception as e: + raise HTTPException(status_code=500, detail=f"抠图处理错误: {str(e)}") + + # 遍历每张卡片进行识别 + tarot_cards = [] + for obj in saved_objects: + fname = obj["filename"] + file_path = os.path.join(output_dir, fname) + + # 调用 Qwen-VL 识别 + # 注意:这里会串行调用,速度可能较慢。 + recognition_res = recognize_card_with_qwen(file_path) + + file_url = str(request.url_for("static", path=f"results/{request_id}/{fname}")) + tarot_cards.append({ + "url": file_url, + "is_rotated": obj["is_rotated_by_algorithm"], + "orientation_status": "corrected_to_portrait" if obj["is_rotated_by_algorithm"] else "original_portrait", + "recognition": recognition_res, + "note": obj["note"] + }) + + return JSONResponse(content={ + "status": "success", + "message": f"成功识别并分割 {expected_count} 张塔罗牌 (含Qwen识别结果)", + "spread_info": spread_info, + "tarot_cards": tarot_cards, + "full_visualization": main_file_url, + "scores": scores.tolist() if torch.is_tensor(scores) else scores + }) + if __name__ == "__main__": import uvicorn # 注意:如果你的文件名不是 fastAPI_tarot.py,请修改下面第一个参数 diff --git a/requirement.txt b/requirement.txt index 9250748..e020c21 100644 --- a/requirement.txt +++ b/requirement.txt @@ -1,3 +1,4 @@ uvicorn python-multipart -fastapi \ No newline at end of file +fastapi +dashscope \ No newline at end of file diff --git a/static/results/1771145685_9aee4513/raw_for_spread.jpg b/static/results/1771145685_9aee4513/raw_for_spread.jpg new file mode 100644 index 0000000..bc6c8f0 Binary files /dev/null and b/static/results/1771145685_9aee4513/raw_for_spread.jpg differ diff --git a/static/results/1771145685_9aee4513/seg_e9cac52c7b564f4791dbb27c0afba438.jpg b/static/results/1771145685_9aee4513/seg_e9cac52c7b564f4791dbb27c0afba438.jpg new file mode 100644 index 0000000..8bebffc Binary files /dev/null and b/static/results/1771145685_9aee4513/seg_e9cac52c7b564f4791dbb27c0afba438.jpg differ diff --git a/static/results/1771145685_9aee4513/tarot_4e0ceb5d8fe94aef921192d490c2bd1f_4.png b/static/results/1771145685_9aee4513/tarot_4e0ceb5d8fe94aef921192d490c2bd1f_4.png new file mode 100644 index 0000000..855e295 Binary files /dev/null and b/static/results/1771145685_9aee4513/tarot_4e0ceb5d8fe94aef921192d490c2bd1f_4.png differ diff --git a/static/results/1771145685_9aee4513/tarot_7bc4483a0eb54d59beadfb2b4cf76547_2.png b/static/results/1771145685_9aee4513/tarot_7bc4483a0eb54d59beadfb2b4cf76547_2.png new file mode 100644 index 0000000..8c91df7 Binary files /dev/null and b/static/results/1771145685_9aee4513/tarot_7bc4483a0eb54d59beadfb2b4cf76547_2.png differ diff --git a/static/results/1771145685_9aee4513/tarot_af19ffac049b435e8198858105905266_3.png b/static/results/1771145685_9aee4513/tarot_af19ffac049b435e8198858105905266_3.png new file mode 100644 index 0000000..5b1e34d Binary files /dev/null and b/static/results/1771145685_9aee4513/tarot_af19ffac049b435e8198858105905266_3.png differ diff --git a/static/results/1771145685_9aee4513/tarot_be00907cb06442f98cc23b9f2b8b7af6_1.png b/static/results/1771145685_9aee4513/tarot_be00907cb06442f98cc23b9f2b8b7af6_1.png new file mode 100644 index 0000000..f3772a9 Binary files /dev/null and b/static/results/1771145685_9aee4513/tarot_be00907cb06442f98cc23b9f2b8b7af6_1.png differ diff --git a/static/results/1771145685_9aee4513/tarot_c4b6e5068e3f40608f5c35e62501abda_0.png b/static/results/1771145685_9aee4513/tarot_c4b6e5068e3f40608f5c35e62501abda_0.png new file mode 100644 index 0000000..2b36957 Binary files /dev/null and b/static/results/1771145685_9aee4513/tarot_c4b6e5068e3f40608f5c35e62501abda_0.png differ diff --git a/static/results/1771145893_ff902547/raw_for_spread.jpg b/static/results/1771145893_ff902547/raw_for_spread.jpg new file mode 100644 index 0000000..feb3eb4 Binary files /dev/null and b/static/results/1771145893_ff902547/raw_for_spread.jpg differ diff --git a/static/results/1771145893_ff902547/seg_459f783dfe9d467d9b12b00f22a49720.jpg b/static/results/1771145893_ff902547/seg_459f783dfe9d467d9b12b00f22a49720.jpg new file mode 100644 index 0000000..ede7a42 Binary files /dev/null and b/static/results/1771145893_ff902547/seg_459f783dfe9d467d9b12b00f22a49720.jpg differ diff --git a/static/results/1771145893_ff902547/tarot_3217c406c29a4165963da8e44cfdb95b_1.png b/static/results/1771145893_ff902547/tarot_3217c406c29a4165963da8e44cfdb95b_1.png new file mode 100644 index 0000000..f781efb Binary files /dev/null and b/static/results/1771145893_ff902547/tarot_3217c406c29a4165963da8e44cfdb95b_1.png differ diff --git a/static/results/1771145893_ff902547/tarot_47b16e30de574599b084d07f14ff0dbb_0.png b/static/results/1771145893_ff902547/tarot_47b16e30de574599b084d07f14ff0dbb_0.png new file mode 100644 index 0000000..f1fbc07 Binary files /dev/null and b/static/results/1771145893_ff902547/tarot_47b16e30de574599b084d07f14ff0dbb_0.png differ diff --git a/static/results/1771146096_519396b9/raw_for_spread.jpg b/static/results/1771146096_519396b9/raw_for_spread.jpg new file mode 100644 index 0000000..ddc48a4 Binary files /dev/null and b/static/results/1771146096_519396b9/raw_for_spread.jpg differ diff --git a/static/results/1771146096_519396b9/seg_ba885e9af1c84884969eecc4d8715af2.jpg b/static/results/1771146096_519396b9/seg_ba885e9af1c84884969eecc4d8715af2.jpg new file mode 100644 index 0000000..ae0fe56 Binary files /dev/null and b/static/results/1771146096_519396b9/seg_ba885e9af1c84884969eecc4d8715af2.jpg differ diff --git a/static/results/1771146096_519396b9/tarot_00dc2b335eef465d9346e4db7abbb030_7.png b/static/results/1771146096_519396b9/tarot_00dc2b335eef465d9346e4db7abbb030_7.png new file mode 100644 index 0000000..9541399 Binary files /dev/null and b/static/results/1771146096_519396b9/tarot_00dc2b335eef465d9346e4db7abbb030_7.png differ diff --git a/static/results/1771146096_519396b9/tarot_40c1b046fb6c47fda2880ab3086cb0c2_6.png b/static/results/1771146096_519396b9/tarot_40c1b046fb6c47fda2880ab3086cb0c2_6.png new file mode 100644 index 0000000..5c57957 Binary files /dev/null and b/static/results/1771146096_519396b9/tarot_40c1b046fb6c47fda2880ab3086cb0c2_6.png differ diff --git a/static/results/1771146096_519396b9/tarot_41236387fb244c6085530c79d6ba21e7_1.png b/static/results/1771146096_519396b9/tarot_41236387fb244c6085530c79d6ba21e7_1.png new file mode 100644 index 0000000..32cbcd9 Binary files /dev/null and b/static/results/1771146096_519396b9/tarot_41236387fb244c6085530c79d6ba21e7_1.png differ diff --git a/static/results/1771146096_519396b9/tarot_589d3887fdb74c039ee8b5fd6dbe5d72_4.png b/static/results/1771146096_519396b9/tarot_589d3887fdb74c039ee8b5fd6dbe5d72_4.png new file mode 100644 index 0000000..415f35e Binary files /dev/null and b/static/results/1771146096_519396b9/tarot_589d3887fdb74c039ee8b5fd6dbe5d72_4.png differ diff --git a/static/results/1771146096_519396b9/tarot_7d71f5e298524af19f67f272d3fa454d_0.png b/static/results/1771146096_519396b9/tarot_7d71f5e298524af19f67f272d3fa454d_0.png new file mode 100644 index 0000000..98b3ed4 Binary files /dev/null and b/static/results/1771146096_519396b9/tarot_7d71f5e298524af19f67f272d3fa454d_0.png differ diff --git a/static/results/1771146096_519396b9/tarot_87fca4b08743494db02253a5a7ad23bd_5.png b/static/results/1771146096_519396b9/tarot_87fca4b08743494db02253a5a7ad23bd_5.png new file mode 100644 index 0000000..69990c7 Binary files /dev/null and b/static/results/1771146096_519396b9/tarot_87fca4b08743494db02253a5a7ad23bd_5.png differ diff --git a/static/results/1771146096_519396b9/tarot_b00f250fa580442593aa6673da9a476c_2.png b/static/results/1771146096_519396b9/tarot_b00f250fa580442593aa6673da9a476c_2.png new file mode 100644 index 0000000..dcf544d Binary files /dev/null and b/static/results/1771146096_519396b9/tarot_b00f250fa580442593aa6673da9a476c_2.png differ diff --git a/static/results/1771146096_519396b9/tarot_d712393deaa347c39b4258d9c942c155_3.png b/static/results/1771146096_519396b9/tarot_d712393deaa347c39b4258d9c942c155_3.png new file mode 100644 index 0000000..f9c9d8e Binary files /dev/null and b/static/results/1771146096_519396b9/tarot_d712393deaa347c39b4258d9c942c155_3.png differ diff --git a/static/results/1771146680_f72a7212/raw_for_spread.jpg b/static/results/1771146680_f72a7212/raw_for_spread.jpg new file mode 100644 index 0000000..ddc48a4 Binary files /dev/null and b/static/results/1771146680_f72a7212/raw_for_spread.jpg differ diff --git a/static/results/1771146680_f72a7212/seg_f15ea225ae0b43afb75e6da0487fd0ff.jpg b/static/results/1771146680_f72a7212/seg_f15ea225ae0b43afb75e6da0487fd0ff.jpg new file mode 100644 index 0000000..ae0fe56 Binary files /dev/null and b/static/results/1771146680_f72a7212/seg_f15ea225ae0b43afb75e6da0487fd0ff.jpg differ diff --git a/static/results/1771146680_f72a7212/tarot_7e9fd096e65f4f259fa450af01c4d192_5.png b/static/results/1771146680_f72a7212/tarot_7e9fd096e65f4f259fa450af01c4d192_5.png new file mode 100644 index 0000000..69990c7 Binary files /dev/null and b/static/results/1771146680_f72a7212/tarot_7e9fd096e65f4f259fa450af01c4d192_5.png differ diff --git a/static/results/1771146680_f72a7212/tarot_9129a62bc8e84dc28b6fb54ed0b246b4_0.png b/static/results/1771146680_f72a7212/tarot_9129a62bc8e84dc28b6fb54ed0b246b4_0.png new file mode 100644 index 0000000..98b3ed4 Binary files /dev/null and b/static/results/1771146680_f72a7212/tarot_9129a62bc8e84dc28b6fb54ed0b246b4_0.png differ diff --git a/static/results/1771146680_f72a7212/tarot_a095c8aa7efa4d0086738bd4612ae506_4.png b/static/results/1771146680_f72a7212/tarot_a095c8aa7efa4d0086738bd4612ae506_4.png new file mode 100644 index 0000000..415f35e Binary files /dev/null and b/static/results/1771146680_f72a7212/tarot_a095c8aa7efa4d0086738bd4612ae506_4.png differ diff --git a/static/results/1771146680_f72a7212/tarot_acdc163bfa904381a0dd150e7aec6621_7.png b/static/results/1771146680_f72a7212/tarot_acdc163bfa904381a0dd150e7aec6621_7.png new file mode 100644 index 0000000..9541399 Binary files /dev/null and b/static/results/1771146680_f72a7212/tarot_acdc163bfa904381a0dd150e7aec6621_7.png differ diff --git a/static/results/1771146680_f72a7212/tarot_eba7b7d703bc40439501c384a04ea4b7_2.png b/static/results/1771146680_f72a7212/tarot_eba7b7d703bc40439501c384a04ea4b7_2.png new file mode 100644 index 0000000..dcf544d Binary files /dev/null and b/static/results/1771146680_f72a7212/tarot_eba7b7d703bc40439501c384a04ea4b7_2.png differ diff --git a/static/results/1771146680_f72a7212/tarot_f9c4874589674434ab7fd20cc23aef95_6.png b/static/results/1771146680_f72a7212/tarot_f9c4874589674434ab7fd20cc23aef95_6.png new file mode 100644 index 0000000..5c57957 Binary files /dev/null and b/static/results/1771146680_f72a7212/tarot_f9c4874589674434ab7fd20cc23aef95_6.png differ diff --git a/static/results/1771146680_f72a7212/tarot_fd066402593840e6a4a07ea7b2c01acf_1.png b/static/results/1771146680_f72a7212/tarot_fd066402593840e6a4a07ea7b2c01acf_1.png new file mode 100644 index 0000000..32cbcd9 Binary files /dev/null and b/static/results/1771146680_f72a7212/tarot_fd066402593840e6a4a07ea7b2c01acf_1.png differ diff --git a/static/results/1771146680_f72a7212/tarot_fe8c4dc18c484c65839cec054a24fe4a_3.png b/static/results/1771146680_f72a7212/tarot_fe8c4dc18c484c65839cec054a24fe4a_3.png new file mode 100644 index 0000000..f9c9d8e Binary files /dev/null and b/static/results/1771146680_f72a7212/tarot_fe8c4dc18c484c65839cec054a24fe4a_3.png differ diff --git a/static/results/1771147171_7043dd6e/raw_for_spread.jpg b/static/results/1771147171_7043dd6e/raw_for_spread.jpg new file mode 100644 index 0000000..2ae1d46 Binary files /dev/null and b/static/results/1771147171_7043dd6e/raw_for_spread.jpg differ diff --git a/static/results/1771147171_7043dd6e/seg_0cdc98dceab84fca819f62aefd3847fc.jpg b/static/results/1771147171_7043dd6e/seg_0cdc98dceab84fca819f62aefd3847fc.jpg new file mode 100644 index 0000000..1aa29f9 Binary files /dev/null and b/static/results/1771147171_7043dd6e/seg_0cdc98dceab84fca819f62aefd3847fc.jpg differ diff --git a/static/results/1771147215_299c8af0/raw_for_spread.jpg b/static/results/1771147215_299c8af0/raw_for_spread.jpg new file mode 100644 index 0000000..2ae1d46 Binary files /dev/null and b/static/results/1771147215_299c8af0/raw_for_spread.jpg differ diff --git a/static/results/1771147215_299c8af0/seg_c0643609f6bc472aa0c97b63281cf213.jpg b/static/results/1771147215_299c8af0/seg_c0643609f6bc472aa0c97b63281cf213.jpg new file mode 100644 index 0000000..1aa29f9 Binary files /dev/null and b/static/results/1771147215_299c8af0/seg_c0643609f6bc472aa0c97b63281cf213.jpg differ diff --git a/static/results/1771147221_98dd0e08/raw_for_spread.jpg b/static/results/1771147221_98dd0e08/raw_for_spread.jpg new file mode 100644 index 0000000..2ae1d46 Binary files /dev/null and b/static/results/1771147221_98dd0e08/raw_for_spread.jpg differ diff --git a/static/results/1771147221_98dd0e08/seg_16e7b8c3de3f45ec807deb08e15bd155.jpg b/static/results/1771147221_98dd0e08/seg_16e7b8c3de3f45ec807deb08e15bd155.jpg new file mode 100644 index 0000000..1aa29f9 Binary files /dev/null and b/static/results/1771147221_98dd0e08/seg_16e7b8c3de3f45ec807deb08e15bd155.jpg differ diff --git a/static/results/1771147306_7b73fc1a/raw_for_spread.jpg b/static/results/1771147306_7b73fc1a/raw_for_spread.jpg new file mode 100644 index 0000000..ad94cbb Binary files /dev/null and b/static/results/1771147306_7b73fc1a/raw_for_spread.jpg differ diff --git a/static/results/1771147306_7b73fc1a/seg_921fe6a8df7d4bb59abcf2cfcb2a6bcd.jpg b/static/results/1771147306_7b73fc1a/seg_921fe6a8df7d4bb59abcf2cfcb2a6bcd.jpg new file mode 100644 index 0000000..dfec189 Binary files /dev/null and b/static/results/1771147306_7b73fc1a/seg_921fe6a8df7d4bb59abcf2cfcb2a6bcd.jpg differ diff --git a/static/results/1771147306_7b73fc1a/tarot_6b92b6ffcc9e4aee8c31de56a26cf072_1.png b/static/results/1771147306_7b73fc1a/tarot_6b92b6ffcc9e4aee8c31de56a26cf072_1.png new file mode 100644 index 0000000..7468f50 Binary files /dev/null and b/static/results/1771147306_7b73fc1a/tarot_6b92b6ffcc9e4aee8c31de56a26cf072_1.png differ diff --git a/static/results/1771147306_7b73fc1a/tarot_c47484aad11643578789902977ab6e2b_2.png b/static/results/1771147306_7b73fc1a/tarot_c47484aad11643578789902977ab6e2b_2.png new file mode 100644 index 0000000..18d1bf2 Binary files /dev/null and b/static/results/1771147306_7b73fc1a/tarot_c47484aad11643578789902977ab6e2b_2.png differ diff --git a/static/results/1771147306_7b73fc1a/tarot_edac5d739dc84b1186ce7b97b0b6565e_0.png b/static/results/1771147306_7b73fc1a/tarot_edac5d739dc84b1186ce7b97b0b6565e_0.png new file mode 100644 index 0000000..bf9876c Binary files /dev/null and b/static/results/1771147306_7b73fc1a/tarot_edac5d739dc84b1186ce7b97b0b6565e_0.png differ diff --git a/static/results/1771147521_e160c2b3/raw_for_spread.jpg b/static/results/1771147521_e160c2b3/raw_for_spread.jpg new file mode 100644 index 0000000..ad94cbb Binary files /dev/null and b/static/results/1771147521_e160c2b3/raw_for_spread.jpg differ diff --git a/static/results/1771147521_e160c2b3/seg_cf060343000841f5b725e40d6da1a2eb.jpg b/static/results/1771147521_e160c2b3/seg_cf060343000841f5b725e40d6da1a2eb.jpg new file mode 100644 index 0000000..dfec189 Binary files /dev/null and b/static/results/1771147521_e160c2b3/seg_cf060343000841f5b725e40d6da1a2eb.jpg differ diff --git a/static/results/1771147521_e160c2b3/tarot_c3d0b0124be648bfa07b28a663a08341_0.png b/static/results/1771147521_e160c2b3/tarot_c3d0b0124be648bfa07b28a663a08341_0.png new file mode 100644 index 0000000..bf9876c Binary files /dev/null and b/static/results/1771147521_e160c2b3/tarot_c3d0b0124be648bfa07b28a663a08341_0.png differ diff --git a/static/results/1771147521_e160c2b3/tarot_e274add3c6f7456b829aacf910084233_1.png b/static/results/1771147521_e160c2b3/tarot_e274add3c6f7456b829aacf910084233_1.png new file mode 100644 index 0000000..7468f50 Binary files /dev/null and b/static/results/1771147521_e160c2b3/tarot_e274add3c6f7456b829aacf910084233_1.png differ diff --git a/static/results/1771147521_e160c2b3/tarot_fe49f7d7ee1f44f4a1111d59bfd67e5f_2.png b/static/results/1771147521_e160c2b3/tarot_fe49f7d7ee1f44f4a1111d59bfd67e5f_2.png new file mode 100644 index 0000000..18d1bf2 Binary files /dev/null and b/static/results/1771147521_e160c2b3/tarot_fe49f7d7ee1f44f4a1111d59bfd67e5f_2.png differ