camstack-models / source /README.md
apocaliss92's picture
source: one rebuild recipe per hosted AGPL file; yolov8n-plate provenance
0755c89 verified
|
Raw History Blame
6.47 kB

Source: how the CamStack YOLO builds are made

This folder is the Corresponding Source under the GNU AGPL-3.0 for the Ultralytics-derived weights in this mirror (objectDetection/yolo26, objectDetection/yolov9, segmentation/yolo26-seg, plateDetection/yolov8-plate). The full source offer is in THIRD_PARTY_MODELS.md.

File What it is
build-camstack-models.py Rebuilds every file in the four folders above. One recipe per hosted file stem: upstream checkpoint, input size, the Ultralytics export() arguments, the OpenVINO precisions and the INT8 calibration count. Each value is what the hosted file records about itself in its metadata.
convert_lib.py The converter build-camstack-models.py calls for OpenVINO: ONNX to IR (ov.convert_model, FP32 or FP16-compressed), NNCF INT8 post-training quantisation, and validation of every IR. It is the same file CamStack's Model Studio runs.
requirements.txt Python dependencies of convert_lib.py, with per-platform markers.
export-models.py An older bulk exporter for YOLOv8 / YOLOv9 / YOLO11 ids. No file in this mirror needs it.

Rebuilding

python3 -m venv .venv && . .venv/bin/activate
pip install -r requirements.txt ultralytics openvino nncf
python build-camstack-models.py --list            # the recipes: one per hosted file stem
python build-camstack-models.py --check-hosted    # every hosted file is a recipe output?

python build-camstack-models.py --variant camstack-yolo26n-320   # one hosted model, every format
python build-camstack-models.py --family yolov9                  # one mirror folder
python build-camstack-models.py --all                            # the whole set
python build-camstack-models.py --all --formats onnx,openvino    # some formats only

Results go to ./exported-models/<mirror path>, for example exported-models/objectDetection/yolo26/openvino/camstack-yolo26n-320-int8.xml. Each build step runs in its own Python process: on macOS, CoreML, OpenVINO and TensorFlow crash one another when they share one. CoreML needs macOS. TFLite needs tensorflow and onnx2tf.

What the recipes encode (the hosted files record each of these):

Folder Files ONNX CoreML OpenVINO IR
objectDetection/yolo26 camstack-yolo26{n,s,m,l,x} @640 static, opset 17 static, batch 1 FP16 as <stem>.xml and <stem>-fp16.xml; INT8 <stem>-int8.xml (128 images)
objectDetection/yolo26 camstack-yolo26{n,s,m,l}-{320,256} dynamic axes, opset 17 flexible batch 1..16, FP16 FP32 <stem>.xml; INT8 <stem>-int8.xml (128 images)
objectDetection/yolov9 camstack-yolov9{t,s,m,c}-{320,640} static, opset 13 static, batch 1 FP16 <stem>-fp16.xml; INT8 <stem>-int8.xml (300 images)
segmentation/yolo26-seg camstack-yolo26{n,s,m}-seg @640 static, opset 17 static, batch 1 FP16 <stem>.xml
plateDetection/yolov8-plate camstack-yolov8n-plate @640 third-party file, unmodified static, batch 1 FP16 <stem>.xml (from the ONNX); also TFLite float32

Recorded tool versions (Ultralytics / PyTorch / coremltools / OpenVINO): YOLO26 @640 and YOLO26-seg 8.4.24 / 2.10.0 / 9.0 / 2026.2.1; YOLO26 @320 and @256 8.4.92 / 2.13.0 for ONNX, 2.5.1 for CoreML / 8.3.0 / 2026.2.1; YOLOv9 8.4.98 / 2.13.0 / 9.0 / 2026.2.1; plate CoreML 8.4.24 / 2.10.0 / 9.0, plate IR OpenVINO 2026.0.0. The script warns when the installed Ultralytics differs. With these versions a rebuild gives the hosted weights. Other versions give the same weights in a possibly different graph. The flexible-batch CoreML exports need coremltools 8.3 with PyTorch 2.5.1, the macOS pins in requirements.txt; coremltools 9 aborts on them.

INT8 calibration

The INT8 IRs are NNCF post-training quantisation of the ONNX (convert_lib.quantize_openvino_int8), calibrated on COCO images. The documented calibration set is COCO val2017:

curl -LO http://images.cocodataset.org/zips/val2017.zip && unzip -q val2017.zip
python build-camstack-models.py --family yolo26 --calib-dir ./val2017

The recipe takes the first N images in file-name order: 128 for YOLO26, 300 for YOLOv9, as recorded in each IR's rt_info. Each image is letterboxed to the model's input size with grey (114) padding and scaled to [0, 1], the way CamStack feeds the model at runtime. --calib-samples overrides N. An IR does not record WHICH images calibrated it, so a different set gives an equivalent INT8 model, not a bit-identical one. Without calibration images the INT8 files are skipped and the run says so.

yolov8n-plate

Two third-party YOLOv8n licence-plate fine-tunes, neither trained by CamStack:

  • onnx/camstack-yolov8n-plate.onnx is best.onnx of ml-debi/yolov8-license-plate-detection (revision 8062e8e8, SHA-256 85d236280a1301ad98907947d284951dd2b20c23a6786ff50f7e6a8ec515bd50), hosted unmodified. Its author published no checkpoint, so the ONNX is the only form of that model that exists. CamStack's modification is the OpenVINO conversion, which the script reproduces from it.
  • coreml/ and tflite/ are Ultralytics exports of best.pt of Koushim/yolov8-license-plate-detection (revision 9aaa5cd4, SHA-256 2d95861825bb4184404344c9cf809f40fd31dba785fe54e8ba5b9a3583789822). The script downloads and verifies both files.

Both model cards say MIT. The Ultralytics YOLOv8n base weights keep both AGPL-3.0, as their own metadata states. Neither publishes its training data.

Licences

  • These scripts (build-camstack-models.py, convert_lib.py, export-models.py, requirements.txt) are CamStack's own code and are offered under the MIT licence.
  • The weights they produce keep their upstream licence. The Ultralytics checkpoints are AGPL-3.0 (LICENSES/AGPL-3.0.txt), and so is every file derived from them in this mirror. Nothing here is relicensed; see LICENSE and each folder's README.md.