チュートリアル

Twelve Labs を使用したセキュリティ分析アプリケーションの構築

リシケシュ・ヤダフ

このチュートリアルでは、防犯分析アプリケーションの構築手順を解説します。このアプリケーションは、Twelve LabsのSearch APIを使用して監視カメラやドライブレコーダーの映像から自然言語クエリで特定のセキュリティインシデントを検索し、Pegasus 1.1エンジンを使用してタイムスタンプと信頼度スコアを含む詳細なインシデントレポートを生成します。

このチュートリアルでは、防犯分析アプリケーションの構築手順を解説します。このアプリケーションは、Twelve LabsのSearch APIを使用して監視カメラやドライブレコーダーの映像から自然言語クエリで特定のセキュリティインシデントを検索し、Pegasus 1.1エンジンを使用してタイムスタンプと信頼度スコアを含む詳細なインシデントレポートを生成します。

この記事の内容

No headings found on page

ニュースレターに登録する

ニュースレターに登録する

ビデオ理解に関する最新の技術進歩、チュートリアル、業界の動向をお届けします

ビデオ理解に関する最新の技術進歩、チュートリアル、業界の動向をお届けします

AIを活用してビデオを検索、分析、探索します。

2025/01/08

12分

記事へのリンクをコピー

はじめに

数時間にも及ぶ防犯カメラの映像の中で、どれほどの重要なセキュリティイベントが見過ごされているか考えたことはありますか? 🎥🔍 果てしなく続くビデオストリームから瞬時に重要な瞬間を正確に特定し、実用的なインテリジェンスに変換できるところを想像してみてください。

Security Analysis Application(セキュリティ分析アプリケーション)は、防犯カメラ、ドライブレコーダー、CCTV(監視カメラ)の録画映像を処理し、極めて重要な瞬間を数秒以内に特定します。Twelve Labs SDKで構築されたこの強力なアプリケーションは、不正アクセスの試みから不審な行動パターンに至るまで、主要なセキュリティイベントを自動的に特定してタイムスタンプを記録します。セキュリティ担当者は、何時間も手作業で確認する手間を省き、シンプルなプロンプトを使って特定のインシデントを迅速に検索し、正確なタイムスタンプと信頼度スコアを伴う結果を即座に受け取ることができます。

本システムは、特定されたイベントごとにAI駆動の包括的なレポートを生成することで、検知能力を高めます。Pegasus 1.1 Engine(生成エンジン)を使用し、未加工のビデオデータを文脈分析を伴う詳細なインシデント文書に変換し、実用的な洞察を提供します。このエンドツーエンドのソリューションは、セキュリティ業務を合理化し、あらゆる重要なセキュリティイベントを確実に捉えることで、個人および業務上の両方のセキュリティニーズに対応します。このアプリケーションがどのように動作するのか、そしてTwelveLabs Python SDKを使用して同様のソリューションをどのように構築できるかを探っていきましょう。

アプリケーションのデモは、こちらから体験できます:セキュリティ分析

コードにアクセスして直接アプリを試してみたい場合は、こちらのReplitテンプレートをご利用いただけます。

デモアプリケーション

以下は、自動車事故、喧嘩、超常現象のビデオ映像をインデックス化するSecurity Analysis Applicationのデモです。セキュリティ分析アプリをお試しください。

__wf_reserved_inherit

ハイウェイでの自動車事故(Car Accident on the highway)」と検索すると、APIは信頼度スコアとタイムスタンプが付いた関連ビデオをすべて取得します。「詳細分析(detailed analysis)」を選択すると、システムプロンプトに基づいてビデオから生成された詳細なレポートを表示できます。レポートはPDFとしてダウンロードすることができ、セキュリティシステムの利便性を高めます。

別のデモ例では、「超常現象の特定(Paranormal activity identified)」と検索すると、暗い場所での特異な活動の映像が取得され、アプリケーションの実力を示します。

__wf_reserved_inherit

前提条件

  • Twelve Labs Playgroundでサインアップし、APIキーを生成します。

  • このアプリケーションのリポジトリはTwelve Labs Security Analysisにあります。

  • Flask、HTML、CSS、JavaScriptについては、すでにある程度理解している必要があります。

アプリケーションの仕組み

このセクションでは、Twelve Labs Engineを搭載したSecurity Analysis Applicationの開発におけるアプリケーションのフローについて説明します。このアプリケーションには、CCTVやドライブレコーダーのビデオ映像をインデックス化する作業が必要であり、これは2つの方法で行うことができます。準備手順のセクションでは、Twelve Labs Playgroundを介してインデックスを作成し、ビデオをアップロードする手順を説明しています。

2つ目の方法は、Twelve Labsと統合されたAWS S3バケットを介したクラウド間転送を使用して、ビデオをインデックス化して保存する方法です。この方法は、大量のビデオデータを処理するのに最適です。

__wf_reserved_inherit

アプリケーションのアーキテクチャは、バックエンド、フロントエンド、サービスレイヤーの3つのレイヤーで構成されています。Twelve Labs Search APIにクエリを実行すると、レンダリング用のvideo_idscoreconfidencetimestamp (start, end, duration)、およびvideo_urlを伴う関連ビデオが返されます。

__wf_reserved_inherit

検索結果からビデオを選択すると、Generate APIがPegasus 1.1 Engine(生成エンジン)をアクティブにします。自由記述形式のプロンプトを使用し、システムはビデオを分析してインシデントや異常なイベントを特定し、説明します。その後、その分析結果をPDFレポートとして生成して保存できます。

準備手順

__wf_reserved_inherit
  1. Twelve Labs PlaygroundからAPIキーを取得し、環境変数を準備します。

  2. Githubからプロジェクトをクローンするか、Replitテンプレートを使用します。

  3. 検索機能に不可欠なビデオインデックスを作成し、データを投入します。Pegasus 1.1 Engineを搭載したインデックスを作成してTwelve Labs Playground経由でビデオを追加し、ビデオクリップをアップロードします。

  4. または、Twelve Labsのインテグレーション機能を使用して、すべての映像ビデオをAWS S3バケットにロードすることもできます。

  5. メインファイルとともに、APIキーを設定した.envファイルをセットアップします。

API_KEY=your_api_key_here
INDEX_ID=your_index_id

これらの手順が完了したら、いよいよアプリケーションの開発に取りかかる準備は万端です!

セキュリティ分析アプリの実装ガイド

このチュートリアルでは、最小限のフロントエンドを備えたFlaskアプリケーションを構築します。ディレクトリ構造は以下の通りです:

.               
├── README.md                 
├── .gitignore           
├── .env                    
├── static/            
└── css/
└── style.css 
├── templates/     
└── index.html
├── app.py 
├── report_generator.py  
├── requirements.txt 
└── uploads

Flaskアプリケーションの作成

前のステップを完了したら、次はFlaskアプリケーションを構築します。

仮想環境を準備し構築するために必要な依存関係については、こちらで確認できます:requirements.txt

Pythonの仮想環境を作成し、次のコマンドを使用してアプリケーションの環境を設定します:

pip install -r requirements.txt

1 - メインアプリケーションのセットアップ

このセクションでは、コアロジックとワークフローを含むメインアプリケーションのユーティリティ機能に焦点を当てます。メインアプリケーションを次の2つの重要なセクションに分けて説明します:

  • ビデオ検索エンジンのセットアップ

  • 検索されたビデオからの詳細な分析レポートの生成

1.1 ビデオ検索エンジンのセットアップ

プロセスは、Twelve Labsクライアントをインポートして初期化し、ビデオ検索APIをセットアップすることから始まります。当社のセキュリティビデオ分析プラットフォームは、信頼性の高い動作と適切なエラー報告を保証する包括的なエラー管理システムに支えられ、堅牢なエラー処理と効率的な検索機能を備えています。

# 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

各検索要求は複数の検証ステップを経ます。まず、システムはJSON構造と必要なパラメータを確認し、検証が失敗した場合は明確なフィードバックを提供します。検証後、システムはTwelve Labsの検索機能を使用して関連するビデオクリップを見つけ、慎重に分析します。

システムは、信頼性を向上させるためにレイヤードアプローチを使用して結果を処理します。見つかった各ビデオクリップについて、URLや再生時間などの追加メタデータを取得し、結果の関連性を示す信頼度スコアリングを実装します。0.7のしきい値を使用する信頼度計算は、結果の品質を伝えるためのシンプルな方法を提供します。個別の結果の処理が失敗した場合、システムは完全に失敗させるのではなく、残りの結果の処理を継続します。

1.2 検索されたビデオからの詳細な分析レポートの生成

指定されたクエリに基づいてインデックスからビデオを取得した後、システムは選択されたビデオの詳細な分析を生成します。このプロセスは、特定のビデオIDを使用し、Twelve Labs APIへのHTTP GETリクエストを介してビデオURLを取得することから始まります。

# 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

ストリーミングURLが取得されると、Twelve Labsクライアントは、包括的なビデオコンテンツ分析用に設計された自由記述形式のプロンプトを使用して、テキスト分析を生成します。その後、システムは余分な引用符や空白を削除して、分析テキストをクリーンアップしフォーマットします。

最終的なレスポンスでは、ビデオURLと分析テキストが組み合わされ、分析が欠落している場合のフォールバックオプションが含まれ、ログ記録が処理されます。

2 - インタラクティブな分析モデルの構築とビデオプレーヤー統合の処理

このセクションでは、index.htmlファイルについて見ていきます。このコードは、シームレスなユーザーエクスペリエンスを作成するために、検索機能とリアルタイムのビデオ分析を統合制御します。アプリケーションは、DOMインタラクション、状態管理、HLSビデオストリーミング、および包括的なエラー処理を実行します。主な機能を以下のサブセクションに分けて説明します:

  • 分析パイプラインのセットアップ

  • HLSビデオプレーヤーの統合

2.1 分析パイプラインのセットアップ

ここでは、アプリケーションにビデオ分析を実装し、エラーやUIフィードバックを処理する方法について説明します。

  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();

}

analyzeVideo関数は、ビデオ分析プロセスを制御します。まず、モーダル、コンテンツ領域、およびダウンロードボタンへの参照を取得します。分析中はモーダルが表示され、ダウンロードボタンは無効になります。この関数は、videoIdを使用してバックエンドリクエストを送り、レスポンスをJSONに変換します。その後、最終検証チェックを行った後、分析テキストを表示します。

最後のステップでテキストを処理し、未加工の分析結果を構造化されたHTMLコンテンツに変換します。これには、改行の改行タグへの変換、引用符の削除、空白のトリミングが含まれます。

2.2 HLSビデオプレーヤーの統合

このセクションでは、HLS(HTTP Live Streaming)プロトコルを使用したビデオストリーミング管理について説明します。

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>
`;
}

まず、ビデオURLが存在すること、DOMにビデオ要素が存在すること、ブラウザがHLSストリーミングをサポートしていることの3つの重要な要素を確認します。HLSプレーヤーをセットアップするために、新しいインスタンスを作成し、ソースとなるビデオのURLをロードして、プレーヤーをビデオ要素に紐づけます。セットアップが完了したら、分析テキストでアプリケーションの状態を更新し、ダウンロードを有効にします。HLSストリーミングの問題をコンソールで追跡するために、エラーモニタリングを追加しました。致命的なエラーが発生した場合は、handleVideoError関数が処理を引き継ぎます。

完全なスクリプトコードは、このindex.htmlファイルで確認できます。

チュートリアルをさらに試すためのアイデア

AI搭載のビデオセキュリティ分析を理解することで、さまざまな分野で数多くの可能性が開かれます。Twelve Labsを使用したこのテクノロジーの多用途性とパワーを示す、魅力的なユースケースをいくつかご紹介します:

🔒 プライベートセキュリティ:防犯カメラの映像を監視し、不法侵入や置き配泥棒を検知します。

📽️ セキュリティオペレーター:不正アクセス、不法侵入、その他のセキュリティ違反の検知を自動化します。

📊 セキュリティアナリティクス:過去のCCTV映像を分析してイベントを特定し、インシデントへの対応時間を改善するための報告書を生成します。

📋 自動ドキュメント化とレポート生成:セキュリティインシデントの自動記録やレポートを作成します。

⚖️ 法的証拠の確認:インシデントや犯罪の証拠となる関連セグメントをハイライトすることで、法執行機関による防犯カメラ映像の確認を支援します。

🚗 交通セキュリティと管理:交通状況の映像を監視し、違反、事故、異常な状態を検知します。これにより、自治体や交通機関がパターンを追跡し、交通法規を執行するのを助けます。

結論

このブログ投稿では、プロフェッショナルおよび個人の両方のセキュリティニーズに対応するために、Twelve Labsを使用してセキュリティアプリケーションを開発し、活用する方法について説明しました。このチュートリアルを最後までお読みいただきありがとうございました。ユーザー体験の向上や、さまざまな課題の解決に関するアイデアをお待ちしております。

追加資料

生成タスクに使用されるエンジンであるPegasus 1.1 (Generator Engine)について詳しく学びましょう。Twelve Labsをさらに深く探索し、ビデオコンテンツ分析についての理解を深めるために、以下の貴重なリソースをチェックしてください:

  • Discordコミュニティ:開発者や熱心なファンが集まる活気あるコミュニティに参加して、アイデアを議論したり、質問したり、プロジェクトを共有したりしましょう。

  • サンプルアプリケーション:さまざまなサンプルアプリケーションを探索して、次のプロジェクトのインスピレーションを得たり、新しい実装テクニックを学んだりしましょう。

  • チュートリアルを探索する:包括的なチュートリアルを通じて、Twelve Labsの機能をさらに深く理解しましょう。

これらのリソースを活用して知識を広げ、Twelve Labsのビデオ理解テクノロジーを使用した革新的なアプリケーションを作成することを推奨します。

はじめに

数時間にも及ぶ防犯カメラの映像の中で、どれほどの重要なセキュリティイベントが見過ごされているか考えたことはありますか? 🎥🔍 果てしなく続くビデオストリームから瞬時に重要な瞬間を正確に特定し、実用的なインテリジェンスに変換できるところを想像してみてください。

Security Analysis Application(セキュリティ分析アプリケーション)は、防犯カメラ、ドライブレコーダー、CCTV(監視カメラ)の録画映像を処理し、極めて重要な瞬間を数秒以内に特定します。Twelve Labs SDKで構築されたこの強力なアプリケーションは、不正アクセスの試みから不審な行動パターンに至るまで、主要なセキュリティイベントを自動的に特定してタイムスタンプを記録します。セキュリティ担当者は、何時間も手作業で確認する手間を省き、シンプルなプロンプトを使って特定のインシデントを迅速に検索し、正確なタイムスタンプと信頼度スコアを伴う結果を即座に受け取ることができます。

本システムは、特定されたイベントごとにAI駆動の包括的なレポートを生成することで、検知能力を高めます。Pegasus 1.1 Engine(生成エンジン)を使用し、未加工のビデオデータを文脈分析を伴う詳細なインシデント文書に変換し、実用的な洞察を提供します。このエンドツーエンドのソリューションは、セキュリティ業務を合理化し、あらゆる重要なセキュリティイベントを確実に捉えることで、個人および業務上の両方のセキュリティニーズに対応します。このアプリケーションがどのように動作するのか、そしてTwelveLabs Python SDKを使用して同様のソリューションをどのように構築できるかを探っていきましょう。

アプリケーションのデモは、こちらから体験できます:セキュリティ分析

コードにアクセスして直接アプリを試してみたい場合は、こちらのReplitテンプレートをご利用いただけます。

デモアプリケーション

以下は、自動車事故、喧嘩、超常現象のビデオ映像をインデックス化するSecurity Analysis Applicationのデモです。セキュリティ分析アプリをお試しください。

__wf_reserved_inherit

ハイウェイでの自動車事故(Car Accident on the highway)」と検索すると、APIは信頼度スコアとタイムスタンプが付いた関連ビデオをすべて取得します。「詳細分析(detailed analysis)」を選択すると、システムプロンプトに基づいてビデオから生成された詳細なレポートを表示できます。レポートはPDFとしてダウンロードすることができ、セキュリティシステムの利便性を高めます。

別のデモ例では、「超常現象の特定(Paranormal activity identified)」と検索すると、暗い場所での特異な活動の映像が取得され、アプリケーションの実力を示します。

__wf_reserved_inherit

前提条件

  • Twelve Labs Playgroundでサインアップし、APIキーを生成します。

  • このアプリケーションのリポジトリはTwelve Labs Security Analysisにあります。

  • Flask、HTML、CSS、JavaScriptについては、すでにある程度理解している必要があります。

アプリケーションの仕組み

このセクションでは、Twelve Labs Engineを搭載したSecurity Analysis Applicationの開発におけるアプリケーションのフローについて説明します。このアプリケーションには、CCTVやドライブレコーダーのビデオ映像をインデックス化する作業が必要であり、これは2つの方法で行うことができます。準備手順のセクションでは、Twelve Labs Playgroundを介してインデックスを作成し、ビデオをアップロードする手順を説明しています。

2つ目の方法は、Twelve Labsと統合されたAWS S3バケットを介したクラウド間転送を使用して、ビデオをインデックス化して保存する方法です。この方法は、大量のビデオデータを処理するのに最適です。

__wf_reserved_inherit

アプリケーションのアーキテクチャは、バックエンド、フロントエンド、サービスレイヤーの3つのレイヤーで構成されています。Twelve Labs Search APIにクエリを実行すると、レンダリング用のvideo_idscoreconfidencetimestamp (start, end, duration)、およびvideo_urlを伴う関連ビデオが返されます。

__wf_reserved_inherit

検索結果からビデオを選択すると、Generate APIがPegasus 1.1 Engine(生成エンジン)をアクティブにします。自由記述形式のプロンプトを使用し、システムはビデオを分析してインシデントや異常なイベントを特定し、説明します。その後、その分析結果をPDFレポートとして生成して保存できます。

準備手順

__wf_reserved_inherit
  1. Twelve Labs PlaygroundからAPIキーを取得し、環境変数を準備します。

  2. Githubからプロジェクトをクローンするか、Replitテンプレートを使用します。

  3. 検索機能に不可欠なビデオインデックスを作成し、データを投入します。Pegasus 1.1 Engineを搭載したインデックスを作成してTwelve Labs Playground経由でビデオを追加し、ビデオクリップをアップロードします。

  4. または、Twelve Labsのインテグレーション機能を使用して、すべての映像ビデオをAWS S3バケットにロードすることもできます。

  5. メインファイルとともに、APIキーを設定した.envファイルをセットアップします。

API_KEY=your_api_key_here
INDEX_ID=your_index_id

これらの手順が完了したら、いよいよアプリケーションの開発に取りかかる準備は万端です!

セキュリティ分析アプリの実装ガイド

このチュートリアルでは、最小限のフロントエンドを備えたFlaskアプリケーションを構築します。ディレクトリ構造は以下の通りです:

.               
├── README.md                 
├── .gitignore           
├── .env                    
├── static/            
└── css/
└── style.css 
├── templates/     
└── index.html
├── app.py 
├── report_generator.py  
├── requirements.txt 
└── uploads

Flaskアプリケーションの作成

前のステップを完了したら、次はFlaskアプリケーションを構築します。

仮想環境を準備し構築するために必要な依存関係については、こちらで確認できます:requirements.txt

Pythonの仮想環境を作成し、次のコマンドを使用してアプリケーションの環境を設定します:

pip install -r requirements.txt

1 - メインアプリケーションのセットアップ

このセクションでは、コアロジックとワークフローを含むメインアプリケーションのユーティリティ機能に焦点を当てます。メインアプリケーションを次の2つの重要なセクションに分けて説明します:

  • ビデオ検索エンジンのセットアップ

  • 検索されたビデオからの詳細な分析レポートの生成

1.1 ビデオ検索エンジンのセットアップ

プロセスは、Twelve Labsクライアントをインポートして初期化し、ビデオ検索APIをセットアップすることから始まります。当社のセキュリティビデオ分析プラットフォームは、信頼性の高い動作と適切なエラー報告を保証する包括的なエラー管理システムに支えられ、堅牢なエラー処理と効率的な検索機能を備えています。

# 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

各検索要求は複数の検証ステップを経ます。まず、システムはJSON構造と必要なパラメータを確認し、検証が失敗した場合は明確なフィードバックを提供します。検証後、システムはTwelve Labsの検索機能を使用して関連するビデオクリップを見つけ、慎重に分析します。

システムは、信頼性を向上させるためにレイヤードアプローチを使用して結果を処理します。見つかった各ビデオクリップについて、URLや再生時間などの追加メタデータを取得し、結果の関連性を示す信頼度スコアリングを実装します。0.7のしきい値を使用する信頼度計算は、結果の品質を伝えるためのシンプルな方法を提供します。個別の結果の処理が失敗した場合、システムは完全に失敗させるのではなく、残りの結果の処理を継続します。

1.2 検索されたビデオからの詳細な分析レポートの生成

指定されたクエリに基づいてインデックスからビデオを取得した後、システムは選択されたビデオの詳細な分析を生成します。このプロセスは、特定のビデオIDを使用し、Twelve Labs APIへのHTTP GETリクエストを介してビデオURLを取得することから始まります。

# 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

ストリーミングURLが取得されると、Twelve Labsクライアントは、包括的なビデオコンテンツ分析用に設計された自由記述形式のプロンプトを使用して、テキスト分析を生成します。その後、システムは余分な引用符や空白を削除して、分析テキストをクリーンアップしフォーマットします。

最終的なレスポンスでは、ビデオURLと分析テキストが組み合わされ、分析が欠落している場合のフォールバックオプションが含まれ、ログ記録が処理されます。

2 - インタラクティブな分析モデルの構築とビデオプレーヤー統合の処理

このセクションでは、index.htmlファイルについて見ていきます。このコードは、シームレスなユーザーエクスペリエンスを作成するために、検索機能とリアルタイムのビデオ分析を統合制御します。アプリケーションは、DOMインタラクション、状態管理、HLSビデオストリーミング、および包括的なエラー処理を実行します。主な機能を以下のサブセクションに分けて説明します:

  • 分析パイプラインのセットアップ

  • HLSビデオプレーヤーの統合

2.1 分析パイプラインのセットアップ

ここでは、アプリケーションにビデオ分析を実装し、エラーやUIフィードバックを処理する方法について説明します。

  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();

}

analyzeVideo関数は、ビデオ分析プロセスを制御します。まず、モーダル、コンテンツ領域、およびダウンロードボタンへの参照を取得します。分析中はモーダルが表示され、ダウンロードボタンは無効になります。この関数は、videoIdを使用してバックエンドリクエストを送り、レスポンスをJSONに変換します。その後、最終検証チェックを行った後、分析テキストを表示します。

最後のステップでテキストを処理し、未加工の分析結果を構造化されたHTMLコンテンツに変換します。これには、改行の改行タグへの変換、引用符の削除、空白のトリミングが含まれます。

2.2 HLSビデオプレーヤーの統合

このセクションでは、HLS(HTTP Live Streaming)プロトコルを使用したビデオストリーミング管理について説明します。

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>
`;
}

まず、ビデオURLが存在すること、DOMにビデオ要素が存在すること、ブラウザがHLSストリーミングをサポートしていることの3つの重要な要素を確認します。HLSプレーヤーをセットアップするために、新しいインスタンスを作成し、ソースとなるビデオのURLをロードして、プレーヤーをビデオ要素に紐づけます。セットアップが完了したら、分析テキストでアプリケーションの状態を更新し、ダウンロードを有効にします。HLSストリーミングの問題をコンソールで追跡するために、エラーモニタリングを追加しました。致命的なエラーが発生した場合は、handleVideoError関数が処理を引き継ぎます。

完全なスクリプトコードは、このindex.htmlファイルで確認できます。

チュートリアルをさらに試すためのアイデア

AI搭載のビデオセキュリティ分析を理解することで、さまざまな分野で数多くの可能性が開かれます。Twelve Labsを使用したこのテクノロジーの多用途性とパワーを示す、魅力的なユースケースをいくつかご紹介します:

🔒 プライベートセキュリティ:防犯カメラの映像を監視し、不法侵入や置き配泥棒を検知します。

📽️ セキュリティオペレーター:不正アクセス、不法侵入、その他のセキュリティ違反の検知を自動化します。

📊 セキュリティアナリティクス:過去のCCTV映像を分析してイベントを特定し、インシデントへの対応時間を改善するための報告書を生成します。

📋 自動ドキュメント化とレポート生成:セキュリティインシデントの自動記録やレポートを作成します。

⚖️ 法的証拠の確認:インシデントや犯罪の証拠となる関連セグメントをハイライトすることで、法執行機関による防犯カメラ映像の確認を支援します。

🚗 交通セキュリティと管理:交通状況の映像を監視し、違反、事故、異常な状態を検知します。これにより、自治体や交通機関がパターンを追跡し、交通法規を執行するのを助けます。

結論

このブログ投稿では、プロフェッショナルおよび個人の両方のセキュリティニーズに対応するために、Twelve Labsを使用してセキュリティアプリケーションを開発し、活用する方法について説明しました。このチュートリアルを最後までお読みいただきありがとうございました。ユーザー体験の向上や、さまざまな課題の解決に関するアイデアをお待ちしております。

追加資料

生成タスクに使用されるエンジンであるPegasus 1.1 (Generator Engine)について詳しく学びましょう。Twelve Labsをさらに深く探索し、ビデオコンテンツ分析についての理解を深めるために、以下の貴重なリソースをチェックしてください:

  • Discordコミュニティ:開発者や熱心なファンが集まる活気あるコミュニティに参加して、アイデアを議論したり、質問したり、プロジェクトを共有したりしましょう。

  • サンプルアプリケーション:さまざまなサンプルアプリケーションを探索して、次のプロジェクトのインスピレーションを得たり、新しい実装テクニックを学んだりしましょう。

  • チュートリアルを探索する:包括的なチュートリアルを通じて、Twelve Labsの機能をさらに深く理解しましょう。

これらのリソースを活用して知識を広げ、Twelve Labsのビデオ理解テクノロジーを使用した革新的なアプリケーションを作成することを推奨します。

はじめに

数時間にも及ぶ防犯カメラの映像の中で、どれほどの重要なセキュリティイベントが見過ごされているか考えたことはありますか? 🎥🔍 果てしなく続くビデオストリームから瞬時に重要な瞬間を正確に特定し、実用的なインテリジェンスに変換できるところを想像してみてください。

Security Analysis Application(セキュリティ分析アプリケーション)は、防犯カメラ、ドライブレコーダー、CCTV(監視カメラ)の録画映像を処理し、極めて重要な瞬間を数秒以内に特定します。Twelve Labs SDKで構築されたこの強力なアプリケーションは、不正アクセスの試みから不審な行動パターンに至るまで、主要なセキュリティイベントを自動的に特定してタイムスタンプを記録します。セキュリティ担当者は、何時間も手作業で確認する手間を省き、シンプルなプロンプトを使って特定のインシデントを迅速に検索し、正確なタイムスタンプと信頼度スコアを伴う結果を即座に受け取ることができます。

本システムは、特定されたイベントごとにAI駆動の包括的なレポートを生成することで、検知能力を高めます。Pegasus 1.1 Engine(生成エンジン)を使用し、未加工のビデオデータを文脈分析を伴う詳細なインシデント文書に変換し、実用的な洞察を提供します。このエンドツーエンドのソリューションは、セキュリティ業務を合理化し、あらゆる重要なセキュリティイベントを確実に捉えることで、個人および業務上の両方のセキュリティニーズに対応します。このアプリケーションがどのように動作するのか、そしてTwelveLabs Python SDKを使用して同様のソリューションをどのように構築できるかを探っていきましょう。

アプリケーションのデモは、こちらから体験できます:セキュリティ分析

コードにアクセスして直接アプリを試してみたい場合は、こちらのReplitテンプレートをご利用いただけます。

デモアプリケーション

以下は、自動車事故、喧嘩、超常現象のビデオ映像をインデックス化するSecurity Analysis Applicationのデモです。セキュリティ分析アプリをお試しください。

__wf_reserved_inherit

ハイウェイでの自動車事故(Car Accident on the highway)」と検索すると、APIは信頼度スコアとタイムスタンプが付いた関連ビデオをすべて取得します。「詳細分析(detailed analysis)」を選択すると、システムプロンプトに基づいてビデオから生成された詳細なレポートを表示できます。レポートはPDFとしてダウンロードすることができ、セキュリティシステムの利便性を高めます。

別のデモ例では、「超常現象の特定(Paranormal activity identified)」と検索すると、暗い場所での特異な活動の映像が取得され、アプリケーションの実力を示します。

__wf_reserved_inherit

前提条件

  • Twelve Labs Playgroundでサインアップし、APIキーを生成します。

  • このアプリケーションのリポジトリはTwelve Labs Security Analysisにあります。

  • Flask、HTML、CSS、JavaScriptについては、すでにある程度理解している必要があります。

アプリケーションの仕組み

このセクションでは、Twelve Labs Engineを搭載したSecurity Analysis Applicationの開発におけるアプリケーションのフローについて説明します。このアプリケーションには、CCTVやドライブレコーダーのビデオ映像をインデックス化する作業が必要であり、これは2つの方法で行うことができます。準備手順のセクションでは、Twelve Labs Playgroundを介してインデックスを作成し、ビデオをアップロードする手順を説明しています。

2つ目の方法は、Twelve Labsと統合されたAWS S3バケットを介したクラウド間転送を使用して、ビデオをインデックス化して保存する方法です。この方法は、大量のビデオデータを処理するのに最適です。

__wf_reserved_inherit

アプリケーションのアーキテクチャは、バックエンド、フロントエンド、サービスレイヤーの3つのレイヤーで構成されています。Twelve Labs Search APIにクエリを実行すると、レンダリング用のvideo_idscoreconfidencetimestamp (start, end, duration)、およびvideo_urlを伴う関連ビデオが返されます。

__wf_reserved_inherit

検索結果からビデオを選択すると、Generate APIがPegasus 1.1 Engine(生成エンジン)をアクティブにします。自由記述形式のプロンプトを使用し、システムはビデオを分析してインシデントや異常なイベントを特定し、説明します。その後、その分析結果をPDFレポートとして生成して保存できます。

準備手順

__wf_reserved_inherit
  1. Twelve Labs PlaygroundからAPIキーを取得し、環境変数を準備します。

  2. Githubからプロジェクトをクローンするか、Replitテンプレートを使用します。

  3. 検索機能に不可欠なビデオインデックスを作成し、データを投入します。Pegasus 1.1 Engineを搭載したインデックスを作成してTwelve Labs Playground経由でビデオを追加し、ビデオクリップをアップロードします。

  4. または、Twelve Labsのインテグレーション機能を使用して、すべての映像ビデオをAWS S3バケットにロードすることもできます。

  5. メインファイルとともに、APIキーを設定した.envファイルをセットアップします。

API_KEY=your_api_key_here
INDEX_ID=your_index_id

これらの手順が完了したら、いよいよアプリケーションの開発に取りかかる準備は万端です!

セキュリティ分析アプリの実装ガイド

このチュートリアルでは、最小限のフロントエンドを備えたFlaskアプリケーションを構築します。ディレクトリ構造は以下の通りです:

.               
├── README.md                 
├── .gitignore           
├── .env                    
├── static/            
└── css/
└── style.css 
├── templates/     
└── index.html
├── app.py 
├── report_generator.py  
├── requirements.txt 
└── uploads

Flaskアプリケーションの作成

前のステップを完了したら、次はFlaskアプリケーションを構築します。

仮想環境を準備し構築するために必要な依存関係については、こちらで確認できます:requirements.txt

Pythonの仮想環境を作成し、次のコマンドを使用してアプリケーションの環境を設定します:

pip install -r requirements.txt

1 - メインアプリケーションのセットアップ

このセクションでは、コアロジックとワークフローを含むメインアプリケーションのユーティリティ機能に焦点を当てます。メインアプリケーションを次の2つの重要なセクションに分けて説明します:

  • ビデオ検索エンジンのセットアップ

  • 検索されたビデオからの詳細な分析レポートの生成

1.1 ビデオ検索エンジンのセットアップ

プロセスは、Twelve Labsクライアントをインポートして初期化し、ビデオ検索APIをセットアップすることから始まります。当社のセキュリティビデオ分析プラットフォームは、信頼性の高い動作と適切なエラー報告を保証する包括的なエラー管理システムに支えられ、堅牢なエラー処理と効率的な検索機能を備えています。

# 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

各検索要求は複数の検証ステップを経ます。まず、システムはJSON構造と必要なパラメータを確認し、検証が失敗した場合は明確なフィードバックを提供します。検証後、システムはTwelve Labsの検索機能を使用して関連するビデオクリップを見つけ、慎重に分析します。

システムは、信頼性を向上させるためにレイヤードアプローチを使用して結果を処理します。見つかった各ビデオクリップについて、URLや再生時間などの追加メタデータを取得し、結果の関連性を示す信頼度スコアリングを実装します。0.7のしきい値を使用する信頼度計算は、結果の品質を伝えるためのシンプルな方法を提供します。個別の結果の処理が失敗した場合、システムは完全に失敗させるのではなく、残りの結果の処理を継続します。

1.2 検索されたビデオからの詳細な分析レポートの生成

指定されたクエリに基づいてインデックスからビデオを取得した後、システムは選択されたビデオの詳細な分析を生成します。このプロセスは、特定のビデオIDを使用し、Twelve Labs APIへのHTTP GETリクエストを介してビデオURLを取得することから始まります。

# 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

ストリーミングURLが取得されると、Twelve Labsクライアントは、包括的なビデオコンテンツ分析用に設計された自由記述形式のプロンプトを使用して、テキスト分析を生成します。その後、システムは余分な引用符や空白を削除して、分析テキストをクリーンアップしフォーマットします。

最終的なレスポンスでは、ビデオURLと分析テキストが組み合わされ、分析が欠落している場合のフォールバックオプションが含まれ、ログ記録が処理されます。

2 - インタラクティブな分析モデルの構築とビデオプレーヤー統合の処理

このセクションでは、index.htmlファイルについて見ていきます。このコードは、シームレスなユーザーエクスペリエンスを作成するために、検索機能とリアルタイムのビデオ分析を統合制御します。アプリケーションは、DOMインタラクション、状態管理、HLSビデオストリーミング、および包括的なエラー処理を実行します。主な機能を以下のサブセクションに分けて説明します:

  • 分析パイプラインのセットアップ

  • HLSビデオプレーヤーの統合

2.1 分析パイプラインのセットアップ

ここでは、アプリケーションにビデオ分析を実装し、エラーやUIフィードバックを処理する方法について説明します。

  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();

}

analyzeVideo関数は、ビデオ分析プロセスを制御します。まず、モーダル、コンテンツ領域、およびダウンロードボタンへの参照を取得します。分析中はモーダルが表示され、ダウンロードボタンは無効になります。この関数は、videoIdを使用してバックエンドリクエストを送り、レスポンスをJSONに変換します。その後、最終検証チェックを行った後、分析テキストを表示します。

最後のステップでテキストを処理し、未加工の分析結果を構造化されたHTMLコンテンツに変換します。これには、改行の改行タグへの変換、引用符の削除、空白のトリミングが含まれます。

2.2 HLSビデオプレーヤーの統合

このセクションでは、HLS(HTTP Live Streaming)プロトコルを使用したビデオストリーミング管理について説明します。

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>
`;
}

まず、ビデオURLが存在すること、DOMにビデオ要素が存在すること、ブラウザがHLSストリーミングをサポートしていることの3つの重要な要素を確認します。HLSプレーヤーをセットアップするために、新しいインスタンスを作成し、ソースとなるビデオのURLをロードして、プレーヤーをビデオ要素に紐づけます。セットアップが完了したら、分析テキストでアプリケーションの状態を更新し、ダウンロードを有効にします。HLSストリーミングの問題をコンソールで追跡するために、エラーモニタリングを追加しました。致命的なエラーが発生した場合は、handleVideoError関数が処理を引き継ぎます。

完全なスクリプトコードは、このindex.htmlファイルで確認できます。

チュートリアルをさらに試すためのアイデア

AI搭載のビデオセキュリティ分析を理解することで、さまざまな分野で数多くの可能性が開かれます。Twelve Labsを使用したこのテクノロジーの多用途性とパワーを示す、魅力的なユースケースをいくつかご紹介します:

🔒 プライベートセキュリティ:防犯カメラの映像を監視し、不法侵入や置き配泥棒を検知します。

📽️ セキュリティオペレーター:不正アクセス、不法侵入、その他のセキュリティ違反の検知を自動化します。

📊 セキュリティアナリティクス:過去のCCTV映像を分析してイベントを特定し、インシデントへの対応時間を改善するための報告書を生成します。

📋 自動ドキュメント化とレポート生成:セキュリティインシデントの自動記録やレポートを作成します。

⚖️ 法的証拠の確認:インシデントや犯罪の証拠となる関連セグメントをハイライトすることで、法執行機関による防犯カメラ映像の確認を支援します。

🚗 交通セキュリティと管理:交通状況の映像を監視し、違反、事故、異常な状態を検知します。これにより、自治体や交通機関がパターンを追跡し、交通法規を執行するのを助けます。

結論

このブログ投稿では、プロフェッショナルおよび個人の両方のセキュリティニーズに対応するために、Twelve Labsを使用してセキュリティアプリケーションを開発し、活用する方法について説明しました。このチュートリアルを最後までお読みいただきありがとうございました。ユーザー体験の向上や、さまざまな課題の解決に関するアイデアをお待ちしております。

追加資料

生成タスクに使用されるエンジンであるPegasus 1.1 (Generator Engine)について詳しく学びましょう。Twelve Labsをさらに深く探索し、ビデオコンテンツ分析についての理解を深めるために、以下の貴重なリソースをチェックしてください:

  • Discordコミュニティ:開発者や熱心なファンが集まる活気あるコミュニティに参加して、アイデアを議論したり、質問したり、プロジェクトを共有したりしましょう。

  • サンプルアプリケーション:さまざまなサンプルアプリケーションを探索して、次のプロジェクトのインスピレーションを得たり、新しい実装テクニックを学んだりしましょう。

  • チュートリアルを探索する:包括的なチュートリアルを通じて、Twelve Labsの機能をさらに深く理解しましょう。

これらのリソースを活用して知識を広げ、Twelve Labsのビデオ理解テクノロジーを使用した革新的なアプリケーションを作成することを推奨します。