feat(ultraplan-local): v1.6.0 — /ultraresearch-local deep research command
Add /ultraresearch-local for structured research combining local codebase analysis with external knowledge via parallel agent swarms. Produces research briefs with triangulation, confidence ratings, and source quality assessment. New command: /ultraresearch-local with modes --quick, --local, --external, --fg. New agents: research-orchestrator (opus), docs-researcher, community-researcher, security-researcher, contrarian-researcher, gemini-bridge (all sonnet). New template: research-brief-template.md. Integration: --research flag in /ultraplan-local accepts pre-built research briefs (up to 3), enriches the interview and exploration phases. Planning orchestrator cross-references brief findings during synthesis. Design principle: Context Engineering — right information to right agent at right time. Research briefs are structured artifacts in the pipeline: ultraresearch → brief → ultraplan --research → plan → ultraexecute. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
commit
baa2d0220b
488 changed files with 213221 additions and 0 deletions
|
|
@ -0,0 +1,378 @@
|
|||
# Video Analysis and Understanding Patterns
|
||||
|
||||
**Last updated:** 2026-02
|
||||
**Status:** GA
|
||||
**Category:** Multi-Modal AI
|
||||
|
||||
---
|
||||
|
||||
## 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 Statens vegvesen, 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
|
||||
|
||||
- **Statens vegvesen**: 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue