210 lines
6.6 KiB
Markdown
210 lines
6.6 KiB
Markdown
|
|
# quiXzoom Capture Flow — Arkitekturspec
|
||
|
|
*Beslutad: 2026-06-17. Ägare: Erik Svensson.*
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Grundprincip
|
||
|
|
|
||
|
|
Användaren ska aldrig behöva gissa vad som är fel.
|
||
|
|
|
||
|
|
**Gammalt flöde (oacceptabelt):**
|
||
|
|
Ta bild → Vänta → Få avslag → Gissa → Ta ny bild
|
||
|
|
|
||
|
|
**quiXzoom-flödet:**
|
||
|
|
Rikta kamera → Följ instruktioner → Grönt ljus → Bild tas → Godkänd direkt
|
||
|
|
|
||
|
|
**KPI:** >90% av alla bilder godkänns vid första exponeringen.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Flödets 7 steg
|
||
|
|
|
||
|
|
### Steg 1 — Uppdrag accepteras
|
||
|
|
|
||
|
|
Zoomer väljer uppdrag. Systemet laddar ett **Mission Context Package**:
|
||
|
|
|
||
|
|
```
|
||
|
|
{
|
||
|
|
mission_id, location, control_objects[], reference_images[],
|
||
|
|
capture_rules[], ai_knowledge_packs[], acceptance_criteria[]
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
Varje `control_object` är kopplat till ett AVO-kunskapspaket.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### Steg 2 — AI-styrt kameraläge (Live Guidance)
|
||
|
|
|
||
|
|
Istället för direkt kamera öppnas **Live Guidance Mode** — kontinuerlig analys av videoströmmen, ~10 fps.
|
||
|
|
|
||
|
|
**Realtidskontroller (alla måste vara ✅ för grönt läge):**
|
||
|
|
|
||
|
|
| Check | Fel-feedback |
|
||
|
|
|-------|-------------|
|
||
|
|
| Objekt hittat | "Rikta kameran mot [objekt]" |
|
||
|
|
| Rätt avstånd | "Flytta närmare" / "Backa 1 meter" |
|
||
|
|
| Rätt vinkel | "Vrid kameran åt höger" / "Höj kameran 15 cm" |
|
||
|
|
| Tillräckligt ljus | "För mörkt — sök bättre ljus" |
|
||
|
|
| Hela objektet synligt | "Objekt delvis utanför bild — backa lite" |
|
||
|
|
| Skärpa godkänd | "Håll kameran still" |
|
||
|
|
| Geo-match | "Du är inte vid rätt adress" |
|
||
|
|
|
||
|
|
**Teknisk implementation:**
|
||
|
|
- Klientsidig: TensorFlow Lite / CoreML på device (låg latens, offline-kapabel)
|
||
|
|
- Serversidig fallback för tyngre analyser (sprickor, OCR) vid bra uppkoppling
|
||
|
|
- Feedback-overlay i AR: grön ram = klar, röd + text = korrigering krävs
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### Steg 3 — Grönt läge (Capture Ready)
|
||
|
|
|
||
|
|
När alla kriterier är uppfyllda:
|
||
|
|
|
||
|
|
```
|
||
|
|
🟢 Objekt verifierat
|
||
|
|
🟢 Bildkvalitet godkänd
|
||
|
|
🟢 Redo att fotografera
|
||
|
|
```
|
||
|
|
|
||
|
|
Kameran kan antingen:
|
||
|
|
- **Autoshoot** — tar bilden automatiskt vid 3 sek stabil grön status
|
||
|
|
- **Manual unlock** — låser upp avtryckaren, Zoomer tar bilden
|
||
|
|
|
||
|
|
Default: autoshoot. Konfigurerbart per uppdragstyp.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### Steg 4 — Parallell AI-analys
|
||
|
|
|
||
|
|
Efter exponering körs AVO-analyser parallellt (target: <3 sek):
|
||
|
|
|
||
|
|
```
|
||
|
|
┌─────────────────────────────────────────────┐
|
||
|
|
│ Image received │
|
||
|
|
├──────────────┬──────────────┬───────────────┤
|
||
|
|
│ AVO instance │ AVO instance │ AVO instance │
|
||
|
|
│ control_obj_1│ control_obj_2│ quality_check │
|
||
|
|
└──────────────┴──────────────┴───────────────┘
|
||
|
|
↓ ↓ ↓
|
||
|
|
└──────────────┴──────────────┘
|
||
|
|
↓
|
||
|
|
Decision Engine
|
||
|
|
```
|
||
|
|
|
||
|
|
Varje AVO-instans kör mot sitt kunskapspaket och returnerar avvikelse-JSON.
|
||
|
|
Quality check är ett eget paket: blur, exposure, completeness.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### Steg 5 — Beslutsmotor
|
||
|
|
|
||
|
|
**GODKÄND:**
|
||
|
|
```
|
||
|
|
🟢 Uppdragets bildkrav uppfyllda
|
||
|
|
Bild accepterad. Fortsätt till nästa kontrollpunkt.
|
||
|
|
```
|
||
|
|
→ Bild sparas, geo-tagg + timestamp + device-ID loggas, betalningspipeline triggas.
|
||
|
|
|
||
|
|
**NEKAD** — AI måste alltid ge en konkret, handlingsbar anledning:
|
||
|
|
|
||
|
|
| Avvikelse | Feedback till Zoomer |
|
||
|
|
|-----------|---------------------|
|
||
|
|
| OCR-fel: skylt oläsbar | "Registreringsskylten är inte fullt läsbar." |
|
||
|
|
| Objekt delvis skymt | "Serienumret är skymt." |
|
||
|
|
| Completeness-fel | "Hela fasaden syns inte." |
|
||
|
|
| Blur | "Bilden är oskarp." |
|
||
|
|
| Object mismatch | "Objektet motsvarar inte uppdragets beskrivning." |
|
||
|
|
| Distance-fel | "Avståndet är för långt." |
|
||
|
|
|
||
|
|
**Aldrig:** "Fel uppstod." / "Bild ej godkänd." utan anledning.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### Steg 6 — Automatisk återgång
|
||
|
|
|
||
|
|
Vid nekad bild: systemet öppnar direkt kameran igen med *uppdaterad* guidance baserad på avvisningsanledningen.
|
||
|
|
|
||
|
|
```
|
||
|
|
Rikta kameran 30 cm lägre. ← Ny specifik instruktion
|
||
|
|
Ta med hela objektet.
|
||
|
|
```
|
||
|
|
|
||
|
|
Ingen manuell navigation. Ingen "försök igen"-knapp. Det bara händer.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### Steg 7 — Uppdrag slutfört
|
||
|
|
|
||
|
|
När alla obligatoriska kontrollobjekt är verifierade:
|
||
|
|
|
||
|
|
```
|
||
|
|
🟢 Uppdrag slutfört
|
||
|
|
🟢 12 av 12 kontrollpunkter verifierade
|
||
|
|
🟢 Kvalitetsnivå: 98%
|
||
|
|
```
|
||
|
|
|
||
|
|
Betalning triggas automatiskt via Stripe Connect.
|
||
|
|
Uppdragsgivaren får leverans i sin dashboard.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## AVO-integration (avvikelsemotorn)
|
||
|
|
|
||
|
|
Live Guidance (steg 2) och Post-capture (steg 4) delar samma kunskapspaket men körs i olika lägen:
|
||
|
|
|
||
|
|
| Läge | Trigger | Latenskrav | AVO-config |
|
||
|
|
|------|---------|------------|------------|
|
||
|
|
| **Live** | Videoframe ~10fps | <100ms | Lätt subset av checks — guidance only |
|
||
|
|
| **Capture** | Exponering | <3 sek | Fullständiga checks — beslutsgrundande |
|
||
|
|
|
||
|
|
Live-läget kör aldrig beslutsgrundande analys — det guidar bara.
|
||
|
|
Post-capture kör fullständig AVO och är det enda som räknas för godkännande.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Kunskapspaket per uppdragstyp (exempel)
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"object": "building_facade",
|
||
|
|
"checks": ["completeness", "ocr_address", "damage_detection", "lighting_check"],
|
||
|
|
"tolerances": { "min_coverage_pct": 85, "max_blur": 0.3 },
|
||
|
|
"known_faults": ["crack", "graffiti", "missing_element", "occlusion"],
|
||
|
|
"risk_rules": { "ocr_fail": "high", "crack": "medium", "graffiti": "low" },
|
||
|
|
"live_guidance": {
|
||
|
|
"distance_range_m": [3, 8],
|
||
|
|
"preferred_angle": "straight_on",
|
||
|
|
"required_elements": ["entrance", "full_height"]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Teknisk stack (förslag)
|
||
|
|
|
||
|
|
| Komponent | Teknologi |
|
||
|
|
|-----------|-----------|
|
||
|
|
| Live guidance (client) | TensorFlow Lite / CoreML |
|
||
|
|
| Post-capture AVO | Server-side (GPU), <3 sek SLA |
|
||
|
|
| Overlay UI | React Native + Reanimated |
|
||
|
|
| Geo-validering | Device GPS + ±15m tolerans |
|
||
|
|
| Bildlagring | S3 (quixzoom-media-prod) |
|
||
|
|
| Beslutspipeline | aamos-core → AVO → beslut → Stripe |
|
||
|
|
| Audit trail | Immutable log: image_hash + geo + timestamp + device_id |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Öppna frågor
|
||
|
|
|
||
|
|
1. **Autoshoot vs manual unlock** — default per uppdragstyp eller global setting?
|
||
|
|
2. **Offline-kapabilitet** — live guidance måste fungera utan nät. Post-capture kan queua.
|
||
|
|
3. **Manipulationsskydd** — hur hindrar vi att Zoomers skickar skärmdumpar av bilder? Device attestation (iOS/Android)?
|
||
|
|
4. **Max antal omtag per kontrollobjekt** — ska det finnas ett tak? (ex. 5 försök → eskalera till manuell granskning)
|
||
|
|
5. **Deltagarens integritet** — bilder kan innehålla personer. GDPR-krav på face blurring?
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
*Nästa steg: Bygga MVP-implementation av Live Guidance för iOS.*
|