トライポッドITセミナー ネットワークカメラ フレームワークを用いた クリエイティブワークショップ #3 トライポッドワークス株式会社 はじめに ネットワークカメラの低価格化 コンシューマ向けカメラは1万円以下で入手可。 ネットワークカメラが気軽に利用可能に。 価格.comの売れ筋 ランキングTOP10のうち 半数が1万円以下! 画像引用: kakaku.com Copyright (C) Tripodworks Co., Ltd. All right reserved 2 使用カメラ紹介 製品名: iPUX Cube IP Camera ICS303C (台湾Fitivision社製) 1/5インチCMOSセンサー搭載 最大解像度640×480(30万画素)、最大フレームレート30fps Ethernet(100Base-T)、Wi-Fi(IEEE802.11 b/g/n)搭載 動画記録形式: MJPEG ナイトモード搭載 動体検知機能搭載 価格: 45台湾ドル (約4000~5000円ぐらい) Copyright (C) Tripodworks Co., Ltd. All right reserved 3 Network Camera camfwd Application camfwlib deQueue enQueue メッセージキュー Camera Command Camera Control A-Camera Plugin B-Camera Plugin C-Camera Plugin Storage Engine カメラ初期化・接続開始 カメラ設定変更 キャプチャ開始・終了 Daemon Command 接続カメラリスト デーモンステータス Storage Command 画像データ一覧取得 画像データ実体取得 Common Response 共通レスポンス体系 File Plugin Database Plugin Memory Plugin Config 2013/4/26 Global Setting Plugin’s Parameter Plugin Select Queuing Parameter Copyright (C) Tripodworks Co., Ltd. All right reserved 4 Network Camera camfwd Application.py camfwlib.py ソケット通信 Webサーバ メッセージキュー Application.c ソケット通信 camfwlib.c 画像処理 メッセージキュー Application.java ソケット通信 camfwlib.java Android アプリ メッセージキュー 5 2013/4/26 :: Network Camera マシン2台構成 camfwd Application camfwlib Storage 前回の構成 Copyright (C) Tripodworks Co., Ltd. All right reserved Network Camera マシン1台構成 camfwd Storage Application camfwlib 今回はこの構成でいきます Copyright (C) Tripodworks Co., Ltd. All right reserved 前回からの変更点 camfwdとcamfwlib間のメッセージのやり取りを独自形式からmsgpack によるシリアライズ利用するようにしました StorageEngineのプラグインとCameraControlのプラグインが 連携するようになりました StorageEngineのプラグインにファイル、メモリ、DBを用意しました CameraControlのプラグインにダミープラグインとダミーストリーミングサーバを用 意しました これらの変更から依存パッケージが増えましたので少し前準備が必要です。 Copyright (C) Tripodworks Co., Ltd. All right reserved 8 準備 : VM配布と設定 1/3 今回セミナー内で利用するDummyDR(ダミーカメラ)は少し重いためCPUとメモ リを多めに割り当てることを推奨します。 今回配布する ovaファイルは CPU2コア、メモリ2GBを 割り当てています。 ovaファイルはDVDに入っています。 Copyright (C) Tripodworks Co., Ltd. All right reserved 9 準備 : VM配布と設定 2/3 お使いいただく環境は Ubuntuです。 Linuxでは、Pythonは標準インストールされています。 環境構築 1. VirtualBoxのインストール VirtualBox-4.2-14-86644-Win.exe よりインストールします。 2. 仮想マシンファイルのインポート VirtualBoxのインストールが終了したら起動し、「ファイル → 仮想アプライアンスのインポート」から 仮想マシンファイル、20130823_ubuntu-ja-12.10i386.ova をインポートします。 Copyright (C) Tripodworks Co., Ltd. All right reserved 10 準備 : VM配布と設定 3/3 環境構築 3. Ubuntuを立ち上げる 仮想マシンのインポートが終了したら「起動」から仮想マシンを起動、ロ グインします。 アカウント名:user パスワード:camera Copyright (C) Tripodworks Co., Ltd. All right reserved 11 準備 : パッケージ導入 1/3 前回までの環境から、今回のセミナーに対応した環境構築手順です。 パッケージ導入ポリシー • aptで入れられるものは入れる。 • pipで入れるのは apt で入れて不都合があるもの。 • tarボールなどのソースからは特段必要が無い限りは入れない。 $ dpkg -l $ pip freeze でインストール一覧で判断しやすいというメリットがあります。 Copyright (C) Tripodworks Co., Ltd. All right reserved 12 準備 : パッケージ導入 2/3 $ sudo apt-get update aptリポジトリの更新 $ sudo apt-get vim vim欲しいね... $ sudo apt-get install python-all-dev pythonのヘッダとライブラリ $ sudo apt-get install python-pip pythonのパッケージ管理システム $ sudo pip install python-daemon pythonのデーモン用ライブラリ $ sudo apt-get install python-cherrypy3 pythonのWebサーバパッケージ $ sudo apt-get install python-routes HTTPルーティング $ sudo apt-get install ffmpeg DummyDRのffmpeg動画から静止画を切り出 す $ sudo pip install msgpack-python camfwd <-> camfw間のシリアライズで利用 Copyright (C) Tripodworks Co., Ltd. All right reserved 13 準備 : パッケージ導入 3/3 $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 $ echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/10gen.list $ sudo apt-get update $ sudo apt-get install mongodb-10gen mongodbのインストール $ sudo pip install pymongo pythonからmongodbを扱う ■セミナーで使うサンプル一式は下記からダウンロードできます。 http://goo.gl/ndMe0W Copyright (C) Tripodworks Co., Ltd. All right reserved 14 CameraControl IPUX ICS303C用プラグイン Dummy ダミーカメラ(静止画)用プラグイン DummyDR ダミーカメラ(動画)用プラグイン camfwdでは、システム構成・ユースケースにあわせたプラグインを複数選択 します。もちろん、自分で作ることも可能です。 このプラグインのライセンス形態はカメラフレームワークのライセンス形 態とは別に作成者が設定できます。(オープンにしなくてもよいです) Copyright (C) Tripodworks Co., Ltd. All right reserved 15 IPUXプラグイン ICS303C用プラグイン コンフィグで指定したIPアドレスを元に HTTPリクエストを行いレスポンスを受け取ります。 カメラ実機に合わせたポーティングはベンダーによってはSDKなどが公開されてい る場合もあります。 公開されていない場合は、管理画面などからHTTP解析をChromeのデベロッパーツール やFirebugなどのブラウザツールを用いたり、Wiresharkなどのパケットキャプチャツー ルを使って解析していきます。 ※パケットキャプチャの使い方については、弊社遠藤の日経セミナーや書籍を!(宣伝) Copyright (C) Tripodworks Co., Ltd. All right reserved 16 Dummyプラグイン ダミーカメラ(静止画)用プラグイン コンフィグで指定したJPEGファイルを常に返す ダミープラグインです。 カメラ実機が用意できない場合の動作確認や、カメラフレームワークの挙動を確か めるためのリファレンスです。最低限の実装しかされていないためソースコードの ボリュームが少なく、容易に拡張できるとおもいます。 Copyright (C) Tripodworks Co., Ltd. All right reserved 17 DummyDRプラグイン 1/2 ダミーカメラ(動画)用プラグイン コンフィグで指定したDummyDRストリーミングサーバの IPアドレスを元にHTTPリクエストを行いレスポンスを受 け取ります。 Dummyプラグインに比べ、あらかじめ用意した動画配信を行うため 画像処理などを用いたアプリケーションで、より高度な動作確認ができます。 DummyDRストリーミングサーバの実装例は、/utils/DummyDRにあります。 Copyright (C) Tripodworks Co., Ltd. All right reserved 18 DummyDRプラグイン 2/2 ダミーカメラ(動画)用プラグイン ■起動方法 デスクトップのDummyDR.shを[実行] 正常に起動していればブラウザで動画が閲覧できます。 http://[ipaddress]:8888/cgi/mjpg/mjpg.cgi Copyright (C) Tripodworks Co., Ltd. All right reserved 19 Camera Controlの設定 camfw.confで設定します。設定内容はプラグインセクション毎に異なります。 [global] camera=cam1,cam2, cam3 利用するプラグインをカンマ区切りで指定 [cam1] model=IPUX address=192.168.1.93 username=admin modelにプラグイン名を指定 address以下は、プラグイン固有設定 passwd=admin [cam2] model= Dummy modelにプラグイン名を指定 static_jpeg は静止画のファイルパス static_jpeg = ./CameraControl/plugins/Dummy.jpg [cam3] model=DummyDR address=127.0.0.1 username=admin modelにプラグイン名を指定 address以下は、プラグイン固有設定 passwd=admin Copyright (C) Tripodworks Co., Ltd. All right reserved 20 Camera Controlプラグインの実装 プラグインファイルを /camfwd/CameraControl/plugins/ に配置します。 プラグインの規則は、設定ファイルのセクション名と同じファイル名、同じクラス 名が必要です。クラスは CamBase からの派生、もしくは別なクラスの改良であれば そのクラスを指定します。 ex) class CS_W06N(CamBase): ex) class CS2330(IPUX): ←IPUX(CS303C)の改良版 プラグインは実行時リフレクションによって読み込まれ、pluginsに格納されたすべ てのプラグインクラスのインタンスが作成されるわけではありません。 Copyright (C) Tripodworks Co., Ltd. All right reserved 21 Camera Controlプラグインの実装 クラスでサポートしている機能メソッドのオーバライドが必要です。 下記は一例 getCamStatus() カメラの接続状態を取得する getResolution() カメラの現在の解像度を取得する getSnapshot() カメラから静止画を取得する startCapture() endCapture()が呼ばれるまでカメラを ストレージエンジンに保存する setVideoFormat() カメラのビデオフォーマットを変更する setContrast() カメラのコントラストを変更する Copyright (C) Tripodworks Co., Ltd. All right reserved 22 Camera Controlプラグイン 演習 /camfw.confを編集して、camfwdに複数のカメラを接続してみましょう。 カメラアプリケーション /app/seminar2/sample.py で複数のカメラから 静止画などを取得してみてください。 /camfwd/CameraControl/plugins/Dummy.pyのgetCamStatus()で 接続状態を ‘Success’:True→False に変更してみましょう。 カメラアプリケーション /app/seminar2/sample.py で変更前と変更後の 動きを確認してみてください。 Copyright (C) Tripodworks Co., Ltd. All right reserved 23 StorageEngine SeFile SeMemory SeMongodb ファイルシステムに保存するプラグイン camfwdのメモリに保存するプラグイン ドキュメント指向データベース(NoSQL)に 保存するプラグイン camfwdでは、システム構成・ユースケースにあわせたプラグインを1つ選択 します。もちろん、自分で作ることも可能です。 このプラグインのライセンス形態はカメラフレームワークのライセンス形 態とは別に作成者が設定できます。(オープンにしなくてもよいです) Copyright (C) Tripodworks Co., Ltd. All right reserved 24 SeFileプラグイン ファイルに保存するプラグイン 単純にコンフィグで指定したパスにファイルを N/A 保存していきます。 保存するファイル数が多くなると、クエリ取得に時間がかかります。 他のプラグインの利用もしくは、改造を推奨しています。 簡単に動作確認するときなどにご利用ください。 依存パッケージはありません。 Copyright (C) Tripodworks Co., Ltd. All right reserved 25 SeMemoryプラグイン メモリに保存するプラグイン コンフィグで指定した量を限度にメモリ上に保存し ます。SeFileよりも高速ですが、camfwdを落とす(落ち る)とすべて消えます。 また、指定量を超えた場合に古いものから削除されるので クエリ取得と実体取得のオーダーの時間間隔が長くなると、クエリ結果から 実体を取得することができなくなる場合があります。 使い捨てが許されるケースやストレージ容量が厳しいときに使います。 依存パッケージはありません。 Copyright (C) Tripodworks Co., Ltd. All right reserved 26 SeMongodbプラグイン ドキュメント指向データベース(NoSQL)に 保存するプラグイン コンフィグで指定したMongoDBに保存します。 永続化可能で、かつSeFileよりも高速です。 SeMemoryのようにサイクリックな動作も可能で、保存速度もメモリにいったん保存 し、非同期でストレージに書き出すのでSeMemoryに近い速度がでます。ソートおよ びクエリはMongoDBのものを利用するので、トータルするとSeFile, SeMemoryよりも早い かもしれません。 依存パッケージはMongoDB、pymongoを利用するため事前準備が必要です。 Copyright (C) Tripodworks Co., Ltd. All right reserved 27 Storage Engineの設定 camfw.confで設定します。設定内容はプラグインセクション毎に異なります。 [global] storage.engine = SeMemory [SeFile] path = ./images [SeMemory] cycle = 10000 利用するプラグインの指定 保存先パスの指定 保存量の上限の指定 [SeMongodb] host = localhost database = camfw MongoDBのホスト、DB名、コレクション名の指定 collection = framedata Copyright (C) Tripodworks Co., Ltd. All right reserved 28 Storage Engineプラグインの実装 プラグインファイルを /camfwd/StorageEngine/plugins/ に配置します。 プラグインの規則は、設定ファイルのセクション名と同じファイル名、同じクラス 名が必要です。クラスは SeBase からの派生、もしくは別なクラスの改良であればそ のクラスを指定します。 ex) class SeMysql(SeBase): ex) class SeMemoryEx(SeMemory): ←SeMemoryの改良版 プラグインは実行時リフレクションによって読み込まれ、pluginsに格納されたすべ てのプラグインクラスのインタンスが作成されるわけではありません。 Copyright (C) Tripodworks Co., Ltd. All right reserved 29 Storage Engineプラグインの実装 クラスには下記メソッドが必要です。 get_frame_list_all() 保存された全フレームキーを返す get_frame_list_first() 保存された一番古いフレームキーを返す get_frame_list_last() 保存された一番新しいフレームキーを返す get_frame_list_range() 指定された時間範囲のフレームキーを返す save_frame() フレームを保存する get_frame() フレームキーから実体を返す Copyright (C) Tripodworks Co., Ltd. All right reserved 30 Storage Engineプラグインの実装 フレームキーフォーマットは “カメラID@日時”です。 ex) cam1@2013-08-23T17:00:00.123456Z カメラIDは各メソッドの target引数で渡されます。 日時は自分で取得する必要があります。 get_frame_list_*()は、すべてリスト形式で返します。 (first, lastは1件のみ返しますが、これもリスト形式が必要です。) エラーの場合は、空のリスト。 get_frame()は、framestring引数が渡されます。 fremestringは、フレームキーフォーマットと同様です。 エラーの場合は、Noneオブジェクトを返します。 Copyright (C) Tripodworks Co., Ltd. All right reserved 31 Storage Engineプラグイン 演習 /camfw.confを編集して、camfwdのストレージエンジンを切り替えてみましょう。 実際にデータがどこに保存されているか確認してみてください。 また、カメラアプリケーション /app/seminar3/sample.py を実行して 取得した画像を確認してみてください。 /camfwd/StorageEngine/plugins/Dummy.pyのsave_frame()で delitem = self.imageset.pop(0)の行をコメントアウトしてみましょう。 あわせて、カメラアプリケーション /app/seminar3/sample.pyのcf.stop_streaming() をコメントアウトして top –u `whoami` でcamfwdの使用メモリが増えているか確認して みてください。 Copyright (C) Tripodworks Co., Ltd. All right reserved 32 今後の開催予定 「ネットワークカメラフレームワークを用いた クリエイティブワークショップ」は全5回の開催を予定しています 第4回目: 10/25 (金) 第5回目: 12/27 (金) Copyright (C) Tripodworks Co., Ltd. All right reserved 33 Copyright (C) Tripodworks Co., Ltd. All right reserved 34
© Copyright 2025 ExpyDoc