Ever wondered how many critical security events go unnoticed in hours of security footage? π₯π Imagine being able to instantly pinpoint the exact moments that matter, transforming endless video streams into actionable intelligence.
The Security Analysis Application processes security footage, dash camera videos, and CCTV recordings to identify crucial moments within seconds. Built with the Twelve Labs SDK, this powerful application automatically identifies and timestamps key security eventsβfrom unauthorized access attempts to suspicious behavior patterns. Security personnel can now skip hours of manual review and instead quickly search for specific incidents using simple prompts, receiving instant results with precise timestamps and confidence scores.
The system enhances detection by generating comprehensive, AI-driven reports for each identified event. Using the Pegasus 1.1 Engine (Generative Engine), it converts raw video data into detailed incident documentation with contextual analysis for actionable insights. This end-to-end solution streamlines security operations and ensures every critical security event is captured, serving both personal and professional security needs. Let's explore how this application works and how you can build similar solutions using the TwelveLabs Python SDK.
You can explore the demo of the application here: Security Analysis
If you want to access the code and experiment with the app directly, you can use this Replit Template.
β
Below is a demo of the Security Analysis Application, which indexes video footage of car accidents, fights, and paranormal activities. Try out the Security Analysis App.
When you search for "Car Accident on the highway," the API retrieves all relevant videos with confidence scores and timestamps. You can select "detailed analysis" to view an in-depth report generated from the video based on the system prompt. The report can be downloaded as a PDF, enhancing the security system's functionality.
In another demo example, searching for "Paranormal activity identified" retrieves footage of dark and unusual activities, showcasing the application's capabilities.
β
β
This section outlines the application flow for developing the Security Analysis Application powered by Twelve Labs Engine.The application requires indexing CCTV and dash cam video footage, which can be done in two ways. The preparation steps section provides instructions for creating the index through Twelve Labs Playground and uploading videos.
The second method uses cloud-to-cloud transfer through an AWS S3 bucket integrated with Twelve Labs for indexing and storing videos. This method is ideal for handling large amounts of video data. For detailed instructions, refer to the Cloud-to-Cloud Integration Guide.
The application architecture consists of three layers: Backend, Frontend, and Service Layer. When you query the Twelve Labs Search API, it returns relevant videos with their video_id
, score
, confidence
, timestamp (start, end, duration)
, and video_url
for rendering.
When you select a video from the search results, the Generate API activates the Pegasus 1.1 Engine (Generative Engine). Using an open-ended prompt, the system analyzes the video to identify and describe any incidents or unusual events. You can then generate and save the analysis as a PDF report.
β
.env
file with your API Key, along with the main file.API_KEY=your_api_key_here
INDEX_ID=your_index_id
With these steps completed, you're now ready to dive in and develop the application!
β
In this tutorial, we'll build a Flask application with a minimal frontend. Here's the directory structure:
.
βββ README.md
βββ .gitignore
βββ .env
βββ static/
β βββ css/
β βββ style.css
βββ templates/
β βββ index.html
βββ app.py
βββ report_generator.py
βββ requirements.txt
βββ uploads/
β
Now that you've completed the previous steps, it's time to build the Flask application.
You can find the required dependencies to prepare and create a virtual environment here: requirements.txt
Create a virtual Python environment, then set up the environment for the application using the following command:
pip install -r requirements.txt
β
This section focuses on the main application utility function, which contains the core logic and workflow. We'll break down the main application into two key sections:
β
The process begins with importing and initializing the Twelve Labs client to set up the video search API. Our security video analysis platform features robust error handling and efficient search capabilities, supported by a comprehensive error management system that ensures reliable operation and appropriate error reporting.
# To handle errors across routes
def handle_errors(f):
@wraps(f)
def decorated_function(*args, **kwargs):
try:
return f(*args, **kwargs)
except Exception as e:
# Log Error
app.logger.error(f"Error: {str(e)}")
return jsonify({
'error': 'An error occurred processing your request',
'details': str(e)
}), 500
return decorated_function
@app.route('/search', methods=['POST'])
@handle_errors
def search():
# Validate request contains JSON data
if not request.is_json:
return jsonify({'error': 'Request must be JSON'}), 400
data = request.get_json()
query = data.get('query')
if not query:
return jsonify({'error': 'Query parameter is required'}), 400
try:
# Search videos using Twelve Labs API
search_results = client.search.query(
index_id=INDEX_ID,
query_text=query,
options=["visual"]
)
formatted_results = []
# Process each video clip from search results
for clip in search_results.data:
try:
headers = {
"x-api-key": API_KEY,
"Content-Type": "application/json"
}
print(headers)
print(f"{BASE_URL}/indexes/{INDEX_ID}/videos/{clip.video_id}")
# To Fetch additional video details
url_response = requests.get(
f"{BASE_URL}/indexes/{INDEX_ID}/videos/{clip.video_id}",
headers=headers
)
# Extract video metadata
video_data = url_response.json()
video_url = video_data.get('hls', {}).get('video_url')
video_duration = video_data.get('metadata', {}).get('duration', 0)
formatted_results.append({
'video_id': clip.video_id,
'score': clip.score,
'confidence': 'High' if clip.score > 0.7 else 'Medium',
'start': clip.start,
'end': clip.end,
'duration': video_duration,
'video_url': video_url
})
except Exception as e:
app.logger.error(f"Error getting video URL: {str(e)}")
continue
return jsonify(formatted_results)
except Exception as e:
app.logger.error(f"Search Error: {str(e)}")
return jsonify({'error': 'Search failed', 'details': str(e)}), 500
# Defining the directory path for sample videos
SAMPLE_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'sample')
@app.route('/sample/<path:filename>')
def serve_sample_video(filename):
# Serve sample video files from the sample directory
try:
return send_from_directory(SAMPLE_DIR, filename)
except Exception as e:
app.logger.error(f"Error serving video: {str(e)}")
return f"Error: {str(e)}", 404
Each search request goes through multiple validation steps. First, the system checks the JSON structure and required parameters, providing clear feedback if any validation fails. After validation, the system uses Twelve Labs' search capabilities to find and carefully analyze relevant video clips.
The system processes results using a layered approach for enhanced reliability. For each video clip found, it retrieves additional metadata including URLs and durations, and implements confidence scoring to indicate result relevance. Using a threshold of 0.7, the confidence calculation offers a straightforward way to communicate result quality. If individual results fail to process, the system continues handling the remaining results rather than failing completely.
β
After retrieving videos from the index based on the provided query, the system generates a detailed analysis of the selected video. The process starts by fetching the video URL through an HTTP GET request to the Twelve Labs API using the specific video ID.
# To handle video analysis requests
@app.route('/analyze/<video_id>')
@handle_errors
def analyze(video_id):
try:
app.logger.info(f"Starting analysis for video: {video_id}")
try:
# 1. Get video URL
headers = {
"x-api-key": API_KEY,
"Content-Type": "application/json"
}
url_response = requests.get(
f"{BASE_URL}/indexes/{INDEX_ID}/videos/{video_id}",
headers=headers
)
url_data = url_response.json()
video_url = url_data.get('hls', {}).get('video_url')
# 2. Generate analysis
analysis_response = client.generate.text(
video_id=video_id,
prompt="Provide a detailed analysis of the key events, actions, and notable elements in this video."
)
# Extract and clean analysis text
analysis_text = str(analysis_response.data) if hasattr(analysis_response, 'data') else ''
analysis_text = analysis_text.strip().strip('"\'')
response_data = {
'video_url': video_url,
'analysis': analysis_text or "No analysis available."
}
app.logger.info("Analysis completed successfully")
return jsonify(response_data)
except Exception as e:
app.logger.error(f"Error in analysis: {str(e)}")
raise
except Exception as e:
app.logger.error(f"Analysis Error: {str(e)}")
return jsonify({
'error': 'Analysis failed',
'details': str(e)
}), 500
Once the streaming URL is obtained, the Twelve Labs client generates text analysis using an open-ended prompt designed for comprehensive video content analysis. The system then cleans and formats the analysis text by removing excess quotes and whitespace.
The final response combines the video URL and analysis text, includes fallback options for missing analyses, and handles logging.
β
This section explores the index.html file. The code orchestrates search functionality and real-time video analysis to create a seamless user experience. The application handles DOM interactions, state management, HLS video streaming, and comprehensive error handling. We'll break down the major functionality into these subsections:
β
Here we'll explore how we implement video analysis and handle errors and UI feedback in our application.
window.analyzeVideo = async function(videoId) {
const modalContent = document.getElementById('analysisContent');
const downloadButton = document.querySelector('.download-button');
const modal = document.getElementById('analysisModal');
// Show modal and display loading spinner
modal.classList.remove('hidden');
modalContent.innerHTML = `
<div class="spinner">
<div class="spinner-ring"></div>
<p>Analyzing video...</p>
</div>
`;
downloadButton.disabled = true;
try {
// Log analysis request and fetch results from server
console.log('Analyzing video:', videoId);
const response = await fetch(`/analyze/${videoId}`);
const data = await response.json();
console.log('Analysis response:', data);
if (!response.ok) {
console.error('Response not OK:', response.status, response.statusText);
throw new Error(data.error || 'Analysis failed');
}
// Validate analysis text exists
const analysisText = data.analysis;
if (!analysisText) {
console.error('No analysis text available');
throw new Error('No analysis data available');
}
// Clean up text by removing escape characters and quotes
let analysisText = data.analysis
.replace(/\\n/g, '\n')
.replace(/^"|"$/g, '')
.trim();
}
The analyzeVideo
function manages the video analysis process. It begins by getting references to the modal, content area, and download button. During analysis, the modal appears and the download button is disabled. The function makes a backend request using the videoId
and converts the response to JSON. Then it displays the analysis text after a final validation check.
The final step processes the text, converting raw analysis into well-structured HTML content. This includes converting newlines to line breaks, removing quotes, and trimming whitespace.
β
This section covers video streaming management using the HLS (HTTP Live Streaming) protocol.
if (data.video_url) { //Check if the video URL exists in response
const video = document.getElementById('analysis-video');
// Verify video element exists and browser supports HLS playback
if (video && Hls.isSupported()) {
// Initialize and configure HLS player instance
const hls = new Hls();
hls.loadSource(data.video_url);
hls.attachMedia(video);
// Error Handling for video playback
hls.on(Hls.Events.ERROR, function(event, data) {
console.error('Video playback error');
if (data.fatal) {
handleVideoError();
}
});
}
}
// Store current analysis text in state and enable download
state.currentAnalysis = analysisText;
downloadButton.disabled = false;
} catch (error) {
// Log and display of Error
console.error('Analysis error');
modalContent.innerHTML = `
<div class="error-message">
<i class="fas fa-exclamation-circle"></i>
<p>${error.message || 'Failed to analyze video. Please try again.'}</p>
<button class="retry-btn" onclick="analyzeVideo('${videoId}')">
<i class="fas fa-redo"></i> Try Again
</button>
</div>
`;
}
};
We start by verifying three key elements: the video URL exists, the video element is present in the DOM, and the browser supports HLS streaming. To set up the HLS player, we create a new instance, load the video source URL, and attach the player to the video element. Once setup is complete, we update the application state with the analysis text and enable downloads. We've added error monitoring to track HLS streaming issues in the console. When fatal errors occur, the handleVideoError
function takes over.
You can find the complete Script code in this index.html file.
β
Understanding AI-powered video security analysis opens up numerous possibilities across different sectors. Here are some compelling use cases that demonstrate the versatility and power of this technology with Twelve Labs:
π Private Security: Monitor security camera footage to detect trespassing and package theft.
π½οΈ Security Operators: Automate detection of unauthorized access, break-ins, and other security breaches.
π Security Analytics: Analyze historical CCTV footage to identify events and generate reports for improving incident response times.
π Automated Documentation and Report Generation: Create automated records and reports of security incidents.
βοΈ Legal Evidence Review: Help law enforcement review security footage by highlighting relevant segments for evidence in incidents or crimes.
π Traffic Security and Management: Monitor traffic footage to detect violations, accidents, and abnormal conditions. This helps cities and transportation agencies track patterns and enforce traffic laws.
β
This blog post explains how to develop and use the security application with Twelve Labs for both professional and personal security needs. Thank you for following this tutorial. We welcome your ideas on improving the user experience and solving various challenges.
β
Learn more about Pegasus 1.1 (Generator Engine), the engine used for generation tasks. To further explore Twelve Labs and enhance your understanding of video content analysis, check out these valuable resources:
We encourage you to leverage these resources to expand your knowledge and create innovative applications using Twelve Labs video understanding technology.
Introducing our new Embed API in Open Beta, enabling customers to generate state-of-the-art multimodal embeddings.
Learn how to build a semantic video search engine with the powerful integration of Twelve Labs' Embed API with ApertureDB for advanced semantic video search.
Twelve Labs has successfully completed its SOC 2 Type 2 audit, marking a significant milestone in our commitment to data security and privacy.
Whether you're looking to find the perfect berry-toned lipstick or just curious about spotting specific colors in your videos, this guide will help you leverage cutting-edge AI to do so effortlessly.