設計時の基本・重要事項
,
目次
- 1 目次
- 2 YC画像取得
- 2.1 アプリで使用可能な解像度一覧について
- 2.2 カメラの上下反転設定に対応するための実装
- 2.3 全方位カメラの映像取得
- 2.4 マルチセンサカメラの映像取得
- 3 AIアクセラレータの活用
- 4 外部機器へのデータ送信方法
- 5 アプリからのカメラファームウェアのCGIの実行
- 6 カメラ内部のRAM,ROMの活用
- 6.1 ROM(フラッシュメモリ)への保存
- 6.2 RAMの活用
- 6.3 リソース情報の取得方法
- 7 SDメモリーカードの活用
- 8 WEB UIの実装
- 9 ログの実装
- 10 複数のAIモデル及び複数アプリの活用
- 11 死活監視
- 12 CV2xとCV52カメラアプリの互換性・SoC判別方法
- 13 Pythonでの開発について
- 13.1 i-PROカメラのPython環境
- 13.2 Python版AdamAppの構造
YC画像取得
アプリで使用可能な解像度一覧について
アプリが使用可能なYC画像の解像度リストは、カメラファームウェアの設定に応じて変わります。
参考:https://dev-partner.i-pro.com/space/TPFAQ/1172766733/ADAM_CamPref_Get()で取得可能なYC解像度一覧
カメラの上下反転設定に対応するための実装
CV2xカメラの画像回転・上下反転設定を使用する場合、アプリが取得するYC画像は自動では反転されず、アプリ内で反転処理を実装する必要があります。
また一部のCV2xカメラ(ボックスタイプ、ドームタイプ)では、上下反転設定にかかわらず、画像センサの取付け向きの関係で、アプリが取得可能なYC画像がデフォルト状態で反転しています。以下のページを参考にYC画像取得後の反転処理を実装して下さい。
https://dev-partner.i-pro.com/space/TPFAQ/965477999/カメラの取り付け向きと取得YC画像について
この実装はSDK v2.01以降に同梱されているサンプルアプリケーションweb_template_app, yuv_dnn_app,
yuv_pose_ap, yuv_ssd_app, yuv_yolo_app,yuv_yolov5_app,yuv_yolov8_appで実装されています。
全方位カメラの映像取得
撮像モード設定に応じて、魚眼画像、パノラマ画像など所望の画像をアプリで使用することが可能です。
https://dev-partner.i-pro.com/space/TPFAQ/1300103211/全方位カメラの映像をAdamAppアプリで使用する
マルチセンサカメラの映像取得
マルチセンサカメラでは、アプリをインストール時、インストール対象のカメラNo(No.1~No.4)を選択してインストールします。アプリが取得するYC画像はADAM_DevYcVideo_Createでは自動でそのカメラNoの映像が取得されます。ADAM_DevRawVideo_Create使用時は引数に応じて自動または特定のカメラNoの映像を指定することが可能です。
また、例えばアプリのWEB画面でそのカメラNoの映像を表示する場合は、Adam_GetSensorChannelでそのアプリがインストールされているカメラNoを取得後、映像配信のCGIを使用してください。
(ex. /cgi-bin/mjpeg?ch=2, /cgi-bin/mjpeg?ch=3, /cgi-bin/mjpeg?ch=4)
この実装はサンプルアプリケーションweb_template_appで実装されています。
また、YC画像のフレームレートに制限があります。
2M / 4Mタイプ: 最大15 fps
5M / 6M / 4Kタイプ: 最大7.5 fps
AIアクセラレータの活用
・AI アクセラレータは i-pro ambaCV2X,CV5X モデルでのみ利用可能です。
・ツール(cvtool)は AdamAppSDK には含まれていません。必要な場合には、i-PRO 株式会社にお問合せください。
ambaCV2X,CV5Xのカメラには、AI の推論処理用アクセラレータ(CVFlow)を内蔵しています。
AdamApp からは、専用の API 経由でこのアクセラレータを使用することが可能です。API の入力として、アクセラレータ用のバイナリファイルが必要になります。以下の手順でバイナリの作成、およびAdamApp への組み込みを行ってください。
[手順]
学習済みの AI モデルを、アクセラレータ用のバイナリファイルに変換します。
SDKパッケージの構造とビルド方法の記載手順にしたがって、AdamApp パッケージを作成します。この際に、手順 1.で作成したバイナリを data/cnn ディレクトリの下に置いてください。
Adam では、上記の手順 1.を行うためのツール(cvtool)を用意しています。cvtool の使用方法については、 AIモデル変換ツールを参照してください。
AI処理の一般的な処理シーケンス例
YC画像のフレームレートとアプリケーションの処理時間について
アプリケーションが、例えば10fpsでYC画像を要求した場合、ファームウェアはアプリケーションに対して10fps(約100msec間隔)でコールバック関数を通知します。
アプリケーションのコールバック関数は、必ずこの間隔以内にコールバック関数を完了する必要があります。
コールバックを通知するタイミングで、アプリケーションの前回のコールバック関数の処理が完了していない場合(アプリケーションの処理が遅延している場合)、前回のコールバック関数が終了したタイミングで次の通知が行われます。この場合、アプリケーションが取得する画像データは古い時間のデータとなります。
またこの遅延が続くと、ファームウェアは遅延をリセットするために、メモリ上の画像データを初期化します。
アプリケーションの処理が遅延しているかどうか確認するためにはサンプルアプリyuv_ssd_app(SDK v2.10以降)のログを参考にしてください。
YC画像のタイムスタンプm_timeStampと、アプリケーションでコールバック関数が実行されたシステム時刻の差を出力するようになっています。この差が増えつづけなければ問題ありません。
カメラファームウェアで発生するイベントをトリガにして、各種処理を行う場合
すべてのYC画像に対して画像解析を行う代わりに、ADAM_DevInputAlarm_Createを使用することで例えばカメラで検知したVMDや端子アラームのイベントをアプリで受信し、その後一定時間だけ処理するような実装(この実装はサンプルアプリweb_template_appで実装されています)、あるいはADAM_DevPtzPresetPositionState_Createを使用することでPTZカメラがプリセットポジション移動したことをトリガとしてその後一定時間だけ処理するような実装が可能です。
ADAM_DevInputAlarm_CreateはPython版のアプリでは非対応です。
外部機器へのデータ送信方法
アプリ内で発生したイベントはSDKを使用してカメラファームウェアのアラーム連動動作機能を動作させたり、またはアプリから外部機器に対して直接通信することも可能です。
ADAM_Alarm_Notify
カメラファームウェアの以下のようなアラーム連動動作を開始させることが可能です。
例
・独自アラーム通知、HTTPアラーム通知 (参考:https://dev-partner.i-pro.com/space/TPFAQ/1029963873/TCP+Alarm%2FHTTP+Alarm)
・メール通知
・SDカードへの映像録画
・アラームFTP転送(JPEG)
・出力端子のアラーム連動出力
※本SDKはサンプルアプリalarm_sample_app、web_template_appで実装されています。
ADAM_MetaDataStream_SetRaw
RTSPのメタデータチャンネルで、Onvif meta streamとしてデータの送信が可能です。本データを活用するソフトはパートナー様で開発頂く必要があります。
※本SDKは各種サンプルアプリmeta_stream_app、web_template_appで実装されています。
ADAM_AdditionalInfo_Set
H.264、H.265、音声のネットワーク配信時のRTP拡張ヘッダに任意の情報を付与します。JPEGの場合はCOMセグメントに格納されます。本データを活用するソフトはパートナー様で開発頂く必要があります。
※本SDKは各種サンプルアプリadditional_info_sample_appで実装されています。
その他
パートナー様で自由にプロトコルの実装が可能です。サンプルアプリmqtt_sampleではMQTTを実装しています。
アプリからのカメラファームウェアのCGIの実行
アプリケーションからカメラファームウェアのHTTPポートに対してローカル通信としてCGIを実行することが可能です。ユーザー認証が必要となるため、カメラのユーザー名、パスワードをアプリケーションの設定値として実装する必要があります。
ローカル通信時に必要となるカメラのHTTPポート番号設定は ADAM_GetHttpInfo で取得することができます。
CGIドキュメントダウンロード:https://i-pro.com/products_and_solutions/ja/surveillance/learning-and-support/device-integration/cgi-itg-camera
各CGIの仕様については、https://japancs.i-pro.com/page/inquiryからお問い合わせください。
カメラ内部のRAM,ROMの活用
カメラの機種によって使用可能なリソースは異なります
参考:https://dev-partner.i-pro.com/space/TPFAQ/694780048/i-PROカメラへのソフトウェアインストール条件
ROM(フラッシュメモリ)への保存
ADAM_GetAppDataDirPathで取得されるディレクトリに対して保存したデータはカメラ内部のフラッシュメモリに保存されるため、カメラの電源をOff/Onを行っても保存されます。
フラッシュメモリには書き込み回数に上限があるため、映像から検知したデータなどを保存したい場合は、SDカードまたは外部装置へ送信して保存する必要があります。
一時的なRAMへの保存で十分の場合は、RAMの上限を超えない範囲でADAM_GetAppTmpDirPathで取得されるディレクトリに保存してください。
高頻度のフラッシュメモリへの書き込みが行われ劣化した場合、アプリのインストール、起動、その他アプリの動作に影響を及ぼす場合があります。
SDK 2.01以降のResouce Monitorでは、フラッシュメモリへのアクセス状況を確認可能です。不要なアクセスがないかどうか、開発中にご確認ください。
参考:https://dev-partner.i-pro.com/space/TPFAQ/1028163220/Resource+Monitor
また、各カメラのROMサイズの上限を超えて、保存が行われた場合、カメラのファームウェアがアプリを停止します。この場合、カメラのWEBブラウザの管理ログに「不正終了(ROM容量制限(実容量))」が表示されます。
RAMの活用
各カメラのRAMサイズの上限を超えて使用された場合、カメラのファームウェアがアプリを停止します。この場合、カメラのWEBブラウザの管理ログに「不正終了(RAM容量制限)」が表示されます。
また、ADAM_GetAppTmpDirPathで取得されるディレクトリに一時的にデータを格納することが可能です。
この場合も上限を超えないようにご使用下さい。
リソース情報の取得方法
開発中はSDK同梱のResouce Monitorで確認可能です。
アプリ内部で取得する場合は、以下のいずれかの方法で可能です。
Adam WebAPI getAppResourceInfo
/proc/[pid]/statusや/proc/[pid]/statmで取得
ADAM_GetRomRamSize *SDK v2.01以降で対応
SDメモリーカードの活用
カメラ設定画面の[基本]-[SDメモリーカード]-[機能拡張ソフトウェアモード]を[On]にすることで、アプリからSDカードに対してデータを書き込むことが可能です。ディレクトリはADAM_GetSdCardPathで取得可能です。
外部ライブラリSQLiteを使用して、SDメモリーカードへデータベースを構築することも可能です。サンプルアプリsqlite_appで実装されています。SQLiteを使用する場合、事前にカメラの[SDメモリーカードファイルシステム]設定を[ext]へ変更し、SDカードをフォーマットしてください。
[SDメモリーカードファイルシステム]設定を[FAT]で使用する場合、カメラファームウェアによるSDメモリーカードへの録画機能は動作しますが、保証できません。
[SDメモリーカードファイルシステム]設定を[ext]で使用する場合、カメラファームウェアによるSDメモリーカードへの録画機能は動作しません。
SDメモリーカードには書き込み回数の上限があります。詳細はメーカーの情報を参照ください。
WEB UIの実装
アプリでWEB UIを自由に実装し、カメラのWEBブラウザから表示することが可能です(ex. MJPEGと検知枠の表示、アプリの設定変更など)
WEB UIは各種サンプルアプリでも実装されており、またweb_template_appでは、一般的にアプリに必要となる機能が含まれています。
アプリのライセンスアクティベーションが必要となる場合、これらはすべてパートナー様で設計、実装頂く必要があります。カメラのMACアドレスやシリアル番号はSDKで取得可能であり、ご使用下さい。
ログの実装
AdamDebug.hに定義されている ADAM_DEBUG_PRINT() 関数 を用いることでログを出力すること可能です。ログはカメラのWEB画面からダウンロード可能なログデータsyslog.tgz 内の mnt/log/pflog.tgz 内の log/adam 内にある pf_< インストール ID>< processId>.log に出力されます。
また開発期間中はログのUDP出力を有効にして、ツールを使用することでリアルタイムにログの内容を確認することが可能です。
複数のAIモデル及び複数アプリの活用
1つのアプリに複数のAIモデルを組み込み、動作させることが可能です。
また、アプリを複数にわけ、アプリ間での通信を行う場合は、サンプルアプリiac_server_sample_app、iac_client_sample_appを参照ください。
死活監視
カメラのファームウェアとアプリのメインスレッドにて約20秒間隔で死活監視が行われます。メインスレッドでの待機処理や時間のかかる処理は行わないようにしてください。
連続2回アプリからの応答がなかった場合、アプリが異常になっていると判定し、ファームウェアはアプリを停止します。その後、そのアプリがスケジュール動作期間内である場合は、再度自動的に起動します。
また、外部装置からのAdamCGI(WEB API)を受信し、アプリがファームウェアに対して応答を返却しない場合も同様に停止、再起動が行われます。例えば、アプリで受信パラメータに対するチェックを行い、異常と判断した場合にもADAM_ServerResponse_SendまたはADAM_ServerResponse_SendAsIsでファームウェアに対する応答を実装する必要があります。
また、アプリ内の別のスレッドを死活監視対象に追加したい場合は、ADAM_KeepAlive_Addをご使用下さい。
CV2xとCV52カメラアプリの互換性・SoC判別方法
SoCがCv2xのカメラ用アプリとCV52のカメラ用アプリは互換性がありません。Cv2xカメラ用アプリをすでに開発済で、CV52カメラ用アプリを開発する場合はAIモデル変換(https://dev-partner.i-pro.com/space/TPFAQ/1187053582)と、ビルド時のオプションを変更(https://dev-partner.i-pro.com/space/TPFAQ/1112245115/SDKインストール(v1.80以降))する必要があります
ソースコードでは以下によって制御を分けることが可能です。ビルド時のオプションによって一方が有効となります。
#ifdef ADAM_TARGET_PF_ipro_ambaCV2X_linux
#ifdef ADAM_TARGET_PF_ipro_ambaCV5X_linux
SDK v2.01以降に同梱されているサンプルアプリケーションweb_template_app, yuv_dnn_app, yuv_pose_ap, yuv_ssd_app, yuv_yolo_app,yuv_yolov5_app,yuv_yolov8_appで実装されています。
また、SDK2.01以降に対応したファームウェアバージョンで追加されたSDK ADAM_GetSocTypeでSoCの情報を取得し、動的に制御を分けることも可能です。
Pythonでの開発について
i-PROカメラのPython環境
i-PRO カメラにあらかじめインストールされている Python 環境は下記の通りです。
Interpreter : Python 3.7.9
External library : python adam module for ADAM API
Python版AdamAppの構造
Python 版 AdamApp は、下記の図に示すように、Main スレッドと Python スレッドから 構成されます。
Python スクリプトに関しては、基本的に Python スレッドで実行されます。 ただし、stopCallback、httpCallback、appPrefCallback 等のコールバック関数については、 Main スレッドで実行されます。
Python版AdamApp が起動すると、まず Main スレッドが生成され、AdamAppの初期化処理を行った後、Pythonスレッドを生成します。PythonスレッドはPython インタープリタを起動し、pymain.py を読み込み、Python スクリプトを実行します。Python スクリプトが最後まで実行されると、Python スレッドは自動的に終了します。その後 Main スレッドが終了処理を行い、AdamApp が終了します。