kamillkate commited on
Commit
eaf56fa
·
verified ·
1 Parent(s): cea9252

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +128 -0
app.py ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ SAM 3 視頻概念分割 - 使用文本提示跟踪概念
3
+ 基於 Ultralytics SAM 3 文檔:
4
+ https://docs.ultralytics.com/zh/models/sam-3/#track-concepts-with-text-prompts
5
+
6
+ 需求:
7
+ pip install -U ultralytics
8
+ pip uninstall clip -y
9
+ pip install git+https://github.com/ultralytics/CLIP.git
10
+
11
+ 注意:
12
+ sam3.pt 需要從 Hugging Face 手動下載(需申請權限):
13
+ https://huggingface.co/facebook/sam3
14
+ """
15
+
16
+ import cv2
17
+ from pathlib import Path
18
+ from ultralytics.models.sam import SAM3VideoSemanticPredictor
19
+
20
+
21
+ # ─────────────────────────────────────────────
22
+ # 設定區域(請依需求修改)
23
+ # ─────────────────────────────────────────────
24
+
25
+ # 輸入影片路徑(可改為本地影片路徑)
26
+ VIDEO_SOURCE = "path/to/your/video.mp4"
27
+
28
+ # 文本提示:指定要追蹤的概念(可自由修改)
29
+ TEXT_PROMPTS = ["person", "bicycle"]
30
+
31
+ # SAM 3 模型權重路徑(需手動下載)
32
+ MODEL_PATH = "sam3.pt"
33
+
34
+ # 輸出影片路徑
35
+ OUTPUT_PATH = "output.mp4"
36
+
37
+ # 信心閾值
38
+ CONFIDENCE = 0.25
39
+
40
+ # 圖像尺寸
41
+ IMG_SIZE = 640
42
+
43
+ # ─────────────────────────────────────────────
44
+ # 主程式
45
+ # ─────────────────────────────────────────────
46
+
47
+ def main():
48
+ print("=" * 60)
49
+ print("SAM 3 視頻概念分割 - 文本提示跟踪")
50
+ print("=" * 60)
51
+ print(f"📹 輸入影片:{VIDEO_SOURCE}")
52
+ print(f"🔍 追蹤概念:{TEXT_PROMPTS}")
53
+ print(f"💾 輸出路徑:{OUTPUT_PATH}")
54
+ print()
55
+
56
+ # 確認影片存在
57
+ if not Path(VIDEO_SOURCE).exists():
58
+ raise FileNotFoundError(
59
+ f"找不到影片:{VIDEO_SOURCE}\n"
60
+ "請修改 VIDEO_SOURCE 為有效的影片路徑。"
61
+ )
62
+
63
+ # 確認模型存在
64
+ if not Path(MODEL_PATH).exists():
65
+ raise FileNotFoundError(
66
+ f"找不到 SAM 3 模型:{MODEL_PATH}\n"
67
+ "請至 https://huggingface.co/facebook/sam3 下載 sam3.pt 並放置於當前目錄。"
68
+ )
69
+
70
+ # 初始化 SAM3VideoSemanticPredictor
71
+ overrides = dict(
72
+ conf=CONFIDENCE,
73
+ task="segment",
74
+ mode="predict",
75
+ imgsz=IMG_SIZE,
76
+ model=MODEL_PATH,
77
+ half=True, # 使用 FP16 加速推理(GPU 需支援)
78
+ save=False, # 我們手動處理輸出,不使用自動儲存
79
+ )
80
+ predictor = SAM3VideoSemanticPredictor(overrides=overrides)
81
+
82
+ # 取得影片基本資訊(用於設定輸出)
83
+ cap = cv2.VideoCapture(VIDEO_SOURCE)
84
+ fps = cap.get(cv2.CAP_PROP_FPS) or 30.0
85
+ width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
86
+ height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
87
+ total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
88
+ cap.release()
89
+
90
+ print(f"影片資訊:{width}x{height} @ {fps:.1f} FPS,共 {total_frames} 幀")
91
+
92
+ # 建立 VideoWriter 輸出 output.mp4
93
+ fourcc = cv2.VideoWriter_fourcc(*"mp4v")
94
+ writer = cv2.VideoWriter(OUTPUT_PATH, fourcc, fps, (width, height))
95
+
96
+ # 執行文本提示視頻跟踪(stream=True 逐幀處理)
97
+ print(f"\n開始分割追蹤...")
98
+ results = predictor(
99
+ source=VIDEO_SOURCE,
100
+ text=TEXT_PROMPTS,
101
+ stream=True,
102
+ )
103
+
104
+ frame_count = 0
105
+ for r in results:
106
+ frame_count += 1
107
+
108
+ # 取得帶有分割遮罩的視覺化幀
109
+ annotated_frame = r.plot() # BGR numpy array
110
+
111
+ # 寫入輸出影片
112
+ writer.write(annotated_frame)
113
+
114
+ # 顯示進度
115
+ if frame_count % 10 == 0 or frame_count == 1:
116
+ print(f" 處理第 {frame_count}/{total_frames} 幀 | 偵測到 {len(r.boxes) if r.boxes is not None else 0} 個物件")
117
+
118
+ writer.release()
119
+
120
+ print()
121
+ print("=" * 60)
122
+ print(f"✅ 完成!共處理 {frame_count} 幀")
123
+ print(f"💾 輸出已儲存至:{OUTPUT_PATH}")
124
+ print("=" * 60)
125
+
126
+
127
+ if __name__ == "__main__":
128
+ main()