Files
Traffic-Intersection-Monito…/optimize_models.py

177 lines
4.9 KiB
Python

#!/usr/bin/env python3
"""
Check and optimize OpenVINO models to FP16 precision.
This script checks if the models are using FP16 precision and converts them if needed.
"""
import os
import sys
import time
import xml.etree.ElementTree as ET
from pathlib import Path
# Add current directory to path
current_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(current_dir)
def check_model_precision(model_path):
"""
Check if the model is using FP16 precision.
Args:
model_path: Path to the model XML file
Returns:
Tuple of (is_fp16, num_fp32_layers, num_total_layers)
"""
if not Path(model_path).exists():
print(f"❌ Model file {model_path} not found!")
return False, 0, 0
tree = ET.parse(model_path)
root = tree.getroot()
fp32_layers = 0
total_layers = 0
# Check layers precision
for layer in root.findall(".//layer"):
total_layers += 1
precision = layer.get("precision")
if precision == "FP32":
fp32_layers += 1
is_fp16 = fp32_layers == 0
return is_fp16, fp32_layers, total_layers
def convert_to_fp16(model_path):
"""
Convert OpenVINO model to FP16 precision.
Args:
model_path: Path to the model XML file
Returns:
Path to the converted model
"""
try:
from openvino.tools import mo
print(f"🔄 Converting model to FP16: {model_path}")
# Get paths
xml_path = Path(model_path)
bin_path = xml_path.with_suffix('.bin')
output_dir = xml_path.parent
if not xml_path.exists() or not bin_path.exists():
print(f"❌ Model files not found: {xml_path} or {bin_path}")
return None
# Run model optimizer to convert to FP16
args = [
"--input_model", str(xml_path),
"--output_dir", str(output_dir),
"--data_type", "FP16"
]
print(f"⚙️ Running Model Optimizer with args: {args}")
start_time = time.time()
mo.main(args)
conversion_time = time.time() - start_time
print(f"✅ Model converted to FP16 in {conversion_time:.2f} seconds")
return model_path
except Exception as e:
print(f"❌ Error converting model: {e}")
import traceback
traceback.print_exc()
return None
def optimize_model(model_path):
"""
Check and optimize model to FP16 precision if needed.
Args:
model_path: Path to the model XML file
Returns:
Path to the optimized model
"""
if not Path(model_path).exists():
print(f"❌ Model file {model_path} not found!")
return None
print(f"🔍 Checking model precision: {model_path}")
is_fp16, fp32_layers, total_layers = check_model_precision(model_path)
if is_fp16:
print(f"✅ Model is already using FP16 precision: {model_path}")
return model_path
else:
print(f"⚠️ Model using FP32 precision ({fp32_layers}/{total_layers} layers). Converting to FP16...")
return convert_to_fp16(model_path)
def main():
"""
Check and optimize all OpenVINO models in the workspace.
"""
print("\n" + "="*80)
print("OpenVINO Model Optimizer - FP32 to FP16 Converter")
print("="*80)
# Check for OpenVINO
try:
import openvino as ov
print(f"✅ OpenVINO version: {ov.__version__}")
except ImportError:
print("⚠️ OpenVINO not installed. Installing now...")
os.system('pip install --quiet "openvino>=2024.0.0"')
import openvino as ov
print(f"✅ OpenVINO installed: {ov.__version__}")
# Find OpenVINO models
search_dirs = [
".",
"openvino_models",
"models",
"../openvino_models"
]
print("🔍 Searching for OpenVINO models...")
models_found = []
for search_dir in search_dirs:
search_path = Path(search_dir)
if not search_path.exists():
continue
# Find XML files
for xml_file in search_path.glob("**/*.xml"):
if "openvino" in str(xml_file).lower() or "yolo" in str(xml_file).lower():
models_found.append(xml_file)
if not models_found:
print("❌ No OpenVINO models found!")
return
print(f"✅ Found {len(models_found)} OpenVINO models:")
for i, model_path in enumerate(models_found):
print(f" {i+1}. {model_path}")
# Process each model
optimized_models = []
for model_path in models_found:
optimized_path = optimize_model(model_path)
if optimized_path:
optimized_models.append(optimized_path)
print(f"\n✅ Optimized {len(optimized_models)} models")
if __name__ == "__main__":
main()