病院、飲食店、家電量販店など、最近はさまざまな場所で顔認証が使われています。
コンピュータで画像や動画などの視覚的な情報を処理するアプリを「コンピュータ・ビジョン・アプリケーション」と呼びますが、OpenVinoを使えばパソコンで簡単に実現できます。
今回は、OpenVinoの説明とインストール方法、デモプログラムを通して基本的な使い方について解説します。
ここまで全体を網羅しているサイトはあまり見かけないので、これからOpenVINOを始めようとする方は、参考になるかと思います。
OpenVinoとは
OpenVinoは、インテル製のCPUやその他デバイスでコンピュータ・ビジョン・アプリケーションを高速に動作させるためのツールキットです。
動画や画像に映る顔を認識し、人物を特定したり表情を分析する場合、ディープラーニング(深層学習)を用いたAI(モデル)が使われます。
ディープラーニングはモデル作成時(学習時)の計算量が非常に多く、NVIDIA社のビデオカード(GPU)をパソコンに増設して処理させる方法が主流です。
一方、モデル利用時(分類や予測などの処理、いわゆる「推論」を行う時)では、モデル作成時ほどの計算量は必要ないものの、例えば自動運転や工場の製品良否判定などミリ秒単位の推論速度が必要なケースが多々あります。
インテルは自社のCPUや、内臓GPU(CPUに統合されたビデオ機能)の性能を最大限に引き出し、ディープラーニングを用いた推論が高速に処理できるツールキット「OpenVino」を開発しました。
OpenVINOの登場で、NVIDIA社のGPUを搭載したパソコンを設置するほどのスペースや、導入コストが無い場合においても、インテル製パソコンであれば、そこそこの速度で推論を行わせることが可能となりました。
OpenVinoはインテルから無料で配布され、誰でもすぐに自分のパソコンにインストールして使うことが可能です。
インテル製CPUを搭載しているパソコンにおいて、そのCPUやGPUの性能を最大限に活かせるという点で、アドバンテージがあります。
OpenVINOの仕組み
OpenVINOは、インテル製CPUやGPUなどのハードウェアでディープラーニングによる推論を行わせるため、用途に応じていくつものツールやライブラリで構成されています。
しかし、コアとなる部分は「モデル変換」、「推論エンジン」、「プラグイン」の3つです。
- モデル変換:他のフレームワークで開発されたモデルをOpenVINO専用フォーマット(IR形式)に変換
- 推論エンジン:変換済みモデルを使って推論を実行する。C,C++,Pythonをサポート。
- プラグイン:ハードウェアの違いを吸収。CPU,GPU,iGPU,VPU,FPGAをサポート
IR形式とは
OpenVINOで利用するには、IR形式と呼ばれるフォーマットに変換する必要があります。変換後は bin、mapping、xml の拡張子を持つ3つのファイルが出来上がります。
このうち、推論時に bin と xml は必須ですが、mapping は特に必要ありません。(デモプログラムに添付されているモデルには、mapping は同梱されていません)
OpenVINOの特徴
主な特徴として次のものがありあます。
- 推論に特化
- ハードウェアへの最適化
- モデルの最適化
- 多くのハードウェアをサポート
- 主要なフレームワークのサポート
- クロスプラットフォーム
- 多彩な事前学習済みモデル
推論に特化
あくまでも、他の方法で作成されたAIモデルを使って推論(認識、特定、分類など)に特化したツールキットであり、ゼロからAIモデルを開発する用途には使えません。
ハードウェアへの最適化
OpenVinoはINTELのCPUやGPUに最適化されているため、他のに比べて数倍ほど速く処理(推論)が出来ます。
モデルの最適化
OpenVinoはCPUやGPUへの最適化だけでなく、モデルそのものも最適化してくれるため、更なる処理速度の向上が期待できます。
ハードウェアのサポート
いずれもインテル製に限りますが、CPU、iGPU(CPU内臓のGPU)、GPU、VPU、FPGAというハードウェアをサポートしています。
VPUは、Vision Processing Unitの略で、画像処理に特化した専用ICチップです。GPUは3Dグラフィックを表示するために開発されているのに対し、VPUは画像認識や物体検知などAI処理に特化しています。
FPGAは、Field Programmable Gate Array の略で、いつでも中身が書き換え可能なICチップです。「ハードウェア言語」を使って論理回路同士の接続を定義できるため、AIに必要な演算処理をハードウェアで作ることが可能で、低電力で高速に演算できるメリットがあります。
主要なフレームワークのサポート
現在サポートされているディープラーニングのフレームワークとして、TensorFrow、PaddlePaddle、Pytorch、Caffe、ONNX、Keras があります。
言い換えると、これらを使って作成したモデルは、OpenVINOのモデルオプティマイザー(Model Optimizer)ツールを使ってOpenVINO形式のフォーマットに変換可能です。
クロスプラットフォーム
Windows、macOS、Linux に対応しています。
多彩な事前学習済みモデル
OpenVino のインストーラーには、よく使われる学習済みモデルとサンプルプログラム(OpenVino Model Zoo)が同梱されているほか、付属のモデルダウンローダーを使えば数多くの学習済みモデルをダウンロード(https://storage.openvinotoolkit.org/)できます。
OpenVINOで出来ること
OpenVINOで出来ることを一覧にまとめてみました。
推論タスク | 説明 | サポートするフレームワーク |
---|---|---|
画像分類 | 画像を与えられたクラスに分類する | Caffe、TensorFlow、ONNX、MXNet |
物体検出 | 画像内の物体を検出して、その位置をバウンディングボックスで囲む | Caffe、TensorFlow、ONNX、MXNet |
顔検出/顔認識 | 画像内の顔を検出し、個々の顔を認識する | Caffe、TensorFlow、ONNX、MXNet |
姿勢推定 | 人物の姿勢を推定し、骨格の検出とポーズの予測を行う | Caffe、TensorFlow、ONNX、MXNet |
セマンティック・セグメンテーション | 画像内の各ピクセルを異なるカテゴリに分類する | Caffe、TensorFlow、ONNX、MXNet |
インスタンス・セグメンテーション | 画像内の各ピクセルに対して、別々の物体インスタンスを割り当てる | TensorFlow |
キーポイント検出 | 画像内の物体の特定のポイントを検出する | Caffe、TensorFlow、ONNX、MXNet |
OCR | 光学文字認識を行い、テキストを抽出する | TensorFlow |
自然言語処理(NLP)タスク | テキストを分類、質問応答、機械翻訳などのタスクを実行する | TensorFlow、ONNX、MXNet |
OpenVINOのメリット、デメリット
OpenVINOのメリット、デメリットは以下の通りです。
メリット | デメリット |
---|---|
インテルのハードウェア性能を最大限に活かして 高速(数倍)速く推論が実行できる | インテルのハードウェア以外はサポートされない |
学習済みモデルやデモアプリが豊富 | 学習済みモデルのカスタマイズや再学習が困難 |
モデルの最適化が行えるため、より速く推論が可能 | 元のモデルに比べて精度が低下する場合がある |
他のフレームワークで作成したモデルを、OpenVINOのモデルオプティマイザーで変換する必要がありますが、この過程でインテルのアーキティクチャに最適化すると同時に、モデルの中身も最適化されます。
つまり、モデルオプティマイザーで変換した時点で多少なりとも元のモデルとは異なってしまうため、処理速度は向上しても、モデルの精度が低下してしまう可能性があります。
OpenVINOのインストール方法
ここでは、OSにWindows11を、言語にPythonを選択した場合のインストール方法を解説します。
前提条件として、既にPythonがインストールされている必要があります。まだインストールされていない場合は、「【初心者必見】Pythonインストールはどれを選べばいい?」の記事を参考にインストールしておいてください。
OpenVINOは、下記の公式サイトからダウンロードできます。リンクをクリックすると、ダウンロードページに移動します。
尚、OpenVINOには開発環境(Development Tool)と実行環境(Runtime)の2種類が用意されています。開発環境には実行環境が含まれていますので、開発環境をインストールすれば実行環境のインストールは不要です。
逆にIRフォーマットのモデルが既に用意されており、推論だけを行わせたいのであれば、実行環境のみをインストールします。
既存のPython環境に開発環境(Development Tools)をインストールする
表示されるダウンロードページに対して5つの項目を選択すると、必要なインストール方法が画面下部に表示されます。
選択項目 | 選択肢 |
---|---|
Enviroment | Development Toools(開発環境)、Runtime(実行環境)のいずれかを選択。 通常はRuntimeとツールが同梱されるDevelopment Tooolsを選択すれば良い。 |
OperatingSystem | Windows,macOS、Linuxのいずれかを選択。 今回はWindowsを選択した。 |
Version | OpenVinoバージョンのいずれかを選択。 通常は最新バージョン(2023年5月時点で 2022.3)を選択すれば良い。 |
Distribution | インストールする方法を PiP、GitHub、Glteeのいずれかを選択。 Pythonの場合はPiPを選択する。 |
Frameworks | モデル作成元のフレームワークを必要な分だけ選択する。 今回はONNX,PyTorch、TensorFlow2.xを選択した。 |
今回のケースでは以下の4つのコマンドを実行することでOpenVINOをインストールできます。
python -m venv openvino_env
openvino_env\Scripts\activate
python -m pip install --upgrade pip
pip install openvino-dev==2022.3.0
表示されたインストール方法は、Anacondaではなく本家のPython上で仮想環境(openvino_env)を作成し、その上に開発環境(openvino-dev)をインストールするという手順になります。
PythonをAnaconda経由でインストールされている場合、下記のコマンドで仮想環境を構築して下さい。それ以外は同じです。
conda create -n openvino_env
Pythonポータブル環境に開発環境(Development Tools)をインストールする
前述のOpenVINOインストール方法では、Pythonに仮想環境を作成し、そこにOpenVINOをインストールしていました。
もう1つの方法として、「【お手軽】WinPython+Portable Gitでお手軽Python環境を構築しようよ」の記事で紹介したポータブルPython環境を作り、そこにOpenVINOをインストールする方法があります。
この方法を選択するメリットは次の通りです。
- 簡単にOpenVINO開発環境が構築できる
- 既にあるPython環境に影響を及ぼさない
- USBに入れておけば、どこのパソコンでも即く実行できる
WinPythonの公式サイトから最新版(WinPython_3.11)をインストールしても良いのですが、同梱されるPythonライブラリのバージョンにOpenVINOが対応しない可能性があるので、今回は無難なところで Winpython64-3.8.9.0.exe(Python 3.8.9同梱) をインストールしました。
Winpython64-3.8.9.0.exeは、こちらのURLからダウンロードできます。
ダウンロードしたファイルは自己解凍形式になっているので、実行すると解凍先のフォルダを聞いてきます。
任意の場所を指定すると、WPy64-3890というフォルダが作成され、Python環境一式が格納されます。
次に、解凍先フォルダにある WinPython Command Prompt.exe を実行するとコマンドプロンプトが表示されますので、ここからコマンドを実行します。
WinPython自身が閉じた環境なので、仮想環境を作る必要は特にありません。次のコマンドを実行するだけでWinPython環境にOpneVINOがインストールされます。
python -m pip install --upgrade pip
pip install openvino-dev==2022.3.0
インストールに成功すると、次のフォルダにOpenVINO関連のツール類が格納されています。
開発環境にインストールされるモジュール
開発環境(openvino-dev)をインストールすると、以下のモジュールが同時にインストールされます。
コンポーネント名 | 説明 |
---|---|
Model Optimizer | モデル変換、最適化ツール |
OpenVINO Runtime | OpenVINOのランタイム(推論エンジン) |
Post-Training Optimization Tool | トレーニング後の最適化ツール |
Benchmark Tool | ベンチマーク ツール |
Accuracy Checker and Annotation Converter | 精度チェッカーとアノテーションコンバーター |
Model Downloader and other Open Model Zoo tools | Model Downloader およびその他の Open Model Zoo ツール |
実行環境(Runtime)をインストールする
OpenVINOの実行環境は、開発環境と同じく 公式サイトからダウンロードできます。
選択項目をマウスで選ぶと、画面下に「Downlad Archives」のボタンが表示されます。
ボタンをクリックすると下記のページに移動しますので、赤枠をクリックし、ZIPファイルをダウンロードしてください。
ダウンロード後、任意のフォルダに解凍します。下記は解凍後のフォルダ構成です。
setupvars.bat というバッチファイルがあるので、これを実行すれば、推論に必要なOpenVINOランタイムへのパスが設定され、OpenVINOで推論が出来るようになります。
GitHubで公開されている OpenVINO ToolKit
Jupyter Notebook で簡単に試せるOpenVINOのデモプログラム(openvio_notebooks)や、OpenVINOで利用可能なモデル(open_model_zoo)など、いくつかのツールキットがGitHub上に公開されています。
https://github.com/openvinotoolkit
OpenVINOの使い方
OpenVINOのチュートリアルが下記URLに記載されていますので、詳細は下記URLからご確認下さい。
Nootbookを使ったデモの実行
GitHubで公開されているOpenVINOのデモプログラム(openvio_notebooks)を使ってデモの実行方法を紹介します。
下記のリンクをクリックすると、GitHubのリポリトジ画面が表示されます。Download.Zipをダウンロードし、お使いのJypeter Notebookが参照できるフォルダに解凍して下さい。
https://github.com/openvinotoolkit/openvino_notebooks
解凍した結果は下記のフォルダ構成になっています。 70種類のデモが格納されていますので、各フォルダ内に格納されているNotebookのファイルを開いて実行してください。
下記は、「001-hello-world」を選んで実行した結果です。
open model zooを使ったデモの実行
GitHubで公開されている「Open Model Zoo」はOpenVINOで利用可能なモデルとデモが格納されています。下記リンクでGitHubのリポリトジに移動し、Downlad.zipをダウンロード後、任意のフォルダに解凍して下さい。
https://github.com/openvinotoolkit/open_model_zoo
Open Model Zoo は OpenVINO形式ではないモデルが数多く公開されていますので、モデルオプティマイザー(mo.exe)を使ってIR形式へのフォーマット変換が必要になります。
今回は、Open Model Zooの demos フォルダに格納されている 3d_segmentation_demo を使って、「モデルのダウンロード → モデルの変換 → データの準備 → 推論の実行」という一連の手順について説明します。
最初に見つけたデモなのですが、脳腫瘍の部位をセグメンテーションするデモでした。この記事を書きながらデモの内容に気付いたのですが、もう少し簡単で軽いデモを選べばよかったと後悔しています。
ただ、医療画像には私も馴染みが無いので、この題材を取り上げることにしました。
デモの詳細については、下記のURLに記載されていますので、必要に応じてご参照下さい。
https://docs.openvino.ai/latest/omz_demos_3d_segmentation_demo_python.html
また、今回の動作検証は Winpython64-3.8.9.0.exe で作ったPythonポータブル環境上に OpenVINOの開発環境をインストールしたものを使っています。
必要に応じてご自身の環境に読み替えてください。
モデルのダウンロード
私の環境において、 Downlad.zip を Open Model Zoo をPドライブ直下の zoo フォルダに解凍しましたので、以下のフォルダ構成になっています。
3d_segmentation_demo フォルダには、デモのPythonプログラム(3d_segmentation_demo.py) とモデルリスト(models.lst)が格納されています。
models.lst には、このデモで必要なモデル名(実際はダウンロード対象モデルのみダウンロードさせるためのフィルター定義)が記載されています。
これを、 omz_downloader.exe コマンドの引数に渡して実行することで、モデルがダウンロードできます。
omz_downloader --list models.lst -o ダウンロード先フォルダ
omz_downloader --list P:\zoo\open_model_zoo-master\demos\3d_segmentation_demo\python\models.lst -o p:\3d_segmentation
引数 | 説明 |
---|---|
-h, --help | ヘルプメッセージを表示して終了 |
--name PAT[,PAT...] | 指定されたパターンの少なくとも一つに一致するモデルのみダウンロード |
--list FILE.LST | 指定されたファイル内のパターンに一致するモデルのみダウンロード |
--all | 利用可能なすべてのモデルをダウンロード |
--print_all | 利用可能なすべてのモデルを表示 |
--precisions PREC[,PREC...] | 指定された精度のモデルのみダウンロード(DLDTネットワークに対して有効)。FP32-INT1、FP16-INT8、FP32-INT8、FP16-INT1、FP16、FP32のいずれかを指定 |
-o DIR, --output_dir DIR | モデルを保存するパスを指定 |
--cache_dir DIR | ダウンロードしたファイルのキャッシュとして使用するディレクトリを指定 |
--num_attempts N | 各ダウンロードを最大N回まで試行 |
--progress_format {text,json} | プログレスレポートに使用するフォーマットを指定(textまたはjson) |
-j N, --jobs N | 並行して実行するダウンロードの数を指定 |
これで p:\3d_segmentation フォルダにモデルがダウンロードできました。
モデルの変換
次に、ダウンロード先のフォルダからONNXファイル(拡張子 ONNX)を探し、om コマンドでOpenVINO形式(IRフォーマット)に変換します。
mo -m モデルファイル名 -o 変換済みモデルの出力先フォルダ --framework モデル作成元のフレームワーク
私の環境では下記の場所に ONNXファイルが格納されていましたので、このファイルを変換します。
mo -m P:\3d_segmentation\public\brain-tumor-segmentation-0002\brain-tumor-segmentation-0002.onnx -o p:\3d_segmentation_ir --framework onnx
これで p:\3d_segmentation_ir フォルダに変換済みモデル(IRフォーマット)が作成できました。
データの準備
OpenVINOのデモで使えるサンプル画像、サンプル動画は下記にURLからダウンロード可能です。
画像 | https://storage.openvinotoolkit.org/data/test_data/images/ |
---|---|
動画 | https://storage.openvinotoolkit.org/data/test_data/videos/ |
今回のデモで利用できる画像は少し特殊で、神経画像データで使われている NifTI フォーマット(拡張子 nii)、もしくは TIFFフォーマットである必要があります上記URLで見つかりませんでした。
しかし、よくよく探したところ、 NifTI フォーマットのサンプル画像は下記URLのGoogleDriveに保存されていました。
https://drive.google.com/drive/folders/1HqEgzS8BV2c7xYNrZdEAnrHk7osJJ--2
Task01_BarinTumour.tar というファイルに1274個のサンプル画像が格納されているので、ダウンロード後に任意のフォルダに解凍してください。ちなみに7GBもありますので、ダウンロードに少々時間が掛かります。
尚、サンプルプログラムから指定できるファイルは1つなので、何個かのファイルを取り出すだけでも構いません。
このサンプル画像は普通では表示できないので、次の章で表示方法についてのサンプルプログラムを紹介していますが、おおよそ下記のような画像だと考えてください(実際は3D画像です)。
もう1つ注意点があってnibabel がインストールされていないとエラーにります。あらかじめインストールしておきましょう。
pip install nibabel
推論の実行
推論は下記の通り Python プログラムに 3d_segmentation_demo.pyのパス、出力先フォルダ、入力画像のパス、モデルファイルのパスを指定して実行します。
python 3d_segmentation_demo.pyのパス -o 出力先フォルダ -i 入力画像のパス -m モデルファイルのパス
python P:\zoo\open_model_zoo-master\demos\3d_segmentation_demo\python\3d_segmentation_demo.py -o p:\result -i P:\BRATS_457.nii.gz -m P:\3d_segmentation_ir\brain-tumor-segmentation-0002.xml
-m オプションでは、IRフォーマット変換済みの P:\3d_segmentation_ir\brain-tumor-segmentation-0002.xml を指定しています。
-i オプションでは、pドライブのルートに置いた BRATS_457.nii という画像ファイルを指定しています。
-o オプションでは、p:\result フォルダを指定していますが、実行時にこのフォルダが無いとエラーになるため、事前に作成しておきましょう。
3d_segmentation_demo.pyを実行した結果、p:\result フォルダに、 output.tiff という画像が作成されています。
真っ黒で何が何だか分かりませんね。入力画像を適当に選んだだけなので真っ黒な画像しか出力されていませんが、ほかの画像を試していけば、そのうち何か表示されるのかもしれません。
今回は手順の説明なので、これで良しとさせて下さい。
NifTI フォーマットについて
NifTI フォーマットは神経画像データで使われていると申しましたが、詳しくはMRIでスキャンした脳の立体画像を格納するフォーマットです。
参考までに、2次元画像、及び立体画像で表示するPythonのプログラムを紹介しておきます。
2次元画像の表示
最初に次のモジュールをインストールしておいて下さい。
pip install SimpleITK
2次元画像として表示するサンプルプログラムです。sitk.ReadImage("p:/BRATS_457.nii") の部分 を任意の niiファイルに変更してください。
# nii形式の画像ファイルを読み込む
img = sitk.ReadImage("p:/BRATS_457.nii")
# 画像をnumpy配列に変換する
img_array = sitk.GetArrayFromImage(img)
img_array = img_array[2, :, :, :]
# 画像の中央スライスを取得する
slice = img_array[img_array.shape[0]//2,:,:]
# 画像を表示する
plt.imshow(slice, cmap="gray")
plt.show()
img_array[2, :, :, :] で4次元データの中から、1つの3次元データを指定しています。
今回は 2 を指定していますが、いくつか表示した中で一番良さそうだった画像を選んでいるだけで、それ以外の根拠はありません。
立体画像の表示
最初に次のモジュールをインストールしておいて下さい。
pip install SimpleITK
pip install mayavi
下記がりった表示するプログラムです。sitk.ReadImage("p:/BRATS_457.nii") の部分 を任意の niiファイルに変更してください。
また、データが4次元配列のようで、img_array[2, :, :, :] で2 を指定している理由は、2次元画像の表示で説明した通りです。
import SimpleITK as sitk
from mayavi import mlab
# nii形式の画像ファイルを読み込む
img = sitk.ReadImage("p:/BRATS_457.nii")
# 画像をnumpy配列に変換する
img_array = sitk.GetArrayFromImage(img)
img_array = img_array[2, :, :, :]
# 3Dボリュームプロットで画像を表示する
mlab.pipeline.volume(mlab.pipeline.scalar_field(img_array), vmin=100)
mlab.show()
実行すると下記の様に、マウスで立体画像を拡大/縮小したり、グリグリ回すことができます。
まとめ
今回はOpenVINOについて、概要とメリット・デメリット、JypeterNoteBookを使ったデモプログラムの実行方法、モデルのダウンロードから推論までの一連の手順について解説しました。
OpenVINOはディープラーニングで作られたAI(モデル)を使って、インテル製CPU/GPUで高速に推論を処理させるためのツールキットです。
あくまでも推論を行うだけであって、モデル作成はTensorFlowやPytorchなど、他のフレームワークを使って作成する必要があります。
他のフレームワークで作成したモデルをOpenVINO形式(IRフォーマット)に変換することでOpenVINOで推論できるのですが、この変換作業によってインテル製CPUに最適化(併せてモデルも最適化)されるため、通常より数倍高速に処理できる反面、オリジナルのモデルよりも精度が落ちる場合もあります。
とはいえ、GPUを入れるほどではないが、通常のCPUでは能力が足りないようなケースでは威力を発揮するため、エッジコンピューティング(自動運転や工場の設備など、末端に設置された機器)における推論で使われています。
コンピュータ・ビジョン・アプリケーション開発を行う際は、是非参考にしてください。
コメント