オブジェクト検出 Python* デモ¶
このデモでは、同期 API と非同期 API を使用したオブジェクト検出ネットワークの推論を紹介します。
非同期 API を使用すると、アプリは推論の完了を待機することなく、アクセラレーターがビジー状態でもホスト上で処理を続行できるため、アプリケーション全体のフレームレートが向上します。具体的には、このデモでは、-nireq
フラグを使用して設定した推論要求の数が保持されます。一部の推論要求は OpenVINO™ ランタイムによって処理されますが、他の要求には新しいフレームデータを入力して非同期で開始したり、推論要求から次の出力を取得して表示することができます。
この手法は、利用可能な任意の並列スラックに一般化できます。例えば、推論を実行し、結果として得られる (前の) フレームを同時にエンコードしたり、顔検出の結果に加えて感情検出を実行するなど、推論を追加して実行できます。ただし、パフォーマンスに関する重要な注意事項があります。例えば、並列実行されるタスクでは、共有計算リソースのオーバーサブスクライブを避ける必要があります。別の例として、推論が iGPU で実行され、CPU が基本的にアイドル状態である場合、CPU で並行して処理を実行するのが合理的です。ただし、例えば GPU 上で推論が実行される場合、デバイスはすでにビジー状態であるため、(結果として得られるビデオの) エンコードを同じ GPU 上で並行して実行してもほとんどメリットはありません。
非同期 API に関するその他のパフォーマンスへの影響とヒントについては、最適化ガイドで説明されています。
デモの目的は次のとおりです。
OpenCV* による入力としてのビデオのサポート
結果として得られる境界ボックスとテキストラベル (
.labels
ファイルから)、またはクラス番号 (ファイルが提供されていない場合) の視覚化
どのように動作するか¶
起動時に、アプリケーションはコマンドライン・パラメーターを受け取り、モデルを OpenVINO™ ランタイムプラグインにロードします。OpenCV VideoCapture からフレームを取得すると、推論を実行して結果を表示します。
非同期 API は、入力/出力をカプセル化し、スケジュールと結果の待機を分離する “推論要求” の概念で動作します。
注: デフォルトでは、Open Model Zoo のデモは BGR チャネル順序での入力を期待します。RGB 順序で動作するようにモデルをトレーニングした場合は、サンプルまたはデモ・アプリケーションでデフォルトのチャネル順序を手動で再配置するか、
--reverse_input_channels
引数を指定したモデル・オプティマイザー・ツールを使用してモデルを再変換する必要があります。引数の詳細については、[前処理計算の埋め込み](@ref openvino_docs_MO_DG_Additional_Optimization_Use_Cases) の入力チャネルを反転するセクションを参照してください。
モデル API¶
このデモでは、Python* モデル API のモデルラッパー、アダプター、パイプラインを利用します。
統一された結果表現を備えたラッパーの汎用インターフェイスにより、1 つのデモで複数の異なるオブジェクト検出モデル・トポロジーがサポートされます。
実行の準備¶
デモの入力画像またはビデオファイルについては、Open Model Zoo デモの概要のデモに使用できるメディアファイルのセクションを参照してください。デモでサポートされるモデルリストは、<omz_dir>/demos/object_detection_demo/python/models.lst
ファイルにあります。このファイルは、モデル・ダウンローダーおよびコンバーターのパラメーターとして使用され、モデルをダウンロードし、必要に応じて OpenVINO IR 形式 (*.xml + *.bin) に変換できます。
モデル・ダウンローダーの使用例:
omz_downloader --list models.lst
モデル・コンバーターの使用例:
omz_converter --list models.lst
サポートされるモデル¶
-
architecture_type = centernet
ctdet_coco_dlav0_512
-
architecture_type = ctpn
ctpn
-
architecture_type = detr
detr-resnet50
-
architecture_type = faceboxes
faceboxes-pytorch
-
architecture_type = nanodet
nanodet-m-1.5x-416
-
architecture_type = nanodet-plus
nanodet-plus-m-1.5x-416
-
architecture_type = retinaface-pytorch
retinaface-resnet50-pytorch
-
architecture_type = ssd
efficientdet-d0-tf
efficientdet-d1-tf
face-detection-0200
face-detection-0202
face-detection-0204
face-detection-0205
face-detection-0206
face-detection-adas-0001
face-detection-retail-0004
face-detection-retail-0005
faster-rcnn-resnet101-coco-sparse-60-0001
faster_rcnn_inception_resnet_v2_atrous_coco
faster_rcnn_resnet50_coco
pedestrian-and-vehicle-detector-adas-0001
pedestrian-detection-adas-0002
person-detection-0106
person-detection-0200
person-detection-0201
person-detection-0202
person-detection-0203
person-detection-0301
person-detection-0302
person-detection-0303
person-detection-retail-0013
person-vehicle-bike-detection-2000
person-vehicle-bike-detection-2001
person-vehicle-bike-detection-2002
person-vehicle-bike-detection-2003
person-vehicle-bike-detection-2004
product-detection-0001
retinanet-tf
rfcn-resnet101-coco-tf
ssd_mobilenet_v1_coco
ssd_mobilenet_v1_fpn_coco
ssd-resnet34-1200-onnx
ssdlite_mobilenet_v2
vehicle-detection-0200
vehicle-detection-0201
vehicle-detection-0202
vehicle-detection-adas-0002
vehicle-license-plate-detection-barrier-0106
vehicle-license-plate-detection-barrier-0123
-
architecture_type = ultra_lightweight_face_detection
ultra-lightweight-face-detection-rfb-320
ultra-lightweight-face-detection-slim-320
-
architecture_type = yolo
mobilenet-yolo-v4-syg
person-vehicle-bike-detection-crossroad-yolov3-1020
yolo-v1-tiny-tf
yolo-v2-ava-0001
yolo-v2-ava-sparse-35-0001
yolo-v2-ava-sparse-70-0001
yolo-v2-tf
yolo-v2-tiny-ava-0001
yolo-v2-tiny-ava-sparse-30-0001
yolo-v2-tiny-ava-sparse-60-0001
yolo-v2-tiny-tf
yolo-v2-tiny-vehicle-detection-0001
yolo-v3-tf
yolo-v3-tiny-tf
-
architecture_type = yolov3-onnx
yolo-v3-onnx
yolo-v3-tiny-onnx
-
architecture_type = yolov4
yolo-v4-tf
yolo-v4-tiny-tf
-
architecture_type = yolof
yolof
-
architecture_type = yolox
yolox-tiny
注: 各種デバイス向けのモデル推論サポートの詳細については、インテルの事前トレーニング・モデルのデバイスサポートとパブリックの事前トレーニング・モデルのデバイスサポートの表を参照してください。
実行¶
-h
オプションを指定してアプリケーションを実行すると、使用方法が表示されます。
usage: object_detection_demo.py [-h] -m MODEL -at
{centernet,detr,ctpn,faceboxes,nanodet,nanodet-plus,retinaface,retinaface-pytorch,ssd,ultra_lightweight_face_detection,yolo,yolov4,yolof,yolox,yolov3-onnx}
-i INPUT [--adapter {openvino,ovms}]
[-d DEVICE] [--labels LABELS] [-t PROB_THRESHOLD]
[--resize_type {standard,fit_to_window,fit_to_window_letterbox}]
[--input_size INPUT_SIZE INPUT_SIZE] [--anchors ANCHORS [ANCHORS ...]]
[--masks MASKS [MASKS ...]] [--layout LAYOUT]
[--num_classes NUM_CLASSES][-nireq NUM_INFER_REQUESTS] [-nstreams NUM_STREAMS]
[-nthreads NUM_THREADS] [--loop] [-o OUTPUT] [-limit OUTPUT_LIMIT] [--no_show]
[--output_resolution OUTPUT_RESOLUTION] [-u UTILIZATION_MONITORS]
[--reverse_input_channels] [--mean_values MEAN_VALUES MEAN_VALUES MEAN_VALUES]
[--scale_values SCALE_VALUES SCALE_VALUES SCALE_VALUES] [-r]
Options:
-h, --help Show this help message and exit.
-m MODEL, --model MODEL
Required. Path to an .xml file with a trained model or
address of model inference service if using OVMS adapter.
-at, --architecture_type Required. Specify model' architecture type. Valid values are {centernet,detr,ctpn,faceboxes,nanodet,nanodet-plus,retinaface,retinaface-pytorch,ssd,ultra_lightweight_face_detection,yolo,yolov4,yolof,yolox,yolov3-onnx}.
-i INPUT, --input INPUT
Required. An input to process. The input must be a
single image, a folder of images, video file or camera id.
--adapter {openvino,ovms}
Optional. Specify the model adapter. Default is
openvino.
-d DEVICE, --device DEVICE
Optional. Specify the target device to infer on; CPU or
GPU is acceptable. The demo
will look for a suitable plugin for device specified.
Default value is CPU.
Common model options:
--labels LABELS Optional. Labels mapping file.
-t PROB_THRESHOLD, --prob_threshold PROB_THRESHOLD
Optional. Probability threshold for detections
filtering.
--resize_type {standard,fit_to_window,fit_to_window_letterbox}
Optional. A resize type for model preprocess. By default used model predefined type.
--input_size INPUT_SIZE INPUT_SIZE
Optional. The first image size used for CTPN model
reshaping. Default: 600 600. Note that submitted
images should have the same resolution, otherwise
predictions might be incorrect.
--anchors ANCHORS [ANCHORS ...]
Optional. A space separated list of anchors. By default used default anchors for model. Only
for YOLOV4 architecture type.
--masks MASKS [MASKS ...]
Optional. A space separated list of mask for anchors. By default used default masks for model.
Only for YOLOV4 architecture type.
--layout LAYOUT Optional. Model inputs layouts. Ex. NCHW or
input0:NCHW,input1:NC in case of more than one input.
--num_classes NUM_CLASSES
Optional. Number of detected classes. Only for NanoDet, NanoDetPlus
architecture types.
Inference options:
-nireq NUM_INFER_REQUESTS, --num_infer_requests NUM_INFER_REQUESTS
Optional. Number of infer requests
-nstreams NUM_STREAMS, --num_streams NUM_STREAMS
Optional. Number of streams to use for inference on
the CPU or/and GPU in throughput mode (for HETERO and
MULTI device cases use format
<device1>:<nstreams1>,<device2>:<nstreams2> or just
<nstreams>).
-nthreads NUM_THREADS, --num_threads NUM_THREADS
Optional. Number of threads to use for inference on
CPU (including HETERO cases).
Input/output options:
--loop Optional. Enable reading the input in a loop.
-o OUTPUT, --output OUTPUT
Optional. Name of the output file(s) to save. Frames of odd width or height can be truncated. See https://github.com/opencv/opencv/pull/24086
-limit OUTPUT_LIMIT, --output_limit OUTPUT_LIMIT
Optional. Number of frames to store in output.
If 0 is set, all frames are stored.
--no_show Optional. Don't show output.
--output_resolution OUTPUT_RESOLUTION
Optional. Specify the maximum output window resolution
in (width x height) format. Example: 1280x720.
Input frame size used by default.
-u UTILIZATION_MONITORS, --utilization_monitors UTILIZATION_MONITORS
Optional. List of monitors to show initially.
Input transform options:
--reverse_input_channels REVERSE_CHANNELS
Optional. Switch the input channels order from
BGR to RGB.
--mean_values MEAN_VALUES
Optional. Normalize input by subtracting the mean
values per channel. Example: 255.0 255.0 255.0
--scale_values SCALE_VALUES
Optional. Divide input by scale values per channel.
Division is applied after mean values subtraction.
Example: 255.0 255.0 255.0
Debug options:
-r, --raw_output_message
Optional. Output inference results raw values showing.
オプションの空のリストを指定してアプリケーションを実行すると、上記の使用法メッセージとエラー・メッセージが表示されます。
次のコマンドを使用すると、事前トレーニングされたオブジェクト検出モデルを使用して GPU で推論を実行できます。
python3 object_detection_demo.py \
-d GPU \
-i <path_to_video>/inputVideo.mp4 \
-m <path_to_model>/efficientdet-d0-tf.xml \
-at ssd \
--labels <omz_dir>/data/dataset_classes/voc_20cl_bkgr.txt
推論要求数は -nireq
フラグで指定します。この場合、デバイスが並列処理をサポートしていれば複数の推論要求を同時に処理できるため、この数を増やすとパフォーマンス (スループット) の向上につながります。ただし、推論要求数が多いと、各フレームの推論送信まで待機する必要があるため、待ち時間が増加します。
FPS を高めるには、使用するすべてのデバイスの合計値である -nstreams
値をわずかに上回るように -nireq
を設定することを推奨します。
注: このデモは、OpenVINO™ ランタイム API からのコールバック機能に基づいています。選択したアプローチにより、デバイスのパフォーマンスの違いによって生じる待機遅延が防止され、マルチデバイス・モードでの実行が最適化されます。ただし、Python API のコールバック・メカニズムの内部構成により、FPS が低下します。これに留意して、パフォーマンスが重要な場合にはこのデモの C++ バージョンを使用してください。
注: 単一の画像を入力として指定すると、デモはすぐに処理してレンダリングし終了します。推論結果を画面上で継続的に視覚化するには、
loop
オプションを適用します。これにより、単一の画像がループで処理されます。
-o
オプションを使用すると、処理結果を Motion JPEG AVI ファイル、または別の JPEG または PNG ファイルに保存できます。
処理結果を AVI ファイルに保存するには、
avi
拡張子を付けた出力ファイル名を指定します (例:-o output.avi
)。-
処理結果を画像として保存するには、出力画像ファイルのテンプレート名を拡張子
jpg
またはpng
で指定します (例:-o output_%03d.jpg
)。実際のファイル名は、実行時に正規表現%03d
をフレーム番号に置き換えることによってテンプレートから構築され、output_000.jpg
、output_001.jpg
などになります。カメラなど連続入力ストリームでディスク領域のオーバーランを避けるため、limit
オプションを使用して出力ファイルに保存されるデータの量を制限できます。デフォルト値は 1000 です。これを変更するには、-limit N
オプションを適用します。ここで、N
は保存するフレームの数です。
注: Windows* システムには、デフォルトでは Motion JPEG コーデックがインストールされていない場合があります。この場合、OpenVINO ™ インストール・パッケージに付属する、
<INSTALL_DIR>/opencv/ffmpeg-download.ps1
にある PowerShell スクリプトを使用して OpenCV FFMPEG バックエンドをダウンロードできます。OpenVINO ™ がシステムで保護されたフォルダーにインストールされている場合 (一般的なケース)、スクリプトは管理者権限で実行する必要があります。あるいは、結果を画像として保存することもできます。
OpenVINO モデルサーバーの実行¶
OpenVINO モデルサーバーで提供されるモデルを使用してデモを実行することもできます。OVMS を使用したデモの実行については、OVMSAdapter
を参照してください。
コマンド例:
python3 object_detection_demo.py \
-i <path_to_video>/inputVideo.mp4 \
-m localhost:9000/models/object_detection \
-at ssd \
--labels <omz_dir>/data/dataset_classes/voc_20cl_bkgr.txt \
--adapter ovms
デモの出力¶
このデモでは、OpenCV を使用して、検出された結果のフレームを表示します (境界ボックスとラベルが提供されている場合は、それらとしてレンダリングされます)。デモレポート
FPS: ビデオフレーム処理の平均レート (1 秒あたりのフレーム数)。
レイテンシー: 1 フレームの処理 (フレームの読み取りから結果の表示まで) に必要な平均時間。
-
次の各パイプライン・ステージのレイテンシー:
デコード — 入力データをキャプチャー。
前処理 — 推論のためのデータの準備。
推論 — 入力データ (画像) を推論して結果を取得。
後処理 — 出力用の推論結果を準備。
レンダリング — 出力画像を生成。
これらのメトリックを使用して、アプリケーション・レベルのパフォーマンスを測定できます。