Ordre 20260912T193441Z-7358817909. Steg 1 var ikke transformen, men å rette
roadmapens R13-gate og få den ratifisert. Gaten `grep -rl "Cosmo"
skills/*/references -> 0` var usann på to uavhengige måter:
1. Ordren fanget den første: 451 av forekomstene er Azure Cosmos DB, ekte
produktinnhold. Diskriminatoren er ikke bokstaven «s» — `Cosmos <norsk
substantiv>` er genitiv av personaen (`### Cosmos tonalitet`), mens
`Cosmos DB`/`CosmosClient`/`cosmos_ru` er produkt.
2. Denne økten fant den andre: 132 persona-forekomster ligger i prosa,
tabeller, dialog-replikker og proveniens-linjer. Heading-nøytralisering
kan ikke nå dem, så «0 persona» er uoppnåelig også under den ratifiserte
formen. Operatøren ratifiserte alternativ A: gaten speiler formen, og de
132 bokføres til R13b/R14.
Tre korreksjoner av premisser som sto i ordren og STATE:
«ca 320 produkt» -> 451 (case-sensitivt nett manglet 327 lowercase
TOC-ankre + 99 identifikatorer; sann nevner 1 638)
«169 headinger» -> 401. 169 var `^## For Cosmo`-prefikset (168) og var
internt inkonsistent med sin egen topp-variant (204)
«417 matcher ingen
populasjon» -> 417 er cosmo-headinger utenfor kodefences; briefens
nevner var reell hele tiden
Fence-bevissthet er målt skadelig, ikke nødvendig: begge toggle-regler er
gale på dette korpuset (naiv toggle skjuler en ekte heading i
chain-of-thought-prompting.md, CommonMark-regelen ubalanserer
service-level-documentation-dr.md). Fence-agnostisk deteksjon finner 401
heading-linjer i nøyaktig de samme 40 variantene som fence-bevisst finner
400 i — ingen kodeblokk-linje er byte-identisk til en persona-heading. Derfor
nøkles transformen på 40 enumererte heading-tekster og ignorerer fences. En
ukjent variant kaster; en slug-kollisjon kaster. Ingenting auto-fikses.
TOC-en regenereres ikke, den rettes kirurgisk: alle 327 persona-lenker hadde
lenketekst lik én av de 40 heading-tekstene og anker lik slugify av den
(327/327, 0 avvik), så heading og TOC-entry skrives i samme operasjon og
ingen mellomtilstand etterlater en død lenke.
Ratifisert målform: `For Cosmo`, `For Cosmo Skyberg` og `For arkitekten
(Cosmo)` konvergerer på `For arkitekten`. To filer kolliderte og er adjudisert
ved å lese dem, ikke ved regel.
Verifisering (alle 7 kriterier fra ordren):
G1 persona på heading-linjer 401 -> 0
G2 døde fragmentlenker 1 -> 1 (pre-eksisterende, unntatt)
G3 produkt-forekomster 451 -> 451; `Cosmos DB|Azure Cosmos` 308 = 308
de 3 kun-produkt-filene byte-identiske
nettet validert begge veier injisert persona feller G1; genitiv feller G1;
produkt-heading og de 3 filene passerer
hele diffen 802 heading-linjer + 654 TOC-linjer, ANNET = 0
linjeantall 728 lagt til = 728 slettet
suite 1120/1120 (1097 + 23 nye)
validate-plugin 250 PASS / 0 FAIL
stikkprøve 10 filer, alle 5 skills, inkl. de 3 mest
produkt-tunge (26/20/19) — kun heading+TOC
Utenfor scope, urørt: de 4 SKILL.md, de 23 commands, CLAUDE.md, README.md,
NOTICE.md, docs/ (alt R14).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
14 KiB
Video Analysis and Understanding Patterns
Last updated: 2026-02 Status: GA Category: Multi-Modal AI Type: reference
Innhold
- Introduksjon
- Kjernekomponentar
- Scene- og Action Detection
- Temporal Understanding og Summarization
- Multi-Frame Analysis Strategies
- Integrasjon med Narrative Understanding
- Norsk offentleg sektor
- Beslutningsrammeverk
- For arkitekten
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
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:
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:
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:
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
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:
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:
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:
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 arkitekten
- 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