| """Auto-export best.pt to FP16 ONNX when training finishes or is killed.""" |
| import torch, onnx, os, glob, sys |
| _orig = torch.load |
| def _safe(*a, **kw): kw["weights_only"] = False; return _orig(*a, **kw) |
| torch.load = _safe |
| from ultralytics import YOLO |
| from onnxconverter_common import float16 |
|
|
| |
| candidates = glob.glob("runs/detect/train*/weights/best.pt") + \ |
| glob.glob("train_with_products/run/weights/best.pt") |
| if not candidates: |
| |
| candidates = glob.glob("runs/detect/train*/weights/last.pt") + \ |
| glob.glob("train_with_products/run/weights/last.pt") |
|
|
| if not candidates: |
| print("NO WEIGHTS FOUND") |
| sys.exit(1) |
|
|
| best = sorted(candidates, key=os.path.getmtime)[-1] |
| print(f"Exporting: {best} ({os.path.getsize(best)/1024/1024:.0f}MB)") |
|
|
| model = YOLO(best, task="detect") |
| model.export(format="onnx", opset=17, simplify=True, imgsz=1280) |
| onnx_path = best.replace(".pt", ".onnx") |
|
|
| m = onnx.load(onnx_path) |
| m16 = float16.convert_float_to_float16(m, keep_io_types=True) |
| onnx.save(m16, "/tmp/model_fp16.onnx") |
| size = os.path.getsize("/tmp/model_fp16.onnx") / 1024 / 1024 |
| print(f"FP16: {size:.1f} MB") |
| print("EXPORT DONE") |
|
|