██████╗ █████╗ ████████╗███████╗██╗ ██╗██╗███████╗██╗ ██████╗ ███╗ ██╗
██╔════╝ ██╔══██╗╚══██╔══╝██╔════╝██║ ██║██║██╔════╝██║██╔═══██╗████╗ ██║
██║ ███╗███████║ ██║ █████╗ ██║ ██║██║███████╗██║██║ ██║██╔██╗ ██║
██║ ██║██╔══██║ ██║ ██╔══╝ ╚██╗ ██╔╝██║╚════██║██║██║ ██║██║╚██╗██║
╚██████╔╝██║ ██║ ██║ ███████╗ ╚████╔╝ ██║███████║██║╚██████╔╝██║ ╚████║
╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ╚═══╝ ╚═╝╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═══╝
Rozpoznawanie tablic rejestracyjnych i kontrola bramy — iOS + Web Panel
GateVision to system automatycznej kontroli bramy wjazdowej. Aplikacja iOS w czasie rzeczywistym rozpoznaje tablice rejestracyjne, porównuje je z bazą danych i automatycznie steruje bramą. Wykorzystuje CoreML (model YOLO wytrenowany na tablicach) do detekcji regionów tablic oraz Apple Vision Framework do odczytu tekstu (OCR).
W tle działa serwer HTTP (port 6600) z pełnym panelem webowym do zarządzania systemem z dowolnego urządzenia w sieci lokalnej.
Źródło obrazu (iPhone / Raspberry Pi / 70mai)
│
├── 🧠 CoreML YOLO → Detekcja regionu tablicy → Crop → Vision OCR → Odczyt tekstu
│
├── 🗄️ SQLite → Sprawdzenie tablicy w bazie → Otwarcie/blokada bramy
│
└── 🌐 HTTP :6600 → Panel webowy (status, logi, zarządzanie, debug)
GateVision oferuje trzy tryby rozpoznawania tablic:
| Tryb | Silnik | Opis |
|---|---|---|
| Pełna klatka | Apple Vision OCR | OCR na całym obrazie — prosty, bez ML, dobre na krótki dystans |
| YOLO ML | CoreML + Vision wrapper | Model YOLO wykrywa region tablicy, obraz jest wycinany i wysyłany do OCR — lepsza skuteczność na dalszy dystans |
| CoreML Direct | CoreML bezpośrednio | Ten sam model YOLO, ale z ręcznym preprocessingiem (resize 640×640, CVPixelBuffer) i bezpośrednim MLModel.prediction() — pełna kontrola, przydatne do debugowania |
Klatka z kamery (portrait)
│
├── CoreML YOLO → bounding boxy tablic (normalized coords)
│
├── Crop + padding + upscale (min 150px) → wycięty region tablicy
│
├── Apple Vision OCR (.accurate) → tekst tablicy + confidence
│
├── Regex filter → [A-Z]{1,3}\d{3,5}[A-Z]{0,2}
│
└── System głosowania (N detekcji w oknie M klatek) → decyzja o otwarciu bramy
- 3 tryby detekcji — Pełna klatka, YOLO ML, CoreML Direct
- 2 tryby OCR — Tablica (filtruje rejestracje, steruje bramą) / Wszystko (wyświetla cały tekst — do kalibracji)
- System głosowania — wymaga N powtórzeń tej samej tablicy w oknie M klatek przed otwarciem bramy
- Cooldown — zapobiega wielokrotnemu otwarciu na tę samą tablicę
- iPhone — wbudowana kamera z wyborem obiektywu (0.5×, 1×, 5×)
- Raspberry Pi — MJPEG stream po HTTP z kamery USB podłączonej do Pi
- 70mai — dashcam przez RTSP stream
- 720p (1280×720) — niska latencja, mniejsze zużycie baterii
- 1080p (1920×1080) — balans jakości i wydajności
- 4K (3840×2160) — maksymalny zasięg detekcji
- Lista autoryzowanych tablic z danymi właścicieli
- Oznaczanie pojazdów flotowych i przypisywanie do użytkowników (AD)
- Blokowanie/odblokowywanie tablic bez usuwania z systemu
- Pełna historia detekcji z klatką z momentu rozpoznania (JPEG snapshot)
- Automat stanowy: ZAMKNIĘTA → OTWIERANIE → OTWARTA → ZAMYKANIE → ZAMKNIĘTA
- Konfigurowalne czasy otwierania, otwarcia i zamykania
- Ręczne sterowanie z aplikacji i panelu web
- Status — stan bramy, metryki OCR, podgląd kamery live (MJPEG stream), przyciski sterowania
- Logi — tabela detekcji z wyszukiwarką i podglądem zdjęć
- Tablice — dodawanie, edycja, blokowanie, usuwanie tablic
- Ustawienia — tryb OCR, tryb detekcji, źródło kamery, rozdzielczość
- Debug — diagnostyka OCR, info o kamerze, baza danych, logi ML z toggle/clear/copy
- MLLogger — szczegółowe logi pipeline'u ML w czasie rzeczywistym
- Debug ML — przechwytywanie wyciętych regionów tablic ze wszystkich detekcji ML (nie tylko zmatchowanych)
- Debug tab — diagnostyka OCR, parametry kamery, stany bramy, testy sterowania
- Loading screen — wizualizacja inicjalizacji (baza, model ML, kamera, serwer)
http://<IP-iPhone>:6600
| Metoda | Endpoint | Opis |
|---|---|---|
GET |
/ |
Dashboard HTML |
GET |
/api/status |
Stan bramy, FPS, ostatnia tablica, źródło kamery |
GET |
/api/snapshot |
Aktualna klatka JPEG |
GET |
/api/stream |
MJPEG stream (podgląd live) |
GET |
/api/live_log |
Ostatnie 60 detekcji na żywo |
GET |
/api/log?q= |
Historia detekcji z wyszukiwaniem |
GET |
/api/log/:id/snapshot |
Klatka JPEG z danego logu |
GET/POST |
/api/plates |
Lista / dodaj tablicę |
PUT/DELETE |
/api/plates/:id |
Edytuj / usuń tablicę |
POST |
/api/plates/:id/toggle_block |
Przełącz blokadę |
POST |
/api/gate/open |
Otwórz bramę |
POST |
/api/gate/close |
Zamknij bramę |
GET/POST |
/api/settings |
Odczyt / zapis ustawień (tryb OCR, detekcja, kamera, rozdzielczość) |
GET |
/api/debug |
Pełna diagnostyka (OCR, kamera, brama, ML logi, baza) |
POST |
/api/ml_log/toggle |
Włącz/wyłącz logowanie ML |
POST |
/api/ml_log/clear |
Wyczyść logi ML |
- Xcode 15+
- iPhone z iOS 16+ (zalecany iPhone 12+ dla Neural Engine)
- Sklonuj repo
- Otwórz
Gatevision.xcodeprojw Xcode - Build & Run (Cmd+R) na urządzeniu fizycznym (kamera nie działa w symulatorze)
Model ML (trained_plates_detection.mlpackage) jest dołączony do repo — Xcode kompiluje go automatycznie do .mlmodelc przy buildzie.
| Tryb | Kiedy używać |
|---|---|
| Tablica | Produkcja — filtruje europejskie tablice, steruje bramą |
| Wszystko | Kalibracja — pokazuje każdy rozpoznany tekst z confidence |
Przed otwarciem bramy aplikacja zbiera minVotes detekcji tej samej tablicy w oknie voteWindowSize klatek. Eliminuje fałszywe odczyty.
Domyślnie: 2 głosy w oknie 6 klatek
ZAMKNIĘTA → [openingTime]s → OTWARTA → [openDuration]s → [closingTime]s → ZAMKNIĘTA
Domyślnie: 2s 10s 3s
[A-Z]{1,3}\d{3,5}[A-Z]{0,2}Obsługuje: WA12345, KR999, PO55123AB, GD00001 itd.
Cała aplikacja iOS mieści się w jednym pliku (GateVisionApp.swift) — single-file architecture.
┌──────────────────────────────────────────────────────────────┐
│ iPhone │
│ │
│ ┌─────────────────┐ ┌────────────────────────────────┐ │
│ │ Źródło kamery │────▶│ CameraEngine │ │
│ │ • iPhone cam │ │ • CoreML YOLO detekcja │ │
│ │ • Raspberry Pi │ │ • Apple Vision OCR │ │
│ │ • 70mai RTSP │ │ • System głosowania │ │
│ └─────────────────┘ │ • Automat stanowy bramy │ │
│ │ • SQLite logging │ │
│ ┌─────────────────┐ │ │ │
│ │ SwiftUI UI │◀────│ @Published properties │ │
│ │ • Status tab │ └───────────────┬───────────────┘ │
│ │ • Logi tab │ │ │
│ │ • Tablice tab │ ┌───────────────▼───────────────┐ │
│ │ • Settings tab │ │ WebServer │ │
│ │ • Debug tab │ │ NWListener :6600 │ │
│ └─────────────────┘ │ • REST API (JSON) │ │
│ │ • HTML dashboard │ │
│ WiFi ──────────────────▶│ • MJPEG stream │ │
│ └───────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
Gatevision/
├── GateVisionApp.swift # Cała aplikacja iOS (single file)
│ ├── Enums # GateState, DetectionMode, OCRMode, CameraSource,
│ │ # LensType, CameraResolution, LoadStep
│ ├── DebugMLEntry # Model danych debug ML
│ ├── Design System (GV) # Kolory, Liquid Glass modifiers
│ ├── Database # SQLite wrapper (plates + access_log + snapshots)
│ ├── MLLogger # Logger pipeline'u ML
│ ├── WebServer # NWListener HTTP + REST API + dashboard
│ ├── CameraEngine # AVFoundation + CoreML + Vision OCR + gate FSM
│ │ ├── captureOutput # Przetwarzanie klatek z iPhone
│ │ ├── handleExternalFrame # Przetwarzanie klatek z Pi/70mai
│ │ ├── runCoreMLDetection # YOLO ML (via Vision wrapper)
│ │ ├── runDirectCoreMLDetection # CoreML Direct (manual preprocessing)
│ │ └── ocrCroppedRegions # Crop + OCR na wyciętych regionach
│ ├── SplashScreen # Loading screen z progress bar
│ ├── RootView # TabView z 5 zakładkami
│ ├── StatusTab # Kamera live + GateCard + metryki
│ ├── LogTab # Aktualna sesja + Historia + Debug ML
│ ├── PlatesTab # CRUD lista tablic
│ ├── SettingsTab # Konfiguracja + Debug nawigacja
│ ├── DebugTab # Diagnostyka, czasy bramy, ML logi, testy
│ └── MLLogView # Przeglądarka logów ML
│
├── dashboard.html # Panel webowy (HTML/CSS/JS)
├── trained_plates_detection.mlpackage # Model CoreML YOLO (detekcja tablic)
└── trained_plates_detection.pt # Model PyTorch (źródło)
MIT — szczegóły w pliku LICENSE.
Made with ❤️ for smart gate automation
GateVision przetwarza wszystko lokalnie na urządzeniu — żadne dane nie są wysyłane na zewnątrz.