Files
saw_mill_knot_detection/export_rtdetr_oak.py

91 lines
2.5 KiB
Python
Raw Permalink Normal View History

"""
Export trained RT-DETR model for OAK-D camera deployment.
This script exports your trained model to OpenVINO format, which can then be
converted to a blob for the OAK-D camera.
Usage:
python export_rtdetr_oak.py --weights runs/rtdetr_training/training/weights/best.pt
"""
import argparse
from pathlib import Path
def export_for_oak(weights_path: Path, img_size: int = 640):
"""
Export RT-DETR model for OAK-D deployment.
Args:
weights_path: Path to trained .pt weights
img_size: Input image size (should match training)
"""
from ultralytics import RTDETR
if not weights_path.exists():
raise ValueError(f"Weights not found: {weights_path}")
print(f"\n{'='*60}")
print(f"Exporting RT-DETR for OAK-D camera")
print(f"Weights: {weights_path}")
print(f"Image size: {img_size}x{img_size}")
print(f"{'='*60}\n")
# Load model
model = RTDETR(weights_path)
# Export to ONNX first (intermediate format)
print("Step 1/2: Exporting to ONNX...")
onnx_path = model.export(
format="onnx",
imgsz=img_size,
simplify=True,
opset=11, # OAK-compatible opset
)
print(f"✓ ONNX exported: {onnx_path}")
# Export to OpenVINO (for OAK)
print("\nStep 2/2: Exporting to OpenVINO...")
openvino_path = model.export(
format="openvino",
imgsz=img_size,
half=False, # Use FP32 for better compatibility
)
print(f"✓ OpenVINO exported: {openvino_path}")
print(f"\n{'='*60}")
print(f"✓ Export complete!")
print(f"\nNext steps:")
print(f"1. Test OpenVINO model: python test_openvino.py --model {openvino_path}")
print(f"2. Convert to blob for OAK:")
print(f" Online: https://blobconverter.luxonis.com/")
print(f" Or use: blobconverter --openvino-xml {openvino_path}/model.xml")
print(f"3. Deploy blob to OAK-D camera with DepthAI")
print(f"{'='*60}\n")
return openvino_path
def main():
parser = argparse.ArgumentParser(description="Export RT-DETR for OAK-D deployment")
parser.add_argument(
"--weights",
type=Path,
required=True,
help="Path to trained .pt weights file"
)
parser.add_argument(
"--img-size",
type=int,
default=640,
help="Input image size (should match training)"
)
args = parser.parse_args()
export_for_oak(args.weights, args.img_size)
if __name__ == "__main__":
main()