ms-ai-architect/skills/ms-ai-engineering/references/multi-modal/video-analysis-patterns.md
Kjell Tore Guttormsen ddce43d8b2 feat(ms-ai-architect): Spor 1 — Port-1-substrat migrert på 4 ikke-advisor-skills (243 Source + 327 Type + 325 TOC + stale-verified poison fjernet) [skip-docs]
Steg 9 (R4): unified migrate-corpus.mjs --write over engineering/governance/
infrastructure/security. 327 filer mutert, verified=null, prosa byte-identisk
(fra første ## seksjon), advisor urørt (0 endringer).

To applier-fixes oppdaget under kjøring (TDD, RED→GREEN):
- insertHeaderFields: anker faller nå tilbake når en meta-linje selv passerer
  500B (2 filer pakket et avsnitt i **Status:** → Type/Source landet utenfor
  scan-vinduet, applierens post-write-assertion fanget + restaurerte).
- normalizeStaleVerified: fjerner nå ALLE stale non-date **Verified:** i
  500B-vinduet, inkl. stray body-dup rett under --- (9 mlops-genaiops-filer var
  ellers falskt "verified"/fresh, droppet fra worklist). Operatør-godkjent
  utvidelse av carve-out; kun stray metadata-linjer, aldri prosa.

test-transform-criterion: precondition oppdatert til post-migrasjons-sannhet
(fila bærer nå Source). Suite 728/728 grønn.
2026-07-04 10:19:11 +02:00

391 lines
14 KiB
Markdown

# Video Analysis and Understanding Patterns
**Last updated:** 2026-02
**Status:** GA
**Category:** Multi-Modal AI
**Type:** reference
---
## Innhold
- [Introduksjon](#introduksjon)
- [Kjernekomponentar](#kjernekomponentar)
- [Scene- og Action Detection](#scene--og-action-detection)
- [Temporal Understanding og Summarization](#temporal-understanding-og-summarization)
- [Multi-Frame Analysis Strategies](#multi-frame-analysis-strategies)
- [Integrasjon med Narrative Understanding](#integrasjon-med-narrative-understanding)
- [Norsk offentleg sektor](#norsk-offentleg-sektor)
- [Beslutningsrammeverk](#beslutningsrammeverk)
- [For Cosmo](#for-cosmo)
## Introduksjon
Videoanalyse og -forståing på Azure-plattforma kombinerer Azure AI Video Indexer sin spesialiserte videoanalyse med generative AI-modellar som GPT-4o for djupare semantisk forståing. Video Indexer ekstraherer over 30 ulike typar innsikt frå video — inkludert scenedeteksjon, talegjenkjenning, emosjonanalyse, OCR, ansiktsgjenkjenning og objektdeteksjon — medan GPT-4o sine visuelle kapabilitetar opnar for fri-form analyse av enkeltbilete og keyframes.
For norsk offentleg sektor er videoanalyse relevant for fleire bruksområde: analyse av overvakingsvideo for Direktoratet for digital tjenesteutvikling, transkripsjon og søk i offentlege høyringar for Stortinget, tilgjengelegheitsanalyse av offentleg video, og automatisert kvalitetskontroll av opplæringsvideo. Azure Video Indexer støttar norsk tale-til-tekst og kan oversette til 50+ språk.
Azure AI Video Indexer tilbyr også real-time videoanalyse (preview) via Azure Arc-enabled infrastruktur, som mogleggjer sanntidsanalyse av livevideo ved kanten — relevant for trafikkmonitorering og smart byinfrastruktur.
---
## Kjernekomponentar
| Komponent | Formål | Teknologi |
|-----------|--------|-----------|
| **Video Indexer** | Heilskapleg videoanalyse med 30+ innsiktstypar | Azure AI Video Indexer |
| **Scene Detection** | Identifiserer sceneovergangar basert på visuelle signal | Video Indexer AI |
| **Shot Detection** | Identifiserer kameraskift og redigeringsovergangar | Video Indexer AI |
| **Keyframe Extraction** | Vel representative bilete frå kvar shot | Video Indexer AI |
| **GPT-4o Vision** | Fri-form analyse av enkeltbilete frå video | Azure OpenAI |
| **Real-time Analysis** | Sanntids videoanalyse ved kanten | Video Indexer on Arc |
| **Spatial Analysis** | Persondeteksjon og bevegelsesanalyse | Azure AI Vision |
---
## Scene- og Action Detection
### Video Indexer Scene Detection
Scene detection identifiserer når ein scene endrar seg basert på visuelle signal. Ein scene representerer ei enkelt hending og består av ein serie relaterte shots.
| Innsiktstype | Beskriving |
|--------------|-----------|
| **Scenes** | Semantisk relaterte sekvenser av shots |
| **Shots** | Samanhengande biletesekvens frå same kamera |
| **Keyframes** | Mest representative bilde frå kvar shot |
| **Editorial Shot Type** | Wide, medium, close-up, extreme close-up, two-shot |
| **Observed People** | Persondeteksjon med bounding boxes |
| **Matched Person** | Kopling mellom observerte personar og ansikt |
| **Detected Clothing** | Klestype-identifisering knytt til personar |
### Indeksering med avanserte innstillingar
```python
import requests
def index_video_advanced(account_id, access_token, video_url, video_name):
"""Indekser video med full suite av innsikter."""
base_url = "https://api.videoindexer.ai"
response = requests.post(
f"{base_url}/{account_id}/Videos",
params={
"accessToken": access_token,
"name": video_name,
"videoUrl": video_url,
"language": "nb-NO",
"indexingPreset": "AdvancedVideo",
"streamingPreset": "Default",
"sendSuccessEmail": True,
"priority": "Normal"
}
)
video_id = response.json()["id"]
return video_id
```
### Indexing Presets
| Preset | Innsikter | Bruksscenario |
|--------|-----------|---------------|
| **Basic** | Transkripsjon, OCR, scener, keyframes | Enkel søkbarheit |
| **Standard** | Basic + emosjonar, nøkkelord, personar, sentiment | Innhaldsanalyse |
| **Advanced** | Standard + kledningsdeteksjon, audioeffektar, matched person | Full analyse |
| **Audio only** | Transkripsjon, sentimentanalyse, nøkkelord | Podcast/lydinnhald |
---
## Temporal Understanding og Summarization
### Tidslinje-basert forståing
Video Indexer gir tidsstempla innsikter som muliggjer temporal forståing:
```python
def get_video_timeline(account_id, video_id, access_token):
"""Hent tidslinje-baserte innsikter frå video."""
base_url = "https://api.videoindexer.ai"
response = requests.get(
f"{base_url}/{account_id}/Videos/{video_id}/Index",
params={
"accessToken": access_token,
"includeSummarizedInsights": True
}
)
insights = response.json()
# Scenetidslinje
scenes = insights["videos"][0]["insights"]["scenes"]
for scene in scenes:
print(f"Scene {scene['id']}: "
f"{format_time(scene['instances'][0]['start'])} - "
f"{format_time(scene['instances'][0]['end'])}")
# Shots i denne scena
for shot in scene.get("shots", []):
for keyframe in shot.get("keyFrames", []):
print(f" Keyframe: {format_time(keyframe['instances'][0]['start'])}")
# Emosjonell tidslinje
sentiments = insights["videos"][0]["insights"]["sentiments"]
for sentiment in sentiments:
print(f"Sentiment: {sentiment['sentimentType']} "
f"(score: {sentiment['averageScore']:.2f})")
for instance in sentiment["instances"]:
print(f" {format_time(instance['start'])} - "
f"{format_time(instance['end'])}")
return insights
```
### AI-driven Video Summarization
Video Indexer tilbyr oppsummeringsfunksjonalitet for opptil 6-timars segment:
```python
def summarize_video_segment(account_id, video_id, access_token,
focus_on="", camera_description=""):
"""Generer AI-oppsummering av eit videosegment."""
summary_config = {
"focus_on": focus_on, # Kva type hendingar å fokusere på
"camera_description": camera_description # Kamerakontekst
}
# Oppsummeringa består av:
# 1. Overordna oversikt — generell beskriving av aktivitetar
# 2. Highlights — spesifikke hendingar med tidsstempel
return summary_config
```
### GPT-4o Keyframe Analysis
For djupare semantisk forståing, analyser keyframes med GPT-4o:
```python
from openai import AzureOpenAI
def analyze_keyframes_with_gpt4o(keyframe_urls, video_context):
"""Analyser keyframes frå video med GPT-4o for narrativ forståing."""
client = AzureOpenAI(
azure_endpoint="https://<resource>.openai.azure.com/",
api_key="<api-key>",
api_version="2024-08-01-preview"
)
# Bygg bildeinnhald frå keyframes
image_content = []
for i, url in enumerate(keyframe_urls):
image_content.append({
"type": "text",
"text": f"Keyframe {i+1}:"
})
image_content.append({
"type": "image_url",
"image_url": {"url": url, "detail": "high"}
})
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "system",
"content": (
"Du analyserer keyframes frå ein video. "
"Beskriv handlinga over tid, identifiser personar, "
"stad og kontekst. Gje ein temporal forståing av "
"kva som skjer i videoen basert på desse bileta."
)
},
{
"role": "user",
"content": [
{"type": "text", "text": f"Kontekst: {video_context}"},
*image_content,
{"type": "text", "text": "Analyser handlinga i videoen basert på keyframes."}
]
}
],
max_tokens=1000
)
return response.choices[0].message.content
```
---
## Multi-Frame Analysis Strategies
### Strategi 1: Uniform Sampling
```python
def uniform_sample_frames(total_frames, num_samples=10):
"""Vel jamlikt fordelte frames for analyse."""
interval = total_frames // num_samples
return [i * interval for i in range(num_samples)]
```
### Strategi 2: Keyframe-basert Sampling
Bruk Video Indexer sine keyframes som er algoritmisk valde for å representere kvar shot:
```python
def get_keyframes_for_analysis(video_insights):
"""Hent keyframes valde av Video Indexer."""
keyframes = []
for scene in video_insights["scenes"]:
for shot in scene.get("shots", []):
for kf in shot.get("keyFrames", []):
keyframes.append({
"timestamp": kf["instances"][0]["start"],
"thumbnail_id": kf["instances"][0]["thumbnailId"],
"scene_id": scene["id"],
"shot_id": shot["id"]
})
return keyframes
```
### Strategi 3: Change-Detection Sampling
Fokuser på frames der visuell endring er størst:
```python
def change_detection_sampling(frames, threshold=0.3):
"""Vel frames basert på visuell endring."""
selected = [frames[0]]
for i in range(1, len(frames)):
similarity = compute_visual_similarity(frames[i-1], frames[i])
if similarity < (1 - threshold):
selected.append(frames[i])
return selected
```
### Strategi 4: Event-driven Sampling
Bruk Video Indexer-innsikter til å fokusere på interessante hendingar:
```python
def event_driven_sampling(video_insights, event_types=None):
"""Vel frames rundt spesifikke hendingstypar."""
event_types = event_types or ["people", "emotions", "labels"]
event_frames = []
for event_type in event_types:
events = video_insights.get(event_type, [])
for event in events:
for instance in event.get("instances", []):
event_frames.append({
"timestamp": instance["start"],
"event_type": event_type,
"confidence": instance.get("confidence", 0)
})
# Sorter etter confidence og dedupliser
event_frames.sort(key=lambda x: x["confidence"], reverse=True)
return deduplicate_by_proximity(event_frames, min_gap_seconds=2)
```
---
## Integrasjon med Narrative Understanding
### Heilskapleg videoforståingspipeline
```
Video Input
|
├── Video Indexer
| ├── Transkripsjon (tale → tekst)
| ├── Scene/Shot/Keyframe-deteksjon
| ├── Persondeteksjon og -gjenkjenning
| ├── OCR (tekst i video)
| ├── Emosjonanalyse
| └── Nøkkelord og emneanalyse
|
├── GPT-4o Keyframe Analysis
| ├── Scene-beskriving
| ├── Handling-identifisering
| └── Kontekstuell tolking
|
└── Narrative Synthesis
├── Kronologisk samandrag
├── Hovudtema identifisering
├── Nøkkelhendingar med tidsstempel
└── Sentiment-boge over tid
```
### Audio Insights
Video Indexer ekstraherer rike audio-innsikter:
| Innsikt | Beskriving |
|---------|-----------|
| **Audio Effects** | Latter, folkemengd-reaksjonar, alarmar, sirener |
| **Keywords** | Viktige nøkkelord frå transkripsjon |
| **Named Entities** | Stadnamn, personnamn, merkevarar |
| **Emotions** | Sinne, frykt, glede, tristheit per tekstsegment |
| **Topics** | Emne-inferering frå transkripsjon og OCR |
| **Speakers** | Talar-identifisering og -diarisering |
---
## Norsk offentleg sektor
### Bruksscenario
- **Direktoratet for digital tjenesteutvikling**: Trafikkvideoanalyse for hendingsdeteksjon og trafikkflyt
- **Stortinget**: Søkbar indeksering av høyringar og debattar
- **NRK**: Automatisk underteksting og innhaldsklassifisering
- **Kommunar**: Analyse av bystyremøte med talar-identifisering
### Personvern og etikk
| Aspekt | Tiltak |
|--------|--------|
| **Ansiktsgjenkjenning** | Krev samtykke eller lovheimel i Noreg |
| **Overvaking** | Regulert av personopplysningslova og arbeidsmiljølova |
| **Lagring** | Video-innsikter lagra i EU med GDPR-etterleving |
| **Transparens** | Informer om automatisert videoanalyse |
| **Dataminimering** | Bruk berre nødvendige innsiktstypar |
### Real-time analyse ved kanten
For bruksscenario som krev sanntidsanalyse utan skyavhengigheit:
- **Azure AI Video Indexer on Arc** — Deploy på Azure Local eller Kubernetes
- **Custom OV Insights** — Eigendefinerte objektdeteksjonar utan koding
- **Persondeteksjon** — Bounding boxes utan ansiktsidentifisering
- **Oppsummering** — Automatisk oppsummering av 6-timars segment
---
## Beslutningsrammeverk
| Scenario | Anbefaling | Begrunnelse |
|----------|------------|-------------|
| Søkbar videoarkivering | Video Indexer Standard preset | Transkripsjon + nøkkelord + scener |
| Detaljert innhaldsanalyse | Video Indexer Advanced + GPT-4o | Full analyse + semantisk forståing |
| Sanntids trafikkmonitorering | Video Indexer on Arc | Edge-basert, låg latency |
| Videotilgjengelegheit | Video Indexer + Azure Speech TTS | Undertekstar + lydbeskrivingar |
| Enkel persondeteksjon | Azure AI Vision Spatial Analysis | Lågare kostnad for basisk analyse |
| Narrativ videoforståing | Keyframe sampling + GPT-4o | Temporal kontekst + semantikk |
---
## For Cosmo
- **Azure AI Video Indexer** gir 30+ innsiktstypar i ein enkelt API — bruk Standard preset for dei fleste bruksscenario, Advanced for full analyse med kledningsdeteksjon og audioeffektar
- **Scene → Shot → Keyframe-hierarkiet** er fundamentalt for temporal forståing — scener er semantiske einingar, shots er kamera-einingar, keyframes er representative stillbilete
- **GPT-4o keyframe analysis** utfyller Video Indexer for djupare semantisk forståing — send 5-10 keyframes med kontekst for narrativ analyse av videoinnhald
- **Real-time Video Indexer on Arc** (preview) mogleggjer edge-basert sanntidsanalyse — relevant for trafikkmonitorering og smart byinfrastruktur i norsk offentleg sektor
- **Audio insights** (emosjonar, nøkkelord, talarar) kombinert med visuelle innsikter gir heilskapleg videoforståing — bruk dette for søkbar arkivering av offentlege høyringar og møte