本記事は、インテル® NUCを活用したエッジAIカメラ「SCORER Traffic Counter Edge」の映像解析ノウハウを解説!からの続きです。
目次
4.OpenVINOによる物体検知の高速化
4-1.YOLOv4のモデルファイルを準備する
4-2. Keras形式へ変換する
4-3. TensorFlow 形式へ変換する
4-4. OpenVINO IR FP32形式へ変換する
4-5. OpenVINO IR INT8 形式へ変換する
4-6.非同期APIで推論速度を更に高速化
5.アルゴリズムのさらなる性能向上に向けて
5-1.Scaled YOLOv4-p6 1280x1280
5-2.YOLOv7
5-3.フレームレートの比較
6.まとめ
4.OpenVINOによる物体検知の高速化
本製品は、第11世代Intel CPUで提供されているIntel Iris Xeグラフィックスと OpenVINO によって、初めて実現可能になったと思います。OpenVINOを利用することで、Intel Iris Xeグラフィックス上で推論が行なえます。
弊社は過去に8世代のIntel NUCで、類似製品の開発を試みたことがありますが、当時のアルゴリズムと、それを動かすことのできるCPU / GPU性能がネックとなり、Traffic Counter Edgeほどの性能を実現できませんでした。特に、YOLOv4には精度重視のモデルを選んでいるため、動画解析には本格的な外付けGPUボードが欲しくなります。しかし、OpenVINOが提供するINT8最適化により、精度を犠牲にせずにモデルを高速化できました。また、Intel Iris Xeグラフィックスの計算能力の高さもあって、カメラ3台の同時解析という製品要件を実現しました。
それでは、Intel Iris Xe / OpenVINOでYOLOv4を動かすまでの手順を見ていきます。
概観としては、最初にYOLOv4のモデルファイル(Darknet形式)を用意し、順々にファイル形式を変換、最終的にOpenVINO IR INT8形式 のモデルファイルを手に入れます。このモデルファイルをOpenVINOの推論エンジンに渡し、Intel Iris Xe上でYOLOv4を動かすことができるようになります。
<YOLOv4のINT8モデルを生成する流れ>
4-1.YOLOv4のモデルファイルを準備する
YOLOにはいくつかの実装がありますが、本製品では、Alexey Bochkovskiy 氏のOSS実装を学習に利用させて頂いています。このレポジトリの README.md にしたがって、交通量計測用データセットを学習させ、モデルファイルを生成します。
実際に変換作業をしてみたい方のため、本記事ではMS COCOデータセットのモデルファイルで代替してみます。モデルファイルはこちらからダウンロードしてください(245.78MBあります)。モデルの構成ファイルとカテゴリー定義ファイルも必要になるので、併せてダウンロードしておきます。
モデルファイル(Darknet形式) | yolov4.weights |
構成ファイル | yolov4.cfg |
カテゴリー定義ファイル | coco.names |
本記事では、OSにUbuntu 18.04 LTS Bionic の Docker コンテナを使って、手順の検証をしました(説明を簡単にするためroot権限でコンテナを起動)。OSは、後ほどOpenVINO を利用するので、OpenVINOの推奨OSリストから選ぶと良いと思います。
- apt-get update
- apt-get install -y wget git python3-pip libgl1-mesa-dev mkisofs unzip
- cd ~
- wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights
- wget https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov4.cfg
- wget https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/coco.names
この段階で、あとから必要になるパッケージ(python3-pip等)もインストールしています。なお、OpenVINOをプレインストールした公式のDockerイメージもありますので、興味のある方は、そちらで試してみても良いかもしれません。
4-2.Keras形式へ変換する
OpenVINOはDarknet形式のモデルファイルを直接処理できないため、まずはKeras HDF5形式へ変換します。変換ツールには、david8862氏の公開しているTF Keras YOLOv4/v3/v2 Modelsetを利用させてもらいました。このツールは、少し改造するとYOLOv7 にも対応できる便利なツールです。
まず、Python Virtualenv でサンドボックス環境を作り、依存関係をインストールします。“source work/bin/activate” を実行すると、ターミナルのプロンプトが変化するので、サンドボックス環境に入ったとわかります。直後にOpenVINO をインストールしているのは、変換ツールが OpenCVを要求するためです。OpenCVはOpenVINOに含まれます。なお、途中のTokenizersのインストールでエラーがでるかもしれませんが、今回は影響しないので、無視して大丈夫です。
- python3 -m pip install --upgrade pip
- pip3 install virtualenv
- virtualenv --system-site-packages -p python3 ./work
- source work/bin/activate
- python3 -m pip install --upgrade pip
- pip install openvino-dev~=2021.4
- pip install tensorflow-cpu~=2.4.1
- pip install keras_applications
- pip install matplotlib
次に david8862氏の変換ツールをGitHubからクローンします。この記事では、2022/9/27 のコミットを利用しました。
- git clone --single-branch https://github.com/david8862/keras-YOLOv3-model-set.git
- cd keras-YOLOv3-model-set/
- git checkout 20e9abf074b897d7f6cc03e237b7c3b43c07a5d2
最後にモデルファイルを変換します。上記のコマンドにより、カレントディレクトリはkeras-YOLOv3-model-set/ に移動している想定なので、ご注意ください。
- python3 ./tools/model_converter/convert.py \
- --yolo4_reorder ../yolov4.cfg ../yolov4.weights ../yolov4.h5
モデルファイル(Keras形式) | yolov4.h5 |
アンカー情報ファイル | yolov4_anchors.txt |
4-3.TensorFlow 形式へ変換する
Keras形式のモデルファイル(.h5)が得られたので、次にTensorFlow形式へ変換します。この変換ツールも、david8862氏のレポジトリに含まれています。
- python3 ./tools/model_converter/keras_to_tensorflow.py \
- --input_model ../yolov4.h5 --output_model ../yolov4.pb
この変換の結果、以下のファイルが生成されます。
モデルファイル(TensorFlow形式) | yolov4.pb |
4-4.OpenVINO IR FP32形式へ変換する
TensorFlow形式のモデルファイル(.pb)が得られたので、漸くOpenVINOが読み込めるIntermediate Representation(IR)のFP32 形式へ変換します。
OpenVINOはpipでインストールしたので、TensorFlow形式をIR形式へ変換するモデルオプティマイザ ”mo_tf.py” は、Pythonのsite-packagesディレクトリにあります。
変換には、モデルのネットワークサイズが必要になります。最初にダウンロードしたモデルの構成ファイル yolov4.cfg にwidthとheightの行があるので、そこから抽出します。
YOLOv4のモデルファイル(Darknet形式)は、色がRed-Green-Blue順に並んだ形式のRGB画像で学習されていますが、推論したいのはOpenCVのBlue-Green-Red順に並んだBGR画像なので、OpenVINO IR形式に変換する際に、この辻褄合わせもやってしまいます。これには ”--reverse_input_channels” オプションを使います。
- cd ~
- NET_W=$(awk -F= '$1=="width"{print $2;exit}' yolov4.cfg)
- NET_H=$(awk -F= '$1=="height"{print $2;exit}' yolov4.cfg)
- SITE_PACKAGES=$(python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])')
- python3 $SITE_PACKAGES/mo_tf.py \
- --input_model yolov4.pb \
- --data_type FP32 \
- --input_shape=[1,$NET_H,$NET_W,3] \
- --reverse_input_channels \
- --input=image_input \
- --scale_values=image_input[255] \
- --output_dir .
手元のマシンでは、33秒程で変換が終わり、以下のファイルが生成されました。
モデルファイル(OpenVINO IR形式) | yolov4.bin |
ネットワーク構成ファイル | yolov4.xml |
変換前後のレイヤー対応関係ファイル | yolov4.mapping |
OpenVINOの推論エンジンに、生成された yolov4.bin と yolov4.xml をロードすると、YOLOv4物体検知が可能になります。YOLOv4は、深層学習ネットワークから結果を抽出するロジックが少々特殊なので、サンプルプログラムを用意しました。OpenVINOの公式デモプログラムをシンプルにしたものです。技術的な詳細は、こちらの記事が参考になると思います。(記事はYOLOv3についてですが、大きく違いません)
例えば、画像ファイル sample.jpg に写っている物体を推論するには次のようにします。
- git clone https://github.com/future-standard/blog-articles.git
- python3 ./blog-articles/video-analysis-in-tce/yolov4-openvino.py sample.jpg
推論結果は、入力画像に描かれた矩形としてresult.jpg にダンプされます。
なお、サンプルプログラムでコンソールに表示される Output Layersは、あとで accuracy_check.yml を作成するときに使います。
4-5.OpenVINO IR INT8 形式へ変換する
漸く最後のステップです。OpenVINO IR FP32形式のモデルファイルを、INT8形式へ最適化します。この手順は、INT8 Quantization(INT8量子化)とも呼ばれますが、最近の OpenVINOではINT8 Calibration(INT8最適化)と云うようです。INT8最適化によって、モデルは大幅に小さくなり、推論は高速になります。
一般的に、INT8最適化では乱暴にモデルを小さくすると、精度も大きく劣化してしまいます。そこでOpenVINOでは、変換前後の精度を確認しながら、影響の少ない部分を削って、モデルを小型化してくれます。このプロセスは、OpenVINOのAccuracy CheckerとPost-training最適化ツール(通称POT)によって自動化されています。
精度の確認には、学習で使ったデータセットを使います。この記事ではMS COCOデータセットで学習したyolov4.weightsを使っていますから、MS COCOデータセットをダウンロードしなければなりません。もちろん、Traffic Counter Edgeでは、交通量計測用データセットを用いてINT8最適化を行っています。
まず、Accuracy Checkerを実行し、FP32モデルの精度を確認してみます。そのために Accuracy Checkerのための設定ファイル accuracy_check.yml を作成します。設定ファイルの仕様は、公式サイトで詳しく説明されていますが、本記事ではこちらを使います。
launchers | 推論エンジンの設定を行うセクションです |
framework | OpenVINOモデルファイルを測定するので ”dlsdk” を指定 |
model | 本手順で生成したyolov4.xmlへのパス |
weights | 本手順で生成した yolov4.binへのパス |
adapter | 推論結果の抽出方法を指定します |
type | YOLOv4 は ”yolo_v3” で大丈夫です |
anchors | 本手順で生成した yolov4_anchors.txt から引用 |
classes | 定義したカテゴリー数: 80 |
anchor_masks | 本手順で生成した yolov4_anchors.txt から引用 |
outputs | Accuracy Checkerが接続するモデルの出力レイヤーです (前述のサンプルプログラムで表示してくれます) - conv2d_93/BiasAdd/Add - conv2d_101/BiasAdd/Add - conv2d_109/BiasAdd/Add |
datasets | 精度測定に使うデータセットを定義するセクションです |
data_source | ダウンロードしたデータセットへのパス ./val2017 |
converter | データセットの形式 “mscoco_detection” |
annotation_file | ダウンロードしたデータセットのアノーテーションファイル ./annotations/instances_val2017.json |
preprocessing | 推論にかけるための画像変換です |
dst_width | yolov4.cfg で定義したネットワークサイズにします:608 |
dst_height | yolov4.cfg で定義したネットワークサイズにします:608 |
metrics | 精度の計測方法を指定します |
設定ファイルを作成したら、MS COCOデータセットをダウンロードします。このデータセットは巨大なので、Zipファイルが2つで合計1GB、解凍後1.5GB程度あります。
- wget http://images.cocodataset.org/zips/val2017.zip
- wget http://images.cocodataset.org/annotations/annotations_trainval2017.zip
- unzip -q -o val2017.zip
- unzip -q -o annotations_trainval2017.zip
Accuracy Checker を実行します。スクリプトの名称は “-er” の無い accuracy_check ですのでご注意ください。
- python3 work/bin/accuracy_check --config accuracy_check.yml --async_mode yes
検証に使ったデータセットが巨大なので、手元のマシンでは1時間強かかりました。もしGPUが利用可能なら、大幅な時間短縮になると思います。
- 5000 objects processed in 3933.585 seconds
- map: 72.80%
- AP@0.5: 76.79%
- AP@0.5:0.05:95: 49.70%
Accuracy Checkerが正常終了したことを確認できたら、POTでINT8最適化します。
- ./work/bin/pot --quantize default --preset performance \
- --name yolov4 --model yolov4.xml --weights yolov4.bin \
- --ac-config accuracy_check.yml \
- --evaluate --direct-dump --output-dir ./
約1時間半かかって、ディレクトリ ./optimizedにINT8形式のモデルファイルが生成されました。
モデルファイル(OpenVINO IR形式) | optimized/yolov4.bin |
ネットワーク構成ファイル | optimized/yolov4.xml |
変換前後のレイヤー対応関係ファイル | optimized/yolov4.mapping |
POTのコンソール出力から、INT8最適化後のモデルの精度がわかります。
- INFO:app.run:map : 0.7234796167928825
- INFO:app.run:AP@0.5 : 0.7681224367224806
- INFO:app.run:AP@0.5:0.05:95 : 0.4751606428613006
mAP が 72.8% から 72.3% へ変化しているので、精度はほとんど低下していないとわかります。またINT8化なので、yolov4.binは 246MBから62MBへ約 1/4 になりました。
INT8化してもOpenVINO IR形式ではあるので、サンプルプログラムも動きます。
- cd optimized/
- cp ../coco.names ./
- python3 ../blog-articles/video-analysis-in-tce/yolov4-openvino.py ../sample.jpg
推論結果をみると、物体検知のConfidence値がわずかに変化していることから、変換後のモデルであるとわかります。
4-6.非同期APIで推論速度を更に高速化
弊社では、エッジ側で映像解析を行うための独自ミドルウェア ”SCORER Fog” を開発しており、今回生成したINT8モデルによる推論などをリアルタイムに実行する仕組みを持っています。もちろん、Traffic Counter Edgeで活用していますし、後述の解析フレームレート(1秒間に何枚の画像を推論できるか)の計測にも利用しました。
SCORER FogのYOLO解析モジュールでは、INT8最適化だけではなく、OpenVINOの非同期推論APIを使用しています。Intel Iris Xeグラフィックスを使った解析フレームレートを計測したところ、非同期APIを使うことで、解析フレームレートが2倍近くになることがわかりました。測定方法やモデルに大きく依存しますが、状況によっては大きな効果を発揮する仕組みです。
5.アルゴリズムのさらなる性能向上に向けて
世の中の深層学習アルゴリズムの発展スピードは凄まじいものがあります。Traffic Counter Edgeでも、YOLOv4の後継となるアルゴリズムの検証を開始しています。
5-1.Scaled YOLOv4-p6 1280x1280
YOLOv4 のネットワークを巨大化させたアルゴリズムです。非常に細かい物体も検知できますが、YOLOv4に比べて学習が発散しやすく、推論の計算パワーも必要です。誤検知も若干多めなので、トラッキングはYOLOv4より難しくなりそうです。
以下に、交通量計測用データセットでのアルゴリズムの精度比較を示します。
なお、このアルゴリズムをOpenVINO IR INT8形式に変換した際には、マシンのメモリが16GBでは足りず、変換エラーとなってしまいました。マシンのメモリを32GBへ増設したところ、変換に成功しました。巨大なモデルですね。
5-2.YOLOv7
YOLOv7 は、YOLOv4の正統な進化形で、2022年7月に公開された比較的新しいアルゴリズムです。論文の著者は、現時点での物体検知の最高峰だと主張しています。
最新の研究なので、さすがの精度です。深層学習のネットワークも小さくなっていることから、推論速度・学習しやすさ共に向上しているようです。
以下に、交通量計測用データセットでのアルゴリズムの精度比較を示します。
5-3.フレームレートの比較
OpenVINO で INT8最適化した場合の処理スピードを計測しました。SCORER Edgeから90 fps で映像を流したときに、それぞれのアルゴリズムの解析フレームレートを見ます。
環境はIntel Core™ i7-1165G7 (TigerLake 2.8GHz) を搭載した11世代 Intel NUC で、GPUはIntel Iris Xe グラフィックスです。
計測では、SCORER Fog を使って OpenVINOの推論プロセスを複数生成しました。プロセス数の増加にともない、トータルの解析フレームレートが頭打ちになるのを確認します。表中の記載で、 ”(2)” は、2プロセスの解析フレームレートの合計という意味で、3プロセスでも値はほぼ同一だった(または低下した)という意味です。
ネットワーク | CPU [FP32] | Iris Xe [FP32] | Iris Xe [INT8] | |
YOLOv4 | 416x416 | 6.2 fps (2) | 14.2 fps (2) | 51.5 fps (5) |
Scaled YOLOv4 p6 | 1088x1088 | 0.8 fps (2) | 1.5 fps (2) | 7.1 fps (2) |
YOLOv7 | 416x416 | 8.5 fps (2) | 19.2 fps (2) | 70.7 fps (5) |
INT8 最適化したYOLOv7のスピードは、現在使っているYOLOv4よりも37% 高速でした。交通量の計測では、カメラ1台あたり10 fps ~ 15 fps の解析フレームレートがあれば、トラッキングが切れにくく精度がでやすい傾向にあります。YOLOv7に切り替えるだけで、検知精度も向上し、同時解析できるカメラの台数は5台ぐらいまで増やせそうです!
6.まとめ
昨年10月に販売を開始したSCORER Traffic Counter Edge では、ハードウェアに第11世代のIntel NUCを採用し、CPU内蔵のIntel Iris Xeグラフィックスで映像解析しています。その結果、コンパクトな筐体にもかかわらず、カメラ3台までの同時解析が可能。このときの消費電力は、たったの64Wです。ソフトウェアから見てみると、OpenVINO による INT8最適化が、製品を実現するための重要ファクターでした。
今後さらに、YOLOv7といった最新のアルゴリズムや、第13世代・14世代のIntel NUCを活用していけば、もっと高精度の映像解析を、もっと低い消費電力でコンパクトに提供できるようになるでしょう。
本記事は、2部構成となっております。
記事の前半は、下記リンクよりお読みいただけます。
映像解析AIを使ったビジネスを始めたいパートナー企業を募集していますPARTNER PROGRAM
VARパートナー(付加価値再販)
SCORER Ready等、弊社が用意しているパッケージに対して、導入コンサルティングやマーケティング企画など貴社の強みにあった付加価値をつけて再販いただくパートナー企業です。
インテーグレーションパートナー
貴社の技術力や開発力を活かし、SCORERを活用したサービスの開発や導入支援、導入後のサポート対応を行って頂くパートナー企業です。
※案件は弊社でご紹介いたします。