提高视频帧率

This commit is contained in:
2025-10-08 11:51:28 +08:00
parent f40d6ffcb6
commit f0b4c5a8bf
13 changed files with 133 additions and 648 deletions

View File

@@ -12,7 +12,7 @@ from app.models import Detection
class PythonModelDetector:
"""Object detector using native Python models"""
def __init__(self, model_name: str, model_path: str, input_width: int, input_height: int, color: int = 0x00FF00):
def __init__(self, model_name: str, model_path: str, input_width: int, input_height: int, color: int = 0x00FF00, model_config: dict = None):
"""
Initialize detector with Python model
@@ -22,11 +22,13 @@ class PythonModelDetector:
input_width: Input width for the model
input_height: Input height for the model
color: RGB color for detection boxes (default: green)
model_config: Additional configuration to pass to the model
"""
self.model_name = model_name
self.input_width = input_width
self.input_height = input_height
self.color = color
self.model_config = model_config or {}
# Convert color from RGB to BGR (OpenCV uses BGR)
self.color_bgr = ((color & 0xFF) << 16) | (color & 0xFF00) | ((color >> 16) & 0xFF)
@@ -72,8 +74,18 @@ class PythonModelDetector:
if not hasattr(model_module, "Model"):
raise AttributeError(f"Model module must define a 'Model' class: {model_path}")
# Create model instance
self.model = model_module.Model()
# Create model instance with config
# Try to pass config to model constructor if it accepts parameters
import inspect
model_class = model_module.Model
sig = inspect.signature(model_class.__init__)
if len(sig.parameters) > 1: # Has parameters beyond 'self'
# Pass all config as keyword arguments
self.model = model_class(**self.model_config)
else:
# No parameters, create without arguments
self.model = model_class()
# Check if model has the required methods
if not hasattr(self.model, "predict"):
@@ -113,18 +125,16 @@ class PythonModelDetector:
# Original image dimensions
img_height, img_width = img.shape[:2]
# Preprocess image
processed_img = self.preprocess(img)
# Measure inference time
start_time = time.time()
try:
# Run inference using model's predict method
# Note: Pass original image to model, let it handle preprocessing
# Expected return format from model's predict:
# List of dicts with keys: 'bbox', 'class_id', 'confidence'
# bbox: (x, y, w, h) normalized [0-1]
model_results = self.model.predict(processed_img)
model_results = self.model.predict(img)
# Calculate inference time in milliseconds
inference_time = (time.time() - start_time) * 1000
@@ -279,13 +289,22 @@ class ModelManager:
# Use color from palette
color = palette[i % len(palette)]
# Extract model-specific config (model_file, model_name, etc.)
# These will be passed to the Model class __init__
model_init_config = {}
if "model_file" in model_config:
model_init_config["model_file"] = model_config["model_file"]
if "display_name" in model_config:
model_init_config["model_name"] = model_config["display_name"]
# Create detector for Python model
detector = PythonModelDetector(
model_name=name,
model_path=path,
input_width=size[0],
input_height=size[1],
color=color
color=color,
model_config=model_init_config
)
self.models[name] = detector