hasari-api / tools /export_models.py
erdoganpeker's picture
v0.3.0 — multimodal vehicle damage MVP
e327f0d
"""
export_models.py
Egitilmis YOLO26 modelini mobil/edge formatlarina export eder.
Desteklenen formatlar:
- tflite: Android, INT8 quantization destekli
- coreml: iOS, FP16 onerilen
- onnx: Cross-platform, ONNX Runtime icin
- openvino: Intel CPU/iGPU
- engine: NVIDIA TensorRT
Kullanim:
# Android icin INT8 TFLite (kucuk + hizli)
python export_models.py --weights runs/.../best.pt \
--format tflite --imgsz 320 --int8
# iOS icin CoreML FP16
python export_models.py --weights runs/.../best.pt \
--format coreml --imgsz 320 --half
# Server icin ONNX
python export_models.py --weights runs/.../best.pt \
--format onnx --imgsz 640
"""
import argparse
from pathlib import Path
from ultralytics import YOLO
def export(weights, format_name, imgsz=640, int8=False, half=False, data=None,
dynamic=False, simplify=True):
"""YOLO26 modelini istenen formata export eder."""
print(f"Yukleniyor: {weights}")
model = YOLO(weights)
kwargs = {
"format": format_name,
"imgsz": imgsz,
"half": half,
"int8": int8,
"dynamic": dynamic,
"simplify": simplify,
}
if data and int8:
# INT8 icin calibration veri seti gerekir
kwargs["data"] = data
print(f"Export ediliyor: format={format_name}, imgsz={imgsz}, int8={int8}, half={half}")
output_path = model.export(**kwargs)
print(f"\nBasarili: {output_path}")
return output_path
def benchmark_exported(model_path, imgsz=320, runs=50):
"""Export edilmis modelin hizini olcer."""
import time
import numpy as np
print(f"\nBenchmark: {model_path}")
try:
model = YOLO(model_path)
dummy = np.zeros((imgsz, imgsz, 3), dtype=np.uint8)
# Warm-up
for _ in range(5):
model.predict(dummy, verbose=False)
# Olc
start = time.time()
for _ in range(runs):
model.predict(dummy, verbose=False)
elapsed = time.time() - start
ms_per_image = elapsed * 1000 / runs
print(f" Ortalama: {ms_per_image:.2f} ms/image")
print(f" FPS: {1000 / ms_per_image:.1f}")
except Exception as e:
print(f" Benchmark basarisiz: {e}")
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--weights", type=str, required=True,
help=".pt model dosyasi")
parser.add_argument("--format", type=str, default="tflite",
choices=["tflite", "coreml", "onnx", "openvino", "engine",
"torchscript", "saved_model"])
parser.add_argument("--imgsz", type=int, default=320,
help="Mobile icin 320 onerilir, server icin 640")
parser.add_argument("--int8", action="store_true",
help="INT8 quantization (mobile icin)")
parser.add_argument("--half", action="store_true",
help="FP16 (iOS Neural Engine icin)")
parser.add_argument("--dynamic", action="store_true")
parser.add_argument("--data", type=str, default=None,
help="INT8 calibration icin data yaml")
parser.add_argument("--benchmark", action="store_true",
help="Export sonrasi benchmark koc")
args = parser.parse_args()
output_path = export(
weights=args.weights,
format_name=args.format,
imgsz=args.imgsz,
int8=args.int8,
half=args.half,
dynamic=args.dynamic,
data=args.data,
)
if args.benchmark:
benchmark_exported(output_path, imgsz=args.imgsz)
# Mobile entegrasyon notlari
print("\n=== Sonraki Adim ===")
if args.format == "tflite":
print("Android entegrasyonu:")
print(" - mobile/assets/models/ klasorune kopyala")
print(" - react-native-fast-tflite ile yukle")
print(" - imgsz=320 icin input shape [1, 320, 320, 3] uint8")
elif args.format == "coreml":
print("iOS entegrasyonu:")
print(" - .mlpackage dosyasini Xcode projesine drag-drop et")
print(" - Vision framework ile inference")
print(" - Apple Neural Engine'in tum gucunu kullan")
elif args.format == "onnx":
print("Server/desktop:")
print(" - onnxruntime ile yukle: pip install onnxruntime-gpu")
print(" - Triton Inference Server icin uygun")
if __name__ == "__main__":
main()