“Free” is a licensing claim, not a price
The most common industrial vision baseline is distributed under a copyleft licence whose network-use provision applies directly to an internal inspection service at a manufacturer. This screen sets out what the licence actually says, what the vendor says it says, what removing the obligation costs, and why the permissive alternative is not a compromise. Every SPDX identifier below was read from the GitHub licence API on 2026-08-09; every dataset licence from the publisher's own metadata API.
What AGPL-3.0 section 13 actually says
Verbatim, from https://www.gnu.org/licenses/agpl-3.0.txt.
13. Remote Network Interaction; Use with the GNU General Public License. Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software.
Three conditions must all hold. They are worth taking one at a time, because the engineer in the room who challenges this is challenging the first one.
| Condition | What it means for a plant inspection service | Verdict |
|---|---|---|
if you modify the Program | Fine-tuning through the public API is arguable. Editing the package source, writing a custom head, loss or dataloader inside it, or vendoring it into your application is clearly modification. Real inspection projects almost always modify. | usually true |
users interacting with it remotely through a computer network | QA stations, an MES, or a line-side HMI calling a REST or gRPC endpoint over the plant network are remote users. Section 13 does not carve out employees. A command-line run by one engineer on one laptop is not. | true for any inspection service |
(if your version supports such interaction) | Wrapping the model in FastAPI, Flask or Triton is what adds that support. | true the moment you deploy it |
“Mere interaction is not conveying” — section 0, and why it does not save you
To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
Under GPL-3.0, running a modified copy on your own server and letting people call it over HTTP is not conveying, so no source obligation arises. That is the ASP loophole. AGPL-3.0 section 13 exists specifically to close it: the duty is triggered by network interaction rather than by distribution. An internal, closed-source inspection microservice, modified in any way and exposed on the plant network, is the exact scenario the clause was drafted for. The obligation is to offer source to those users, not to the world, but sections 2 and 10 then let any of those users redistribute it freely, so the practical effect is public release.
Test your own deployment
A faithful walk through the three conditions. A reading of the licence text, not legal advice.
What the vendor itself says, which is broader than the licence
- ultralytics.com/license — An Enterprise License is required to use the model without open-sourcing your entire project. Internal business tools, private company applications, SaaS platforms, embedded hardware and edge devices, and custom-trained models in commercial settings are all enumerated as Enterprise triggers.
- docs.ultralytics.com AGPL compliance section — Compliance requires publishing the complete larger application, any modifications, training and inference scripts, configuration, backend and frontend code, modified third-party libraries, training data if needed to retrain, and model weights if modified or fine-tuned. Note the weights clause: the vendor treats a fine-tuned defect model as part of the corresponding source, so your own inspection weights would have to be published.
- ultralytics/ultralytics issue #19390, February 2025 — A maintainer, on an explicitly non-network on-device product: you would very likely need the enterprise license if you are not intending to release the source for the app that is integrating the model.
- ultralytics/ultralytics issue #22458 — The gap between the licence text and the vendor's reading is contested in public, under the title “License Ambiguity: Ultralytics Website does not follow the spirit of GNU AGPLv3”.
The enterprise licence, on its published terms
| Price | Not published. Quote only, tailored to the organisation's size and use case. |
| Term | One year, auto-renewing annually. |
| Non-renewal notice | Written notice 45 days before the end of the term. |
| Fee setting | Renewal amount determined 60 days before renewal. Payment due in 30 days; 1.5% late fee. |
| Grant | Non-exclusive, non-transferable. Licensee and subcontractors may ship unlimited commercial products. |
| Coverage | The whole YOLO portfolio for the term, including enterprise-only proprietary models. |
| On non-renewal | Cease using the software in unsold products and archive internal applications. |
| Pro tier ($29/seat/month) | Does not buy you out of AGPL. Only Enterprise carries the commercial grant. |
Detection models: licence, obligation, accuracy and latency
Rows marked SAB were measured by Roboflow's single-artifact benchmarking harness on the full 5,000-image COCO val2017 split with pycocotools, NVIDIA T4, TensorRT, FP16, batch 1, so they are mutually comparable. Rows marked “authors” are vendor-reported and are not directly comparable — they are labelled rather than quietly mixed in.
| Model | Licence | SPDX | Network-use obligation | Commercial-safe closed source | COCO AP | T4 ms | Params M | Source |
|---|---|---|---|---|---|---|---|---|
| RF-DETR-N | Apache 2.0 | Apache-2.0 | No | yes | 48.4 | 2.3 | 30.5 | SAB |
| RF-DETR-S | Apache 2.0 | Apache-2.0 | No | yes | 53.0 | 3.5 | 32.1 | SAB · The headline comparison |
| RF-DETR-M | Apache 2.0 | Apache-2.0 | No | yes | 54.7 | 4.4 | 33.7 | SAB |
| RF-DETR-L | Apache 2.0 | Apache-2.0 | No | yes | 56.5 | 6.8 | 33.9 | SAB |
| D-FINE-S | Apache 2.0 | Apache-2.0 | No | yes | 50.6 | 3.5 | 10.2 | SAB |
| D-FINE-M | Apache 2.0 | Apache-2.0 | No | yes | 55.0 | 5.4 | 19.2 | SAB |
| LW-DETR-M | Apache 2.0 | Apache-2.0 | No | yes | 52.6 | 5.0 | 28.0 | SAB · range 1.9-13.0 ms across sizes |
| RT-DETRv2-R50 | Apache 2.0 | Apache-2.0 | No | yes | 53.1 | 9.0 | 42.0 | authors |
| YOLOX-L | Apache 2.0 | Apache-2.0 | No | yes | 49.7 | – | 54.2 | authors |
| torchvision FCOS R50-FPN | BSD-3-Clause | BSD-3-Clause | No | yes | 39.2 | – | 32.3 | authors · What this demo's baseline backbone comes from |
| Anomalib PatchCore / PaDiM / EfficientAD | Apache 2.0 | Apache-2.0 | No | yes | – | – | – | n/a · Anomaly detection, not COCO-scored |
| YOLO-NAS | Apache 2.0 code | mixed | No (code) | no | 52.2 | – | 67.0 | authors · TRAP: weights are non-commercial research-only |
| Ultralytics YOLO11-L | AGPL-3.0 | AGPL-3.0 | YES, section 13 | no | 49.9 | 6.5 | 25.3 | SAB · Enterprise Licence required for closed source |
| Ultralytics YOLO26-M | AGPL-3.0 | AGPL-3.0 | YES, section 13 | no | 52.5 | 4.4 | 20.0 | SAB |
| YOLOv10 | AGPL-3.0 | AGPL-3.0 | YES | no | 54.4 | – | 29.5 | authors |
| YOLOv12 | AGPL-3.0 | AGPL-3.0 | YES | no | 55.2 | – | 59.1 | authors |
| YOLOv9 (official) | GPL-3.0 | GPL-3.0 | No s13, copyleft on conveying | no | 55.6 | – | 58.0 | authors |
| YOLOv6 (meituan) | GPL-3.0 | GPL-3.0 | No s13, copyleft on conveying | no | 57.2 | – | 59.6 | authors |
| YOLO-World | GPL-3.0 | GPL-3.0 | No s13, copyleft on conveying | no | 35.4 | – | 110.0 | authors · TRAP: widely assumed Apache; it is GPL-3.0 |
| MMYOLO | GPL-3.0 | GPL-3.0 | No s13, copyleft on conveying | no | – | – | – | n/a |
Two traps a licence badge will not catch
YOLO-World
- The badge says
- commonly assumed Apache-2.0, because most open-vocabulary detectors are
- The reality
- GPL-3.0, verified via the GitHub licence API
- Why it matters
- Teams switch off Ultralytics to escape copyleft and land on another copyleft model. Switching to a different YOLO usually does not escape it: v6, v9 and MMYOLO are GPL-3.0; v10 and v12 are AGPL-3.0.
Surya (OCR)
- The badge says
- Apache-2.0 — and the GitHub licence API agrees, because the repo licence is Apache-2.0
- The reality
- The weights are a modified AI Pubs Open RAIL-M licence: free for research, personal use, and startups under $5M funding or revenue. Verbatim from the README.
- Why it matters
- Code licence and weights licence are different artefacts. An enterprise well above $5M revenue needs a paid Datalab licence. No automated badge check would catch this, because the badge is telling the truth about the code.
And the same lesson in the data
| Dataset | Licence | SPDX | Usable commercially | Note | Verified via |
|---|---|---|---|---|---|
| DAGM 2007 | CC BY 4.0 | CC-BY-4.0 | yes | Used here as the primary detection set | Zenodo REST API |
| VT Corrosion Condition State | CC0 1.0 | CC0-1.0 | yes | Used here for the taxonomy and agreement work | Figshare REST API |
| VisA (Amazon) | CC BY 4.0 | CC-BY-4.0 | yes | Not needed once DAGM covers detection; note Anomalib's docs state its licence incorrectly | AWS Open Data registry |
| Corrosion in Industrial Complexes, Ostrava | CC BY 4.0 | CC-BY-4.0 | yes | Not used | Zenodo REST API |
| MVTec AD | CC BY-NC-SA 4.0 | CC-BY-NC-SA-4.0 | no | The most-cited industrial inspection benchmark in the world, and non-commercial | publisher terms |
| Casting / impeller (Kaggle) | CC BY-NC-ND 4.0 | CC-BY-NC-ND-4.0 | no | Thematically the most relevant set found, and the least usable. ND forbids even a re-labelled derivative | Kaggle metadata API |
| KolektorSDD / SDD2 | CC BY-NC-SA 4.0 | CC-BY-NC-SA-4.0 | no | Non-commercial | repo LICENSE |
| Severstal Steel | Competition rules | none | no | No redistribution right | Kaggle rules |
| NEU-DET | None stated | none | no | Freely downloadable is not licensed. Default copyright grants no rights | Kaggle metadata API |
| GC10-DET | None stated | none | no | Same. A Roboflow mirror self-declares CC BY 4.0, which the uploader had no right to do | repo, Kaggle metadata API |
The most thematically perfect dataset in the entire search — submersible pump impellers, which are as close to a compressor component as public data gets — is CC BY-NC-ND 4.0. NoDerivatives is fatal: you may not publish even the re-labelled derivative this demonstration is built on. The most relevant dataset is the least usable, and that is the single most memorable fact in the data audit.
What this demonstration actually runs on
| Component | Licence | Source |
|---|---|---|
| Dataset: DAGM 2007 | CC BY 4.0 | Zenodo 10.5281/zenodo.12750201 |
| Dataset: VT Corrosion Condition State | CC0 1.0 | Figshare 10.7294/16624663.v2 |
| Backbone: torchvision ResNet-18, ImageNet weights | BSD-3-Clause | github.com/pytorch/vision |
| Framework: PyTorch (build time only) | BSD-3-Clause | github.com/pytorch/pytorch |
| Runtime: ONNX Runtime | MIT | github.com/microsoft/onnxruntime |
| Runtime: onnx | Apache-2.0 | github.com/onnx/onnx |
| Imaging: Pillow | MIT-CMU | github.com/python-pillow/Pillow |
| Imaging: OpenCV (build time only) | Apache-2.0 | github.com/opencv/opencv |
| Numerics: numpy, scipy | BSD-3-Clause | numpy.org, scipy.org |
| Web: FastAPI, Starlette, uvicorn | MIT / BSD-3-Clause | fastapi.tiangolo.com |
| Agreement statistics: atlas_shared.stats | this repository | implemented in-house, no GPL krippendorff package |
Zero AGPL. Zero GPL. Zero non-commercial data.
Rejected, and why
| Component | Licence | Reason |
|---|---|---|
| Ultralytics YOLO, any version | AGPL-3.0 | This demo contains zero Ultralytics code. That absence is the point. |
| krippendorff (PyPI) | GPL-3.0 | Krippendorff's alpha is implemented in atlas_shared.stats instead. |
| MVTec AD | CC BY-NC-SA 4.0 | Non-commercial. The reflex choice for anomaly detection, and unusable. |
| Anomalib the library | Apache-2.0, so not a licence problem | Excluded on weight, not licence: it pulls Lightning and a large dependency tree into a 1400 MB service. The PaDiM method is reimplemented here in about 80 lines against a torchvision backbone, and the licence of that reimplementation is stated on the anomaly screen. |
One of these was rejected on weight rather than licence, and it is marked as such. Conflating the two would be the same sloppiness this screen is about.
precomputed Built by docs/research/demo3-cv.md (machine-verified audit) at 2026-08-09. Licences are facts about the world, not measurements of this dataset, so they are recorded rather than recomputed. Each row names the API it was read from. Re-run that script to regenerate it; nothing on this page is hardcoded.