Files
boc/quixzoom-capture-pipeline/urban-knowledge-graph/README-UKG.md
T
Bernt bae705aa97 ARCHITECTURE: NFC roadmap, edge AI, audit logging
- 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
2026-06-29 16:24:48 +00:00

8.5 KiB

QUIXZOOM Urban Knowledge Graph (UKG)

Den verkliga "hjärnan" i QUIXZOOM

"AI-modeller kan bytas ut och förbättras över tid, men en väldesignad kunskapsgraf med observationer, evidens och historik blir en långsiktig strategisk tillgång som är svår att återskapa."


Tre Lager

1. Observation Layer

Video
  ↓
Frame Extraction
  ↓
Observation Engine  ← AI detekterar objekt
  ↓
Knowledge Graph     ← Sparas som strukturerade observationer

Istället för att spara "bilder" sparar vi observationer:

{
  "id": "obs_1782638086138_ab6ndwzwo",
  "timestamp": "2026-06-28T08:15:30Z",
  "source": {
    "type": "quixzoom",
    "id": "zoomer_001"
  },
  "media": {
    "type": "video",
    "url": "https://r2.landvex.com/videos/bangkok_001.mp4",
    "frameNumber": 342
  },
  "observedObjects": [{
    "objectId": "street_lamp_3e6a09cfabc7",
    "confidence": 0.94,
    "bbox": [100, 200, 150, 300]
  }],
  "location": { "lat": 13.725, "lng": 100.555 },
  "quality": { "resolution": 1080, "sharpness": 0.9 }
}

2. Evidence Layer

Samma gatlykta i hundra videor = ett objekt med hundra bevis:

Street Lamp #1293
  ├── Evidence
  │     ├── Video A, Frame 342 (Zoomer 001)
  │     ├── Video B, Frame 91 (Zoomer 002)
  │     ├── QUIXZOOM Capture (Zoomer 003)
  │     ├── Inspector Capture (Municipality)
  │     └── Municipality Capture (Official)
  └── Confidence: 0.98 (från multipla källor)

Skalbart och verifierbart över tid.

3. Temporal Layer

Förändring över tid — det är här Landvex-värdet ligger:

Street Lamp #1293

2026-06-01  OK
2026-08-12  Lutning upptäckt (0° → 2°)
2026-09-20  Korrosion ökar, ljus flimrar
2026-10-11  Belysning trasig
2026-11-02  UTBYTT

Användning:

  • Modellera förändringstakt
  • Förutsäga underhållsbehov
  • Upptäcka avvikelser
  • Planera inspektioner

Arkitektur

┌─────────────────────────────────────────────────────────────┐
│                  URBAN KNOWLEDGE GRAPH                       │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │ Observation │  │  Evidence   │  │  Temporal   │         │
│  │   Layer     │  │   Layer     │  │   Layer     │         │
│  └──────┬──────┘  └──────┬──────┘  └──────┬──────┘         │
│         │                │                │                 │
│         └────────────────┼────────────────┘                 │
│                          │                                  │
│                    ┌─────┴─────┐                            │
│                    │  Object   │                            │
│                    │  Entity   │                            │
│                    └─────┬─────┘                            │
│                          │                                  │
│         ┌────────────────┼────────────────┐                 │
│         ▼                ▼                ▼                 │
│    ┌─────────┐     ┌─────────┐     ┌─────────┐            │
│    │ Spatial │     │  Type   │     │ Relation│            │
│    │  Index  │     │  Index  │     │  Graph  │            │
│    └─────────┘     └─────────┘     └─────────┘            │
│                                                              │
└─────────────────────────────────────────────────────────────┘

Objekt-struktur

{
  "id": "street_lamp_3e6a09cfabc7",
  "type": "street_lamp",
  "subtype": "led",
  
  "location": {
    "lat": 13.725,
    "lng": 100.555,
    "accuracy": 2,
    "altitude": 15
  },
  
  "attributes": {
    "material": "steel",
    "height": 7.8,
    "paint": "grey",
    "rust": false,
    "lean": 0,
    "light": "working"
  },
  
  "status": "active",
  "verificationStatus": "verified",
  "confidence": 0.94,
  "uncertainty": 0.06,
  
  "observationIds": ["obs_xxx", "obs_yyy"],
  "evidenceIds": ["ev_xxx", "ev_yyy", "ev_zzz"],
  "temporalIds": ["tmp_xxx", "tmp_yyy"],
  "relationIds": ["rel_xxx"]
}

Integration

iOS-appen skriver observationer

// Zoomer dokumenterar gatlykta
let observation = Observation(
    source: .quixzoom(zoomerId: "zoomer_001"),
    media: .video(url: videoURL, frame: 342),
    observedObjects: [
        ObservedObject(
            type: .streetLamp,
            confidence: 0.94,
            attributes: [
                .material: "steel",
                .height: 7.8,
                .light: .working
            ]
        )
    ],
    location: gpsLocation
)

// Skicka till UKG
ukg.addObservation(observation)

WebSocket-servern skickar uppdateringar

// Server skickar instruktion baserat på UKG
const gaps = ukg.identifyKnowledgeGaps(areaId);
const topGap = gaps[0];

ws.send({
  type: 'instruction',
  text: `Dokumentera ${topGap.description}`,
  reason: `Knowledge gap: ${topGap.type}`
});

Active Learning frågar grafen

// Vilka kunskapsgap finns?
const gaps = ukg.identifyKnowledgeGaps('bangkok');

// Vilka objekt behöver verifiering?
const needsVerification = ukg.findObjectsByVerificationStatus('unverified');

// Vilka områden saknar data?
const uncovered = ukg.findUncoveredAreas('bangkok');

Mission Mode genereras från UKG

// Skapa uppdrag baserat på grafens behov
const mission = {
  type: 'verify',
  targetObject: ukg.findObjectWithLowConfidence(),
  reason: 'Object confidence below threshold'
};

Adaptive Intelligence planerar från UKG

// Vad vet vi redan?
const knowledge = ukg.getAreaKnowledge('bangkok');

// Vad saknas?
const gaps = ukg.identifyKnowledgeGaps('bangkok');

// Planera nästa observation
const nextObservation = planner.planNext(knowledge, gaps);

API

Skapa objekt

const lamp = ukg.createObject({
  type: 'street_lamp',
  location: { lat: 13.725, lng: 100.555 },
  attributes: { material: 'steel', height: 7.8 }
});

Lägg till observation

ukg.addObservation({
  sourceType: 'quixzoom',
  sourceId: 'zoomer_001',
  mediaType: 'video',
  mediaUrl: 'https://r2.landvex.com/videos/xxx.mp4',
  frameNumber: 342,
  observedObjects: [{ objectId: lamp.id, confidence: 0.94 }],
  location: { lat: 13.725, lng: 100.555 }
});

Lägg till evidens

ukg.addEvidence({
  objectId: lamp.id,
  proofType: 'video',
  proofUrl: 'https://r2.landvex.com/videos/xxx.mp4#frame=342',
  sourceType: 'quixzoom',
  reliability: 0.85
});

Hämta temporal historik

const history = ukg.getTemporalHistory(lamp.id);
// Returns: [{ timestamp, state: { attributes }, changes, reason }]

Sök närliggande objekt

const nearby = ukg.findNearbyObjects(
  { lat: 13.725, lng: 100.555 },
  50 // radius in meters
);

Hitta objekt efter typ

const lamps = ukg.findObjectsByType('street_lamp', bangkokArea);

Merge objekt (hundra videor → ett objekt)

ukg.mergeObjects(mainLampId, [duplicateLampId1, duplicateLampId2]);

Filstruktur

urban-knowledge-graph/
├── ukg.js              # Huvudklass
└── README-UKG.md       # Denna fil

Nästa steg

  1. Persistens: Spara till PostgreSQL/Neo4j
  2. Realtid: WebSocket-uppdateringar
  3. Query API: GraphQL för komplexa frågor
  4. Visualisering: Karta med objekt
  5. Export: SIE4, GeoJSON, CityGML

LandveX Inc. — Urban Knowledge Graph: Den verkliga hjärnan i QUIXZOOM.