8f05a7c188
- Update ASR, face, OCR, pose processors - Add release pre-flight check script - Add synonym generation, chunk processing scripts - Add face recognition, stamp search utilities
177 lines
4.7 KiB
Python
177 lines
4.7 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
測試數據庫修復後的視頻人臉分析
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
import json
|
|
import psycopg2
|
|
from datetime import datetime
|
|
|
|
# 添加項目根目錄到路徑
|
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
# 數據庫連接配置
|
|
DB_CONFIG = {
|
|
"host": "localhost",
|
|
"port": 5432,
|
|
"database": "momentry",
|
|
"user": "accusys",
|
|
"password": "accusys",
|
|
}
|
|
|
|
|
|
def test_database_connection():
|
|
"""測試數據庫連接"""
|
|
try:
|
|
conn = psycopg2.connect(**DB_CONFIG)
|
|
cursor = conn.cursor()
|
|
|
|
# 檢查表是否存在
|
|
cursor.execute("""
|
|
SELECT EXISTS (
|
|
SELECT FROM information_schema.tables
|
|
WHERE table_name = 'face_detections'
|
|
)
|
|
""")
|
|
table_exists = cursor.fetchone()[0]
|
|
|
|
if not table_exists:
|
|
print("❌ face_detections 表不存在")
|
|
return False
|
|
|
|
# 檢查列結構
|
|
cursor.execute("""
|
|
SELECT column_name, data_type, is_nullable
|
|
FROM information_schema.columns
|
|
WHERE table_name = 'face_detections'
|
|
ORDER BY ordinal_position
|
|
""")
|
|
|
|
columns = cursor.fetchall()
|
|
print("✅ face_detections 表結構:")
|
|
for col in columns:
|
|
print(
|
|
f" - {col[0]}: {col[1]} ({'NULL' if col[2] == 'YES' else 'NOT NULL'})"
|
|
)
|
|
|
|
# 檢查是否有 frame_number 列
|
|
column_names = [col[0] for col in columns]
|
|
if "frame_number" not in column_names:
|
|
print("❌ 缺少 frame_number 列")
|
|
return False
|
|
|
|
if "timestamp_secs" not in column_names:
|
|
print("❌ 缺少 timestamp_secs 列")
|
|
return False
|
|
|
|
cursor.close()
|
|
conn.close()
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"❌ 數據庫連接錯誤: {e}")
|
|
return False
|
|
|
|
|
|
def test_insert_detection():
|
|
"""測試插入人臉檢測記錄"""
|
|
try:
|
|
conn = psycopg2.connect(**DB_CONFIG)
|
|
cursor = conn.cursor()
|
|
|
|
# 創建測試數據
|
|
test_detection = {
|
|
"video_uuid": "test_uuid_123",
|
|
"frame_idx": 100,
|
|
"timestamp": 5.0,
|
|
"x": 100,
|
|
"y": 150,
|
|
"width": 50,
|
|
"height": 60,
|
|
"confidence": 0.95,
|
|
"embedding": [0.1] * 512, # 512維嵌入向量
|
|
"attributes": {"age": 30, "gender": "male"},
|
|
"detected_at": datetime.now(),
|
|
}
|
|
|
|
# 插入測試記錄
|
|
cursor.execute(
|
|
"""
|
|
INSERT INTO face_detections (
|
|
video_uuid, frame_number, timestamp_secs,
|
|
x, y, width, height, confidence,
|
|
embedding, attributes, created_at
|
|
) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
|
|
RETURNING id
|
|
""",
|
|
(
|
|
test_detection["video_uuid"],
|
|
test_detection["frame_idx"],
|
|
test_detection["timestamp"],
|
|
test_detection["x"],
|
|
test_detection["y"],
|
|
test_detection["width"],
|
|
test_detection["height"],
|
|
test_detection["confidence"],
|
|
json.dumps(test_detection["embedding"]),
|
|
json.dumps(test_detection["attributes"]),
|
|
test_detection["detected_at"],
|
|
),
|
|
)
|
|
|
|
record_id = cursor.fetchone()[0]
|
|
conn.commit()
|
|
|
|
print(f"✅ 成功插入測試記錄,ID: {record_id}")
|
|
|
|
# 驗證記錄
|
|
cursor.execute(
|
|
"SELECT COUNT(*) FROM face_detections WHERE id = %s", (record_id,)
|
|
)
|
|
count = cursor.fetchone()[0]
|
|
|
|
if count == 1:
|
|
print("✅ 記錄驗證成功")
|
|
else:
|
|
print("❌ 記錄驗證失敗")
|
|
|
|
# 清理測試數據
|
|
cursor.execute("DELETE FROM face_detections WHERE id = %s", (record_id,))
|
|
conn.commit()
|
|
|
|
cursor.close()
|
|
conn.close()
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"❌ 插入測試記錄失敗: {e}")
|
|
return False
|
|
|
|
|
|
def main():
|
|
print("=" * 60)
|
|
print("測試數據庫修復")
|
|
print("=" * 60)
|
|
|
|
# 測試數據庫連接
|
|
print("\n1. 測試數據庫連接...")
|
|
if not test_database_connection():
|
|
print("❌ 數據庫連接測試失敗")
|
|
return
|
|
|
|
# 測試插入功能
|
|
print("\n2. 測試插入人臉檢測記錄...")
|
|
if not test_insert_detection():
|
|
print("❌ 插入測試失敗")
|
|
return
|
|
|
|
print("\n" + "=" * 60)
|
|
print("✅ 所有測試通過!數據庫修復成功")
|
|
print("=" * 60)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|