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.
391 lines
14 KiB
Markdown
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
|