config.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import os
  2. import socket
  3. def get_local_ip():
  4. """获取本机局域网 IP"""
  5. try:
  6. # 创建一个UDP套接字
  7. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  8. # 连接一个不需要实际存在的外部地址
  9. s.connect(('8.8.8.8', 80))
  10. ip = s.getsockname()[0]
  11. except Exception:
  12. ip = "127.0.0.1"
  13. finally:
  14. s.close()
  15. return ip
  16. class Settings:
  17. LOCAL_IP: str = get_local_ip()
  18. LOCAL_PORT: int = 7721
  19. BASE_URL: str = f"http://{LOCAL_IP}:{LOCAL_PORT}"
  20. # API 核心配置
  21. API_URL: str = "http://100.64.0.8/v1/workflows/run"
  22. API_KEY: str = "Bearer app-qR46FHcfLyKz2kb0tiiRfV50"
  23. USER_ID: str = "abc-123"
  24. # 滑动窗口配置 (可用于长视频的分片处理)
  25. CHUNK_SIZE: int = 8000
  26. OVERLAP_SIZE: int = 500
  27. # 静态资源与图片保存目录配置
  28. STATIC_DIR: str = os.path.join(os.getcwd(), "static")
  29. FRAMES_DIR: str = os.path.join(STATIC_DIR, "frames")
  30. # ==========================================
  31. # 视频帧分析算法配置 (Video Analysis Settings)
  32. # ==========================================
  33. # HuggingFace 语义分割模型路径 (用于识别手和卡片)
  34. VIDEO_SEG_MODEL_DIR: str = r"C:\Code\ML\Model\Card_Seg\segformer_card_hand02_safetensors"
  35. # 目标时间戳前后的搜索范围 (毫秒) -> 决定了去目标时间戳附近多大范围内寻找最佳帧
  36. VIDEO_SEARCH_BEFORE_MS: int = int(os.getenv("VIDEO_SEARCH_BEFORE_MS", "1000")) # 往前找/毫秒
  37. VIDEO_SEARCH_AFTER_MS: int = int(os.getenv("VIDEO_SEARCH_AFTER_MS", "6000")) # 往后找
  38. # 视频分析时的抽帧率 -> 例如 4.0 代表每秒只分析 4 帧,避免逐帧分析导致性能雪崩
  39. VIDEO_ANALYSIS_FPS: float = float(os.getenv("VIDEO_ANALYSIS_FPS", "5.0"))
  40. # 只对综合得分排名前 K 的候选帧进行 OCR 识别 (OCR 比较耗时,没必要每帧都跑)
  41. VIDEO_OCR_TOP_K: int = int(os.getenv("VIDEO_OCR_TOP_K", "5"))
  42. # 目标停留时间 (秒) -> 用来奖励那些在画面中稳定停留的帧 (排除一闪而过的残影)
  43. VIDEO_DWELL_TARGET_SECONDS: float = float(os.getenv("VIDEO_DWELL_TARGET_SECONDS", "1.2"))
  44. # 画面中被判定为"有卡"或"有手"的最小面积比例 (过滤掉误识别的零星像素)
  45. VIDEO_MIN_CARD_AREA_RATIO: float = float(os.getenv("VIDEO_MIN_CARD_AREA_RATIO", "0.01")) # 卡片占全图 >= 1%
  46. VIDEO_MIN_HAND_AREA_RATIO: float = float(os.getenv("VIDEO_MIN_HAND_AREA_RATIO", "0.005")) # 手占全图 >= 0.5%
  47. # 分割模型输出的类别 ID
  48. VIDEO_CARD_LABEL_ID: int = int(os.getenv("VIDEO_CARD_LABEL_ID", "1"))
  49. VIDEO_HAND_LABEL_ID: int = int(os.getenv("VIDEO_HAND_LABEL_ID", "2"))
  50. settings = Settings()
  51. # 确保图片输出目录存在,避免运行报错
  52. os.makedirs(settings.FRAMES_DIR, exist_ok=True)