Ver código fonte

配置更新

AnlaAnla 1 dia atrás
pai
commit
235137fc0c
4 arquivos alterados com 75 adições e 9 exclusões
  1. 1 1
      Test/seg_test02.py
  2. 67 0
      Test/test02.py
  3. 2 2
      app/core/config.py
  4. 5 6
      app/services/video_service.py

+ 1 - 1
Test/seg_test02.py

@@ -43,5 +43,5 @@ def show(img_path):
     plt.show()
 
 if __name__ == '__main__':
-    show(r"C:\Users\wow38\Pictures\videoframe_6871967 - 副本.png")
+    show("../static/frames/9b6704fa-2bc7-40e7-b0a5-f41fd9b8b93f_10930288.jpg")
     print()

+ 67 - 0
Test/test02.py

@@ -0,0 +1,67 @@
+import os
+from langgraph.graph import StateGraph, START, END
+from langgraph.graph.message import add_messages
+from langchain_openai import ChatOpenAI
+
+# --------------- 基本配置 ----------------
+
+# 1) 设置 API Key & Base URL
+# 假设你已经通过 DeepSeek QPI 获取到了兼容 OpenAI 的 key & endpoint
+os.environ["OPENAI_API_KEY"] = "YOUR_QPI_API_KEY"
+# 如果 DeepSeek QPI 需要自定义 Base URL,请设置:
+# os.environ["OPENAI_API_BASE"] = "https://your-provider-url/v1"
+
+# 2) 初始化 LLM
+# deepseek/deepseek-r1 通常在 QPI/OpenRouter 兼容 API 下可调用
+llm = ChatOpenAI(model="deepseek/deepseek-r1:latest", temperature=0.7)
+
+
+# --------------- LangGraph 节点 ----------------
+
+def call_deepseek(state):
+    """
+    一个简单的函数节点,它用 LLM 理解 state["messages"]
+    并返回下一步 messages
+    """
+    user_msgs = state["messages"]
+
+    # 调用 LLM
+    response = llm(
+        # LangChain 格式要求 messages 是 dict 列表
+        messages=user_msgs
+    )
+
+    # 获取模型输出的 text
+    ai_msg = response["choices"][0]["message"]
+
+    # 将 AI 的回复追加回状态
+    return {"messages": user_msgs + [ai_msg]}
+
+
+# --------------- 构建状态图 ----------------
+
+# 状态类型使用 LangChain 的消息状态对象
+from langgraph.graph import MessagesState
+
+graph = StateGraph(MessagesState)
+
+# 添加节点到图
+graph.add_node(call_deepseek)
+
+# 定义边 (Start → 我们的 LLM 节点 → End)
+graph.add_edge(START, "call_deepseek")
+graph.add_edge("call_deepseek", END)
+
+# 编译图
+compiled_graph = graph.compile()
+
+# --------------- 调用运行 ----------------
+
+result = compiled_graph.invoke({
+    "messages": [
+        {"role": "user", "content": "你好,帮我写一段 LangGraph 入门示例说明"}
+    ]
+})
+
+# 输出最终状态
+print(result["messages"][-1]["content"])

+ 2 - 2
app/core/config.py

@@ -28,7 +28,7 @@ class Settings:
     USER_ID: str = "abc-123"
 
     # 滑动窗口配置 (可用于长视频的分片处理)
-    CHUNK_SIZE: int = 10000
+    CHUNK_SIZE: int = 8000
     OVERLAP_SIZE: int = 500
 
     # 静态资源与图片保存目录配置
@@ -47,7 +47,7 @@ class Settings:
     VIDEO_SEARCH_AFTER_MS: int = int(os.getenv("VIDEO_SEARCH_AFTER_MS", "6000"))  # 往后找
 
     # 视频分析时的抽帧率 -> 例如 4.0 代表每秒只分析 4 帧,避免逐帧分析导致性能雪崩
-    VIDEO_ANALYSIS_FPS: float = float(os.getenv("VIDEO_ANALYSIS_FPS", "4.0"))
+    VIDEO_ANALYSIS_FPS: float = float(os.getenv("VIDEO_ANALYSIS_FPS", "5.0"))
 
     # 只对综合得分排名前 K 的候选帧进行 OCR 识别 (OCR 比较耗时,没必要每帧都跑)
     VIDEO_OCR_TOP_K: int = int(os.getenv("VIDEO_OCR_TOP_K", "5"))

+ 5 - 6
app/services/video_service.py

@@ -10,6 +10,9 @@ import cv2
 from app.core.config import settings
 from app.core.logger import get_logger
 from app.schemas.models import CardInfoInput, CardInfoOutput
+import torch
+from PIL import Image
+from transformers import AutoImageProcessor, AutoModelForSemanticSegmentation
 
 logger = get_logger("VideoService")
 
@@ -46,8 +49,8 @@ class FrameCandidate:
 
 class VideoService:
     def __init__(self):
-        # 高斯分布的 sigma,用于计算时间权重。10.0 表示对时间差容忍度较
-        self.weight_sigma = 10.0
+        # 高斯分布的 sigma,用于计算时间权重。更大表示对时间差容忍度更
+        self.weight_sigma = 6.0
         self.search_before_ms = settings.VIDEO_SEARCH_BEFORE_MS
         self.search_after_ms = settings.VIDEO_SEARCH_AFTER_MS
         self.analysis_fps = max(settings.VIDEO_ANALYSIS_FPS, 0.5)
@@ -127,10 +130,6 @@ class VideoService:
             return None
 
         try:
-            import torch
-            from PIL import Image
-            from transformers import AutoImageProcessor, AutoModelForSemanticSegmentation
-
             self._seg_processor = AutoImageProcessor.from_pretrained(model_dir)
             self._seg_model = AutoModelForSemanticSegmentation.from_pretrained(model_dir)
             self._seg_model.eval()  # 开启评估模式