OpenVINOとYOLOを活用したエッジAIカメラ「SCORER Traffic Counter Edge」の構築ノウハウを公開

AIカメラ

エッジAI

OpenVINOとYOLOを活用したエッジAIカメラ「SCORER Traffic Counter Edge」の構築ノウハウを公開

本記事は、インテル® 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モデルを生成する流れ
<YOLOv4のINT8モデルを生成する流れ>

 

4-1.YOLOv4のモデルファイルを準備する

YOLOにはいくつかの実装がありますが、本製品では、Alexey Bochkovskiy 氏のOSS実装を学習に利用させて頂いています。このレポジトリの README.md にしたがって、交通量計測用データセットを学習させ、モデルファイルを生成します。

実際に変換作業をしてみたい方のため、本記事ではMS COCOデータセットのモデルファイルで代替してみます。モデルファイルはこちらからダウンロードしてください(245.78MBあります)。モデルの構成ファイルカテゴリー定義ファイルも必要になるので、併せてダウンロードしておきます。

モデルファイル(Darknet形式) yolov4.weights
構成ファイル yolov4.cfg
カテゴリー定義ファイル coco.names
<最初に準備する3つのファイル>

本記事では、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
<Ubuntu 18.04環境を準備し、モデルファイルをダウンロード>

この段階で、あとから必要になるパッケージ(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
<Python仮想環境を ./work 下に構築し、依存関係を準備>

次に 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 にダンプされます。

OpenVINO IR FP32モデルでの推論結果
<OpenVINO IR FP32モデルでの推論結果>

なお、サンプルプログラムでコンソールに表示される 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 CheckerPost-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 精度の計測方法を指定します
<accuracy-checker.ymlの説明>

設定ファイルを作成したら、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 の出力例>

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
<POTが出力するINT8最適化後の精度>

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値がわずかに変化していることから、変換後のモデルであるとわかります。

OpenVINO IR INT8モデルでの推論結果
<OpenVINO IR INT8モデルでの推論結果>

 

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モデルでの推論結果
<YOLOv4 608x608/昼間>
 
Scaled YOLOv4-p6 1280x1280/昼間
<Scaled YOLOv4-p6 1280x1280/昼間>
 
YOLOv4 608x608/夜間
<YOLOv4 608x608/夜間>
 
Scaled YOLOv4-p6 1280x1280/夜間
<Scaled YOLOv4-p6 1280x1280/夜間>

なお、このアルゴリズムをOpenVINO IR INT8形式に変換した際には、マシンのメモリが16GBでは足りず、変換エラーとなってしまいました。マシンのメモリを32GBへ増設したところ、変換に成功しました。巨大なモデルですね。

 

5-2.YOLOv7 

YOLOv7 は、YOLOv4の正統な進化形で、2022年7月に公開された比較的新しいアルゴリズムです。論文の著者は、現時点での物体検知の最高峰だと主張しています。

最新の研究なので、さすがの精度です。深層学習のネットワークも小さくなっていることから、推論速度・学習しやすさ共に向上しているようです。

以下に、交通量計測用データセットでのアルゴリズムの精度比較を示します。

YOLOv4 608x608/昼間
<YOLOv4 608x608/昼間
 
YOLOv7 864x864/昼間
<YOLOv7 864x864/昼間
 
YOLOv4 608x608/夜間
<YOLOv4 608x608/夜間
 
YOLOv7 864x864/夜間
<YOLOv7 864x864/夜間
 

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で新しいこと、
はじめてみませんか?
まずはお気軽にご相談ください。

お問い合わせはこちらから 
SCORERが3分で分かる 資料ダウンロード

映像解析AIを使ったビジネスを始めたいパートナー企業を募集していますPARTNER PROGRAM

VARパートナー(付加価値再販)

VARパートナー(付加価値再販)

SCORER Ready等、弊社が用意しているパッケージに対して、導入コンサルティングやマーケティング企画など貴社の強みにあった付加価値をつけて再販いただくパートナー企業です。

integration_partner

インテーグレーションパートナー

貴社の技術力や開発力を活かし、SCORERを活用したサービスの開発や導入支援、導入後のサポート対応を行って頂くパートナー企業です。
※案件は弊社でご紹介いたします。

詳細を見る

一部パートナー企業