詳細 |
|
ターゲット OS: |
Ubuntu* 16.04 LTS |
プログラミング言語: |
C++ |
作業時間: |
45 分 |
説明
このリファレンス実装は、視聴者解析にインテル® ディストリビューションの OpenVINO™ ツールキット、4K 広告の表示にインテル® Media SDK を使用して開発されました。このアプリケーションは、デジタルサイネージの前に立っている視聴者の年齢と性別を識別し、識別した情報に基づいて適切な 4K 広告を選択します。Grafana* でリアルタイム・データ視覚化が行われ、開発者は経時的な傾向をモニターできます。このリファレンス実装は、実世界のマーケティングおよび広告を向上することを目標としています。
要件
ハードウェア
ソフトウェア
- Ubuntu* 16.04 LTS
- インテル® ディストリビューションの OpenVINO™ ツールキット 2019 R2 リリース
- インテル® Media SDK
仕組み
このアプリケーションは、カメラなどのビデオソースからフレームを取得し、ディープ・ニューラル・ネットワーク (DNN) を使用してデータを処理します。最初のネットワークは顔を検出します。2 つ目のニューラル・ネットワークは検出した顔の年齢と性別を判断します。3 つ目のニューラル・ネットワークは、人の頭部姿勢を検出します。
アプリケーションは、デジタル・サイネージ・カメラの前に立っている人の年齢、性別、頭部姿勢を観測して、5 つのフレームのデータを収集します。観測の変動を避けるため、データは正規化されます。正規化されたデータに基づいて、アプリケーションは性別に適した広告を選択します。
JSON ファイルは、異なる年齢および性別グループの広告のリストを提供します。この JSON ファイルは解析され、年代グループ、性別、広告のリストなど、ファイルに含まれるデータは C++ 構造で格納されます。ソフトウェアは、視聴者解析で年齢グループと性別を判断すると、JSON データから広告を選択します。広告は HEVC プラグインを使用してデコードされ、インテル® Media SDK を使用して再生されます。
このアプリケーションには、視聴者解析プロセス (AAP) と広告表示プロセス (ADP) の 2 つのプロセスがあります。これらのプロセス間の通信にはパイプを使用します。
AAP は、視聴者を解析し、適切な広告を選択して、選択した広告をパイプに書き込みます。ADP は、パイプからファイル名を読み取り、H.265 または HEVC 形式のビデオをデコードしてレンダリングします。広告の再生が終了すると、ADP は広告完了の肯定応答をパイプを通じて AAP に送信します。肯定応答を受信すると、AAP はその時間の視聴者に基づいて次の広告を選択し、ADP に送信します。新しい広告は、前の広告が完了した場合にのみ再生されます。
2 つのプロセスは並列で実行され、視聴者解析は広告の再生中にも行われます。20 フレームごとに、アプリケーションは InfluxDB* データベースにデータを送信し、Grafana* で視覚化されて、経時的な傾向が表示されます。Grafana* は、広告に興味を持った人の数、興味を持たなかった人の数、現在再生している広告、デジタルサイネージの前に立ったユニークな人の総数を視覚化します。
セットアップ
コードの取得
リファレンス実装のクローンを作成します。
sudo apt-get update && sudo apt-get install git
git clone https://github.com/intel-iot-devkit/intelligent-kiosk-analytics-cpp.git
インテル® ディストリビューションの OpenVINO™ ツールキットのインストール
インテル® ディストリビューションの OpenVINO™ ツールキットのインストールおよびセットアップ方法の詳細は、Linux* 向けインテル® ディストリビューションの OpenVINO™ ツールキットのインストール (英語) を参照してください。
GPU で推論を実行する場合は、下記の手順に従って OpenCL* ランタイムパッケージをインストールします。CPU で推論を実行する場合は不要です。
その他の依存ファイル
インテル® Media SDK
インテル® Media SDK は、インテル® グラフィックス・ハードウェア・プラットフォームのハードウェア・アクセラレーションによるビデオデコード、エンコードおよびフィルタリングにアクセスする C API を提供します。
InfluxDB*
InfluxDB* は大量の書き込みとクエリーロードを扱うように設計された時系列データベースです。InfluxDB* は、DevOps モニタリング、アプリケーション・メトリック、IoT センサーデータ、リアルタイム分析を含む、大量の時系列データを含むユースケースで外部記憶装置として使用されます。
Grafana*
Grafana* はオープンソースの汎用ダッシュボードおよびグラフ・コンポーザーで、ウェブ・アプリケーションとして動作します。Graphite*、InfluxDB*、Prometheus*、OpenTSDB をバックエンドとしてサポートしています。Grafana* を使用すると、メトリックがどこに格納されていても、メトリックを照会、視覚化、アラートおよび把握できます。
使用するモデル
このアプリケーションは、インテルの face-detection-retail-0004 (英語)、age-gender-recognition-retail-0013 (英語) および head-pose-estimation-adas-0001 (英語) モデルを使用します。モデルは、モデル・ダウンローダーを使用してダウンロードできます。モデル・ダウンローダーは、アプリケーションで使用する .xml ファイルと .bin ファイルをダウンロードします。
モデルをダウンロードしてアプリケーションの依存ファイルをインストールするには、intelligent-kiosk-analytics-cpp
ディレクトリーで下記のコマンドを実行します。
./setup.sh
設定ファイル
resources/config.json は、入力としてアプリケーションで使用されるビデオのパスを含んでいます。
例:
{
"inputs": [
{
"video":"path_to_video/video1.mp4",
}
]
}
path/to/video
は入力ビデオファイルのパスです。
使用する入力ビデオ
アプリケーションは任意の入力ビデオで動作します。サンプルビデオはこちら (英語) で提供されています。
初回は、face-demographics-walking-and-pause (英語) を使用することを推奨します。
例:
{
"inputs": [
{
"video":"sample-videos/face-demographics-walking-and-pause.mp4",
}
]
}
ほかのビデオを使用する場合は、config.json ファイルにビデオのパスを指定します。
ビデオの代わりにカメラを使用する
config.json ファイルの path/to/video
をカメラ ID に変更します。ID はビデオデバイスの ID です (/dev/videoX の数 X)。
Ubuntu* で、利用可能なすべてのビデオデバイスをリストするには、次のコマンドを使用します。
ls /dev/video*
例えば、上記のコマンドの出力が /dev/video0 の場合、config.json は次のようになります。
{
"inputs": [
{
"video":"0"
}
]
}
環境の設定
プロジェクト・ディレクトリーに移動します。
cd <path-to-intelligent-kiosk-analytics-cpp>
インテル® ディストリビューションの OpenVINO™ ツールキットを使用するように環境を設定します。
source /opt/intel/openvino/bin/setupvars.sh
アプリケーションのビルド
ビルドするには、intelligent-kiosk-analytics-cpp
ディレクトリーに移動して次のコマンドを実行します。
mkdir -p build && cd build
cmake ..
make
export LD_LIBRARY_PATH=$PWD/ie_cpu_extension:$LD_LIBRARY_PATH
アプリケーションの実行
CPU で実行する
アプリケーションはデフォルトで CPU で実行されますが、コマンドライン引数で -d CPU -d_hp CPU -d_ag CPU と明示的に指定することもできます。
__bin/Release/application -m /opt/intel/openvino/deployment_tools/open_model_zoo/tools/downloader/Retail/object_detection/face/sqnet1.0modif-ssd/0004/dldt/FP32/face-detection-retail-0004.xml -m_ag /opt/intel/openvino/deployment_tools/open_model_zoo/tools/downloader/Retail/object_attributes/age_gender/dldt/FP32/age-gender-recognition-retail-0013.xml -m_hp /opt/intel/openvino/deployment_tools/open_model_zoo/tools/downloader/Transportation/object_attributes/headpose/vanilla_cnn/dldt/FP32/head-pose-estimation-adas-0001.xml
インテル® ディストリビューションの OpenVINO™ ツールキットで提供されるモデルに加えて、Caffe*、TensorFlow*、または Apache* MXNet マシンラーニング・フレームワークでトレーニングされた、顔検出、年齢/性別認識、頭部姿勢モデルを含めることもできます。これらのモデルを含めるには、使用するフレームワーク向けにモデル・オプティマイザーを設定した後、トレーニング済みモデルを変換して、モデルの最適化された中間表現 (IR) を作成します。
モデル・オプティマイザーの詳細は、モデル・オプティマイザー開発者ガイド (英語) を参照してください。
IR が取得できたら、アプリケーションを実行します。
__bin/Release/application -m <path-to-face-detection-IR>/face-detection.xml -m_ag <path-to-age-gender-IR>/age-gender-recognition.xml -m_hp <path-to-head-pose-estimation-IR>/head-pose-estimation.xml
注:
- アプリケーションを終了するには、[Detection results] ウィンドウをクリックして ESC キーを長押しします。
- 同期モードでアプリケーションを実行するには、コマンドライン引数で
-async 0
を使用します。デフォルトでは、アプリケーションは非同期モードで実行されます。
- 複数のデバイスで実行するには、-d MULTI:device1,device2 を使用します (例: -d MULTI:CPU,GPU,MYRIAD)。
異なるハードウェアで実行する
アプリケーションは、異なるモデルに異なるハードウェア・アクセラレーターを使用できます。下記のコマンドライン引数を使用して、各モデルのターゲットデバイスを指定します。
-d <device>: Target device for Face Detection network (CPU, GPU, MYRIAD or HDDL).
-d_ag <device>: Target device for Age Gender Recognition network (CPU, GPU, MYRIAD or HDDL).
-d_hp <device>: Target device for Head Pose Estimation network (CPU, GPU, MYRIAD or HDDL).
例:
顔検出モデルを CPU、年齢認識モデル (FP32) を GPU、頭部姿勢推定モデルを MYRIAD で実行するには、下記のコマンドを使用します。
__bin/Release/application -m /opt/intel/openvino/deployment_tools/open_model_zoo/tools/downloader/Retail/object_detection/face/sqnet1.0modif-ssd/0004/dldt/FP32/face-detection-retail-0004.xml -m_ag /opt/intel/openvino/deployment_tools/open_model_zoo/tools/downloader/Retail/object_attributes/age_gender/dldt/FP32/age-gender-recognition-retail-0013.xml -m_hp /opt/intel/openvino/deployment_tools/open_model_zoo/tools/downloader/Transportation/object_attributes/headpose/vanilla_cnn/dldt/FP16/head-pose-estimation-adas-0001.xml -d CPU -d_ag GPU -d_hp MYRIAD
FP32: FP32 は数の表現に 32 ビットを使用する単精度浮動小数点演算です。大きさ (仮数部) は 8 ビット、精度 (指数部) は 23 ビットです。詳細は、ここをクリックしてください。
FP16: FP16 は 16 ビットを使用する半精度浮動小数点演算です。大きさ (仮数部) は 5 ビット、精度 (指数部) は 10 ビットです。詳細は、ここをクリックしてください。
注: インテル® ニューラル・コンピュート・スティックおよび HDDL は FP16 モデルのみ実行できます。コマンドライン引数でアプリケーションに渡されるモデルは FP16 データ型でなければなりません。
トラブルシューティング
アプリケーションを実行すると、共有ライブラリーのロードに関する次のエラーが表示されることがあります: __bin/Release/application: error while loading shared libraries: libcpu_extension.so: cannot open shared object file: No such file or directory
このエラーが発生した場合、intelligent-kiosk-analytics-cpp ディレクトリーに移動して LD_LIBRARY_PATH 環境変数をエクスポートします。
cd build
export LD_LIBRARY_PATH=$PWD/ie_cpu_extension:$LD_LIBRARY_PATH
広告リストへの新しい広告の追加
JSON ファイルに新しい広告を追加するには、以下の手順に従います。
FFmpeg を使用して、デコードプロセスの入力ビデオ形式である H.265 または HEVC 形式にビデオを変換します。MP4 ビデオを必要な形式に変換するには、次の操作を行います。
sudo apt install ffmpeg
- FFmpeg を使用して .mp4 から .hevc 形式にビデオを変換します。
ffmpeg -i <input_video>.mp4 -c:v libx265 -c:a aac -b:a 128k <output_video>.hevc
intelligent-kiosk-analytics-cpp ディレクトリー以下の resources ディレクトリーにビデオをコピーします。
広告のビデオファイルの名前を追加します。例えば、29 才から 49 才の年齢グループの男性向けに再生する新しい広告ファイル intel.hevc を追加するには、adlist.json ファイルを変更します。
- エディターで、
intelligent-kiosk-analytics-cpp/resources
ディレクトリーの adList.json ファイルを開きます。
- "Age_Group": 3、"Gender": "M" の広告リストの最後に、ファイル名 intel.hevc を追加します。
{
"Age_Group": 3,
"Gender": "M",
"Ads": [
"maleAd.h265",
"maleAd.h265",
"maleAd.h265",
"intel.hevc"
]
}
注:
- アプリケーションの年齢グループは 4 つに分かれています。
- 子ども: 1 才から 13 才、年齢グループ 1 に属します。
- 青年: 14 才から 28 才、年齢グループ 2 に属します。
- 大人: 29 才から 49 才、年齢グループ 3 に属します。
- シニア: 50 才以上、年齢グループ 4 に属します。
InfluxDB* データベース
Grafana* での視覚化
Grafana* でデータを視覚化します。
端末で、Grafana* サーバーを開始します。
sudo service grafana-server start
ブラウザーを開いて localhost:3000 に移動します。
ユーザー admin およびパスワード admin でログインします。
Configuration アイコンをクリックし、[Data Sources] を選択します。
[+ Add data source] をクリックして下記の情報を設定します。
- Name: Demographics
- Type: InfluxDB
- URL: http://localhost:8086
- Database: Demographics
- [Save and Test] をクリックします。
ページの下部の [Back] ボタンをクリックします。[+ Add data source] をクリックして下記の情報を設定します。
ページの下部の [Back] ボタンをクリックします。AdData と Demographics がデータソースに追加されます。
新しいダッシュボードを作成します。
Grafana* アイコンの下のサイドバー・メニューの + アイコンをクリックして [Dashboard] を選択します。
[Singlestat] を選択します。[Panel Title] をクリックして [Edit] を選択します。
[Singlestat] メニュータブの [General] をクリックして [Panel Title] を Number of people に変更します。
[Singlestat] メニュータブの [Metrics] をクリックします。[Data Source] から Demographics を選択します。
[Add Query] を選択します。[select measurement] をクリックして [Demographics] を選択します。
[field (value)] で、[value] をクリックして [Total people] を選択します。
[SELECT] フィールドの mean の横の + をクリックします。[Selectors] から last() を選択します。mean() がオーバーライドされます。
ステップ 2 の後、クエリー A は次のようになります。
FROM default Demographics SELECT field(Total people) last() GROUP BY time($__interval) fill(null) FORMAT AS Time Series
- [Singlestat] メニュータブの [Options] をクリックします。[stat] フィールドから [Current] を選択して、最初の行の [Font size] を 120 に変更します。
- 下部の [Gauge] オプションで [show] を選択します。
- ダッシュボードの名前を Kiosk にします。[Save] ボタンをクリックします。
以下を変更してステップ 2 を繰り返し、ダッシュボードに Number of male の Singlestat パネルを追加します。
[Panel title] を Number of people から Number of male に変更します。
[Singlestat] メニュータブの [Metrics] の [field (value)] で、[Total male] を選択します。
クエリー A は次のようになります。
FROM default Demographics SELECT field(Total male) last() GROUP BY time($__interval) fill(null) FORMAT AS Time Series
- ダッシュボードを保存して、上部メニューの右上隅の [Back to dashboard] アイコンをクリックします。
同様に、以下を変更してステップ 2 を繰り返し、ダッシュボードに Number of female の Singlestat パネルを追加します。
[Panel title] を Number of people から Number of female に変更します。
[Singlestat] メニュータブの [Metrics] の [field (value)] で、[Total female] を選択します。
クエリー A は次のようになります。
FROM default Demographics SELECT field(Total female) last() GROUP BY time($__interval) fill(null) FORMAT AS Time Series
ダッシュボードを保存して、[Back to dashboard] アイコンをクリックします。
人口統計時系列データを視覚化するグラフを追加します。
上部メニューの [add panel] アイコンをクリックして、[Graph] をクリックします。グラフがダッシュボードに追加されます。
グラフの [Panel Title] をクリックして [Edit] を選択します。
[Graph] メニュータブの [General] をクリックして [Panel Title] を People viewing Ad に変更します。
[Graph] メニュータブの [Metrics] をクリックします。[Data Source] から Demographics を選択します。
[Add Query] を選択します。[select measurement] をクリックして [Demographics] を選択します。
[field (value)] をクリックして [Total people] を選択します。
[SELECT] フィールドの + をクリックします。[Selectors] から last() を選択します。
[GROUP BY] フィールドで、[time($__interval)] をクリックして 10s を選択します。
[ALIAS BY] 行のクエリー名を Number of people にします。
クエリー A は次のようになります。
FROM default Demographics SELECT field(Total people) last() GROUP BY time(10s) fill(null) FORMAT AS Time Series ALIAS BY Number of People
+ をクリックして、男性と女性の数を表示するクエリーを同様に追加します。男性と女性のクエリーは次のようになります。
クエリー B:
FROM default Demographics SELECT field(Total male) last() GROUP BY time(10s) fill(null) FORMAT AS Time Series ALIAS BY Number of male
クエリー C:
FROM default Demographics SELECT field(Total female) last() GROUP BY time(10s) fill(null) FORMAT AS Time Series ALIAS BY Number of female
- [Graph] メニュータブの [Display] をクリックして、[Mode Options] の [Fill] と [Line Width] の値を 2 に変更します。
- メニュータブの [Time Range] をクリックし、[Override relative time] [Last] の横のテキストボックスに 500s と入力します。
- ダッシュボードを保存して、[Back to dashboard] アイコンをクリックします。
人口統計データを表示する表を追加します。
上部メニューの [add panel] アイコンをクリックして、[Table] をクリックします。
表の [Panel Title] をクリックして [Edit] を選択します。
[Table] メニュータブの [General] をクリックして [Panel Title] を Demographics に変更します。
[Table] メニュータブの [Metrics] をクリックします。[Data Source] から Demographics を選択します。
[Metrics] でクエリーを次のように設定します。
クエリー A:
FROM default Demographics SELECT field(Total people) last() GROUP BY time(1s) fill(none) FORMAT AS Time Series ALIAS BY Number of People
クエリー B:
FROM default Demographics SELECT field(Total male) last() GROUP BY time(1s) fill(none) FORMAT AS Time Series ALIAS BY Number of male
クエリー C:
FROM default Demographics SELECT field(Total female) last() GROUP BY time(1s) fill(none) FORMAT AS Time Series ALIAS BY Number of female
下記のイメージのように、メニュータブの [Column Styles] から、[+Add] をクリックして [Apply to columns named] に No. of people と設定し、Type の [Type] で Number を選択して [Decimals] フィールドに 0 と入力します。
- 同様に、[Column Styles] で No. of male と No. of female のルールを追加し、[Type] で Number を選択して [Decimals] フィールドに 0 と入力します。
- ダッシュボードを保存して、[Back to dashboard] アイコンをクリックします。
広告に興味を持った人を表示するグラフを追加します。
上部メニューの [add panel] アイコンをクリックして、[Graph] をクリックします。グラフがダッシュボードに追加されます。
グラフの [Panel Title] をクリックして [Edit] を選択します。
[Graph] メニュータブの [General] をクリックして [Panel Title] を Audience interested in viewing the Ad に変更します。
[Graph] メニュータブの [Metrics] をクリックします。[Data Source] から AdData を選択します。
[Metrics] でクエリーを次のように設定します。
クエリー A:
FROM default AdData SELECT field(peopleInterested) last() GROUP BY time(10s) fill(null) FORMAT AS Time Series ALIAS BY People Interested
クエリー B:
FROM default AdData SELECT field(peopleNotInterested) last() GROUP BY time(10s) fill(null) FORMAT AS Time Series ALIAS BY People Not Interested
[Graph] メニュータブの [Display] をクリックして、[Mode Options] の [Fill] と [Line Width] の値を 2 に変更します。
メニュータブの [Time Range] をクリックし、[Override relative time] [Last] の横のテキストボックスに 500s と入力します。
ダッシュボードを保存して、[Back to dashboard] アイコンをクリックします。
広告に興味を持った人を表示する表を追加します。
上部メニューの [add panel] アイコンをクリックして、[Table] をクリックします。
表の [Panel Title] をクリックして [Edit] を選択します。
[Table] メニュータブの [General] をクリックして [Panel Title] を Ad Data に変更します。
[Table] メニュータブの [Metrics] をクリックします。[Data Source] から AdData を選択します。
[Metrics] でクエリーを次のように設定します。
クエリー A:
FROM default AdData SELECT field(previousAd) last() GROUP BY time(1s) fill(none) FORMAT AS Time Series ALIAS BY Ad name
クエリー B:
FROM default AdData SELECT field(peopleInterested) last() GROUP BY time(1s) fill(none) FORMAT AS Time Series ALIAS BY People Interested
クエリー C:
FROM default AdData SELECT field(peopleNotInterested) last() GROUP BY time(1s) fill(none) FORMAT AS Time Series ALIAS BY People Not Interested
[Column Styles] で People interested と People not interested のルールを追加し、[Type] で Number を選択して [Decimals] フィールドに 0 と入力します。
ダッシュボードを保存して、[Back to dashboard] アイコンをクリックします。
ダッシュボードで現在再生されている広告を表示します。
[Singlestat] を選択し、[Panel Title] をクリックして [Edit] を選択します。
[Singlestat] メニュータブの [General] をクリックして [Panel Title] を Ad currently playing に変更します。
[Singlestat] メニュータブの [Metrics] をクリックします。[Data Source] から AdData を選択します。
[Metrics] でクエリーを次のように設定します。
クエリー A:
FROM default AdData SELECT field(currentAd) last() GROUP BY time($__interval) fill(null) FORMAT AS Time Series
ダッシュボードを保存して、[Back to dashboard] アイコンをクリックします。
以下を変更してステップ 2 を繰り返し、ダッシュボードに Number of unique visitors の Singlestat パネルを追加します。
[Panel title] を Number of people から Number of unique visitors に変更します
[Singlestat] メニュータブの [Metrics] の [field (value)] で、[Unique visitors] を選択します。
クエリー A は次のようになります。
FROM default Demographics SELECT field((Unique visitors)) last() GROUP BY time(1m) fill(null) FORMAT AS Time Series
[Singlestat] メニュータブの [Options] をクリックします。Value の下の [stat] フィールドから [Current] を選択して、最初の行の [Font size] を 120 に変更します。
ダッシュボードを保存して、[Back to dashboard] アイコンをクリックします。
ダッシュボードの上部メニューから [Time picker] を選択します。[Custom range] で、[From] を now-10m、[To] を now、[Refreshing every:] を 5s に設定し、[Apply] をクリックしてダッシュボードを保存します。
C++ コードを実行して Grafana* でデータを視覚化します。
ダッシュボードのパネルのサイズと位置は変更できます。
Grafana* での視覚化は、以下の手順で行うこともできます。
ブラウザーで、localhost:3000 に移動します。
ユーザー admin およびパスワード admin でログインします。
[Configuration] をクリックします。
[Data Sources] を選択します。
[+ Add data source] をクリックして下記の情報を設定します。
- Name: Demographics
- Type: InfluxDB
- URL: http://localhost:8086
- Database: Demographics
- [Save and Test] をクリックします。
ページの下部の [Back] ボタンをクリックします。[+ Add data source] をクリックして下記の情報を設定します。
ブラウザーの左側の + アイコンをクリックして、import を選択します。
Upload.json File をクリックします。
intelligent-kiosk-analytics-cpp/resources ディレクトリーから kiosk-analytics.json を選択します。
Demographics の [Select a influxDB data source] で "Demographics"、AdData フィールドで "AdData" データソースを選択します。
[Import] をクリックします。
アプリケーションを実行して Grafana* でデータを確認します。