cvflair 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cvflair-0.2.0/CHANGELOG.md +26 -0
- cvflair-0.2.0/LICENSE +21 -0
- cvflair-0.2.0/MANIFEST.in +12 -0
- cvflair-0.2.0/PKG-INFO +249 -0
- cvflair-0.2.0/README.md +207 -0
- cvflair-0.2.0/examples/demo_fake_detections.py +80 -0
- cvflair-0.2.0/examples/quickstart.py +16 -0
- cvflair-0.2.0/examples/theme_preview.py +45 -0
- cvflair-0.2.0/examples/yolo_quickstart.py +21 -0
- cvflair-0.2.0/pyproject.toml +78 -0
- cvflair-0.2.0/setup.cfg +4 -0
- cvflair-0.2.0/src/cvflair/__init__.py +33 -0
- cvflair-0.2.0/src/cvflair/camera.py +266 -0
- cvflair-0.2.0/src/cvflair/models.py +140 -0
- cvflair-0.2.0/src/cvflair/py.typed +0 -0
- cvflair-0.2.0/src/cvflair/themes.py +232 -0
- cvflair-0.2.0/src/cvflair.egg-info/PKG-INFO +249 -0
- cvflair-0.2.0/src/cvflair.egg-info/SOURCES.txt +24 -0
- cvflair-0.2.0/src/cvflair.egg-info/dependency_links.txt +1 -0
- cvflair-0.2.0/src/cvflair.egg-info/requires.txt +15 -0
- cvflair-0.2.0/src/cvflair.egg-info/top_level.txt +1 -0
- cvflair-0.2.0/tests/conftest.py +89 -0
- cvflair-0.2.0/tests/test_camera.py +159 -0
- cvflair-0.2.0/tests/test_models.py +130 -0
- cvflair-0.2.0/tests/test_themes.py +149 -0
- cvflair-0.2.0/tools/make_demo_gif.py +114 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Değişiklik günlüğü
|
|
2
|
+
|
|
3
|
+
Sürümleme [Semantic Versioning](https://semver.org/lang/tr/) izler.
|
|
4
|
+
Paket henüz PyPI'da yayınlanmadı; sürümler depo içi kilometre taşlarıdır.
|
|
5
|
+
|
|
6
|
+
## 0.2.0
|
|
7
|
+
|
|
8
|
+
### Eklendi
|
|
9
|
+
- `Camera.stream(model=...)`: model verildiğinde akış `(kare, tespitler)` çifti üretir.
|
|
10
|
+
- `cvflair.models`: ağırlık yolu, hazır Ultralytics modeli veya `sv.Detections`
|
|
11
|
+
döndüren herhangi bir çağrılabilir aynı detektör arayüzüne çevriliyor.
|
|
12
|
+
- `UltralyticsDetector` — `conf`, `iou`, `device` gibi ayarları her çağrıya taşır,
|
|
13
|
+
`verbose` varsayılan olarak kapalı.
|
|
14
|
+
- `yolo` extra'sı (`pip install "cvflair[yolo]"`). Ultralytics AGPL-3.0 olduğu için
|
|
15
|
+
zorunlu bağımlılık değil; eksikse hata mesajı extra'yı ve lisans gerekçesini söylüyor.
|
|
16
|
+
- `examples/yolo_quickstart.py`.
|
|
17
|
+
|
|
18
|
+
## 0.1.0
|
|
19
|
+
|
|
20
|
+
### Eklendi
|
|
21
|
+
- `Camera`: webcam açma, ayrı thread'de okuma, son kareyi tutan tek slotlu kuyruk,
|
|
22
|
+
`q`/ESC ile biten `stream()` akışı.
|
|
23
|
+
- `Theme`: `supervision` annotator'larını yapılandıran katman; `minimal`, `neon`,
|
|
24
|
+
`pastel` temaları. Annotator'lar tema kurulurken bir kez oluşturuluyor.
|
|
25
|
+
- Türkçe README, `docs/demo.gif` üreten `tools/make_demo_gif.py`, kamerasız örnekler.
|
|
26
|
+
- Kamera gerektirmeyen pytest paketi (sahte `capture_factory`).
|
cvflair-0.2.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 kbycode
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
include LICENSE
|
|
2
|
+
include README.md
|
|
3
|
+
include CHANGELOG.md
|
|
4
|
+
|
|
5
|
+
# Testler sdist'ten de çalışabilsin: conftest.py olmadan test dosyaları import edilemiyor.
|
|
6
|
+
recursive-include tests *.py
|
|
7
|
+
recursive-include examples *.py
|
|
8
|
+
recursive-include tools *.py
|
|
9
|
+
|
|
10
|
+
# Dokümantasyon görselleri depoda duruyor, pakete girmiyor (README mutlak URL kullanıyor).
|
|
11
|
+
prune docs
|
|
12
|
+
prune .github
|
cvflair-0.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: cvflair
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Theme-based, model-agnostic visualisation layer for computer vision detections, built on supervision.
|
|
5
|
+
Author: kbycode
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/kbycode/cvflair
|
|
8
|
+
Project-URL: Documentation, https://github.com/kbycode/cvflair#readme
|
|
9
|
+
Project-URL: Repository, https://github.com/kbycode/cvflair
|
|
10
|
+
Project-URL: Issues, https://github.com/kbycode/cvflair/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/kbycode/cvflair/blob/main/CHANGELOG.md
|
|
12
|
+
Keywords: computer-vision,opencv,supervision,annotation,visualization,webcam,yolo,bounding-box,themes
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Intended Audience :: Education
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
24
|
+
Classifier: Topic :: Scientific/Engineering :: Image Processing
|
|
25
|
+
Classifier: Topic :: Multimedia :: Video :: Display
|
|
26
|
+
Requires-Python: >=3.10
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
License-File: LICENSE
|
|
29
|
+
Requires-Dist: numpy>=1.24
|
|
30
|
+
Requires-Dist: opencv-python>=4.8
|
|
31
|
+
Requires-Dist: supervision<0.30,>=0.28
|
|
32
|
+
Provides-Extra: yolo
|
|
33
|
+
Requires-Dist: ultralytics>=8.2; extra == "yolo"
|
|
34
|
+
Provides-Extra: dev
|
|
35
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
36
|
+
Requires-Dist: ruff>=0.6; extra == "dev"
|
|
37
|
+
Requires-Dist: pillow>=10.0; extra == "dev"
|
|
38
|
+
Provides-Extra: release
|
|
39
|
+
Requires-Dist: build>=1.2; extra == "release"
|
|
40
|
+
Requires-Dist: twine>=5.0; extra == "release"
|
|
41
|
+
Dynamic: license-file
|
|
42
|
+
|
|
43
|
+
# cvflair
|
|
44
|
+
|
|
45
|
+
Bilgisayarlı görü tespitlerini üç satırda, hazır temalarla ekrana çizen ince bir katman.
|
|
46
|
+
|
|
47
|
+
Çizim işini [supervision](https://github.com/roboflow/supervision) yapar; cvflair kamera
|
|
48
|
+
döngüsünü ve tema ayarlarını üstlenir. Model bağımsızdır: `supervision`'ın `Detections`
|
|
49
|
+
nesnesini üreten her kaynak (YOLO, MediaPipe, InsightFace veya özel bir model) tema
|
|
50
|
+
tarafından çizilebilir.
|
|
51
|
+
|
|
52
|
+

|
|
53
|
+
|
|
54
|
+
*Aynı tespitler, üç tema. Animasyon `tools/make_demo_gif.py` ile üretildi — sentetik
|
|
55
|
+
sahne, kamera gerekmiyor.*
|
|
56
|
+
|
|
57
|
+
> **Durum:** Faz 1 tamam (kamera döngüsü, üç tema, testler), Faz 2 başladı (model
|
|
58
|
+
> bağlama). Paket henüz PyPI'da yayınlanmadı.
|
|
59
|
+
|
|
60
|
+
## Kurulum
|
|
61
|
+
|
|
62
|
+
Python 3.10 veya üzeri gerekir (bu alt sınır `supervision`'dan geliyor).
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
git clone https://github.com/kbycode/cvflair.git
|
|
66
|
+
cd cvflair
|
|
67
|
+
pip install -e .
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Yayınlandıktan sonra: `pip install cvflair`
|
|
71
|
+
|
|
72
|
+
YOLO ile kullanmak için Ultralytics extra'sı: `pip install -e ".[yolo]"`
|
|
73
|
+
(ayrıntı ve lisans notu için aşağıdaki [Lisans](#lisans) bölümü).
|
|
74
|
+
|
|
75
|
+
## Hızlı başlangıç
|
|
76
|
+
|
|
77
|
+
```python
|
|
78
|
+
from cvflair import Camera
|
|
79
|
+
|
|
80
|
+
cam = Camera(source=0, theme="neon")
|
|
81
|
+
for frame in cam.stream():
|
|
82
|
+
cam.show(frame)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Kamera açılır, kareler ayrı bir thread'de okunur, pencere `q` veya ESC ile kapanır —
|
|
86
|
+
`release()` çağırmaya, `while True` kurmaya gerek yok.
|
|
87
|
+
|
|
88
|
+
> Model verilmeyen bu akışta ekranda ham kare görünür: tema ancak ortada tespit
|
|
89
|
+
> varken çizim yapar. Temayı modelsiz, canlı görmek için:
|
|
90
|
+
> `python examples/demo_fake_detections.py` — kamera görüntüsü üzerine hareketli sahte
|
|
91
|
+
> kutular çizer ve temaları 3 saniyede bir değiştirir.
|
|
92
|
+
|
|
93
|
+
## Modelle kullanım
|
|
94
|
+
|
|
95
|
+
`stream()`'e bir model verildiğinde her adım `(kare, tespitler)` çifti döndürür ve
|
|
96
|
+
tema otomatik uygulanır:
|
|
97
|
+
|
|
98
|
+
```python
|
|
99
|
+
from cvflair import Camera
|
|
100
|
+
|
|
101
|
+
cam = Camera(source=0, theme="neon")
|
|
102
|
+
for frame, detections in cam.stream(model="yolov8n.pt"):
|
|
103
|
+
cam.show(frame, detections)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
`model` üç şeyden biri olabilir:
|
|
107
|
+
|
|
108
|
+
| Değer | Anlamı |
|
|
109
|
+
|---|---|
|
|
110
|
+
| `"yolov8n.pt"` (ağırlık yolu) | Ultralytics ile yüklenir — `cvflair[yolo]` gerekir |
|
|
111
|
+
| Hazır bir Ultralytics modeli | `YOLO(...)` nesnesi doğrudan verilebilir, çıktısı dönüştürülür |
|
|
112
|
+
| Herhangi bir çağrılabilir | `sv.Detections` döndüren kendi fonksiyonun — MediaPipe, InsightFace, özel model |
|
|
113
|
+
|
|
114
|
+
Son seçenek kütüphaneyi model-agnostik yapan yer:
|
|
115
|
+
|
|
116
|
+
```python
|
|
117
|
+
import supervision as sv
|
|
118
|
+
from cvflair import Camera
|
|
119
|
+
|
|
120
|
+
def detect(frame) -> sv.Detections:
|
|
121
|
+
... # kendi modelin
|
|
122
|
+
return sv.Detections(xyxy=..., class_id=..., confidence=...)
|
|
123
|
+
|
|
124
|
+
cam = Camera(source=0, theme="pastel")
|
|
125
|
+
for frame, detections in cam.stream(model=detect):
|
|
126
|
+
cam.show(frame, detections)
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Çıkarım bu döngüde çalışır, okuma thread'inde değil: bir kare işlenirken okuyucu
|
|
130
|
+
kuyruktaki kareyi tazelemeye devam eder, dolayısıyla bir sonraki tur birikmiş
|
|
131
|
+
kareyle değil en güncel kareyle başlar.
|
|
132
|
+
|
|
133
|
+
Ultralytics'e ek ayar geçirmek için `UltralyticsDetector` doğrudan kullanılabilir:
|
|
134
|
+
|
|
135
|
+
```python
|
|
136
|
+
from cvflair import Camera, UltralyticsDetector
|
|
137
|
+
from ultralytics import YOLO
|
|
138
|
+
|
|
139
|
+
detector = UltralyticsDetector(YOLO("yolov8n.pt"), conf=0.4, device="cpu", classes=[0])
|
|
140
|
+
cam = Camera(source=0, theme="neon")
|
|
141
|
+
for frame, detections in cam.stream(model=detector):
|
|
142
|
+
cam.show(frame, detections)
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Etiket metni doğrudan da verilebilir: `cam.show(frame, detections, labels=[...])`.
|
|
146
|
+
Pencere yönetimi uygulamaya aitse `cam.annotate(frame, detections)` yalnızca çizim yapar.
|
|
147
|
+
|
|
148
|
+
## Temalar
|
|
149
|
+
|
|
150
|
+
| Tema | Görünüm | |
|
|
151
|
+
|---|---|---|
|
|
152
|
+
| `minimal` | ince beyaz çerçeve, sade etiket — ekran kaydı ve profesyonel demo için |  |
|
|
153
|
+
| `neon` | sınıf başına canlı renk, yuvarlak köşe, koyu hâle ile parlama hissi |  |
|
|
154
|
+
| `pastel` | yumuşak tonlar, geniş yuvarlama, koyu etiket yazısı — atölye/projeksiyon |  |
|
|
155
|
+
|
|
156
|
+
Yol haritasındaki `cyberpunk` ve `hud` temaları Faz 2'de gelecek.
|
|
157
|
+
|
|
158
|
+
Özel bir tema, `Theme` doğrudan kurulup `Camera`'ya verilerek tanımlanır:
|
|
159
|
+
|
|
160
|
+
```python
|
|
161
|
+
import supervision as sv
|
|
162
|
+
from cvflair import Camera, Theme
|
|
163
|
+
|
|
164
|
+
my_theme = Theme(
|
|
165
|
+
name="my-theme",
|
|
166
|
+
palette=sv.ColorPalette.from_hex(["#39FF14", "#FF00E5"]),
|
|
167
|
+
box_style="corner", # "box" | "round" | "corner"
|
|
168
|
+
thickness=2,
|
|
169
|
+
glow=True,
|
|
170
|
+
text_scale=0.6,
|
|
171
|
+
)
|
|
172
|
+
cam = Camera(source=0, theme=my_theme)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Temaları görmenin iki yolu:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
python examples/demo_fake_detections.py # canlı kamera + hareketli sahte tespitler
|
|
179
|
+
python examples/theme_preview.py # kamerasız, her temayı bir PNG'ye çizer
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## API özeti
|
|
183
|
+
|
|
184
|
+
| Üye | Ne yapar |
|
|
185
|
+
|---|---|
|
|
186
|
+
| `Camera(source, theme, width, height, fps, window_name, capture_factory)` | Kaynağı ve temayı bağlar; kamerayı henüz açmaz |
|
|
187
|
+
| `cam.start()` / `cam.close()` | Cihazı açar ve okuma thread'ini başlatır / her şeyi bırakır |
|
|
188
|
+
| `cam.stream(timeout, model=None)` | Kareleri üretir; model verilirse `(kare, tespitler)` çifti. İlk kullanımda `start()`, bitince `close()` eder |
|
|
189
|
+
| `cam.read(timeout)` | En güncel tek kareyi döndürür, kaynak bittiyse `None` |
|
|
190
|
+
| `cam.show(frame, detections, labels)` | Temayı uygular, pencerede gösterir; çıkış istendiğinde `False` döner |
|
|
191
|
+
| `cam.annotate(frame, detections, labels)` | Sadece çizer, pencere açmaz |
|
|
192
|
+
| `cam.theme` | Okunur/yazılır; `cam.theme = "minimal"` çalışır |
|
|
193
|
+
| `cam.frames_read` / `cam.frames_dropped` | Okunan ve tüketici yetişemediği için atılan kare sayısı |
|
|
194
|
+
| `get_theme(ad)` / `available_themes()` | Tema adını çözer / mevcut adları listeler |
|
|
195
|
+
| `UltralyticsDetector(model, **kwargs)` | Ultralytics çıktısını `sv.Detections`'a çevirir; `conf`, `iou`, `device` gibi ayarları taşır |
|
|
196
|
+
| `resolve_detector(model)` | Ağırlık yolu / model / çağrılabilir → detektör; `stream()` bunu kullanır |
|
|
197
|
+
|
|
198
|
+
`Camera` bağlam yöneticisi olarak da kullanılabilir: `with Camera() as cam: ...`
|
|
199
|
+
|
|
200
|
+
## Nasıl çalışıyor
|
|
201
|
+
|
|
202
|
+
- **Kareler ayrı thread'de okunur.** Okuyucu, tüketiciyi beklemez.
|
|
203
|
+
- **Kuyruk tek slotlu.** Yeni kare gelince bekleyen eski kare düşürülür
|
|
204
|
+
(`frames_dropped` ile sayılır). Böylece işleme yavaşladığında gecikme birikmez;
|
|
205
|
+
ekranda hep en güncel kare olur.
|
|
206
|
+
- **Annotator'lar bir kere kurulur.** `Theme` nesnesi oluşturulurken `supervision`
|
|
207
|
+
annotator'ları hazırlanır ve her karede yeniden kullanılır — döngü içinde annotator
|
|
208
|
+
kurmak bu tür işlerde en sık görülen gereksiz maliyettir.
|
|
209
|
+
- **Çizim matematiği yeniden yazılmadı.** Her piksel `supervision` tarafından çiziliyor;
|
|
210
|
+
cvflair sadece yapılandırma ve akış katmanı.
|
|
211
|
+
- **Model paketin dışında.** `stream(model=...)` verilen şeyi bir çağrılabilire çevirir;
|
|
212
|
+
ağırlıklar ilk yinelemede yüklenir. Hiçbir model kodu veya ağırlığı pakete gömülü değil.
|
|
213
|
+
|
|
214
|
+
## Geliştirme
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
python -m venv .venv
|
|
218
|
+
.venv\Scripts\activate
|
|
219
|
+
pip install -e ".[dev]"
|
|
220
|
+
pytest
|
|
221
|
+
ruff check .
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Testler kamera gerektirmez: `Camera`'ya `capture_factory` üzerinden sahte bir
|
|
225
|
+
`VideoCapture` verilir, temalar da sentetik kareler üzerinde doğrulanır.
|
|
226
|
+
|
|
227
|
+
Dokümantasyon görselleri de kamerasız üretilir:
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
python tools/make_demo_gif.py # docs/demo.gif
|
|
231
|
+
python examples/theme_preview.py # examples/output/theme-*.png
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## Yol haritası
|
|
235
|
+
|
|
236
|
+
| Faz | İçerik | Durum |
|
|
237
|
+
|---|---|---|
|
|
238
|
+
| Faz 1 | Kamera döngüsü, `minimal`/`neon`/`pastel` temaları, README, demo GIF, testler | tamam |
|
|
239
|
+
| Faz 2 | Model bağlama (`stream(model=...)`) | tamam |
|
|
240
|
+
| Faz 2 | PyPI paketi, Türkçe dokümantasyon sitesi, tema playground, `cyberpunk`/`hud` | sırada |
|
|
241
|
+
| Faz 3 | GitHub Actions (lint + test), issue şablonları, örnek galerisi | planlandı |
|
|
242
|
+
|
|
243
|
+
## Lisans
|
|
244
|
+
|
|
245
|
+
MIT — bkz. [LICENSE](LICENSE). Bağımlılıkların hepsi izin verici lisanslı
|
|
246
|
+
(`supervision` MIT, `opencv-python` Apache 2.0, `numpy` BSD).
|
|
247
|
+
|
|
248
|
+
YOLO ağırlıkları veya Ultralytics kodu bu pakete gömülü değildir; Ultralytics'in
|
|
249
|
+
kullanılması hâlinde AGPL-3.0 koşulları onu kullanan projenin sorumluluğundadır.
|
cvflair-0.2.0/README.md
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# cvflair
|
|
2
|
+
|
|
3
|
+
Bilgisayarlı görü tespitlerini üç satırda, hazır temalarla ekrana çizen ince bir katman.
|
|
4
|
+
|
|
5
|
+
Çizim işini [supervision](https://github.com/roboflow/supervision) yapar; cvflair kamera
|
|
6
|
+
döngüsünü ve tema ayarlarını üstlenir. Model bağımsızdır: `supervision`'ın `Detections`
|
|
7
|
+
nesnesini üreten her kaynak (YOLO, MediaPipe, InsightFace veya özel bir model) tema
|
|
8
|
+
tarafından çizilebilir.
|
|
9
|
+
|
|
10
|
+

|
|
11
|
+
|
|
12
|
+
*Aynı tespitler, üç tema. Animasyon `tools/make_demo_gif.py` ile üretildi — sentetik
|
|
13
|
+
sahne, kamera gerekmiyor.*
|
|
14
|
+
|
|
15
|
+
> **Durum:** Faz 1 tamam (kamera döngüsü, üç tema, testler), Faz 2 başladı (model
|
|
16
|
+
> bağlama). Paket henüz PyPI'da yayınlanmadı.
|
|
17
|
+
|
|
18
|
+
## Kurulum
|
|
19
|
+
|
|
20
|
+
Python 3.10 veya üzeri gerekir (bu alt sınır `supervision`'dan geliyor).
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
git clone https://github.com/kbycode/cvflair.git
|
|
24
|
+
cd cvflair
|
|
25
|
+
pip install -e .
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Yayınlandıktan sonra: `pip install cvflair`
|
|
29
|
+
|
|
30
|
+
YOLO ile kullanmak için Ultralytics extra'sı: `pip install -e ".[yolo]"`
|
|
31
|
+
(ayrıntı ve lisans notu için aşağıdaki [Lisans](#lisans) bölümü).
|
|
32
|
+
|
|
33
|
+
## Hızlı başlangıç
|
|
34
|
+
|
|
35
|
+
```python
|
|
36
|
+
from cvflair import Camera
|
|
37
|
+
|
|
38
|
+
cam = Camera(source=0, theme="neon")
|
|
39
|
+
for frame in cam.stream():
|
|
40
|
+
cam.show(frame)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Kamera açılır, kareler ayrı bir thread'de okunur, pencere `q` veya ESC ile kapanır —
|
|
44
|
+
`release()` çağırmaya, `while True` kurmaya gerek yok.
|
|
45
|
+
|
|
46
|
+
> Model verilmeyen bu akışta ekranda ham kare görünür: tema ancak ortada tespit
|
|
47
|
+
> varken çizim yapar. Temayı modelsiz, canlı görmek için:
|
|
48
|
+
> `python examples/demo_fake_detections.py` — kamera görüntüsü üzerine hareketli sahte
|
|
49
|
+
> kutular çizer ve temaları 3 saniyede bir değiştirir.
|
|
50
|
+
|
|
51
|
+
## Modelle kullanım
|
|
52
|
+
|
|
53
|
+
`stream()`'e bir model verildiğinde her adım `(kare, tespitler)` çifti döndürür ve
|
|
54
|
+
tema otomatik uygulanır:
|
|
55
|
+
|
|
56
|
+
```python
|
|
57
|
+
from cvflair import Camera
|
|
58
|
+
|
|
59
|
+
cam = Camera(source=0, theme="neon")
|
|
60
|
+
for frame, detections in cam.stream(model="yolov8n.pt"):
|
|
61
|
+
cam.show(frame, detections)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
`model` üç şeyden biri olabilir:
|
|
65
|
+
|
|
66
|
+
| Değer | Anlamı |
|
|
67
|
+
|---|---|
|
|
68
|
+
| `"yolov8n.pt"` (ağırlık yolu) | Ultralytics ile yüklenir — `cvflair[yolo]` gerekir |
|
|
69
|
+
| Hazır bir Ultralytics modeli | `YOLO(...)` nesnesi doğrudan verilebilir, çıktısı dönüştürülür |
|
|
70
|
+
| Herhangi bir çağrılabilir | `sv.Detections` döndüren kendi fonksiyonun — MediaPipe, InsightFace, özel model |
|
|
71
|
+
|
|
72
|
+
Son seçenek kütüphaneyi model-agnostik yapan yer:
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
import supervision as sv
|
|
76
|
+
from cvflair import Camera
|
|
77
|
+
|
|
78
|
+
def detect(frame) -> sv.Detections:
|
|
79
|
+
... # kendi modelin
|
|
80
|
+
return sv.Detections(xyxy=..., class_id=..., confidence=...)
|
|
81
|
+
|
|
82
|
+
cam = Camera(source=0, theme="pastel")
|
|
83
|
+
for frame, detections in cam.stream(model=detect):
|
|
84
|
+
cam.show(frame, detections)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Çıkarım bu döngüde çalışır, okuma thread'inde değil: bir kare işlenirken okuyucu
|
|
88
|
+
kuyruktaki kareyi tazelemeye devam eder, dolayısıyla bir sonraki tur birikmiş
|
|
89
|
+
kareyle değil en güncel kareyle başlar.
|
|
90
|
+
|
|
91
|
+
Ultralytics'e ek ayar geçirmek için `UltralyticsDetector` doğrudan kullanılabilir:
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
from cvflair import Camera, UltralyticsDetector
|
|
95
|
+
from ultralytics import YOLO
|
|
96
|
+
|
|
97
|
+
detector = UltralyticsDetector(YOLO("yolov8n.pt"), conf=0.4, device="cpu", classes=[0])
|
|
98
|
+
cam = Camera(source=0, theme="neon")
|
|
99
|
+
for frame, detections in cam.stream(model=detector):
|
|
100
|
+
cam.show(frame, detections)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Etiket metni doğrudan da verilebilir: `cam.show(frame, detections, labels=[...])`.
|
|
104
|
+
Pencere yönetimi uygulamaya aitse `cam.annotate(frame, detections)` yalnızca çizim yapar.
|
|
105
|
+
|
|
106
|
+
## Temalar
|
|
107
|
+
|
|
108
|
+
| Tema | Görünüm | |
|
|
109
|
+
|---|---|---|
|
|
110
|
+
| `minimal` | ince beyaz çerçeve, sade etiket — ekran kaydı ve profesyonel demo için |  |
|
|
111
|
+
| `neon` | sınıf başına canlı renk, yuvarlak köşe, koyu hâle ile parlama hissi |  |
|
|
112
|
+
| `pastel` | yumuşak tonlar, geniş yuvarlama, koyu etiket yazısı — atölye/projeksiyon |  |
|
|
113
|
+
|
|
114
|
+
Yol haritasındaki `cyberpunk` ve `hud` temaları Faz 2'de gelecek.
|
|
115
|
+
|
|
116
|
+
Özel bir tema, `Theme` doğrudan kurulup `Camera`'ya verilerek tanımlanır:
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
import supervision as sv
|
|
120
|
+
from cvflair import Camera, Theme
|
|
121
|
+
|
|
122
|
+
my_theme = Theme(
|
|
123
|
+
name="my-theme",
|
|
124
|
+
palette=sv.ColorPalette.from_hex(["#39FF14", "#FF00E5"]),
|
|
125
|
+
box_style="corner", # "box" | "round" | "corner"
|
|
126
|
+
thickness=2,
|
|
127
|
+
glow=True,
|
|
128
|
+
text_scale=0.6,
|
|
129
|
+
)
|
|
130
|
+
cam = Camera(source=0, theme=my_theme)
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Temaları görmenin iki yolu:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
python examples/demo_fake_detections.py # canlı kamera + hareketli sahte tespitler
|
|
137
|
+
python examples/theme_preview.py # kamerasız, her temayı bir PNG'ye çizer
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## API özeti
|
|
141
|
+
|
|
142
|
+
| Üye | Ne yapar |
|
|
143
|
+
|---|---|
|
|
144
|
+
| `Camera(source, theme, width, height, fps, window_name, capture_factory)` | Kaynağı ve temayı bağlar; kamerayı henüz açmaz |
|
|
145
|
+
| `cam.start()` / `cam.close()` | Cihazı açar ve okuma thread'ini başlatır / her şeyi bırakır |
|
|
146
|
+
| `cam.stream(timeout, model=None)` | Kareleri üretir; model verilirse `(kare, tespitler)` çifti. İlk kullanımda `start()`, bitince `close()` eder |
|
|
147
|
+
| `cam.read(timeout)` | En güncel tek kareyi döndürür, kaynak bittiyse `None` |
|
|
148
|
+
| `cam.show(frame, detections, labels)` | Temayı uygular, pencerede gösterir; çıkış istendiğinde `False` döner |
|
|
149
|
+
| `cam.annotate(frame, detections, labels)` | Sadece çizer, pencere açmaz |
|
|
150
|
+
| `cam.theme` | Okunur/yazılır; `cam.theme = "minimal"` çalışır |
|
|
151
|
+
| `cam.frames_read` / `cam.frames_dropped` | Okunan ve tüketici yetişemediği için atılan kare sayısı |
|
|
152
|
+
| `get_theme(ad)` / `available_themes()` | Tema adını çözer / mevcut adları listeler |
|
|
153
|
+
| `UltralyticsDetector(model, **kwargs)` | Ultralytics çıktısını `sv.Detections`'a çevirir; `conf`, `iou`, `device` gibi ayarları taşır |
|
|
154
|
+
| `resolve_detector(model)` | Ağırlık yolu / model / çağrılabilir → detektör; `stream()` bunu kullanır |
|
|
155
|
+
|
|
156
|
+
`Camera` bağlam yöneticisi olarak da kullanılabilir: `with Camera() as cam: ...`
|
|
157
|
+
|
|
158
|
+
## Nasıl çalışıyor
|
|
159
|
+
|
|
160
|
+
- **Kareler ayrı thread'de okunur.** Okuyucu, tüketiciyi beklemez.
|
|
161
|
+
- **Kuyruk tek slotlu.** Yeni kare gelince bekleyen eski kare düşürülür
|
|
162
|
+
(`frames_dropped` ile sayılır). Böylece işleme yavaşladığında gecikme birikmez;
|
|
163
|
+
ekranda hep en güncel kare olur.
|
|
164
|
+
- **Annotator'lar bir kere kurulur.** `Theme` nesnesi oluşturulurken `supervision`
|
|
165
|
+
annotator'ları hazırlanır ve her karede yeniden kullanılır — döngü içinde annotator
|
|
166
|
+
kurmak bu tür işlerde en sık görülen gereksiz maliyettir.
|
|
167
|
+
- **Çizim matematiği yeniden yazılmadı.** Her piksel `supervision` tarafından çiziliyor;
|
|
168
|
+
cvflair sadece yapılandırma ve akış katmanı.
|
|
169
|
+
- **Model paketin dışında.** `stream(model=...)` verilen şeyi bir çağrılabilire çevirir;
|
|
170
|
+
ağırlıklar ilk yinelemede yüklenir. Hiçbir model kodu veya ağırlığı pakete gömülü değil.
|
|
171
|
+
|
|
172
|
+
## Geliştirme
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
python -m venv .venv
|
|
176
|
+
.venv\Scripts\activate
|
|
177
|
+
pip install -e ".[dev]"
|
|
178
|
+
pytest
|
|
179
|
+
ruff check .
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Testler kamera gerektirmez: `Camera`'ya `capture_factory` üzerinden sahte bir
|
|
183
|
+
`VideoCapture` verilir, temalar da sentetik kareler üzerinde doğrulanır.
|
|
184
|
+
|
|
185
|
+
Dokümantasyon görselleri de kamerasız üretilir:
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
python tools/make_demo_gif.py # docs/demo.gif
|
|
189
|
+
python examples/theme_preview.py # examples/output/theme-*.png
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Yol haritası
|
|
193
|
+
|
|
194
|
+
| Faz | İçerik | Durum |
|
|
195
|
+
|---|---|---|
|
|
196
|
+
| Faz 1 | Kamera döngüsü, `minimal`/`neon`/`pastel` temaları, README, demo GIF, testler | tamam |
|
|
197
|
+
| Faz 2 | Model bağlama (`stream(model=...)`) | tamam |
|
|
198
|
+
| Faz 2 | PyPI paketi, Türkçe dokümantasyon sitesi, tema playground, `cyberpunk`/`hud` | sırada |
|
|
199
|
+
| Faz 3 | GitHub Actions (lint + test), issue şablonları, örnek galerisi | planlandı |
|
|
200
|
+
|
|
201
|
+
## Lisans
|
|
202
|
+
|
|
203
|
+
MIT — bkz. [LICENSE](LICENSE). Bağımlılıkların hepsi izin verici lisanslı
|
|
204
|
+
(`supervision` MIT, `opencv-python` Apache 2.0, `numpy` BSD).
|
|
205
|
+
|
|
206
|
+
YOLO ağırlıkları veya Ultralytics kodu bu pakete gömülü değildir; Ultralytics'in
|
|
207
|
+
kullanılması hâlinde AGPL-3.0 koşulları onu kullanan projenin sorumluluğundadır.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Modelsiz canlı demo: kamera görüntüsü üzerine hareketli sahte tespitler çizer.
|
|
3
|
+
|
|
4
|
+
Faz 1'de model bağlama yok; bu betik tespitlerin yerine hareket eden kutular
|
|
5
|
+
üreterek temayı canlı gösterir. Temalar birkaç saniyede bir sırayla değişir.
|
|
6
|
+
|
|
7
|
+
Çalıştırmak için: python examples/demo_fake_detections.py
|
|
8
|
+
Çıkmak için: pencere seçiliyken 'q' veya ESC
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import math
|
|
12
|
+
import time
|
|
13
|
+
|
|
14
|
+
import numpy as np
|
|
15
|
+
import supervision as sv
|
|
16
|
+
|
|
17
|
+
from cvflair import Camera, available_themes
|
|
18
|
+
|
|
19
|
+
#: Kaç saniyede bir sıradaki temaya geçileceği. Kare sayısı yerine süre
|
|
20
|
+
#: kullanılıyor, çünkü kare hızı cihaza göre değişiyor.
|
|
21
|
+
THEME_SWITCH_SECONDS = 3.0
|
|
22
|
+
|
|
23
|
+
CLASS_NAMES = ("kutu", "hedef")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _pulse(tick: int, period: int, low: float, high: float) -> float:
|
|
27
|
+
"""(low, high) aralığında ileri geri salınan bir değer."""
|
|
28
|
+
phase = (math.sin(2 * math.pi * tick / period) + 1) / 2
|
|
29
|
+
return low + (high - low) * phase
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def fake_detections(width: int, height: int, tick: int) -> sv.Detections:
|
|
33
|
+
"""İki kutu: biri yatay, diğeri dikey salınıyor."""
|
|
34
|
+
box_w, box_h = width * 0.26, height * 0.42
|
|
35
|
+
left = _pulse(tick, 140, 0.04, 0.42) * width
|
|
36
|
+
top = height * 0.18
|
|
37
|
+
|
|
38
|
+
small_w, small_h = width * 0.20, height * 0.28
|
|
39
|
+
small_left = width * 0.62
|
|
40
|
+
small_top = _pulse(tick, 100, 0.10, 0.55) * height
|
|
41
|
+
|
|
42
|
+
return sv.Detections(
|
|
43
|
+
xyxy=np.array(
|
|
44
|
+
[
|
|
45
|
+
[left, top, left + box_w, top + box_h],
|
|
46
|
+
[small_left, small_top, small_left + small_w, small_top + small_h],
|
|
47
|
+
],
|
|
48
|
+
dtype=np.float32,
|
|
49
|
+
),
|
|
50
|
+
class_id=np.array([0, 1]),
|
|
51
|
+
confidence=np.array(
|
|
52
|
+
[_pulse(tick, 70, 0.55, 0.99), _pulse(tick, 55, 0.40, 0.95)], dtype=np.float32
|
|
53
|
+
),
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def main() -> None:
|
|
58
|
+
themes = available_themes()
|
|
59
|
+
print(f"Temalar sırayla: {', '.join(themes)} — çıkmak için 'q' veya ESC")
|
|
60
|
+
|
|
61
|
+
cam = Camera(source=0, theme=themes[0])
|
|
62
|
+
started = time.monotonic()
|
|
63
|
+
for tick, frame in enumerate(cam.stream()):
|
|
64
|
+
elapsed = time.monotonic() - started
|
|
65
|
+
wanted = themes[int(elapsed // THEME_SWITCH_SECONDS) % len(themes)]
|
|
66
|
+
if wanted != cam.theme.name:
|
|
67
|
+
# Tema atamak annotator'ları yeniden kurar; sadece ad değişince yapılıyor.
|
|
68
|
+
cam.theme = wanted
|
|
69
|
+
|
|
70
|
+
height, width = frame.shape[:2]
|
|
71
|
+
detections = fake_detections(width, height, tick)
|
|
72
|
+
labels = [
|
|
73
|
+
f"{name} {confidence:.2f}"
|
|
74
|
+
for name, confidence in zip(CLASS_NAMES, detections.confidence, strict=True)
|
|
75
|
+
]
|
|
76
|
+
cam.show(frame, detections, labels=labels)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
if __name__ == "__main__":
|
|
80
|
+
main()
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Üç satırlık başlangıç: kamerayı aç, kareleri neon temasıyla göster.
|
|
3
|
+
|
|
4
|
+
Tespit verilmediği için ekranda ham kare görünür — tema yalnızca `show()`'a bir
|
|
5
|
+
`Detections` geldiğinde çizim yapar. Temayı modelsiz görmek için:
|
|
6
|
+
examples/demo_fake_detections.py
|
|
7
|
+
|
|
8
|
+
Çalıştırmak için: python examples/quickstart.py
|
|
9
|
+
Çıkmak için: pencere seçiliyken 'q' veya ESC
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from cvflair import Camera
|
|
13
|
+
|
|
14
|
+
cam = Camera(source=0, theme="neon")
|
|
15
|
+
for frame in cam.stream():
|
|
16
|
+
cam.show(frame)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Kamerasız tema önizlemesi: sahte tespitlerle her temayı bir PNG'ye çizer.
|
|
3
|
+
|
|
4
|
+
Çalıştırmak için: python examples/theme_preview.py
|
|
5
|
+
Çıktı: examples/output/theme-<ad>.png
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
import cv2
|
|
11
|
+
import numpy as np
|
|
12
|
+
import supervision as sv
|
|
13
|
+
|
|
14
|
+
from cvflair import available_themes, get_theme
|
|
15
|
+
|
|
16
|
+
OUTPUT_DIR = Path(__file__).parent / "output"
|
|
17
|
+
|
|
18
|
+
# Tespit üreten bir model yerine sabit kutular: amaç temanın görünümü.
|
|
19
|
+
DETECTIONS = sv.Detections(
|
|
20
|
+
xyxy=np.array(
|
|
21
|
+
[[60, 90, 300, 380], [340, 140, 560, 330], [600, 60, 760, 260]], dtype=np.float32
|
|
22
|
+
),
|
|
23
|
+
class_id=np.array([0, 1, 2]),
|
|
24
|
+
confidence=np.array([0.94, 0.81, 0.66], dtype=np.float32),
|
|
25
|
+
)
|
|
26
|
+
LABELS = ["kisi 0.94", "bisiklet 0.81", "kopek 0.66"]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def backdrop(width: int = 840, height: int = 460) -> np.ndarray:
|
|
30
|
+
"""Koyu gri, hafif degradeli bir zemin — kutuların kontrastını görmek için."""
|
|
31
|
+
column = np.linspace(28, 58, width, dtype=np.uint8)
|
|
32
|
+
return np.repeat(column[None, :, None], height, axis=0).repeat(3, axis=2)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def main() -> None:
|
|
36
|
+
OUTPUT_DIR.mkdir(exist_ok=True)
|
|
37
|
+
for name in available_themes():
|
|
38
|
+
frame = get_theme(name).annotate(backdrop(), DETECTIONS, labels=LABELS)
|
|
39
|
+
path = OUTPUT_DIR / f"theme-{name}.png"
|
|
40
|
+
cv2.imwrite(str(path), frame)
|
|
41
|
+
print(f"{name:>8} -> {path}")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
if __name__ == "__main__":
|
|
45
|
+
main()
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""
|
|
2
|
+
YOLO ile üç satırlık akış.
|
|
3
|
+
|
|
4
|
+
Gereken: pip install "cvflair[yolo]"
|
|
5
|
+
Ağırlık dosyası ilk çalıştırmada Ultralytics tarafından indirilir.
|
|
6
|
+
Ultralytics AGPL-3.0 lisanslıdır; cvflair'in zorunlu bağımlılığı değildir.
|
|
7
|
+
|
|
8
|
+
Etiketler sınıf adlarından gelir (supervision dönüşümü class_name alanını doldurur).
|
|
9
|
+
Güven skorunu da yazdırmak için:
|
|
10
|
+
labels = [f"{n} {c:.2f}" for n, c in zip(detections["class_name"], detections.confidence)]
|
|
11
|
+
cam.show(frame, detections, labels=labels)
|
|
12
|
+
|
|
13
|
+
Çalıştırmak için: python examples/yolo_quickstart.py
|
|
14
|
+
Çıkmak için: pencere seçiliyken 'q' veya ESC
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from cvflair import Camera
|
|
18
|
+
|
|
19
|
+
cam = Camera(source=0, theme="neon")
|
|
20
|
+
for frame, detections in cam.stream(model="yolov8n.pt"):
|
|
21
|
+
cam.show(frame, detections)
|