bae705aa97
- Add NFC ePassport roadmap (ICAO 9303, eIDAS) - Add TensorFlow.js edge face detection (BlazeFace) - Add structured audit logger (GDPR-compliant) - Risk scoring support Part of KYC Apple Native UX v1.1.0
350 lines
12 KiB
Markdown
350 lines
12 KiB
Markdown
# QUIXZOOM Arkitektur — Komplett System
|
|
|
|
## Utvecklingsordning (Eriks prioritering)
|
|
|
|
```
|
|
1. Object Identity Engine (deduplicering och objektmatchning)
|
|
2. Persistenslager (PostgreSQL + PostGIS + Neo4j)
|
|
3. Observation Engine
|
|
4. Evidence Engine
|
|
5. Temporal Engine
|
|
6. Mission Generator
|
|
7. Adaptive AI
|
|
8. Developer Visualization
|
|
9. GraphQL API
|
|
```
|
|
|
|
---
|
|
|
|
## Komponenter
|
|
|
|
### 1. Object Identity Engine ✅
|
|
|
|
**Fil:** `identity-engine/identity.js`
|
|
|
|
**Funktion:** Avgör om två observationer avser samma fysiska objekt.
|
|
|
|
**Signaler:**
|
|
- GPS (med accuracy)
|
|
- Kameravinkel (kompass, pitch, roll)
|
|
- 3D-position
|
|
- Visuell signatur (perceptual hash)
|
|
- Storlek
|
|
- Närliggande objekt (spatial context)
|
|
- Historik
|
|
- Sannolikhetsmodell
|
|
|
|
**Exempel:**
|
|
```javascript
|
|
const result = await engine.matchObservation(observation);
|
|
// Result: MATCHED (confidence: 94.2%)
|
|
// Breakdown: { gps: 0.98, visual: 0.85, angle: 0.72, ... }
|
|
```
|
|
|
|
---
|
|
|
|
### 2. Persistenslager ✅
|
|
|
|
#### PostgreSQL + PostGIS
|
|
**Fil:** `persistence/postgres-schema.sql`
|
|
|
|
**Tabeller:**
|
|
- `zoomers` — Zoomer-profiler
|
|
- `areas` — Områden med spatiala bounds
|
|
- `observations` — Observationer med GPS
|
|
- `objects` — Urban objects
|
|
- `evidence` — Bevis
|
|
- `temporal_records` — Historik
|
|
- `missions` — Uppdrag
|
|
- `sensor_logs` — Sensor-data
|
|
- `events` — Event sourcing
|
|
|
|
**Spatiala index:**
|
|
```sql
|
|
CREATE INDEX idx_observations_location ON observations USING GIST(location);
|
|
CREATE INDEX idx_objects_location ON objects USING GIST(location);
|
|
```
|
|
|
|
#### Neo4j
|
|
**Fil:** `persistence/neo4j-schema.cypher`
|
|
|
|
**Noder:** Object, Observation, Evidence, Area, Zoomer, Mission
|
|
|
|
**Relationer:**
|
|
```cypher
|
|
(:Object)-[:OBSERVED_IN]->(:Observation)
|
|
(:Object)-[:SUPPORTED_BY]->(:Evidence)
|
|
(:Object)-[:NEAR {distance: 5}]->(:Object)
|
|
(:Object)-[:PART_OF]->(:Object)
|
|
(:Object)-[:REPLACED_BY]->(:Object)
|
|
```
|
|
|
|
#### Event Store
|
|
**Fil:** `persistence/event-store.js`
|
|
|
|
**Event-flöde:**
|
|
```
|
|
ObservationCreated
|
|
↓
|
|
ObservationValidated
|
|
↓
|
|
EvidenceAdded
|
|
↓
|
|
ObjectUpdated
|
|
↓
|
|
MissionGenerated
|
|
↓
|
|
LearningQueueUpdated
|
|
```
|
|
|
|
**Fördelar:**
|
|
- Hela stadens historik kan spelas upp igen
|
|
- Algoritmer kan förbättras retroaktivt
|
|
- Full audit trail
|
|
|
|
---
|
|
|
|
### 3. Observation Engine ✅
|
|
|
|
**Fil:** `urban-knowledge-graph/ukg.js`
|
|
|
|
**Tre lager:**
|
|
1. **Observation Layer** — Strukturerade observationer (inte bilder)
|
|
2. **Evidence Layer** — Ett objekt, hundra bevis
|
|
3. **Temporal Layer** — Förändring över tid
|
|
|
|
**Exempel:**
|
|
```javascript
|
|
const observation = {
|
|
id: 'obs_482917',
|
|
object: {
|
|
type: 'street_lamp',
|
|
attributes: {
|
|
material: 'steel',
|
|
height: 7.8,
|
|
paint: 'grey',
|
|
rust: true,
|
|
lean: 4,
|
|
light: 'broken'
|
|
}
|
|
},
|
|
location: { lat: 13.725, lng: 100.555 },
|
|
confidence: 0.94,
|
|
verified: false
|
|
};
|
|
```
|
|
|
|
---
|
|
|
|
### 4. Evidence Engine ✅
|
|
|
|
**Fil:** `urban-knowledge-graph/ukg.js`
|
|
|
|
**Samma gatlykta i hundra videor = ETT objekt:**
|
|
|
|
```
|
|
Street Lamp #1293
|
|
├── Video A, Frame 342 (Zoomer 001, reliability: 0.85)
|
|
├── Video B, Frame 91 (Zoomer 002, reliability: 0.80)
|
|
├── QUIXZOOM Capture (Zoomer 003, reliability: 0.90)
|
|
├── Inspector Capture (Municipality, reliability: 0.95)
|
|
└── Municipality Capture (Official, reliability: 0.98)
|
|
```
|
|
|
|
---
|
|
|
|
### 5. Temporal Engine ✅
|
|
|
|
**Fil:** `urban-knowledge-graph/ukg.js`
|
|
|
|
**Förändring över tid:**
|
|
|
|
| Datum | Händelse | Ändringar |
|
|
|-------|----------|-----------|
|
|
| 2026-06-01 | Initial observation | — |
|
|
| 2026-08-12 | Tilt detected | lean: 0° → 2° |
|
|
| 2026-09-20 | Corrosion increasing | rust: no → yes, light: working → flickering |
|
|
| 2026-10-11 | Light broken | light: flickering → broken |
|
|
| 2026-11-02 | Replaced | status: repaired |
|
|
|
|
---
|
|
|
|
### 6. Mission Generator ✅
|
|
|
|
**Fil:** `fleet-intelligence/coordinator.js`
|
|
|
|
**Uppdragstyper:**
|
|
- `verify` — Verifiera osäker observation
|
|
- `explore` — Utforska kunskapsgap
|
|
- `document` — Dokumentera specifikt objekt
|
|
- `diversify` — Filma vid annan tid/vinkel
|
|
|
|
**Exempel:**
|
|
```javascript
|
|
// Zoomer A dokumenterar Sukhumvit
|
|
// Zoomer B verifierar misstänkt skada
|
|
// Zoomer C filma nattetid
|
|
// Zoomer D annan kameravinkel
|
|
```
|
|
|
|
---
|
|
|
|
### 7. Adaptive AI ✅
|
|
|
|
**Fil:** `app/guided-capture.js`, `app/active-learning.js`
|
|
|
|
**Fyra nivåer:**
|
|
1. **Recording** — Basinsamling
|
|
2. **Guided** — AI ger instruktioner
|
|
3. **Mission** — Specifika uppgifter
|
|
4. **Adaptive** — AI planerar nästa observation
|
|
|
|
**Nivå 5 — Fleet Intelligence:**
|
|
- Optimerar hela flottan
|
|
- Tilldelar uppdrag baserat på position
|
|
- Balanserar täckning
|
|
|
|
---
|
|
|
|
### 8. Developer Visualization ✅
|
|
|
|
**Fil:** `visualization/dev-dashboard.html`
|
|
|
|
**Vy:**
|
|
- Alla observerade objekt
|
|
- Kunskapsgap
|
|
- Osäkra observationer
|
|
- Väntande verifieringar
|
|
- Aktiva Zoomers
|
|
- AI:s rekommenderade nästa uppdrag
|
|
|
|
---
|
|
|
|
### 9. GraphQL API (senare)
|
|
|
|
**Planerat:**
|
|
```graphql
|
|
type Object {
|
|
id: ID!
|
|
type: String!
|
|
location: GeoPoint!
|
|
attributes: JSON
|
|
observations: [Observation!]!
|
|
evidence: [Evidence!]!
|
|
temporal: [TemporalRecord!]!
|
|
relations: [Relation!]!
|
|
}
|
|
|
|
query {
|
|
objects(area: "bangkok", type: "street_lamp") {
|
|
id
|
|
location
|
|
confidence
|
|
verificationStatus
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Dataflöde
|
|
|
|
```
|
|
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
|
│ iOS App │────▶│ WebSocket │────▶│ Backend │
|
|
│ (Capture) │ │ Server │ │ (Node.js) │
|
|
└─────────────┘ └─────────────┘ └──────┬──────┘
|
|
│
|
|
┌──────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────┐
|
|
│ URBAN KNOWLEDGE GRAPH │
|
|
├─────────────────────────────────────────────────────────┤
|
|
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|
│ │ Observation │ │ Evidence │ │ Temporal │ │
|
|
│ │ Layer │ │ Layer │ │ Layer │ │
|
|
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
|
|
│ │ │ │ │
|
|
│ └────────────────┼────────────────┘ │
|
|
│ │ │
|
|
│ ┌─────┴─────┐ │
|
|
│ │ Object │ │
|
|
│ │ Entity │ │
|
|
│ └─────┬─────┘ │
|
|
│ │ │
|
|
│ ┌────────────────┼────────────────┐ │
|
|
│ ▼ ▼ ▼ │
|
|
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
|
|
│ │PostgreSQL│ │ Neo4j │ │ Event │ │
|
|
│ │+PostGIS │ │ (Graph) │ │ Store │ │
|
|
│ └─────────┘ └─────────┘ └─────────┘ │
|
|
└─────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────┐
|
|
│ AI & ANALYTICS │
|
|
├─────────────────────────────────────────────────────────┤
|
|
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|
│ │ Object │ │ Active │ │ Fleet │ │
|
|
│ │ Identity │ │ Learning │ │Coordinator │ │
|
|
│ │ Engine │ │ │ │ │ │
|
|
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
|
└─────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────┐
|
|
│ VISUALISERING │
|
|
├─────────────────────────────────────────────────────────┤
|
|
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|
│ │ Dev │ │ Admin │ │ GraphQL │ │
|
|
│ │ Dashboard │ │ Panel │ │ API │ │
|
|
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
|
└─────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## Filstruktur
|
|
|
|
```
|
|
quixzoom-capture-pipeline/
|
|
├── identity-engine/
|
|
│ └── identity.js # Object Identity Engine
|
|
├── persistence/
|
|
│ ├── event-store.js # Event Sourcing
|
|
│ ├── postgres-schema.sql # PostgreSQL + PostGIS
|
|
│ └── neo4j-schema.cypher # Neo4j Graph
|
|
├── urban-knowledge-graph/
|
|
│ ├── ukg.js # Urban Knowledge Graph
|
|
│ └── README-UKG.md
|
|
├── fleet-intelligence/
|
|
│ └── coordinator.js # Fleet Coordinator
|
|
├── value-score/
|
|
│ └── calculator.js # Data Value Score
|
|
├── app/
|
|
│ ├── guided-capture.js # 4-nivå insamling
|
|
│ └── active-learning.js # Information gain
|
|
├── websocket/
|
|
│ └── server.js # WebSocket Server
|
|
├── ios/
|
|
│ └── QuixZoomCapture/ # iOS App (Swift)
|
|
├── visualization/
|
|
│ └── dev-dashboard.html # Developer Dashboard
|
|
└── README-ARCHITECTURE.md # Denna fil
|
|
```
|
|
|
|
---
|
|
|
|
## Nästa steg
|
|
|
|
1. **Deploya PostgreSQL + PostGIS**
|
|
2. **Deploya Neo4j**
|
|
3. **Integrera Object Identity Engine med UKG**
|
|
4. **Bygg backend-API**
|
|
5. **Testa med riktig data från Bangkok**
|
|
|
|
---
|
|
|
|
*LandveX Inc. — Urban Knowledge Graph: Den verkliga hjärnan i QUIXZOOM.*
|