Download index.html from getreadystack/rf-detr-migration-check: direct link, hf CLI and curl.
- Browser
- Download file 41.9 kB
-
https://huggingface.co/spaces/getreadystack/rf-detr-migration-check/resolve/main/index.html
- Command line
-
hf download hf://spaces/getreadystack/rf-detr-migration-check/index.html
-
curl -L -o index.html https://huggingface.co/spaces/getreadystack/rf-detr-migration-check/resolve/main/index.html
41.9 kB
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"> | |
| <meta name="viewport" content="width=device-width,initial-scale=1"> | |
| <title>RF DETR Migration Check — find yolo ties and show replacements</title> | |
| <meta name="description" content="This free browser tool finds Ultralytics YOLO ties in project files and Python code and shows Apache-2.0 RF-DETR replacement lines."> | |
| <style> | |
| :root{color-scheme:light}body{margin:0;font:15px/1.55 system-ui,-apple-system,"Segoe UI",sans-serif;background:#faf9f5;color:#1a1512} | |
| .wrap{max-width:960px;margin:0 auto;padding:28px 18px 60px}h1{font-size:26px;margin:0 0 6px}.lede{color:#4a403a;margin:0 0 16px} | |
| textarea{width:100%;min-height:260px;font:13px/1.45 ui-monospace,Menlo,Consolas,monospace;padding:12px;border:1px solid #d9d0c4;border-radius:8px;box-sizing:border-box} | |
| .bar{display:flex;gap:10px;align-items:center;margin:12px 0}button{font:600 15px system-ui;padding:10px 18px;border:0;border-radius:8px;background:#1a1512;color:#fff;cursor:pointer} | |
| input[type=date]{font:14px system-ui;padding:8px;border:1px solid #d9d0c4;border-radius:6px} | |
| table{border-collapse:collapse;width:100%;font-size:14px;margin-top:10px}th,td{text-align:left;padding:8px 10px;border-bottom:1px solid #eee;vertical-align:top}th{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:#7a6e65} | |
| .sev.error{color:#a8551f;font-weight:700}.sev.warn,.sev.warning{color:#96691f}.ok{color:#2a6446;font-weight:600}.sum{font-weight:600} | |
| .note{font-size:13px;color:#7a6e65;margin-top:18px}#paid{margin-top:22px;padding:14px 16px;border:1px solid #e2d8cb;border-radius:10px;background:#fffdfa} | |
| </style> | |
| <script data-grow-initializer="">!(function(){window.growMe||((window.growMe=function(e){window.growMe._.push(e);}),(window.growMe._=[]));var e=document.createElement("script");(e.type="text/javascript"),(e.src="https://faves.grow.me/main.js"),(e.defer=!0),e.setAttribute("data-grow-faves-site-id","U2l0ZTphZjljMzgyMC0yMmU5LTRhYjgtYTIxNS03OTRhMGY1N2ExYzM=");var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t);})();</script> | |
| <!--yj-canon-s101--><link rel="canonical" href="https://getreadystack.com/tools/rf-detr-migration-check"><style data-yj-mfit="1">#out{max-width:100%}#out td,#out th{overflow-wrap:anywhere}#out pre,#out code{white-space:pre-wrap;overflow-wrap:anywhere}@media (max-width:640px){table{display:block;max-width:100%;overflow-x:auto}pre{max-width:100%;overflow-x:auto}code,a{overflow-wrap:anywhere}img,svg,video,canvas,iframe{max-width:100%}textarea,input,select{max-width:100%;box-sizing:border-box}.yj-lgbar{position:static;justify-content:flex-end;margin:0 0 10px}h1,h2,h3,h4,p,li,dd,dt,blockquote,figcaption,summary,label,.res,.lead{overflow-wrap:anywhere}label{max-width:100%;box-sizing:border-box}#out table:not(:has(tr>:nth-child(4))){display:table;table-layout:fixed;width:100%}#out table:has(tr>:nth-child(4)),#out table:has(tr>:nth-child(4)) tbody,#out table:has(tr>:nth-child(4)) tr,#out table:has(tr>:nth-child(4)) td{display:block;width:auto;overflow:visible}#out table:has(tr>:nth-child(4)) thead{display:none}#out table:has(tr>:nth-child(4)) tr{padding:10px 0;border-bottom:1px solid rgba(128,128,128,.28)}#out table:has(tr>:nth-child(4)) td{border:0;padding:1px 0}#out table:has(tr>:nth-child(4)) td:nth-child(-n+3){display:inline-block;margin-right:10px;font-size:12px;opacity:.78}}</style> | |
| </head> | |
| <body> | |
| <div class="wrap"> | |
| <h1>RF DETR Migration Check — find yolo ties and show replacements</h1> | |
| <p class="lede">rf-detr migration check: flags Ultralytics YOLO (AGPL-3.0) ties in requirements.txt, pyproject.toml, environment.yml, Dockerfiles and Python code, with the Apache-2.0 RF-DETR line for each. Runs entirely in your browser — nothing is uploaded.</p> | |
| <textarea id="src" spellcheck="false"># Dockerfile — shelf-camera inference service (closed-source, runs on store edge boxes) | |
| FROM ultralytics/ultralytics:8.3.40-cpu | |
| WORKDIR /app | |
| COPY requirements.txt . | |
| RUN pip install --no-cache-dir ultralytics==8.3.40 | |
| RUN git clone --depth 1 https://github.com/ultralytics/yolov5 /opt/yolov5 | |
| ADD https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n.pt /app/models/ | |
| RUN yolo export model=/app/models/best.pt format=onnx | |
| RUN pip install --no-cache-dir yolov5==7.0.13 | |
| COPY . . | |
| EXPOSE 8080 | |
| CMD ["python", "serve.py"]</textarea> | |
| <div class="bar"><button id="go">Check</button><label>as of <input type="date" id="today"></label></div> | |
| <div id="out" aria-live="polite"></div> | |
| <div id="paid"><strong>Free here:</strong> Check the open Dockerfile, requirements.txt, pyproject.toml, environment.yml or .py file for Ultralytics YOLO ties, with the RF-DETR line for each. <strong>In the editor:</strong> Scan every repo in the workspace and export a dated migration plan per repo, each Ultralytics tie mapped to its RF-DETR line; team key adds a CI gate — that part asks for a licence key. <a href="https://getreadystack.com/api/buy/cl/polar_cl_UuXU7kAm3WAf84LgoasEawBMqJBBC8JlOhATk4CxErK">Full version: workspace migration plan + team CI gate</a></div> | |
| <p class="note">Same engine as the VS Code extension, byte for byte.</p> | |
| </div> | |
| <script>var UL_RULES = [ | |
| {"id": "UL01", "check": "ultralytics-package", "sev": "error", | |
| "re": "(?:^\\s*[\"']?ultralytics(?:\\[[\\w,]+\\])?\\s*(?:[=\u003c\u003e~!]=?|[\"',]|$)|^\\s*-\\s*ultralytics\\b(?![-/])|pip3?\\s+install\\b[^#\\n]*\\sultralytics(?![-/\\w]))", "flags": "i", | |
| "msg": "This line installs the ultralytics package, which is AGPL-3.0. Ultralytics: \"An Enterprise License is required if you want to use Ultralytics YOLO without open-sourcing your entire project\", and that includes internal business tools, SaaS back ends and edge devices.", | |
| "fix": "rfdetr (Apache-2.0 for Nano, Small, Medium and Large)", | |
| "source": "https://www.ultralytics.com/license"}, | |
| {"id": "UL02", "check": "yolov5-pip-package", "sev": "error", | |
| "re": "(?:^\\s*[\"']?yolov5\\s*(?:[=\u003c\u003e~!]=?|[\"',]|$)|^\\s*-\\s*yolov5\\b|pip3?\\s+install\\b[^#\\n]*\\syolov5\\b)", "flags": "i", | |
| "msg": "The yolov5 pip package repackages Ultralytics YOLOv5 code, which Ultralytics publishes under AGPL-3.0. The Ultralytics Enterprise License covers \"the complete Ultralytics YOLO source code portfolio, including YOLO26, earlier YOLO versions\", so YOLOv5 is not exempt.", | |
| "fix": "rfdetr", | |
| "source": "https://www.ultralytics.com/license"}, | |
| {"id": "UL03", "check": "ultralytics-docker-image", "sev": "error", | |
| "re": "^\\s*FROM\\s+(?:--platform=\\S+\\s+)?(?:docker\\.io\\/)?ultralytics\\/", "flags": "i", | |
| "msg": "The ultralytics/* base image ships the AGPL-3.0 ultralytics package in every container built from it, including containers deployed to cameras, robots and edge devices, which Ultralytics lists as needing an Enterprise License.", | |
| "fix": "FROM python:3.12-slim + RUN pip install --no-cache-dir rfdetr", | |
| "source": "https://www.ultralytics.com/license"}, | |
| {"id": "UL04", "check": "ultralytics-repo-source", "sev": "error", | |
| "re": "(?:git\\s+clone\\b[^#\\n]*github\\.com\\/ultralytics\\/(?:yolov3|yolov5|ultralytics)|git\\+https?:\\/\\/github\\.com\\/ultralytics\\/|github\\.com\\/ultralytics\\/(?:yolov5|ultralytics)\\/archive)", "flags": "i", | |
| "msg": "This line pulls Ultralytics YOLO source straight from GitHub. The code carries the same AGPL-3.0 terms as the pip package, so a vendored copy needs an Enterprise License or a fully published project.", | |
| "fix": "pip install rfdetr (drop the cloned repo)", | |
| "source": "https://www.ultralytics.com/license"}, | |
| {"id": "UL05", "check": "torch-hub-ultralytics", "sev": "error", | |
| "re": "torch\\.hub\\.load\\(\\s*['\"]ultralytics\\/", "flags": "", | |
| "msg": "torch.hub.load downloads and runs the AGPL-3.0 Ultralytics repository at runtime, so the service uses Ultralytics YOLO even though no requirements file lists it.", | |
| "fix": "from rfdetr import RFDETRMedium; model = RFDETRMedium()", | |
| "source": "https://www.ultralytics.com/license"}, | |
| {"id": "UL06", "check": "ultralytics-import", "sev": "warn", | |
| "re": "^\\s*(?:from\\s+ultralytics(?:\\.\\w+)*\\s+import\\b|import\\s+ultralytics\\b)|from\\s+ultralytics\\s+import\\b", "flags": "", | |
| "msg": "Python code that imports ultralytics is part of the derivative work the AGPL-3.0 terms reach. Swap the import when the dependency goes.", | |
| "fix": "from rfdetr import RFDETRMedium", | |
| "source": "https://www.ultralytics.com/license"}, | |
| {"id": "UL07", "check": "ultralytics-weights", "sev": "warn", | |
| "re": "\\byolo(?:v3|v5|v8|v9|v10|11|12|26)[nsmlx]?(?:6|-p6|u)?(?:-(?:seg|pose|cls|obb|world|worldv2))?\\.(?:pt|onnx|engine|torchscript|tflite)\\b", "flags": "i", | |
| "msg": "Pretrained Ultralytics YOLO weights. The Enterprise License lists the pretrained models among what it covers, so shipping or downloading these weights in a closed product is part of the licence question too.", | |
| "fix": "RFDETRMedium() (Apache-2.0 weights for Nano to Large)", | |
| "source": "https://www.ultralytics.com/license"}, | |
| {"id": "UL08", "check": "yolo-cli", "sev": "warn", | |
| "re": "(?:^|[\\s\"'\\[,;\u0026|])yolo\\s+(?:(?:detect|segment|classify|pose|obb)\\s+)?(?:predict|train|val|export|track|benchmark)\\b", "flags": "", | |
| "msg": "The yolo command is the Ultralytics command-line tool, installed by the ultralytics package. Build steps and scripts that call it keep the AGPL-3.0 package in the image.", | |
| "fix": "python -c \"from rfdetr import RFDETRMedium; RFDETRMedium().export()\"", | |
| "source": "https://www.ultralytics.com/license"}, | |
| {"id": "UL09", "check": "rfdetr-pml-model", "sev": "warn", | |
| "re": "\\b(?:RFDETRXLarge|RFDETR2XLarge|RFDETRSegXLarge|RFDETRSeg2XLarge|rfdetr_plus|rfdetr-plus|rfdetr\\[plus\\])", "flags": "", | |
| "msg": "Already on RF-DETR, but this size is not Apache-2.0: the XL and 2XL detection models and the rfdetr_plus extension are under PML 1.0. Nano, Small, Medium and Large are Apache-2.0.", | |
| "fix": "RFDETRLarge (Apache-2.0)", | |
| "source": "https://github.com/roboflow/rf-detr"} | |
| ] | |
| ;</script> | |
| <script>// rf-detr Migration Check engine: finds Ultralytics YOLO (AGPL-3.0) ties in requirements, pyproject, environment.yml, Dockerfiles and Python. | |
| // Same file runs in Node (VS Code extension, verify) and in the browser (free web page). | |
| (function (root) { | |
| const RULES = (typeof module !== 'undefined') ? require('./rules.json') : root.UL_RULES; | |
| const COMPILED = RULES.map(r => ({ r, rx: new RegExp(r.re, r.flags || '') })); | |
| // A project that declares itself AGPL-3.0 may use Ultralytics YOLO under the free licence (it must publish the whole source). | |
| const AGPL_DECL = /(?:^\s*license\s*=\s*(?:\{\s*text\s*=\s*)?["']AGPL-3\.0|org\.opencontainers\.image\.licenses\s*=\s*["']?AGPL-3\.0|^\s*#\s*SPDX-License-Identifier:\s*AGPL-3\.0|License\s*::\s*OSI Approved\s*::\s*GNU Affero)/im; | |
| function check(text, opts) { | |
| const today = (opts && opts.today) || new Date().toISOString().slice(0, 10); | |
| const src = String(text || ''); | |
| const lines = src.split(/\r?\n/); | |
| const agpl = AGPL_DECL.test(src); | |
| const findings = []; | |
| lines.forEach((line, i) => { | |
| if (/^\s*#/.test(line) && !/^\s*#\s*(?:RUN|FROM)\b/.test(line)) return; // comments, but not commented-out Dockerfile steps | |
| // one finding per line: the first (most specific) rule that matches | |
| const hit = COMPILED.find(c => c.rx.test(line)); | |
| if (!hit) return; | |
| const r = hit.r; | |
| let sev = r.sev, msg = r.msg; | |
| if (agpl && r.check !== 'rfdetr-pml-model') { | |
| sev = 'info'; | |
| msg = 'This file declares the project AGPL-3.0, which the free Ultralytics licence allows if the complete source of the whole project is published. ' + msg; | |
| } | |
| findings.push({ check: r.check, id: r.id, sev, msg, fix: r.fix, source: r.source, line: i + 1, text: line.trim() }); | |
| }); | |
| return { | |
| findings, | |
| errors: findings.filter(f => f.sev === 'error').length, | |
| warnings: findings.filter(f => f.sev === 'warn').length, | |
| agpl_declared: agpl, | |
| as_of: today | |
| }; | |
| } | |
| const api = { engine: { check }, RULES, RULE_COUNT: RULES.length }; | |
| if (typeof module !== 'undefined') module.exports = api; | |
| root.ULENGINE = api; | |
| })(typeof window !== 'undefined' ? window : globalThis); | |
| </script> | |
| <script>// ⛔뼈대 — kit/scaffold.py 가 찍는다 (s143). findings [{check,sev,msg,line?}] → 글/HTML. 같은 파일이 Node 와 브라우저에서 산다. | |
| ; | |
| function escapeHtml(s) { return String(s == null ? '' : s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"'); } | |
| function summaryLine(res) { | |
| const f = (res && res.findings) || []; const e = f.filter(function (x) { return String(x.sev || 'error').toLowerCase().startsWith('err'); }).length; | |
| return f.length ? (f.length + ' finding' + (f.length === 1 ? '' : 's') + ' (' + e + ' error' + (e === 1 ? '' : 's') + ')') : 'Clean — no findings.'; | |
| } | |
| function toText(res, label) { | |
| const f = (res && res.findings) || []; | |
| const lines = ['== ' + (label || '') + ' — ' + summaryLine(res)]; | |
| f.forEach(function (x) { lines.push(' ' + String(x.sev || 'error').toUpperCase().slice(0, 4) + ' ' + (x.line ? 'L' + x.line + ' ' : '') + (x.check || x.id || '') + ' ' + (x.msg || x.message || '')); }); | |
| return lines.join('\n'); | |
| } | |
| function toHtml(res) { | |
| const f = (res && res.findings) || []; | |
| if (!f.length) return '<p class="ok">' + escapeHtml(summaryLine(res)) + '</p>'; | |
| const rows = f.map(function (x) { return '<tr><td class="sev ' + escapeHtml(String(x.sev || 'error')) + '">' + escapeHtml(String(x.sev || 'error')) + '</td><td>' + (x.line ? 'L' + escapeHtml(x.line) : '') + '</td><td><code>' + escapeHtml(x.check || x.id || '') + '</code></td><td>' + escapeHtml(x.msg || x.message || '') + '</td></tr>'; }).join(''); | |
| return '<p class="sum">' + escapeHtml(summaryLine(res)) + '</p><table><thead><tr><th>Level</th><th>Line</th><th>Check</th><th>What</th></tr></thead><tbody>' + rows + '</tbody></table>'; | |
| } | |
| var ULREPORT = { escapeHtml: escapeHtml, summaryLine: summaryLine, toText: toText, toHtml: toHtml }; | |
| if (typeof module !== 'undefined' && module.exports) module.exports = ULREPORT; | |
| else window.ULREPORT = ULREPORT; | |
| </script> | |
| <script> | |
| (function(){ | |
| var src=document.getElementById('src'), out=document.getElementById('out'), go=document.getElementById('go'), today=document.getElementById('today'); | |
| today.value=new Date().toISOString().slice(0,10); | |
| function run(){ try { var res=window.ULENGINE.engine.check(src.value,{today:today.value}); out.innerHTML=window.ULREPORT.toHtml(res); } catch(e){ out.innerHTML='<p class="sev error">Could not run: '+String(e.message||e)+'</p>'; } } | |
| go.onclick=run; if (src.value.trim()) run(); | |
| })(); | |
| </script> | |
| <section data-yj-install="free" style="margin:2rem auto 1rem;max-width:46rem;padding:1.25rem 1.25rem;border:1px solid #cfe3d6;border-radius:12px;background:#f6fbf8;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .4rem;font-size:1.2rem">Install free</h2><p style="margin:0 0 .8rem;color:#41505f">Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.</p><a href="https://open-vsx.org/extension/readystack/rf-detr-migration-check" rel="noopener" data-yj-install-door="ovsx" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'rf-detr-migration-check',src:'ovsx',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">Open VSX (Cursor, VSCodium)</a><p style="margin:.6rem 0 0;font-size:.92rem;color:#41505f"><a href="https://getreadystack.com/api/buy/team" rel="nofollow" style="color:#0f7b3f;text-decoration:underline">Team? One key for every ReadyStack linter, 5 seats, $149 once</a></p></section> | |
| <section data-yj-alert="rule" style="margin:1rem auto 1.5rem;max-width:46rem;padding:1.1rem 1.25rem;border:1px solid #d9dee6;border-radius:12px;background:#fbfcfd;font:15px/1.55 system-ui,-apple-system,Segoe UI,sans-serif"><b style="font-size:1.05rem">Get one email when this rule changes</b><div style="opacity:.78;margin:.35rem 0 .8rem">We watch the regulation and vendor sources behind rf-detr Migration Check — Ultralytics YOLO ties every day. When a rule changes, you get a single email with what changed and the updated check. No newsletter.</div><div style="display:flex;gap:8px;flex-wrap:wrap"><input id="yjae" type="email" placeholder="you@example.com" style="flex:1;min-width:210px;padding:11px 13px;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:#fff;color:inherit"><button id="yjab" style="padding:11px 18px;border-radius:8px;border:0;cursor:pointer;background:#0f7b3f;color:#fff;font:600 15px system-ui,sans-serif">Notify me</button></div><div id="yjao" hidden style="margin-top:.6rem;color:#0f7b3f">You're on the list. One email when it changes.</div><script>(function(){var b=document.getElementById("yjab"),e=document.getElementById("yjae");if(!b||!e)return;b.addEventListener("click",function(){var v=e.value.trim();if(!/.+@.+\..+/.test(v))return;try{localStorage.setItem("yj_em","1");}catch(_){}fetch(location.origin+"/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:v,slug:"rf-detr-migration-check",lang:"en",source:"rule_alert"+((b.closest&&b.closest("section")&&b.closest("section").getAttribute("data-yj-moved"))?"_at_result":"")})}).then(function(r){var o=document.getElementById("yjao");o.hidden=false;if(!r.ok){o.textContent="Could not save - please try again.";}}).catch(function(){var o=document.getElementById("yjao");o.hidden=false;o.textContent="Could not save - please try again.";});});})();</script><script>(function(){var e=document.getElementById("yjae"),s=e&&e.closest?e.closest("section"):null,o=document.getElementById("out");if(!s||!o)return;var d=false;function mv(ev){if(d)return;if(ev&&ev.target&&s.contains(ev.target))return;d=true;var b=o;while(b.parentNode&&b.parentNode!==document.body&&b.parentNode.tagName!=="MAIN"&&b.parentNode.tagName!=="ARTICLE")b=b.parentNode;if(!b.parentNode||b===s||b.contains(s))return;try{b.parentNode.insertBefore(s,b.nextSibling);s.setAttribute("data-yj-moved","1");}catch(_){}}document.addEventListener("input",mv,true);document.addEventListener("change",mv,true);document.addEventListener("click",function(ev){var b=ev.target&&ev.target.closest?ev.target.closest("button,input[type=submit]"):null;if(b&&!b.closest("[data-yj],[data-yj-cta],[data-yj-install],[data-yj-alert],.yj-find,.yj-related,#yj-ask,.yjp"))mv(ev);},true);})();</script></section> | |
| <section data-yj-cta="paid" style="margin:3rem auto;max-width:46rem;padding:1.5rem 1.25rem;border:1px solid #d8dee9;border-radius:12px;background:#fbfcfe;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .5rem;font-size:1.25rem">Get the full version <span class="yj-price">$29</span></h2><p class="yj-cta-paid" style="margin:.25rem 0 .6rem;color:#1f2a37">Scan every repo in the workspace and export a dated migration plan per repo, each Ultralytics tie mapped to its RF-DETR line; a team key adds a CI gate</p><p class="yj-cta-pay" style="margin:.25rem 0 1rem;color:#5b6b7c;font-size:.94rem">One payment, one licence key for this tool. The key is shown right after payment.</p><p class="yj-cta-anchor" style="margin:0 0 1rem;color:#5b6b7c;font-size:.94rem">Ultralytics' own pricing page: the Pro plan is $29 per seat a month and still AGPL-3.0; only the Enterprise plan, priced "Custom", includes the commercial Enterprise License.</p><a href="https://getreadystack.com/api/buy/cl/polar_cl_UuXU7kAm3WAf84LgoasEawBMqJBBC8JlOhATk4CxErK" rel="nofollow" style="display:inline-block;padding:.7rem 1.3rem;border-radius:8px;background:#1b64f2;color:#fff;text-decoration:none;font-weight:600">Buy the full version — $29</a></section> | |
| <!--yj-share-s101--><div style="margin:28px 0 8px;text-align:center"><button id="yjcp" type="button" style="font:inherit;padding:10px 18px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Copy link</button><button id="yjimg" type="button" style="font:inherit;padding:10px 18px;margin-left:8px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Save result as image</button></div><script>(function(){var b=document.getElementById("yjimg");if(!b)return;b.addEventListener("click",function(){var o=document.getElementById("out");var txt=(o&&(o.innerText||o.textContent)||"").trim();if(!txt){b.textContent="(no result yet)";setTimeout(function(){b.textContent="Save result as image";},1500);return;}var lines=txt.split(String.fromCharCode(10)).filter(function(x){return x.trim();}).slice(0,10);var W=1200,P=56,c=document.createElement("canvas");c.width=W;var lh=38,H=P*2+70+lines.length*lh+60;c.height=H;var x=c.getContext("2d");x.fillStyle="#1a1512";x.fillRect(0,0,W,H);x.fillStyle="#f3e9d2";x.font="600 34px system-ui,Segoe UI,Arial";var t=(document.title||"").split("|")[0].trim();x.fillText(t.slice(0,54),P,P+34);x.font="22px ui-monospace,Menlo,Consolas,monospace";x.fillStyle="#e8dcc4";for(var i=0;i<lines.length;i++){x.fillText(lines[i].slice(0,88),P,P+70+i*lh+22);}x.font="600 22px system-ui,Segoe UI,Arial";x.fillStyle="#c9a227";var d=location.hostname.replace("www.","");x.fillText(d,W-P-x.measureText(d).width,H-P+6);c.toBlob(function(bl){var u=URL.createObjectURL(bl),a=document.createElement("a");a.href=u;a.download=(t||"result").replace(/[^a-z0-9]+/gi,"-").toLowerCase()+"-"+d+".png";document.body.appendChild(a);a.click();setTimeout(function(){URL.revokeObjectURL(u);a.remove();},2000);},"image/png");});})();</script><script>(function(){var b=document.getElementById("yjcp");if(!b)return;var t=b.textContent;b.addEventListener("click",function(){var u=location.href.split("#")[0];function d(){b.textContent="Link copied";setTimeout(function(){b.textContent=t;},1800);}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(u).then(d,function(){prompt("",u);});}else{prompt("",u);}});})();</script> | |
| <script data-yj="yj-view-beacon">(function(){try{var p=location.pathname;var k='yjv:'+p;if(sessionStorage.getItem(k))return;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",ref:(document.referrer||''),src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}catch(e){}})();</script> | |
| <script data-yj="yj-use-beacon">(function(){try{var o=document.getElementById('out');if(!o)return;var p=location.pathname,k='yju:'+p,sent=false;function fire(){if(sent||sessionStorage.getItem(k))return;if(!(o.textContent||'').replace(/\s+/g,'').length)return;sent=true;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",t:'use',src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}var mo=new MutationObserver(function(){fire();if(sent)mo.disconnect();});mo.observe(o,{childList:true,characterData:true,subtree:true});}catch(e){}})();</script><div class="yj-home-find"><div class="yj-lgbar"><a href="/" class="yj-lg on">EN</a><a href="/de/" class="yj-lg">DE</a><a href="/ja/" class="yj-lg">JA</a><a href="/es/" class="yj-lg">ES</a><a href="/pt/" class="yj-lg">PT</a></div><section class="yj-find"><h2>Find a tool</h2><input id="yjq" type="search" autocomplete="off" placeholder="Type a product name, format or task"><div id="yjr"></div></section><style>.yj-lgbar{position:absolute;top:14px;right:18px;display:flex;gap:6px;z-index:60}.yj-lg{font:600 12px/1 system-ui,sans-serif;padding:6px 9px;border-radius:4px;text-decoration:none;color:#8b96a3;border:1px solid rgba(140,150,165,.28)}.yj-lg:hover{color:#e8eaed;border-color:rgba(160,175,195,.6)}.yj-lg.on{color:#0e1116;background:#cfd6de;border-color:#cfd6de}.yj-find{max-width:760px;margin:34px auto 8px;padding:0 20px}.yj-find h2{font:600 20px/1.3 system-ui,sans-serif;margin:0 0 10px}#yjq{width:100%;box-sizing:border-box;padding:13px 15px;font:400 15.5px system-ui,sans-serif;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:rgba(255,255,255,.04);color:inherit}#yjq:focus{outline:none;border-color:#7FD1C4}#yjr{margin-top:10px;display:flex;flex-direction:column;gap:6px}#yjr a{display:flex;justify-content:space-between;gap:12px;padding:11px 14px;border:1px solid rgba(140,150,165,.22);border-radius:6px;text-decoration:none;font:400 14.5px/1.4 system-ui,sans-serif;color:inherit}#yjr a:hover{border-color:#7FD1C4}#yjr .pr{font:600 13px system-ui,sans-serif;color:#5fbf9a;white-space:nowrap}</style><script>(function(){var q=document.getElementById("yjq"),r=document.getElementById("yjr"),D=null;function load(){if(D)return Promise.resolve(D);return fetch("/search-index.json").then(function(x){return x.json();}).then(function(j){D=j;return j;}).catch(function(){D=[];return D;});}function esc(t){return String(t).replace(/[&<>"]/g,function(c){return {"&":"&","<":"<",">":">",'"':"""}[c];});}function run(){var v=q.value.trim().toLowerCase();if(v.length<2){r.innerHTML="";return;}load().then(function(j){var w=v.split(/\s+/),o=[];for(var i=0;i<j.length&&o.length<12;i++){var t=j[i].t.toLowerCase();var ok=true;for(var k=0;k<w.length;k++){if(t.indexOf(w[k])<0){ok=false;break;}}if(ok)o.push(j[i]);}r.innerHTML=o.length?o.map(function(x){return "<a href=\""+esc(x.u)+"\">"+"<span>"+esc(x.t)+"</span>"+(x.p?"<span class=\"pr\">$"+x.p+"</span>":"")+"</a>";}).join(""):"";});}q.addEventListener("input",run);q.addEventListener("focus",load);})();</script></div><section data-yj="yj-facts-v1" style="max-width:920px;margin:48px auto 0;padding:0 20px;font-family:system-ui,sans-serif"><style>.yj-article p{font:400 15.5px/1.7 system-ui,sans-serif;color:#26313b;margin:0 0 12px;max-width:72ch}.yj-article h2,.yj-article h3,.yj-article h4{font:600 17px/1.35 system-ui,sans-serif;color:#1b1f24;margin:22px 0 8px}.yj-article table{border-collapse:collapse;margin:10px 0 16px;font:14px/1.45 system-ui,sans-serif}.yj-article th,.yj-article td{border:1px solid #e2e6ea;padding:6px 10px;text-align:left}.yj-article th{background:#f4f6f8}.yj-article pre{background:#0f1720;color:#e6edf3;padding:12px 14px;border-radius:8px;overflow:auto;font:13px/1.5 ui-monospace,Menlo,monospace}.yj-article code{font:13px ui-monospace,Menlo,monospace;background:#f1f3f5;padding:1px 4px;border-radius:3px}.yj-article pre code{background:none;padding:0}.yj-article ul,.yj-article ol{font:15px/1.6 system-ui,sans-serif;color:#26313b}</style><p style="font:400 13px/1.5 system-ui,sans-serif;color:#6b7680;margin:0 0 14px"><time datetime="2026-09-30">Updated 2026-09-30</time> · ReadyStack</p><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","dateModified":"2026-09-30","author":{"@type":"Organization","name":"ReadyStack"}}</script><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Worked example</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 16px;color:#5b6570">Real numbers from this tool, line by line.</p><div class="yj-article"><p><img src="https://getreadystack.com/img/promo/sku429240_result_card.jpg" alt="Migrate from Ultralytics YOLO to RF-DETR: the six Dockerfile lines that keep a closed product on AGPL-3.0" loading="lazy" style="max-width:100%;border-radius:6px"></p> | |
| <p>Six Ultralytics YOLO ties turned up in a 12-line Dockerfile that a machine-learning engineer shipping a closed-source shelf-camera service checked before moving to RF-DETR: four errors and two warnings.</p> | |
| <h3>What Ultralytics says</h3> | |
| <p>The ultralytics package and its YOLO models are licensed AGPL-3.0. Ultralytics' licence page is direct: "An Enterprise License is required if you want to use Ultralytics YOLO without open-sourcing your entire project." Its list includes internal business tools, any commercial product, SaaS APIs that use YOLO behind the scenes, and edge devices, robots and cameras. It covers "the complete Ultralytics YOLO source code portfolio, including YOLO26, earlier YOLO versions".</p> | |
| <p>There is no list price. The pricing page shows the Enterprise plan as "Custom". The Pro plan costs $29 per seat a month and is still AGPL-3.0, so it does not make a closed product compliant.</p> | |
| <h3>The six lines</h3> | |
| <table><thead><tr><th>Line</th><th>Ultralytics line</th><th>RF-DETR fix</th><th>Severity</th></tr></thead><tbody><tr><td>2</td><td><code>FROM ultralytics/ultralytics:8.3.40-cpu</code></td><td><code>FROM python:3.12-slim</code></td><td>error</td></tr><tr><td>5</td><td><code>pip install ultralytics==8.3.40</code></td><td><code>pip install rfdetr</code></td><td>error</td></tr><tr><td>6</td><td><code>git clone …/ultralytics/yolov5</code></td><td><code>pip install rfdetr, drop the clone</code></td><td>error</td></tr><tr><td>7</td><td><code>ADD …/yolo11n.pt</code></td><td><code>RFDETRMedium(), Apache-2.0 weights</code></td><td>warning</td></tr><tr><td>8</td><td><code>yolo export … format=onnx</code></td><td><code>RFDETRMedium().export()</code></td><td>warning</td></tr><tr><td>9</td><td><code>pip install yolov5==7.0.13</code></td><td><code>pip install rfdetr</code></td><td>error</td></tr></tbody></table> | |
| <p>The four errors put Ultralytics code into the image: the base image, the ultralytics install, the cloned yolov5 repository and the yolov5 package. The two warnings are lines you rewrite once the dependency goes: the yolo11n.pt weights and the yolo export step, which calls the ultralytics command-line tool.</p> | |
| <h3>Why pip freeze is not enough</h3> | |
| <p>A dependency licence scanner reads installed packages. It sees ultralytics, but not the base image, the cloned folder, a torch.hub.load call that downloads the repository at runtime, or a weights file fetched with ADD. A chatbot rewrites the Dockerfile you paste, but rarely knows that RF-DETR is not one licence: Nano, Small, Medium and Large are Apache-2.0, while the XL and 2XL models and the rfdetr_plus extension are PML 1.0.</p> | |
| <h3>Checking every line at once</h3> | |
| <p>rf-detr Migration Check reads Dockerfiles, requirements.txt, pyproject.toml, environment.yml, setup files and Python code against 9 rules: the ultralytics package, the yolov5 package, ultralytics/* base images, cloned or git-installed Ultralytics repos, torch.hub.load of Ultralytics repos, ultralytics imports, YOLO weights files, the yolo command, and RF-DETR sizes under PML 1.0. Each finding names the line, the RF-DETR fix and the source. The fixed Dockerfile returns 0 findings.</p> | |
| <p>The file itself changes the answer. A pyproject.toml that declares license = "AGPL-3.0-only" gets the same ultralytics line as an info finding, not an error, because the free licence allows it when the complete source is published. A detect.py already on RFDETRXLarge gets a warning pointing to RFDETRLarge.</p> | |
| <h3>What to do next</h3> | |
| <p>Start with the base image and the pip installs, since they decide what ships, then swap the imports and retrain on RFDETRMedium or RFDETRLarge.</p> | |
| <p>The single-file check is free in VS Code and on the web page, with every rule and every fix. The paid version scans every repo in a workspace and exports a dated migration plan per repo; a team key adds a CI gate that fails a build adding new Ultralytics use.</p></div><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:30px 0 10px;color:#1b1f24">15 seconds — what it actually does</h2><video controls muted playsinline preload="none" poster="/img/promo/sku429240_result_card.jpg" style="width:100%;max-width:360px;border-radius:10px;display:block;margin:0 auto"><source src="/media/sku429240_short.mp4" type="video/mp4"></video><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:34px 0 6px;color:#1b1f24">Questions people ask</h2><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does rf-detr Migration Check do?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">rf-detr Migration Check reads Dockerfiles, requirements.txt, pyproject.toml, environment.yml, setup files and Python code, and flags every line that ties a project to Ultralytics YOLO: the ultralytics and yolov5 packages, ultralytics/* base images, cloned Ultralytics repos, torch.hub.load calls, imports, the yolo command and YOLO weights files. Each finding shows the RF-DETR replacement line and the source page.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Who is rf-detr Migration Check for?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">It is for machine-learning engineers and CTOs who ship closed-source computer-vision products, internal tools, SaaS back ends or edge cameras on Ultralytics YOLO. Ultralytics states that an Enterprise License is required to use Ultralytics YOLO without open-sourcing the entire project. It also suits teams already on RF-DETR who need to confirm they use only the Apache-2.0 model sizes.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Why not use pip freeze, a licence scanner or a chatbot?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">pip freeze and dependency licence scanners list the ultralytics package, but not the ultralytics/* Docker base image, a git-cloned yolov5 folder, a torch.hub.load call or a downloaded yolo11n.pt weights file. A chatbot rewrites the file you paste, yet it rarely knows that RF-DETR XL and 2XL models are PML 1.0 rather than Apache-2.0.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What is free and what does the paid version add?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">The free version runs all 9 rules on the open file in VS Code and on the web page, with the RF-DETR fix on every finding and no cap. The paid version, $29 once with one licence key per person or team seat, scans every repo in the workspace and exports a dated migration plan per repo; a team key adds a CI gate.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does staying on Ultralytics YOLO cost a closed-source product?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Ultralytics publishes no list price for its Enterprise License: the pricing page shows the Enterprise plan as Custom. Its Pro plan costs $29 per seat a month and is still AGPL-3.0, so it does not cover a closed product. RF-DETR Nano, Small, Medium and Large are Apache-2.0. The single-file check here is free.</p></details><script type="application/ld+json" data-yj="yj-faq-ld">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What does rf-detr Migration Check do?", "acceptedAnswer": {"@type": "Answer", "text": "rf-detr Migration Check reads Dockerfiles, requirements.txt, pyproject.toml, environment.yml, setup files and Python code, and flags every line that ties a project to Ultralytics YOLO: the ultralytics and yolov5 packages, ultralytics/* base images, cloned Ultralytics repos, torch.hub.load calls, imports, the yolo command and YOLO weights files. Each finding shows the RF-DETR replacement line and the source page."}}, {"@type": "Question", "name": "Who is rf-detr Migration Check for?", "acceptedAnswer": {"@type": "Answer", "text": "It is for machine-learning engineers and CTOs who ship closed-source computer-vision products, internal tools, SaaS back ends or edge cameras on Ultralytics YOLO. Ultralytics states that an Enterprise License is required to use Ultralytics YOLO without open-sourcing the entire project. It also suits teams already on RF-DETR who need to confirm they use only the Apache-2.0 model sizes."}}, {"@type": "Question", "name": "Why not use pip freeze, a licence scanner or a chatbot?", "acceptedAnswer": {"@type": "Answer", "text": "pip freeze and dependency licence scanners list the ultralytics package, but not the ultralytics/* Docker base image, a git-cloned yolov5 folder, a torch.hub.load call or a downloaded yolo11n.pt weights file. A chatbot rewrites the file you paste, yet it rarely knows that RF-DETR XL and 2XL models are PML 1.0 rather than Apache-2.0."}}, {"@type": "Question", "name": "What is free and what does the paid version add?", "acceptedAnswer": {"@type": "Answer", "text": "The free version runs all 9 rules on the open file in VS Code and on the web page, with the RF-DETR fix on every finding and no cap. The paid version, $29 once with one licence key per person or team seat, scans every repo in the workspace and exports a dated migration plan per repo; a team key adds a CI gate."}}, {"@type": "Question", "name": "What does staying on Ultralytics YOLO cost a closed-source product?", "acceptedAnswer": {"@type": "Answer", "text": "Ultralytics publishes no list price for its Enterprise License: the pricing page shows the Enterprise plan as Custom. Its Pro plan costs $29 per seat a month and is still AGPL-3.0, so it does not cover a closed product. RF-DETR Nano, Small, Medium and Large are Apache-2.0. The single-file check here is free."}}]}</script><div id="yj-ask" style="margin:36px 0 0;padding:18px 18px 16px;border:1px solid #e2e6ea;border-radius:10px;background:#fbfbfc"><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:0 0 4px;color:#1b1f24">Ask about this tool</h2><p style="font:400 13.5px/1.5 system-ui,sans-serif;margin:0 0 12px;color:#5b6570">One question, answered by the person who built it. Your email only if you want the answer sent.</p><form onsubmit="return yjAsk(event)" style="display:grid;gap:8px"><textarea name="question" required minlength="10" maxlength="2000" rows="3" placeholder="Your question" style="font:14px/1.5 system-ui,sans-serif;padding:10px;border:1px solid #cfd6dd;border-radius:6px"></textarea><div style="display:flex;gap:8px;flex-wrap:wrap"><input type="email" name="email" placeholder="Email (optional)" style="flex:1;min-width:200px;font:14px system-ui,sans-serif;padding:9px 10px;border:1px solid #cfd6dd;border-radius:6px"><button type="submit" style="font:600 14px system-ui,sans-serif;padding:9px 18px;border:0;border-radius:6px;background:#1b1f24;color:#fff;cursor:pointer">Send</button></div><p id="yj-ask-msg" style="font:13px system-ui,sans-serif;margin:2px 0 0;color:#0a6238;min-height:1em"></p></form><script>function yjAsk(e){e.preventDefault();var f=e.target,m=document.getElementById("yj-ask-msg");m.style.color="#0a6238";fetch(location.origin+"/api/ask",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sku:429240,slug:"rf-detr-migration-check",lang:"en",question:f.question.value,email:f.email.value,page:location.pathname})}).then(function(r){if(!r.ok)throw 0;m.textContent="Thanks \u2014 noted. Answers land on this page and, if you left an email, in your inbox.";f.question.value="";}).catch(function(){m.style.color="#a8551f";m.textContent="Could not send. Please try again in a minute.";});return false;}</script></div></section><section class="yj-related" style="max-width:920px;margin:56px auto 40px;padding:0 20px"><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Same job, next tool</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 20px;color:#5b6570">Free in the browser. The full version is a one-time licence.</p><div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px"><a class="yj-rel-c" href="https://getreadystack.com/tools/ai-model-license-lint"><span class="yj-rel-t">AI Model License Lint</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/base-image-eol-lint"><span class="yj-rel-t">Base Image EOL Lint - Dockerfile and CI end-of-life check</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/spdx-license-field-lint"><span class="yj-rel-t">SPDX License Field Lint for package.json, pyproject.toml and Cargo.toml</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/bitnami-image-catalog-gate"><span class="yj-rel-t">Bitnami Image Gate: Compose, Helm, Dockerfile</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/license-flip-audit"><span class="yj-rel-t">License Flip Audit - BUSL/SSPL/AGPL in your deps</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/openpdf-migration-check"><span class="yj-rel-t">OpenPDF Migration Check: iText AGPL Gate</span><span class="yj-rel-p">$29</span></a></div><style>.yj-rel-c{display:flex;flex-direction:column;gap:8px;padding:15px 16px;border:1px solid #e2e6ea;border-radius:6px;text-decoration:none;background:#fff}.yj-rel-c:hover{border-color:#b9c2cb;background:#fafbfc}.yj-rel-t{font:500 14.5px/1.42 system-ui,sans-serif;color:#1b1f24}.yj-rel-p{font:600 13px system-ui,sans-serif;color:#0a6238}</style></section></body> | |
| </html> | |