ネットワークカメラワークショップ03資料 - Tripodworks(トライポッド

Download Report

Transcript ネットワークカメラワークショップ03資料 - Tripodworks(トライポッド

トライポッド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