Litsenziyalar: nimani sotish mumkin
Bu bobning kodi: kod/23_litsenziyalar.py — kitob papkasidan ishga tushiring: python kod/23_litsenziyalar.py
IV qism — biznes. III qism oxirida tizim ishladi: kamera, YOLO, tracker, panel, Telegram. Endi birinchi biznes savoli texnik emas: buni sotish mumkinmi?
Mahsulot ichida uch xil narsa bor, har birining egasi va sharti alohida:
- kod — Ultralytics, OpenCV, Django, psycopg va yuzlab boshqa paketlar;
- model og'irliklari —
yolo11n.pt, 7-bobda o'zimiz o'qitganbest.pt, YuNet, SFace; - ma'lumot — model o'qitilgan va o'lchangan datasetlar, namoyish videolari.
Zanjirdagi eng qattiq shart butun mahsulotga ta'sir qiladi. Bu bobda har bir shartni birlamchi manbadan o'qiymiz — litsenziya matnining o'zi va muallifning o'z sahifasi. Keyin mijozga yetadigan narsani o'lchaymiz: model fayllari va 21-bobdagi Docker tasvirlari ichida qanday litsenziyalar bor.
Bu bob yuridik maslahat emas. Manbalar 2026-09-22 da tekshirilgan; litsenziyalar o'zgaradi (quyida InsightFace misoli bor). Shartnoma imzolashdan oldin yurist bilan tekshiring.
AGPL-3.0: matnning o'zi nima deydi
Ultralytics kodi (ultralytics paketi) AGPL-3.0 litsenziyasida. Bu copyleft litsenziya: kodni ishlatish bepul, lekin ma'lum holatlarda o'z kodingizni ham ochishingiz shart. Qaysi holatlarda — matnning bir necha joyi hal qiladi (gnu.org/licenses/agpl-3.0.txt).
0-bo'lim — "tarqatish" (convey) nima:
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.
Tarqatish — boshqaga nusxa berish. Foydalanuvchi tarmoq orqali ishlatib, nusxa olmasa — bu tarqatish emas.
2-bo'lim — tarqatmasangiz:
You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force.
6-bo'lim — tarqatsangiz: dastur bilan birga uning "Corresponding Source" ini (mos manba kodini) ham shu litsenziya ostida berasiz. 1-bo'limdagi ta'rifi keng: "all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities". 10-bo'lim qo'shadi: oluvchi avtomatik ravishda asl mualliflardan litsenziya oladi, siz esa qo'shimcha cheklov qo'ya olmaysiz — "you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License".
13-bo'lim — tarmoq orqali foydalanish. AGPL ni oddiy GPL dan ajratadigan joy:
... 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 ...
5-bo'lim — "aggregate": alohida va mustaqil dasturlar bitta diskda birga yotsa, litsenziya ulardan biridan boshqasiga o'tmaydi. 21-bobdagi Compose to'plamida Postgres, nginx, MediaMTX — alohida dasturlar. Tahlilchi esa ultralytics ni import qiladi: ular bitta dastur ichida birlashgan.
Matn bo'yicha uchta asosiy holat:
| Holat | Matn nima deydi |
|---|---|
| O'z kompaniyangiz ichida, o'z kameralaringizda | Tarqatish yo'q — 2-bo'lim: shartsiz |
| Mijoz serveriga o'rnatish yoki tayyor qurilma sotish | Tarqatish — 6-bo'lim: mijozga butun mos manba kodi AGPL bilan; mijoz uni o'zgartirishi va boshqalarga berishi mumkin, siz buni taqiqlay olmaysiz (10-bo'lim) |
| O'z serveringizda xizmat: mijoz faqat panel va Telegram xabarini ko'radi | Nusxa berilmaydi — tarqatish emas; Ultralytics kodini o'zgartirgan bo'lsangiz, 13-bo'lim: tarmoq foydalanuvchilariga manba taklif qilinadi |
Ultralytics nima deydi
Huquq egasining o'z sahifasi (ultralytics.com/license) matndan kengroq talab qo'yadi. "Qaysi litsenziya kerak?" savoliga javobi:
If you use Ultralytics YOLO code, models, architectures, training pipelines, or trained/fine-tuned models, you must either: Open-source your entire project under AGPL-3.0, or; Obtain an Ultralytics Enterprise License. This applies even if you: Train your own model from scratch; Do not use pretrained weights; Use YOLO only internally or for R&D; Deploy through a SaaS platform, API, or other private system; Embed it in hardware, edge devices, or commercial products.
O'qitilgan modellar haqida: "All Ultralytics YOLO trained models fall under the AGPL-3.0 License by default. The AGPL-3.0 License covers the training code and the models produced by that training code." Enterprise litsenziya narxi sahifada yo'q: "Our licensing is tailored to each organization's size and specific use case" — narx so'rov formasi orqali beriladi.
Farqni ko'ring: matn ichki foydalanishni shartsiz qoldiradi (2-bo'lim), tarmoq orqali xizmatga esa faqat o'zgartirilgan versiya uchun talab qo'yadi (13-bo'lim). Ultralytics esa ikkala holatda ham "butun loyihani oching yoki Enterprise oling" deydi. Qaysi talqin sudda ustun kelishini bu kitob hal qilmaydi. Biznes uchun xulosa esa oddiy: Ultralytics — huquq egasi, u bilan nizo — xavf. Yopiq mahsulot sotmoqchi bo'lsangiz, bob oxiridagi uch yo'ldan birini oldindan tanlang.
O'lchaymiz: model fayli o'z litsenziyasini yozib yuradi
Ultralytics har bir model fayliga litsenziya yozuvini qo'shadi. Kitobdagi fayllarni o'qiymiz: yuklab olinganlar, 7-bobda o'zimiz o'qitganlar va 8-, 18-boblardagi eksportlar.
import json import re import subprocess import sys from pathlib import Path import onnx import pandas as pd import torch sys.path.insert(0, "kod") from tizim import docker_buyrugi def pt_yozuv(yol): ck = torch.load(yol, map_location="cpu", weights_only=False) return ck.get("license"), ck.get("version"), ck.get("date", "")[:10] def onnx_yozuv(yol): m = {p.key: p.value for p in onnx.load(yol).metadata_props} return m.get("license"), m.get("version"), m.get("date", "")[:10] def engine_yozuv(yol): with open(yol, "rb") as f: m = json.loads(f.read(int.from_bytes(f.read(4), "little"))) return m.get("license"), m.get("version"), m.get("date", "")[:10] OQUVCHI = {".pt": pt_yozuv, ".onnx": onnx_yozuv, ".engine": engine_yozuv} fayllar = ["weights/yolov8n.pt", "weights/yolo11n.pt", "weights/yolo26n.pt", "out/train/ppe_coco/weights/best.pt", "out/train/ppe_noldan/weights/best.pt", "weights/yolo11n_640.onnx", "weights/yolo11n_384x640_b16.engine"] show(pd.DataFrame([dict(zip(("fayl", "litsenziya", "ultralytics", "sana"), (f, *OQUVCHI[Path(f).suffix](f)))) for f in fayllar]))
| fayl | litsenziya | ultralytics | sana |
|---|---|---|---|
| weights/yolov8n.pt | AGPL-3.0 License (https://ultralytics.com/license) | 8.0.0.dev0 | 2022-12-30 |
| weights/yolo11n.pt | AGPL-3.0 License (https://ultralytics.com/license) | 8.2.100 | 2024-09-25 |
| weights/yolo26n.pt | AGPL-3.0 (https://ultralytics.com/license) | 8.3.222 | 2025-12-15 |
| out/train/ppe_coco/weights/best.pt | AGPL-3.0 (https://ultralytics.com/license) | 8.4.17 | 2026-09-21 |
| out/train/ppe_noldan/weights/best.pt | AGPL-3.0 (https://ultralytics.com/license) | 8.4.17 | 2026-09-21 |
| weights/yolo11n_640.onnx | AGPL-3.0 License (https://ultralytics.com/license) | 8.4.17 | 2026-09-21 |
| weights/yolo11n_384x640_b16.engine | AGPL-3.0 License (https://ultralytics.com/license) | 8.4.17 | 2026-09-21 |
weights_only=False .pt ichidagi pickle kodini bajaradi — bunday yuklashni faqat o'zingiz ishonadigan fayllarda qiling. ONNX va TensorRT metama'lumoti oddiy matn, bajarilmaydi.
Eng muhim qator — ppe_noldan. 7-bobda bu model tasodifiy vaznlardan, COCO og'irliklarisiz o'qitilgan, lekin yozuv baribir AGPL-3.0: uni oldindan o'qitilgan og'irlik emas, o'qitish kodi yozadi. Ultralytics sahifasidagi "Train your own model from scratch" jumlasi aynan shu holat. (Uning ma'lumoti — Construction-PPE — ham AGPL, pastda.) Eksport litsenziyani o'zgartirmaydi: ONNX va TensorRT fayllarida ham xuddi shu yozuv.
Muqobil: ruxsat beruvchi litsenziyali modellar
Ruxsat beruvchi (permissive) litsenziyalar — MIT, BSD, Apache-2.0 — kodni yopiq mahsulotda ishlatishga ruxsat beradi. Asosiy shart: litsenziya matni va mualliflik yozuvini mahsulot bilan birga berish. GitHub litsenziya API si bo'yicha (2026-09-22):
| Detektor | Litsenziya | Izoh |
|---|---|---|
| YOLOX (Megvii-BaseDetection/YOLOX) | Apache-2.0 | og'irliklar repo "releases" ida |
| RT-DETR (lyuwenyu/RT-DETR, asl repo) | Apache-2.0 | ultralytics ichidagi RT-DETR — AGPL, chunki kod Ultralytics niki |
| D-FINE (Peterande/D-FINE) | Apache-2.0 | |
| RF-DETR (roboflow/rf-detr) | Apache-2.0 | N, S, M, L hajmlari; XL va 2XL — PML 1.0 |
| YOLOv7, YOLOv9 (WongKinYiu) | GPL-3.0 | copyleft: tarqatsangiz, manba ochiladi |
| Tracker | Litsenziya | Izoh |
|---|---|---|
| ByteTrack (FoundationVision/ByteTrack) | MIT | asl kod |
| BoT-SORT (NirAharon/BoT-SORT) | MIT | asl kod |
| trackers (roboflow/trackers) | Apache-2.0 | SORT, ByteTrack, OC-SORT |
| deep_sort (nwojke/deep_sort) | GPL-3.0 | |
| boxmot | AGPL-3.0 |
10-bobda SORT ni noldan yozdik — o'zingiz yozgan kod o'zingizniki. 22-bob ishchisidagi BoT-SORT esa ultralytics.trackers dan, ya'ni AGPL.
Model almashtirish bepul emas: yangi detektorni o'z ma'lumotingizda qayta o'qitish va 16-, 22-boblardagi o'lchovlarni qaytadan qilish kerak. Kitobdagi bilim esa — dekodlash, NMS, Kalman, Venger algoritmi, baholash — har qanday detektorga o'tadi. Yana bir gap: COCO da o'qitilgan har qanday model, litsenziyasi Apache bo'lsa ham, COCO rasmlarining shartidan qutulmaydi (pastda).
Ma'lumotlar
| Dataset | Kitobda | Litsenziya | Tijoriy |
|---|---|---|---|
| COCO | 2-bob; YOLO11n shunda o'qitilgan | annotatsiyalar CC BY 4.0; rasmlar — Flickr shartlari | annotatsiya — ha, muallifni ko'rsatib; rasmlar uchun javobgarlik foydalanuvchida |
| Construction-PPE | 7-bob, o'qitish | AGPL-3.0 | Ultralytics shartlari bilan (yuqorida) |
| MOT17 | 9–16-boblar, o'lchash | CC BY-NC-SA 3.0 | yo'q |
| WILDTRACK | 15-bob | ko'rsatilmagan | ruxsat berilmagan |
| Pexels 13921040 | 22-bob | Pexels litsenziyasi | ha, cheklovlar bilan |
COCO. Foydalanish shartlari (cocodataset.org, "Terms of Use"): annotatsiyalar CC BY 4.0 da, rasmlar esa boshqacha: "The COCO Consortium does not own the copyright of the images. Use of the images must abide by the Flickr Terms of Use. The users of the images accept full responsibility for the use of the dataset". COCO da oldindan o'qitilgan har qanday model shu rasmlardan o'rgangan.
MOT17. MOTChallenge sayti hozir ishlamaydi: arxivlar eski manzillarida yuklanadi, natijalar statik arxivda (16-aprel 2026 holati). Litsenziya matni saytning 2024-12-19 dagi arxiv nusxasida (web.archive.org): "The datasets provided on this page are published under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License. This means that you must attribute the work in the manner specified by the authors, you may not use this work for commercial purposes and if you alter, transform, or build upon this work, you may distribute the resulting work only under the same license." Kitobda MOT17 faqat o'rganish va o'lchash uchun ishlatildi. Mahsulot uchun tracker sozlamalarini mijozning o'z videosida tanlang va o'lchang (16-, 22-boblar).
WILDTRACK. Datasetning README.txt sida faqat "If you use this dataset, please cite the paper" deyilgan. Litsenziya ko'rsatilmagani — ruxsat degani emas: tijoriy foydalanish uchun mualliflardan yozma ruxsat so'rash kerak.
Construction-PPE. Ultralytics hujjati: "Construction-PPE is developed and released under the AGPL-3.0 License, supporting open-source research and commercial applications with proper attribution." Dataset papkasidagi LICENSE fayli — AGPL-3.0 matni. Unda o'qitilgan model (7-bob) Ultralytics talqini bo'yicha AGPL.
Pexels. Ruxsat: "All photos and videos on Pexels are free to use." "Attribution is not required." O'zgartirish ham mumkin. Taqiqlar orasida ikkitasi bizga tegishli: "Identifiable people may not appear in a bad light or in a way that is offensive" va "Don't imply endorsement of your product by people or brands on the imagery." Kaska nazorati namoyishida ishchini "kaskasiz" deb ko'rsatish — aynan "yomon ko'rinish" xavfi, shuning uchun 22-bobda yuzlar xiralashtirilgan. Reklama materialida esa videodagi odamlar mahsulotingizni "tavsiya qilayotgandek" ko'rinmasin.
Amaliy xulosa: sotiladigan model uchun eng yaxshi ma'lumot — mijozning o'z kameralaridan, yozma kelishuv bilan: kimniki, qancha saqlanadi, kim belgilaydi. Qonun tomoni — 24-bobda, shartnoma — 26-bobda.
Boshqa modellar va kutubxonalar
| Nima | Litsenziya | Manba |
|---|---|---|
| YuNet (yuz detektori, 13-bob) | MIT | opencv_zoo, models/face_detection_yunet/README.md |
| SFace (yuz tanish, 13-bob) | Apache-2.0 | opencv_zoo, models/face_recognition_sface/README.md |
| InsightFace | kod MIT; modellar — faqat notijorat tadqiqot | deepinsight/insightface, README |
| MediaPipe kutubxonasi | Apache-2.0 | GitHub |
| BlazeFace short range (MediaPipe yuz modeli) | Apache-2.0 | model kartasi (PDF) |
| EfficientDet-Lite0 (MediaPipe, 8-bob) | fayl uchun yozilmagan | MediaPipe sahifasi; asli google/automl — Apache-2.0 |
| TrackEval | MIT | GitHub |
| MediaMTX | MIT | GitHub |
| Django | BSD-3-Clause | GitHub |
| PostgreSQL | PostgreSQL License | postgresql.org: "similar to the BSD or MIT licenses" |
| nginx | BSD-2-Clause | GitHub |
8-bobda va'da qilgan edik: MediaPipe model fayllarining sharti. BlazeFace model kartasida yozilgan: "LICENSED UNDER Apache License, Version 2.0". EfficientDet-Lite0 uchun MediaPipe sahifasida model litsenziyasi yo'q; og'irliklar kelib chiqqan google/automl repozitoriysi Apache-2.0. Mahsulotda ishlatishdan oldin bunday "yozilmagan" joylarni muallifdan yozma so'rang.
InsightFace README si 2025-11-24 da yangilangan: ochiq yuz tanish modellari (masalan, buffalo_l) uchun litsenziya endi alohida so'raladi. Litsenziya o'zgarib turadi — har tekshiruvning sanasini yozib qo'ying.
O'lchaymiz: mijozga yetadigan tasvirlar ichida nima bor
21-bobdagi ikki tasvir — yolo-kitob-web:1 (Django, gunicorn) va yolo-kitob-tahlilchi:1 (YOLO ishchisi) — aynan mijoz serveriga boradigan narsa. Ular ichida biz o'zimiz tanlamagan paketlar ham bor: ultralytics/ultralytics asosiy tasviri o'zi bilan ko'p paket olib keladi. Har bir Python paketining litsenziyasini uning metama'lumotidan o'qiymiz. Litsenziya to'rt joyda bo'lishi mumkin, tartib bilan tekshiramiz: License-Expression (yangi standart, SPDX nomi), License (qisqa bo'lsa), Classifier, oxirida — paketdagi litsenziya faylining boshi.
import json from importlib import metadata as md def klassifikator(m): return "; ".join(sorted({c.split(" :: ")[-1] for c in m.get_all("Classifier") or [] if c.startswith("License ::")})) def litsenziya(d): m = d.metadata matn = (m.get("License") or "").strip() if m.get("License-Expression"): return m["License-Expression"], "License-Expression" if matn and "\n" not in matn and len(matn) < 60: return matn, "License" if klassifikator(m): return klassifikator(m), "Classifier" for f in d.files or []: if f.parts[0].endswith(".dist-info") and ("LICEN" in f.name.upper() or "COPYING" in f.name.upper()): return " ".join((f.read_text() or "").split()[:8]), "fayl" return "?", "-" for d in md.distributions(): matn, manba = litsenziya(d) print(json.dumps({"paket": d.metadata["Name"], "versiya": d.version, "litsenziya": matn, "manba": manba, "klassifikator": klassifikator(d.metadata)}))
Skriptni har bir tasvir ichida ishga tushiramiz, tarmoqsiz (--network none) — audit uchun internet kerak emas. Har litsenziyani oilaga ajratamiz; bir nechta litsenziya yozilgan bo'lsa, eng qattig'i olinadi. To'liq ro'yxat out/litsenziyalar/ ga CSV bo'lib yoziladi — mijozga beriladigan uchinchi tomon ro'yxatining asosi.
docker = docker_buyrugi() TASVIRLAR = ["yolo-kitob-web:1", "yolo-kitob-tahlilchi:1"] OILALAR = [("AGPL", r"AGPL|Affero"), ("LGPL", r"LGPL|Lesser General"), ("GPL", r"GPL|General Public"), ("MPL", r"MPL|Mozilla"), ("yopiq", r"Proprietary|NVIDIA"), ("ruxsat beruvchi", r"\bMIT\b|BSD|Apache|ISC|PSF|Python Software|Unlicense|HPND|Zlib|CC0|Public Domain" r"|PostgreSQL|Permission is hereby granted")] def oila(matn): return next((nom for nom, rx in OILALAR if re.search(rx, matn)), "noma'lum") def audit(tasvir): r = subprocess.run([docker, "run", "--rm", "-i", "--network", "none", "--entrypoint", "python", tasvir, "-"], input=Path("kod/litsenziya_audit.py").read_text(), capture_output=True, text=True) if r.returncode != 0: raise SystemExit(f"{tasvir}: {r.stderr.strip()[-300:]} (tasvir 21-bobda yig'iladi)") df = pd.DataFrame([json.loads(q) for q in r.stdout.splitlines()]).drop_duplicates("paket").sort_values("paket") return df.assign(oila=df.litsenziya.map(oila), klassifikator_oila=df.klassifikator.map(lambda k: oila(k) if k else "")) natija = {t: audit(t) for t in TASVIRLAR} Path("out/litsenziyalar").mkdir(parents=True, exist_ok=True) for t, df in natija.items(): df.to_csv(f"out/litsenziyalar/{t.split(':')[0]}.csv", index=False) show(pd.DataFrame({t: df.oila.value_counts() for t, df in natija.items()}).fillna(0).astype(int)) barchasi = pd.concat([df.assign(tasvir=t.split(":")[0]) for t, df in natija.items()]) qattiq = barchasi[barchasi.oila != "ruxsat beruvchi"] nvidia = qattiq.paket.str.startswith("nvidia-") print("nvidia-* paketlari:", nvidia.sum(), "ta,", sorted(set(qattiq[nvidia].litsenziya))) show(qattiq[~nvidia][["tasvir", "paket", "versiya", "litsenziya", "manba"]], n=30)
nvidia-* paketlari: 12 ta, ['LicenseRef-NVIDIA-Proprietary', 'NVIDIA Proprietary Software']
| oila | yolo-kitob-web:1 | yolo-kitob-tahlilchi:1 |
|---|---|---|
| AGPL | 0 | 2 |
| LGPL | 2 | 2 |
| MPL | 0 | 3 |
| noma'lum | 0 | 2 |
| ruxsat beruvchi | 6 | 118 |
| yopiq | 0 | 12 |
| tasvir | paket | versiya | litsenziya | manba |
|---|---|---|---|---|
| yolo-kitob-web | psycopg | 3.3.3 | LGPL-3.0-only | License-Expression |
| yolo-kitob-web | psycopg-binary | 3.3.3 | LGPL-3.0-only | License-Expression |
| yolo-kitob-tahlilchi | certifi | 2025.10.5 | MPL-2.0 | License |
| yolo-kitob-tahlilchi | chardet | 5.2.0 | LGPL | License |
| yolo-kitob-tahlilchi | frozendict | 2.4.6 | LGPL v3 | License |
| yolo-kitob-tahlilchi | hypothesis | 6.147.0 | MPL-2.0 | License-Expression |
| yolo-kitob-tahlilchi | menuinst | 2.4.1 | (c) 2016 Continuum Analytics, Inc. / http://continuum.io All | fayl |
| yolo-kitob-tahlilchi | python-dateutil | 2.9.0.post0 | Dual License | License |
| yolo-kitob-tahlilchi | tqdm | 4.67.1 | MPL-2.0 AND MIT | License |
| yolo-kitob-tahlilchi | ultralytics | 8.4.17 | AGPL-3.0 | License |
| yolo-kitob-tahlilchi | ultralytics-thop | 2.0.18 | AGPL-3.0 | License |
Keyin — metama'lumotning o'ziga ishonib bo'lmaydigan joylar: litsenziya faqat fayldan topilganlar va Classifier boshqa oilani ko'rsatganlar.
shubha = barchasi[(barchasi.manba == "fayl") | ((barchasi.klassifikator_oila != "") & (barchasi.klassifikator_oila != barchasi.oila))] show(shubha[["tasvir", "paket", "litsenziya", "manba", "klassifikator"]])
| tasvir | paket | litsenziya | manba | klassifikator |
|---|---|---|---|---|
| yolo-kitob-tahlilchi | archspec | Apache-2.0 OR MIT | License | Other/Proprietary License |
| yolo-kitob-tahlilchi | conda-package-handling | BSD 3-Clause License Copyright (c) 2019, Conda All | fayl | |
| yolo-kitob-tahlilchi | conda_index | BSD 3-Clause License Copyright (c) 2022, conda All | fayl | |
| yolo-kitob-tahlilchi | faster-coco-eval | Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS | fayl | |
| yolo-kitob-tahlilchi | matplotlib-inline | BSD 3-Clause License Copyright (c) 2019-2022, IPython Development | fayl | |
| yolo-kitob-tahlilchi | menuinst | (c) 2016 Continuum Analytics, Inc. / http://continuum.io All | fayl | |
| yolo-kitob-tahlilchi | nvidia-nccl-cu12 | BSD-3-Clause | License | Other/Proprietary License |
| yolo-kitob-tahlilchi | nvidia-nvshmem-cu12 | BSD-3-Clause | License | Other/Proprietary License |
| yolo-kitob-tahlilchi | nvidia-nvtx-cu12 | Apache 2.0 | License | Other/Proprietary License |
| yolo-kitob-tahlilchi | python-dateutil | Dual License | License | Apache Software License; BSD License |
| yolo-kitob-tahlilchi | setuptools | Permission is hereby granted, free of charge, to | fayl |
Python paketlari hammasi emas: tasvirda operatsion tizim paketlari ham bor (Debian yoki Ubuntu). Ularni sanaymiz va har birining copyright faylida GPL so'zi borligini tekshiramiz:
for t in TASVIRLAR: r = subprocess.run([docker, "run", "--rm", "--network", "none", "--entrypoint", "sh", t, "-c", "dpkg-query -W -f='${Package}\\n' | wc -l; grep -l GPL /usr/share/doc/*/copyright | wc -l"], capture_output=True, text=True) jami, gpl = r.stdout.split() print(f"{t}: OS paketlari {jami}, copyright faylida 'GPL' borlari {gpl}")
yolo-kitob-web:1: OS paketlari 87, copyright faylida 'GPL' borlari 77 yolo-kitob-tahlilchi:1: OS paketlari 229, copyright faylida 'GPL' borlari 176
Tasvirdagi natijalarni o'qish
Web tasviri kichik va toza: 8 ta Python paketi, bittagina copyleft — psycopg va uning kompilyatsiya qilingan qismi psycopg-binary (LGPL-3.0). LGPL "kichik" copyleft: 4-bo'limi kutubxona bilan birlashgan dasturni o'zingiz tanlagan shartlarda tarqatishga ruxsat beradi, agar kutubxona ishlatilganini aytsangiz, GPL va LGPL matnlarini qo'shsangiz va foydalanuvchi kutubxonani o'zgartirilgan versiyasiga almashtira olsa. Python paketni ish vaqtida import qiladi va uni pip bilan boshqa versiyaga almashtirish mumkin — bu 4(d)(1) dagi "shared library mechanism" ga yaqin; yakuniy xulosani yuristga qoldiring.
Tahlilchi tasviri boshqacha — 139 ta paket, ulardan 118 tasi ruxsat beruvchi:
- AGPL —
ultralyticsva uning FLOPs hisoblagichiultralytics-thop. - LGPL —
chardetvafrozendict. Metama'lumotda faqat "LGPL" va "LGPL v3" deyilgan; litsenziya fayllarini o'qisak — LGPL-2.1 va LGPL-3.0. - MPL-2.0 —
certifi,hypothesis,tqdm. Bu fayl darajasidagi copyleft: MPL fayllarini boshqa litsenziyadagi kod bilan birga tarqatish mumkin (3.3-bo'lim), lekin MPL fayllarining o'zi va ularga kiritilgan o'zgarishlar MPL da qoladi (3.1-bo'lim). - Yopiq — 12 ta
nvidia-*paketi (CUDA, cuDNN va boshqalar), NVIDIA ning o'z shartlari bilan: tasvirni tarqatishdan oldin ularni o'qing. - Noma'lum — 2 ta, ularni qo'lda o'qidik.
menuinstning litsenziya fayli "All Rights Reserved" bilan boshlanadi, lekin davomi — BSD uslubidagi tarqatish shartlari.python-dateutilningLicensemaydoni faqat "Dual License"; fayli — Apache-2.0,Classifieri — Apache va BSD.
Metama'lumot aldaydi. Shubhali jadvalda archspec ning Classifier i "Other/Proprietary License" deydi, License maydoni esa "Apache-2.0 OR MIT". Uchta nvidia-* paketida ham xuddi shunday: Classifier — "Proprietary", License — BSD-3-Clause yoki Apache 2.0. Oddiy skaner ularni yopiq deb belgilardi. Aksincha holat ham bor: oltita paketda litsenziya maydonlari bo'sh va oila faqat litsenziya faylidan topildi. Shuning uchun avtomatik audit — birinchi elak, oxirgi so'z emas: har bir ruxsat beruvchi bo'lmagan va shubhali paketni qo'lda, litsenziya faylini o'qib tekshiring.
Tasvirni berish — OS paketlarini ham berish. Tasvirni mijozga bersangiz, undagi hamma dasturni tarqatgan bo'lasiz, jumladan OS paketlarini: web tasvirida 87 tadan 77 tasining, tahlilchida 229 tadan 176 tasining copyright faylida GPL bor. GPL ham tarqatishda manba kodini berishni talab qiladi. AGPL va GPL-3.0 ning 6(d) bo'limi manbani uchinchi tomon serveridan ko'rsatishga ruxsat beradi (masalan, Debian arxivi), lekin "you remain obligated to ensure that it is available for as long as needed". O'z serveringizdagi xizmat modelida tasvir sizda qoladi va bu savol tug'ilmaydi.
Sotishning uch yo'li
- Ochiq manba. Butun loyiha AGPL-3.0 ostida, mijozga manba kodi bilan. Pul — o'rnatish, moslash, qo'llab-quvvatlash va xizmat uchun (25-bob). Raqobatchi kodingizni olishi mumkin: himoya koddan emas, tajriba, ma'lumot va xizmat sifatidan keladi.
- Ultralytics Enterprise litsenziyasi. Kod yopiq qoladi. Narx so'rov bilan — uni tannarxga qo'shing (25-bob).
- Ruxsat beruvchi detektor va tracker (Apache-2.0 / MIT) va o'z ma'lumotingiz. Qayta o'qitish va qayta o'lchash kerak. LGPL va MPL paketlarining shartlari qoladi, lekin yuqoridagi bo'limlarga ko'ra ular yopiq kod bilan birga tarqatishga ruxsat beradi.
Sotishdan oldin tekshiruv ro'yxati
- Har bir model fayli: qaysi kod bilan va qaysi ma'lumotda o'qitilgan.
.ptdagilicenseyozuvi — birinchi belgi. - Har bir dataset: tijoriy ruxsat bormi. "NC" — yo'q. Litsenziya ko'rsatilmagan — yo'q.
- Tasvir auditi: bu bobdagi kod. Copyleft, yopiq va shubhali paketlar qo'lda tekshiriladi.
- Yetkazib berish: uchinchi tomon ro'yxati (
out/litsenziyalar/*.csv) va litsenziya matnlari mahsulot bilan birga. - Media: namoyish va reklamadagi odamlar — manba litsenziyasi va 24-bobdagi qonun.
- Sana: har tekshiruvning sanasi va manba manzili yoziladi — litsenziyalar o'zgaradi.
Asosiy fikr
- AGPL matni: ichki foydalanish shartsiz, tarqatish — manba kodi bilan, tarmoq orqali — o'zgartirilgan versiya uchun manba taklifi. Ultralytics o'z sahifasida kengroq talab qo'yadi: ochiq loyiha yoki Enterprise litsenziya.
- Ultralytics har bir model fayliga AGPL yozuvini qo'yadi — noldan o'qitilganiga ham, ONNX va TensorRT eksportlariga ham.
- Ma'lumot sharti modelga ergashadi: MOT17 (NC) va WILDTRACK (litsenziyasiz) — faqat o'rganish uchun.
- Mijozga yetadigan tahlilchi tasvirida 139 ta Python paketi va 229 ta OS paketi bor; ularning litsenziyasini o'lchash mumkin, lekin metama'lumotga ko'r-ko'rona ishonib bo'lmaydi.
Mashqlar
kod/litsenziya_audit.pyni o'z muhitingizda ishga tushiring (python kod/litsenziya_audit.py). Paketlar soni tasvirlardagidan nega farq qiladi? Kitob kodida umuman ishlatilmaydigan paketlarni toping.- 22-bob ishchisidagi tracker ni roboflow/trackers dagi ByteTrack (Apache-2.0) ga almashtiring va 16-bob o'lchovlarini takrorlang. Detektor hali ham AGPL — yopiq mahsulot uchun yana nima qolmoqda?
- Bitta Apache-2.0 detektorni tanlang: og'irliklari qaysi datasetda o'qitilgan va u datasetning sharti nima? Javobni manba manzili va sana bilan yozing.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.