CoreYOLO
Object detection. Built for Apple.
Train an independent detector in Python. Ship Core ML to Apple silicon (ReLU palettes on ANE; SiLU dense FP16 on GPU).
Code is MIT. Weights carry their own license, stated per checkpoint.
Website · Docs · Models · Deploy · iOS sample · Licenses
Roboflow data.yaml → train → .coreyolo → export → Core ML → iPhone / Mac
The public type is Detector (YOLO is a compatibility alias). App code loads CoreYOLO files only (.coreyolo, trained best.pt, or .mlpackage).
Install
pip install coreyolo
pip install "coreyolo[video]" # webcam (`--source 0`)
from coreyolo import Detector
model = Detector("n") # GELAN n; also "s" / "m" / "l", or family="e2e"
model.train(data="data.yaml", epochs=100, imgsz=640)
model.save("weights/app.coreyolo")
model.export(imgsz=640) # ReLU → FP16 + palettes + ANE; SiLU convert → dense FP16 GPU
Designed for Apple silicon
| Core ML first | Fused Conv–BN, inference branch only, cached DFL grids (no meshgrid / arange), host NMS. ReLU: FP16 + 8-bit palettes on the Neural Engine. Converted SiLU: dense FP16 on GPU. iOS 16 and macOS 13. |
| MIT | Code is MIT. Weights are per checkpoint. GELAN files from MultimediaTechLab v9-*.pt are MIT (keep the Wong/Tsui copyright). Ultralytics yolov9*.pt stays AGPL-3.0; converting the file does not change its applicable terms. Choosing a model means choosing its license. |
| Your labels | Drop in a Roboflow YOLO or YOLO-Seg export. Same data.yaml you already have. |
ReLU prefers ANE (--device ane). Converted SiLU graphs prefer GPU.
Three graphs. One trainer.
| Graph | What it is | Ship path |
|---|---|---|
| GELAN (default) | YOLOv9 GELAN. Scales n / s / m / l match public v9-t / s / m / c. Export is the main branch only (no PGI aux). |
Train ReLU for ANE, or convert MultimediaTechLab v9-*.pt (SiLU, GPU, MIT). |
| DFL | C2f + Distribution Focal Loss. Host NMS. Detect and instance segmentation. | --family dfl |
| E2E | Original C3k2 + C2PSA. NMS-free top-300 at inference. | Train from scratch (--family e2e or --recipe coco-n-e2e). |
n, s, m, and l
Same GELAN trainer. Pick the scale for the device.
| Scale | Params (detect, nc=80) | Typical use | Convert (MIT) |
|---|---|---|---|
| n | 2.13M GELAN · 3.16M DFL · 2.73M E2E | iPhone, real-time camera | v9-t.pt |
| s | 7.32M GELAN · 11.17M DFL · 10.65M E2E | Mac / iPad | v9-s.pt |
| m | 20.22M GELAN · 25.90M DFL · 22.63M E2E | Accuracy-biased | v9-m.pt |
| l | 25.59M GELAN · 43.69M DFL · 27.17M E2E | Offline / max accuracy | v9-c.pt |
coreyolo convert --weights v9-t.pt --out weights/coreyolo-n-coco.coreyolo
coreyolo convert --weights v9-s.pt --out weights/coreyolo-s-coco.coreyolo
coreyolo convert --weights v9-m.pt --out weights/coreyolo-m-coco.coreyolo
coreyolo convert --weights v9-c.pt --out weights/coreyolo-l-coco.coreyolo
Source: MultimediaTechLab/YOLO v1.0-alpha (copyright Kin-Yiu Wong and Hao-Tang Tsui). Same MIT files LibreYOLO converts. Ultralytics yolov9t.pt is a different dump (AGPL-3.0). Do not pass those pickles into Detector().
Zoo
Binaries live on GitHub Releases, not in git. mAP stays blank until you record COCO val. See weights/manifest.json and weights/LICENSE_NOTICE.txt. Choosing a model means choosing its license.
| Id | Graph | Act | Compute | How | License |
|---|---|---|---|---|---|
coreyolo-n-coco |
gelan | SiLU | GPU | convert --weights v9-t.pt |
MIT |
coreyolo-s-coco |
gelan | SiLU | GPU | convert --weights v9-s.pt |
MIT |
coreyolo-m-coco |
gelan | SiLU | GPU | convert --weights v9-m.pt |
MIT |
coreyolo-l-coco |
gelan | SiLU | GPU | convert --weights v9-c.pt |
MIT |
coreyolo-n-coco-seg |
gelan | ReLU | ANE | train --task segment |
MIT |
coreyolo-n-coco-relu |
gelan | ReLU | ANE | train --recipe coco-n |
MIT |
coreyolo-e2e-n-coco |
e2e | ReLU | ANE | train --recipe coco-n-e2e |
MIT |
Python SDK
from coreyolo import Detector
model = Detector("n")
model.train(data="datasets/dummy/data.yaml", epochs=20, batch=8, imgsz=320)
model.save("weights/app.coreyolo")
model = Detector("weights/app.coreyolo") # or a Core ML .mlpackage
results = model.predict("photo.jpg", classes="person", save=True)
results[0].save("out.jpg")
model.export(imgsz=320)
model.val(data="data.yaml") returns mAP. model.predict(0) opens the webcam.
From a clone:
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
Apple silicon: PyTorch train / val / predict use MPS (GPU) when it works, then CUDA, then CPU. Core ML .mlpackage inference defaults to GPU (CPU_AND_GPU); --device all adds the Neural Engine, --device ane is ANE-only.
Labels
Roboflow Export → YOLO (detect) or YOLO-Seg (polygons):
dataset/
data.yaml
train/images/ train/labels/
valid/images/ valid/labels/
Detect lines are normalized class xc yc w h. data.yaml may use list or dict names, val or valid.
coreyolo dummy-data --out datasets/dummy
coreyolo train --data datasets/dummy/data.yaml --model n --epochs 20 --imgsz 320
coreyolo export --weights runs/detect/train/weights/best.pt --imgsz 320
Segmentation: --task segment. Mosaic is off. Core ML writes three outputs; NMS and mask assembly stay on the host. iOS sample: examples/ios.
Train on COCO
coreyolo coco --out datasets/coco --download
coreyolo train --recipe coco-n-fast # 100 epochs
coreyolo train --recipe coco-n # 300 epochs, ReLU (ANE)
coreyolo train --recipe coco-n-e2e
| Recipe | Scale | Notes |
|---|---|---|
coco-n-fast |
n | First COCO run |
coco-n / coco-s / coco-m / coco-l |
GELAN ReLU | Neural Engine path |
coco-n-e2e |
n E2E | NMS-free |
CLI
coreyolo coco --out datasets/coco --download [--max-images 512]
coreyolo convert --weights v9-t.pt --out weights/coreyolo-n-coco.coreyolo
coreyolo train --recipe coco-n-fast
coreyolo train --data data.yaml --model n --family e2e --epochs 100 --device gpu
coreyolo val --data data.yaml --weights best.pt --device gpu
coreyolo predict --weights best.mlpackage --source photo.jpg --device gpu
coreyolo predict --weights best.mlpackage --source 0 --device gpu # webcam; Q quits
coreyolo export --weights best.pt --imgsz 640 [--int8] [--no-palette]
coreyolo dummy-data --out datasets/dummy --segment
License
CoreYOLO's code is MIT. It does not require you to open source your application, and it does not change if you sell what you build.
Pretrained weights are separate: each one carries the license of whoever trained it, stated per checkpoint. GELAN COCO files converted from MultimediaTechLab v9-*.pt are MIT (copyright Kin-Yiu Wong and Hao-Tang Tsui). Ultralytics yolov9*.pt converts stay AGPL-3.0. A model you train yourself is yours. Converting a file does not change its applicable terms.
Choosing a model means choosing its license. See docs/licenses.md, weights/LICENSE_NOTICE.txt, and NOTICE. This is a description of the licenses involved, not legal advice. YOLO is a trademark of its owners.
Metadata
Release files for coreyolo 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| coreyolo-0.2.1.tar.gz | 84.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| coreyolo-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 170.6 kB
Release files / coreyolo-0.2.1.tar.gz
| Download URL | coreyolo-0.2.1.tar.gz |
|---|---|
| Size | 84.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2b9e5694c678a5cc38514f244c1191be0d3f5a69d31b4bbfd3794afbb0f87dd8
|
|
BLAKE2b-256 checksum How to use checksums |
a55e25dcc4faaca355e87c35cc7bd4cc2c42f23d2e5a763f23c153283690d471
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.
Transparency logRelease files / coreyolo-0.2.1-py3-none-any.whl
| Download URL | coreyolo-0.2.1-py3-none-any.whl |
|---|---|
| Size | 86.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
19474848f55b9e2467fbdbb7ca75a11159d6e84a2f0537c92ec4491deeb710ae
|
|
BLAKE2b-256 checksum How to use checksums |
f30a2c7de16668a455f664bf2bcb9111b27ab2b3e847b237d8b5d43123f52616
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.
Transparency log