概要
このチュートリアルでは、Jupyter* Notebook で OpenVINO™ ツールキットと Ultralytics YOLO* v8 を使って小売店のレジ向けにインテリジェントな待ち行列管理システムを構築する方法を説明します。実際のベンチマーク・データを確認し、ご自分のセットアップで実環境のベンチマークを実行できます。
ディープラーニングと物体検出のためのコンピューター・ビジョンにより、企業はリアルタイムで業務についてのインサイトを得て、効率と顧客満足度を高められます。OpenVINO™ ツールキットは、同じシステムで使用できるカメラの数を増やすなど、導入における一般的な制約を克服するために役立ちます。OpenVINO™ ツールキットにより、入力データを処理し、予測を生成して出力するための時間を最小限に抑え、より多くのフレームを処理して意思決定を高速化できます。
このアプリケーションは、お客様の満足こそが重要である、ペースの速い今日の小売環境に焦点を当てています。このアプリケーションは、並んでいるお客様を検知し、リアルタイムの分析データを提供します。このデータにより、店舗はお客様が別の列に並ぶよう案内して、行列や待ち時間を最小限に抑え、スタッフがレジのプロセスを適切に合理化することで、お客様の満足度を高められます。
さらに、このソリューションは、物体検出、物体のカウント、および意思決定が必要なあらゆる問題に適用できます。
前提条件
- Python* 3.8 以降がシステムにインストールされている。
- Git がシステムにインストールされている。
- ウェブカムまたは IP カメラがシステムに接続されている。
- ハードウェアが OpenVINO™ ツールキットのシステム要件に一致し、サポートされている。
注 このチュートリアルは、インテル® Core™ プロセッサー、Intel Atom® プロセッサー (開発コード名 Alder Lake)、第 4 世代インテル® Xeon® スケーラブル・プロセッサー (開発コード名 Sapphire Rapids)、およびインテルの Flex dGPU 上で実証されました。
手順 1: リポジトリーをクローンする
インテリジェントな待ち行列管理リポジトリーをシステムにクローンし、ライブラリーとツールをインストールするには、次のコマンドを使用します。
sudo apt install git git-lfs gcc python3-venv python3-dev
git clone –b recipes https://github.com/openvinotoolkit/openvino_notebooks.git openvino_notebooks
これにより、リポジトリーが openvino_notebook フォルダーにクローンされ、サンプルビデオがダウンロードされます。次に、フォルダーに移動します。
cd openvino_notebooks/recipes/intelligent_queue_management
ビデオサンプルをプルします。
git lfs pull
このアプリケーションは、Python* を使用して仮想環境を設定します。仮想環境パッケージがインストールされていない場合、次のコマンドを実行します。
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python3-ven
インテルのグラフィックス・カードを統合した CPU がある場合、このデバイスで推論を有効化するため、Intel® Graphics Compute Runtime for oneAPI Level Zero and OpenCL™ Driver をインストールします。Ubuntu* 20.04 のコマンドは、次のとおりです。
sudo apt-get install intel-opencl-icd
次に、仮想環境を準備します。
手順 2: 仮想環境を作成してアクティブにする
システム上でグローバルな影響を避けるには、Python プロジェクトを独自の環境に分離するのが最善です。仮想環境をセットアップするには、ターミナルまたはコマンドプロンプトを開き、環境を構築するディレクトリーに移動します。次に、新しい仮想環境を作成するため、次のコマンドを実行します。
Linux* や macOS* などの UNIX* 系のオペレーティング・システムでは、次のコマンドを使用します。
python3 -m venv venv
Windows* では、次のコマンドを使用します。
python -m venv venv
これにより、新しい仮想環境 venv が現在のフォルダーに作成されます。次に、先ほど作成した環境をアクティブにします。使用するコマンドは、オペレーティング・システムによって異なります。
Linux や macOS などの UNIX 系のオペレーティング・システムでは、次のコマンドを使用します。
source venv/bin/activate
Windows では、次のコマンドを使用します。
venvScriptsactivate
これにより仮想環境がアクティブになり、そのことがシェルのプロンプトの変化により示されます。
手順 3: 必要なものをインストールする
インテリジェントな待ち行列管理アプリケーションには、多くの依存関係があり、実行するためにはそれらをインストールする必要があります。これらは requirements ファイルに列挙されており、Python パッケージ・インストーラーを使用してインストールできます。
OpenVINO™ ツールキットや YOLO* v8 など、必要な Python ライブラリーをダウンロードするため、次のコマンドを使用します。
python -m pip install --upgrade pip
pip install -r requirements.txt
これで、すべての依存関係と必要なものがインストールされました。次に、アプリケーションを実行する前段階として、モデルの最適化と変換を行います。
手順 4: Jupyter* Notebook を起動する
Jupyter Notebook と共に、本番環境の導入を容易にするため、リポジトリーにスクリプトが含まれています。これらのスクリプトには、ノートブックと同じコードが含まれており、モデルを変換してインテリジェントな待ち行列管理アプリケーションをコマンドラインから直接実行できるようにします。これは、本番環境で AI ソリューションを自動化してスケールさせるのに特に役立ちます。
このチュートリアルでは、Jupyter Notebook を使用します。
YOLO v8 モデルを変換して最適化する前に、JupyterLab を起動するため、intelligent_queue_management ノートブック内で、次のコマンドを実行します。
jupyter lab docs
JupyterLab が、ノートブックが含まれる docs ディレクトリーを開きます。
手順 5: モデルを変換して最適化する
docs フォルダーにある、convert-and-optimize-the-model ノートブックを開きます。このノートブックには、YOLO v8 モデルをダウンロードして変換するための詳細な手順が記載されています。これにより、OpenVINO™ ツールキットで使用するモデルが準備されます。
次のノートブックのスニペットは、export メソッドを使用してモデルを変換する方法を示しています。
# export model to OpenVINO format
out_dir = det_model.export(format="openvino", dynamic=False, half=True)
- det_model は YOLO v8、物体検出モデルを表します。
- format を openvino に設定し、OpenVINO™ モデルのフォーマットでエクスポートします。
- dynamic パラメーターが False に設定されているのは、モデルを固定された入力サイズ (すなわち静的モデル) でエクスポートすることを示します。静的モデルでは、実行されている異なる推論の間で、入力テンソルの次元を変更することはできません。
- half を True に設定し、モデルの重みに半精度浮動小数点フォーマット (FP16) を使用します。
これにより、YOLO v8 モデルが OpenVINO™ ツールキットの中間表現 (IR) フォーマットに変換され、ツールキットの機能を活用してモデルを最適化し、さまざまなハードウェア・プラットフォームでパフォーマンスを向上できます。IR フォーマットは、OpenVINO™ ツールキットがディープラーニングのモデルを表すために使用する一般的なフォーマットであり、さまざまなハードウェア・プラットフォームをまたいで効率的な推論を可能にします。
手順 6: NNCF ポストトレーニング量子化 API を使用してモデルを最適化する
インテリジェントな待ち行列管理アプリケーションを実行する前に、ニューラルネットワーク圧縮フレームワーク (NNCF) を使用して、モデルを最適化する必要があります。このツールは、OpenVINO™ ツールキットで、精度の低下を最小限にしつつ、ニューラルネットを最適化する高度なアルゴリズムを提供するものです。
このチュートリアルでは、NNCF の 8bit ポストトレーニング量子化を使用します。これにより、パイプラインを微調整することなく、モデルを最適化できます。これは、次のように YOLO v8 モデルに適用されます。
- 量子化用のデータセットをロードする: モデルを効果的に量子化するには、元のトレーニング・データと同じドメインの、代表的なデータセットが必要です。理想的には、このデータセットは検証データセットのサブセットであるべきです。このデータセットは、nncf.quantize 関数によって使用され、モデルのパラメーターを調整して、最適なパフォーマンスを実現します。
- nncf.quantize でモデルを量子化する: この関数は、検出モデルに 8bit 量子化を適用し、モデルの計算とメモリーの要件を下げます。
注 量子化の目的は精度への影響を最小限に抑えることですが、モデルの精度はわずかに低下する可能性があります。 - OpenVINO™ ツールキット IR モデルをシリアル化する: openvino.runtime.serialize 関数を使用して、最適化されたモデルをディスクに保存します。このシリアル化されたモデルは、後で推論のためにロードできます。
次に、IR モデルを量子化します。
import numpy as np
import nncf
from torch.utils.data import DataLoader
from torchvision import datasets
from ultralytics.yolo.data import augment
from openvino import runtime as ov
# create the COCO validation dataset
coco_dataset = datasets.CocoDetection("coco/images/val2017", annFile="coco/annotations/instances_val2017.json", ...)
# get the loader with batch size 1
det_data_loader = DataLoader(coco_dataset, batch_size=1, shuffle=True)
# transform input function
def transform_fn(data_item):
# skip the label
return data_item[0]
quantization_dataset = nncf.Dataset(det_data_loader, transform_fn)
# load model
core = ov.Core()
ov_model = core.read_model(ov_model_path)
ignored_scope = nncf.IgnoredScope(types=["Multiply", "Subtract", "Sigmoid"], names=["/model.22/dfl/conv/Conv", "/model.22/Add", ...])
# quantize
quantized_model = nncf.quantize(ov_model, quantization_dataset,
preset=nncf.QuantizationPreset.MIXED, ignored_scope=ignored_scope)
# save to disk
ov.serialize(quantized_model, str(int8_model_path))
手順 7: インテリジェントな待ち行列管理アプリケーションを実行する
docs フォルダーにある run-the-application ノートブックを開きます。このノートブックには、インテリジェントな待ち行列管理アプリケーションを実行し、ビデオストリームを分析し、それぞれの関心領域 (ROI) にいるお客様の数を検出するための詳細な手順が記載されています。
アプリケーションを実行する前に、最適化した YOLO™ v8 モデルを OpenVINO™ フォーマットでロードします。モデルをロードするには、次のコードを使用します。
# initialize OpenVINO
core = ov.Core()
# read the model from file
model = core.read_model(model_path)
# compile the model for latency mode
model = core.compile_model(model, device_name="AUTO", config={"PERFORMANCE_HINT": "LATENCY"})
ノートブックは、前処理、モデルのロード、メイン処理関数、および前述した後処理の手順を使用して、インテリジェントな待ち行列管理アプリケーションを実行する方法を示します。このアプリケーションは、ビデオストリームを分析し、検出された ROI と、各行列にいるお客様の数を表示します。
- 前処理: アプリケーションの最初の手順には、入力ビデオストリームの前処理が含まれます。この処理には、モデルの入力要件に適合させるための、ビデオフレームのサイズ変更と、色空間の調整が含まれます。
- 後処理: 待ち行列に並ぶお客様を検出した後、アプリケーションはその結果を後処理する必要があります。この処理には、信頼度のしきい値と、人だけを強調するなどのオブジェクト・クラスとに基づいて検出された物質のフィルタリングが含まれます。
- メイン処理関数: このノートブックのメイン処理関数は、アプリケーションの実行、ビデオストリームの処理、および待ち行列に並ぶお客様の検出を担当します。この関数は、ロードされた YOLO v8 モデルと OpenVINO™ ツールキットを使用して、物体検出と待ち行列分析を実行します。
このアプリケーションでは、zones.json ファイルを使用して、ビデオストリームの ROI を定義します。これらの ROI は、ビデオ内の特定の待ち行列領域を表し、アプリケーションがその領域に集中して、他の領域を無視するために役立ちます。このファイルには、JSON オブジェクトの配列が含まれ、そのそれぞれに固有の ID を持つ ROI、多角形領域を定義するポイントのセット、そしてオプションで領域を説明するラベルがあります。この構成ファイルは、アプリケーションがビデオストリームの待ち行列を正確に監視するために不可欠です。
アプリケーションを実行するには、次のコードを使用して、ビデオのパス、モデルのパス、ゾーン構成ファイルのパス、およびお客様の制限を設定します。
video_path = "../sample_video.mp4" # Provide Path to the video file or camera number (0, 1, 2, etc.)
model_path = "../model/yolov8m_openvino_int8_model/yolov8m.xml"
zones_config_file = "../zones.json"
customers_limit = 3
queue_management は、OpenVINO™ ツールキットを使用して、ビデオファイルの物体検出を行い、検出された物体に基づいて、各ゾーンのお客様の数をカウントする関数です。queue_management 関数を呼び出すには、次のコードを使用します。
queue_management(video_path, model_path, zones_config_file, customers_limit)
queue_management 関数は、次の 4 つの引数をとります。まずビデオファイルへのパス、モデルファイルへのパス、ゾーンの定義が含まれる JSON ファイルへのパス、そして任意の時点でゾーンで許容されるお客様の最大人数です。この関数は、検出された物体とゾーンのアノテーションをオーバーレイした出力ビデオを表示し、いずれかのゾーンが許容人数を超えている場合は、店舗管理者にアラート通知を送信します。
次に、アプリケーションがビデオストリームの分析を開始し、各 ROI にいるお客様の数を検出します。その結果は端末に表示され、グラフィカル・インターフェイスには、ビデオストリームと、検出された ROI および各待ち行列に並ぶお客様の数が表示されます。q または esc を押すことで、いつでもアプリケーションを停止できます。
これで、完全に機能するインテリジェントな待ち行列管理システムができました。これを小売店のレジのシナリオで使用して、顧客満足度を改善し、売上を高めることができます。
手順 8: Benchmark_App によるパフォーマンス・ベンチマーク
YOLO v8 モデル最適化の効果を評価するには、OpenVINO™ ツールキットの benchmark_app を使用します。これにより、モデルの実際のパフォーマンスに関するインサイトが得られるため、それに基づいた導入の計画が可能になります。
第 4 世代インテル® Xeon® スケーラブル・プロセッサー上で、OpenVINO™ ツールキット・バージョン 2023.0.0 を使用した、YOLO v8m モデルのベンチマークの結果は次のとおりです。
スループット:
- FP16: 252 FPS
- int8: 195 FPS
レイテンシー:
- FP16: 7.94ms
- int8: 10.19ms
これらの結果は、int8 量子化 (NNCF) を使用することで、FPS において最高のスループットが得られることを実証しています。一般的に 1080p のカメラが、30 FPS のフレームレートで使用されている店舗レジなどの実際的なシナリオでは、スループットが 252 FPS の YOLO v8m モデルは理論上、第 4 世代インテル® Xeon® スケーラブル・プロセッサー上で、およそ 8 台のカメラを同時に処理できます (252/30 = ~8)。
注 これらの数字は、モデルの理論上の最大値を示すものです。実際のパフォーマンスは、さまざまな要因によって変わる場合があります。導入環境でモデルをテストし、実環境のパフォーマンスを把握することをお勧めします。
ベンチマークは、第 4 世代インテル® Xeon® スケーラブル・プロセッサー上で実施されました。この CPU は、YOLO v8m モデルを効率的に実行するためのハードウェア・インフラストラクチャーを提供します。
ベンチマークを実行するには、次のコマンドを使用します。
!benchmark_app -m $int8_model_det_path -d $device -hint latency -t 30
$int8_model_det_path を int8 モデルへのパスに、$device を使用している特定のデバイス (CPU、GPU など) に置き換えます。このコマンドは、モデル上で推論を 30 秒間実行し、モデルのパフォーマンスに関するインサイトを提供します。
注 このコマンドでは、入力データのシェイプを明示的に定義していませんが、-hint latency オプションを使用して、モデルを低レイテンシー用に最適化しています。
利用可能なオプションの包括的な概要と、追加のコマンドライン・オプションを確認するには、benchmark_app --help を実行します。
最後に
OpenVINO™ ツールキットを使用して、YOLO v8 物体検出を用いて小売店のレジで人を数える、インテリジェントな待ち行列管理アプリケーションの作成方法を紹介しました。これにより、お客様を別の列に案内して待ち時間を最小限に抑えるためのリアルタイムデータを取得できます。
このチュートリアルでは、OpenVINO™ ツールキットを使用して、小売店のレジ向けにインテリジェントな待ち行列管理システムを作成しましたが、物体検出の可能性は膨大です。例えば、行列はレジでの精算以外にも発生する可能性があり、検出の対象は人だけに限られません。次のアプリケーションでは、このチュートリアルの中核となる原理を新しい可能性に適用することができます。例えば、自動車を検出して高速道路の交通渋滞を緩和したり、コンサート会場で人々を誘導したりすることもできます。
ご質問や、共有したいことがある場合は、GitHub* または Intel Community Support Channel でディスカッションに参加してください。OpenVINO™ ツールキットによる開発の詳細については、こちらのドキュメントを参照してください。
パフォーマンス・ベンチマークの詳細については、GitHub にアクセスしてください。