config.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. """
  2. 全局配置 - 服务器版(192.168.77.249, ~/顾工交接/wzj)
  3. 模型/训练代码目录与框架根同级(旧 ~/wzj/wzj → 上级 ~/wzj;现 ~/顾工交接/wzj → 上级 ~/顾工交接)。
  4. """
  5. import os
  6. PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
  7. # 框架根的上一级:模型目录(正在使用的模型_.../、20260415_.../)与之同级。
  8. # 用 dirname(PROJECT_ROOT) 自适应,避免迁移路径后硬编码失效。
  9. WZJ_ROOT = os.path.dirname(PROJECT_ROOT)
  10. # ==================== 模型路径 ====================
  11. YOLO_MODEL_PATH = os.path.join(WZJ_ROOT, "20260415_球星卡和宝可梦模型数据处理和训练代码/yolov11n_card_seg01.onnx")
  12. DINOV2_MODEL_PATH = os.path.join(WZJ_ROOT, "正在使用的模型_3球星卡_1宝可梦/dinov2_base_retrieval_392_PokemonCN04")
  13. # 评级卡检测模型(YOLO26 card_v1,检测封装壳上的评级公司标签 PSA/BGS/CGC/SGC)
  14. # ultralytics 目录在框架树内,用 PROJECT_ROOT 相对路径(本地镜像 D:\顾工交接\wzj 与服务器 ~/wzj/wzj 都自洽)
  15. GRADING_MODEL_PATH = os.path.join(PROJECT_ROOT, "ultralytics/runs/detect/card_v1/weights/best.pt")
  16. # ==================== 数据目录 ====================
  17. DATA_DIR = os.path.join(PROJECT_ROOT, "data")
  18. GALLERY_IMG_DIR = os.path.join(DATA_DIR, "gallery_images")
  19. QUERY_IMG_DIR = os.path.join(DATA_DIR, "query_images")
  20. GALLERY_FEATURES_PATH = os.path.join(DATA_DIR, "gallery_features.npy")
  21. GALLERY_META_PATH = os.path.join(DATA_DIR, "gallery_meta.json")
  22. RESULT_PATH = os.path.join(DATA_DIR, "match_results.json")
  23. # CSV 数据源(服务器读不了PG/CH,从本地导出CSV传入)
  24. CARD_MASTER_CSV = os.path.join(DATA_DIR, "card_master.csv")
  25. TRANSACTIONS_CSV = os.path.join(DATA_DIR, "transactions.csv")
  26. # ==================== 数据库配置(服务器网络隔离,暂不可用,留作参考)====================
  27. PG_CONFIG = {
  28. "host": "100.64.0.10", "port": 25432,
  29. "user": "readonlyuser", "password": "Pass2026", "database": "hs_sync_data",
  30. }
  31. PG_TABLE = "public.cards_master_v2"
  32. CLICKHOUSE_CONFIG = {
  33. "host": "192.168.31.233", "port": 8123,
  34. "username": "card_transactions_ro", "password": "CardTxReadOnly2026!",
  35. "database": "card_transactions",
  36. }
  37. CLICKHOUSE_TABLE = "card_transactions_unified_sync"
  38. # ==================== MinIO(交易图,已验证凭据)====================
  39. MINIO_CONFIG = {
  40. "endpoint": "127.0.0.1:9000", # 服务器本地访问
  41. "access_key": "minioadmin",
  42. "secret_key": "minioadmin",
  43. "secure": False,
  44. "bucket": "reverse.search",
  45. }
  46. # C 端 /match_fields 拍摄图落盘(249 MinIO grading 桶,与树莓派同源凭据;
  47. # SDK 走本机 127.0.0.1,对外回显用 public_base)
  48. CAPP_MINIO = {
  49. "endpoint": "127.0.0.1:9000",
  50. "public_base": "http://192.168.77.249:9000",
  51. "access_key": "pZEwCGnpNN05KPnmC2Yh",
  52. "secret_key": "KfJRuWiv9pVxhIMcFqbkv8hZT9SnNTZ6LPx592D4",
  53. "secure": False,
  54. "bucket": "grading",
  55. "prefix": "capp_img_data",
  56. }
  57. # ==================== 模型参数 ====================
  58. YOLO_CONF_THRESHOLD = 0.25
  59. YOLO_IMG_SIZE = 640
  60. DINOV2_FEATURE_DIM = 768
  61. GRADING_CONF_THRESHOLD = 0.25 # 评级公司标签检测置信度
  62. GRADING_IMG_SIZE = 640
  63. # ==================== 检索参数 ====================
  64. TOP_K = 5
  65. SIMILARITY_THRESHOLD = 0.50 # 100张人工核验:sim>=0.50 几乎无误,定为高/低置信界限(2026-09-02从0.60同步158生产值)
  66. GALLERY_FILTER = None
  67. DOWNLOAD_WORKERS = 16
  68. FEATURE_BATCH_SIZE = 32
  69. def ensure_dirs():
  70. for d in [DATA_DIR, GALLERY_IMG_DIR, QUERY_IMG_DIR]:
  71. os.makedirs(d, exist_ok=True)
  72. # ===== 双区级联(2026-08 从本地同步追加,供 cascade_match / 生产入库)=====
  73. CARD_CROP_MODE = os.environ.get("CARD_CROP_MODE", "seg_warp")
  74. CARD_SEG_MODEL_PATH = os.path.join(PROJECT_ROOT, "ultralytics/runs/segment/card_seg_pn_v2/weights/best.pt")
  75. YOLO_MODEL_PATH_LEGACY = YOLO_MODEL_PATH # 保留旧 A4 onnx 路径
  76. # 查询侧默认走 card_seg_v2;旧 serve 若依赖 YOLO_MODEL_PATH=onnx 请用 CARD_CROP_MODE=bbox_legacy
  77. if CARD_CROP_MODE == "seg_warp" and os.path.exists(CARD_SEG_MODEL_PATH):
  78. YOLO_MODEL_PATH = CARD_SEG_MODEL_PATH
  79. UPPER_MODEL_PATH = os.path.join(PROJECT_ROOT, "upper_model_output_v0904/best_upper_half_model.pth")
  80. LOWER_MODEL_PATH = os.path.join(PROJECT_ROOT, "layer3_bg_model_output_v0904/best_layer3_bottom_model.pth")
  81. UPPER_HALF_CROPS_DIR = os.path.join(PROJECT_ROOT, "_upper_half_crops")
  82. GALLERY_UPPER_FEATURES_PATH = os.path.join(DATA_DIR, "gallery_v0904/gallery_upper_features.npy")
  83. GALLERY_LOWER_FEATURES_PATH = os.path.join(DATA_DIR, "gallery_v0904/gallery_lower_features.npy")
  84. GALLERY_DUAL_META_PATH = os.path.join(DATA_DIR, "gallery_v0904/gallery_dual_meta.json")
  85. CARD_MASTER_ALL_CSV = os.path.join(DATA_DIR, "card_master_all.csv")
  86. DUAL_FEATURE_DIM = 1024
  87. CASCADE_TOP_K_RECALL = 30
  88. CASCADE_ALPHA = 0.5
  89. CASCADE_BACKEND = "gpu" # 2026-09-03 切 GPU 常驻图库召回(bench Top-5 与 milvus 全等,40ms→0.4ms/卡);回滚改回 milvus # 249 默认走本机 Milvus 双区库
  90. MILVUS_HOST = "127.0.0.1"
  91. MILVUS_PORT = "19530"
  92. MILVUS_UPPER_COLLECTION = "pokemon_dual_upper_dinov2l_1024"
  93. MILVUS_LOWER_COLLECTION = "pokemon_dual_lower_dinov2l_1024"
  94. # ==================== 8020 生产接口(serve_card_match_v2)排队/缓存 ====================
  95. # 全部支持环境变量覆盖;本地调试与 249 生产用同一套默认值
  96. V2_QUEUE_SIZE = int(os.environ.get("V2_QUEUE_SIZE", "32")) # 任务队列上限,满即 429
  97. V2_WORKERS = int(os.environ.get("V2_WORKERS", "0")) # 推理 worker 数;0=自动(=可见GPU数,至少1);>GPU数=每卡多worker(压测后再开)
  98. V2_WAIT_TIMEOUT = float(os.environ.get("V2_WAIT_TIMEOUT", "60")) # handler 等结果超时(秒),超时 504
  99. V2_CACHE_MAX = int(os.environ.get("V2_CACHE_MAX", "256")) # 内容 md5 → 结果缓存条数(LRU)
  100. V2_CACHE_TTL = float(os.environ.get("V2_CACHE_TTL", "900")) # 缓存 TTL(秒)
  101. V2_MAX_CONTENT_MB = int(os.environ.get("V2_MAX_CONTENT_MB", "20")) # 上传图大小上限(MB)
  102. # ==================== 卡牌分割近距 mask 合并(yolo_detector.detect_and_crop_all)====================
  103. # 两实例中心(mask 质心,回退 bbox 中心)距离 <= CARD_MERGE_DIST_PX 视为同一张卡的重复分割,
  104. # 保留 conf 高者;CARD_MERGE_DIST_PX<=0 关闭合并。
  105. # CARD_MERGE_MIN_IOU:可选 IoU 门槛(>0 启用:距离近且 IoU 达标才合并,防误杀紧贴的不同卡);
  106. # 0 = 纯距离口径(默认,与 8020 接口定稿一致)。
  107. CARD_MERGE_DIST_PX = float(os.environ.get("CARD_MERGE_DIST_PX", "50"))
  108. CARD_MERGE_MIN_IOU = float(os.environ.get("CARD_MERGE_MIN_IOU", "0"))