UTS CAPSTONE · PROJECT 08-01

Ask your camera archive a question. Get the moment, not the tape.

Query multi-camera CCTV footage in natural language. Language and vision-language models turn hours of recordings into searchable events, and every answer points to the exact moments behind it.

  • Plain-language questions, no query syntax
  • Answers that cite the moments they came from
  • Detected objects outlined on the footage
cctvai.site/results
The Results workspace for the question “What happened at the hospital on 5 March between 1pm and 2pm?”: an answer listing the vehicles and people seen between 13:00 and 14:00, each citing a numbered source, beside hospital footage from camera G341 with a white SUV outlined and the top five matching moments listed below.

THE PROBLEM

More footage than anyone can watch.

25,500+

cameras on public transport, in just three states.

NSW rail network
11,000+
Queensland Rail
9,000+
Public Transport Victoria
5,500

600,000 h

of footage recorded every day by those cameras alone (25,500 × 24 h)

1 TB

of video evidence reaches NSW Police every day

After the 2014 Martin Place siege in Sydney, investigators viewed more than 1,000 hours of CCTV by hand. In a later NSW case, reviewing 14,000 CCTV files took months.

Today, someone still has to watch it.

Footage is slow to search when an event spans several cameras or unfolds over time, and current vision-language models reason poorly across cameras. Most tools only filter by camera and time window, so unless someone already knows where and when to look, the footage goes unreviewed.

Sources: Morgan & Coughlan (2018), Australian Institute of Criminology; Microsoft Australia News Centre (2021); State Coroner of NSW (2015). Daily hours are our estimate, assuming continuous recording.

THE IDEA

Ask in plain English. Get the moment.

What happened at the hospital on 5 March between 1pm and 2pm?

  • What?

    See the event

  • When?

    Pinpoint the time

  • Who?

    Spot who is involved

HOW IT WORKS

From footage to answer, in five steps.

Models reason poorly about events across cameras, so Horus does not ask a model to watch the video at query time. It extracts structured events first, then searches them.

  1. 1

    Cameras record

    Hours of footage from many cameras and places.

    MEVA · 71 clips · 23 cameras · 4 sites

  2. 2

    AI watches

    It notes who is there, what they do, and when.

    Qwen3-VL · YOLO26 · ByteTrack

  3. 3

    Events are saved

    Every moment becomes a short, searchable record.

    1,955 events · Supabase · Qdrant

  4. 4

    You ask

    Type a question. Place, date and time are understood.

    FastAPI · filters + search

  5. 5

    You see the proof

    An answer that links to the exact second of video.

    Cited answer

CHECKEDSteps 2 and 4 are tested separately, so a wrong answer can be traced to the step that caused it.

Under the hood: one question, traced

Filters narrow the events to the right place and time; meaning then ranks what is left. Metadata alone cannot tell a white SUV from a red one.

  1. 1 · THE QUESTION

    “A white SUV at the school on the 7th March between 11am and 12pm”

  2. 2 · FILTERS

    location
    school
    date
    7 March 2018
    time
    11:00 – 12:00

    No model call: instant and repeatable.

  3. 3 · SEARCH

    1,955 events 5 returned

    scores 0.73 0.72 0.71 0.70 0.70

    All clear of the 0.6 cut-off.

  4. 4 · THE ANSWER

    “A white SUV is parked nose-in at the building entrance at 11:13 [1]. Earlier that hour cameras captured it driving through campus at 11:02 [2] and leaving a service bay at 11:08 [4]; these may show the same vehicle.”

It cites every event it used, and says the sightings may be one vehicle rather than asserting it.

THE PRODUCT

An AI answer is only useful if you can check it.

Ask the way you'd ask a colleague.

  • No query syntax: describe the event in plain words.
  • Place, date and time in the question become filters, like the hospital on 5 March between 1pm and 2pm. Detected terms can be retuned inline.
  • Recent and saved queries run again in one click.

QUESTIONS LIKE THESE

  • What happened at the hospital on 5 March between 1pm and 2pm?
  • Did someone carry a heavy object in this scene?
  • Did anyone open a car trunk in the school parking lot?
  • Was there a vehicle that turned right in the school parking lot?
  • Did anyone get out of a vehicle at the bus stop?
  • Was someone talking on the phone near the parked cars?
  • Did anyone leave a bag behind?
cctvai.site/dashboard
The search screen, titled “Ask your footage”: the question “What happened at the hospital on 5 March between 1pm and 2pm?” in the search field with the place and time underlined as detected terms, and the three most recent questions below.
cctvai.site/results
An answer about the hospital between 13:00 and 14:00 with timed, cited bullet points, next to footage from camera G341, with the chunk metadata panel open on the right showing the event, its confidence, camera, scene, time and description.

Every answer shows its sources.

  1. 1

    Answers in clear text

    A formatted answer in the chat, with times and bullet points.

  2. 2

    Every claim has a reference

    Each sentence cites the event it came from.

  3. 3

    One click to the exact second

    The video jumps to the moment, with tracked people and vehicles outlined.

  4. 4

    Suggests the next question

    Follow-up ideas keep the search going.

The AI does not have the last word. The video does.

KEY RESULTS

Filtering doubles accuracy, and every layer is scored on its own.

MEVA's audited annotations are the ground truth. The annotations and the search are scored independently, and the test set includes questions whose right answer is that nothing matches, checked against every caption, twice.

The right video comes first

19/22

with filters

9/22

without filters

Turning the place, date and time in a question into filters doubles how often the right video is the first result.

0.886 vs 0.432

Mean reciprocal rank: how close to the top the right video lands (1 = always first).

Retrieval, 22 test questionsThe same questions, with and without filters.
  • Correct video firsthigher is better

    With filters
    19/22
    Without
    9/22
  • Correct video in the top 5higher is better

    With filters
    20/22
    Without
    10/22
  • Returned nothinglower is better

    With filters
    2/22
    Without
    12/22

The annotations

1,955

structured events

1,387 tracked objects from 5.9 hours of footage

96.4%

of events consistent with MEVA ground truth

1,724 of 1,788; only 1% contradict it

80.5%

of MEVA activity types described

487 of 605

HONEST FINDING

The events describe where people and vehicles move very well, but name the exact MEVA action less often. Even people disagree: MEVA lists what happens in a clip without saying who does it.

20%

strict action match

32%

agreement between two human reviewers

CONCLUSIONS

It works, and we know what to fix next.

Hours of manual review become a question and a click, for police, transport operators and councils.

What we showed

  • Plain-English querying of multi-camera CCTV works end to end, and it is live.
  • Structured events first, search second: the right video comes first for 19 of 22 questions.
  • Every answer cites its source moment: one click to check it.
  • Open-weight models running on a laptop: no GPU cluster needed.

Next steps

  • Questions about order and sequences across cameras (“after the van arrived…”)
  • Scale from 71 clips to all 769 audited MEVA clips, then to larger datasets
  • New settings: streets, stations, shopping centres, night-time and indoor footage

See it on real multi-camera footage.

Horus is live. Open the query workspace and ask your first question.

Try it now
Horus: natural-language search for multi-camera CCTV footage