このコラムでは、富士ソフトが「第3回AI・人工知能EXPO秋(2022/10/26~28)」に出展したデモンストレーションについて、目的・背景・技術について解説しています。
前編では、OpenVINO™ツールキットの解説と、それを用いたタンパク質解析の実現例を見ていただきました。この後編ではOpenVINO™ツールキットを馬の姿勢推定に適用し、外見からの健康管理を目指します。
ご興味ある項目を、さらに詳しく聞きたい方は、ページ最下部にあるフォームよりお気軽にお問い合わせください。
競走馬の外見による異常検知
姿勢推定による異常検知
AIプロテオミクス®は血液採取と二次元電気泳動法による画像化が必要で、精度は高いものの推定まで時間がかかります。その前段階として、もっと手軽に、できれば厩舎の普段の飼育状況から、屈腱炎の予兆を得られないかという目的で、競走馬の姿勢推定から異常検知することにしました。こちらは当社独自の取り組みです。
屈腱炎になる競走馬は、歩行姿勢に特徴的な傾向が見られます。その予兆を見逃さないようにAIが警告できるシステムを目指します。
OpenVINO™ ツールキットを使った姿勢推定モデルの最適化実装
野生動物は弱っている姿を見せれば他の動物に襲われやすくなるため病気や怪我を負っていること本能的に隠します。馬も同じように痛みを表に見せない傾向があるため、馬の様子から痛みを感じているかどうかを判断することは経験豊富な調教師や獣医師でないと難しいとされています。そのため、不調の発見が遅れることもあるそうです。
富士ソフトでは、この判断を誰でも簡単にAIを用いて実現できないかを検討しています。
馬は歩くときに肢に痛みがあると、以下の特徴があるそうです。
・四肢に痛みがある場合は、痛いところをなるべく使わないようにするため、肢の運びが異常になる。
・前肢に痛みがある場合は、痛い肢で着地したときに頭頸を上げる。
・後肢に痛みがある場合は、痛い肢を着地したときに頭頸を下げる。
これらの特徴を踏まえ、馬の頭の位置と肢が地面につくタイミングを検出することで、どの肢が痛いのかを推測することができます。その推定結果をもとに、普段とは違う行動を検知し、馬の怪我を未然予防できるものと考え開発を進めました。
姿勢推定について:
馬が歩く姿勢を推定するために、MMPoseのHorse10モデルを使用しました。Horse10は、Pytorchをフレームワークにしたモデルであり、OpenVINO™ ツールキットで使用するためには、以下の手順が必要です。
1. MMPoseをgitから入手しインストールする。
2. Pytorch形式からONNX形式へ変換する。
3. ONNX形式からIR形式へ変換する。
【変換手順】
1.MMPoseをgitから入手しインストールする。
コマンド例:
git clone https://github.com/open-mmlab/mmpose.git -b v0.28.1
cd mmpose
pip install -r requirements.txt
pip install -v -e .
実行結果:
~~~ 中略 ~~~
~~~ 中略 ~~~
2. Pytorch形式からONNX形式へ変換する。
MMPoseに含まれているPythonスクリプト(pytorch2onnx.py)でONNX形式のモデルを出⼒します。
スクリプトに与える第1引数と第2引数はそれぞれモデルの表のArchとckptの欄にあるファイルを指定します。
shapeオプションはInput Shapeに256×256のカラー画像を入力しているので
”1 3 256 256”を指定します。
コマンド例:
python tools/deployment/pytorch2onnx.py
configs/animal/2d_kpt_sview_rgb_img/topdown_heatmap/horse10/hrnet_w32_horse10_256x256-split1.py
https://download.openmmlab.com/mmpose/animal/hrnet/hrnet_w32_horse10_256x256_split1-401d901a_20210405.pth ––shape 1 3 256 256 ––verify ––show ––output-file ../models/hrnet_w32_horse10_256x256_split1/model.onnx ––opset-version 11
実行結果:
~~~ 中略 ~~~
3. ONNX形式からIR形式に変換する。
OpenVINO™ ツールキットのModel Optimizerを使用して、IR形式に変換します。
コマンド例:
mo ––input_model ../models/hrnet_w32_horse10_256x256_split1/model.onnx ––mean_values=[123.675,116.28,103.53] ––scale_values=[58.395,50.4,50.625] ––reverse_input_channels -o ../models/hrnet_w32_horse10_256x256_split1
※mean_valueとscale_valuesは、学習済みモデルの表のArchのリンク先のファイル(hrnet_w32_horse10_256x256-split1.py)のmean, stdの値に255を掛けた値をご利⽤ください。
hrnet_w32_horse10_256x256-split1.pyより一部抜粋:
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]),
実行結果:
推論処理には、Open Model Zooに含まれている「single_human_pose_estimation_demo」をベースに開発しました。このソフトは、人を検出してbbox(Bounding Box)で囲み、検出されたすべての人物のポーズを推定します。このソフトで使用している物体検出の学習済みモデルは、起動オプションを変更することで、何を検出するかを変更することができます。そのため、馬を検出するように設定を変更し、姿勢推定の学習済みモデルを人物用からHorse10に置き換えるだけでコードを流用でき、馬の姿勢推定処理の開発期間を短縮することができました。
また、馬の姿勢推定を実現するにあたり、Keypoint数に関連する処理の修正が必要でした。Keypointは目や関節、爪先などの推定結果が、画像中のどこにあるのかを座標で表す配列です。「single_human_pose_estimation_demo」が使用している人物の姿勢推定モデルは、人体の17か所をKeypointとして座標出力していました。Horse10のKeypoint数は22個のため、これを修正しました。
【Keypointに関する変更点】
single_human_pose_estimation_demo.py
88,89c88
< colors = [(0, 0, 255), (0, 255, 0),
–––
> colors = [(0, 0, 255),
estimator.py
< def preprocess_bbox(bbox, image, width, height):
< aspect_ratio = width / height
–––
> def preprocess_bbox(bbox, image):
> aspect_ratio = 0.75
44c44
< def __init__(self, input_height=384, input_width=288, output_height=48, output_width=36, num_keypoints=17):
–––
> def __init__(self, input_height=384, input_width=288, output_height=48, output_width=36):
52c52
< c, s = preprocess_bbox(bbox, img, self.input_width, self.input_height)
–––
> c, s = preprocess_bbox(bbox, img)
96c96
< # OUTPUT_CHANNELS_SIZE = 17
–––
> OUTPUT_CHANNELS_SIZE = 17
98,99c98,99
< if len(output_shape) != 4:
< raise RuntimeError("Expected model output shape [1, KP, H, W]")
–––
> if len(output_shape) != 4 or output_shape[1] != OUTPUT_CHANNELS_SIZE:
> raise RuntimeError(“Expected model output shape [1, {}, H, W]”.format(OUTPUT_CHANNELS_SIZE))
105c105
< self._transform = TransformedCrop(input_shape[2], input_shape[3], output_shape[2], output_shape[3], output_shape[1])
–––
> self._transform = TransformedCrop(input_shape[2], input_shape[3], output_shape[2], output_shape[3])
Horse10が出力したKeypointを行動検知処理に渡すことで、馬の行動に異常がないかを検知できます。
ここまでで、OpenVINO™ ツールキットを使うと既存モデルを簡単にインテル® チップに最適化実装できることが確認できました。
ここからは、精度性能を維持しつつ量子化により高速化していきます。
・量子化の手順の説明
量子化はモデル圧縮手法の一つで、学習済みモデルのサイズ縮小、推論処理における速度性能の向上が見込めます。OpenVINO™ ツールキットの開発ツールであるPost-training Optimization Tool (POT)を使用することで、簡単に量子化できました。POTには、Default QuantizationとAccuracy Aware Quantizationの2種類のアルゴリズムがあります。今回は、Default QuantizationのSimplifiedモードを使用しました。この変換手順を以下に記します。
【変換手順】
1. POTのDefault Quantizationを使って量子化する。
Default Quantizationに必要な引数:
-q:defaultを指定
-m:IR形式に変換した学習済みモデル(*.xmlを指定)
-w:IR形式に変換した学習済みモデル(*.binを指定)
––engine:simplifiedを指定
––data-source:Simplifiedモードの時必要。Simplified モードの場合は適当な画像ファイルが入っているフォルダのパスを指定。ここではCOCO 2017の画像を使用。
コマンド例:
pot -q default -m model.xml -w model.bin ––engine simplified ––data-source c:\temp\DATASET\val2017
実行結果:
たったこれだけの手順で、量子化されたモデルが作成できます。
・速度評価
速度性能を確認するには、 OpenVINO™ ツールキットの開発ツールであるbenchmark_appを使用します。評価に使用したインテル® チップは、11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHzです。
表は、Horse10の2つのモデルについて、オプションで条件を変えながら速度性能を比較した結果です。
Model | hrnet_w32_horse10_256x256_split1 | res50_horse10_256x256_split1 | hrnet_w32_horse10_256x256_split1 | res50_horse10_256x256_split1 | ||||
Device | CPU | GPU | ||||||
Prec | FP32 | INT8 | FP32 | INT8 | FP32 | INT8 | FP32 | INT8 |
Throughput(FPS) | 21.57 | 73.61 | 30.28 | 95.50 | 45.00 | 91.00 | 56.31 | 159.88 |
スループットの結果から、以下の条件が速度性能的に優位であることがわかります。
・hrnet_w32_horse10_256x256_split1より、res50_horse10_256x256_split1
・CPUより、GPUで動作させる
・量子化前のFP32モデルより、量子化後のINT8モデル
・精度評価
IR変換後や量子化後は学習済みモデルの検出精度が大きく低下することもあるため、精度の確認が必要です。
インテル社がWebページで公開しているOpen Model Zooの学習済みモデルであれば、OpenVINO™ ツールキットの開発ツールであるAccuracy Checkerを使用して簡単に精度を確認できます。またAccuracy Checkerが対応しているデータセットと精度メトリックを利用する場合も簡単に精度を確認できます。
それ以外のケースでは、精度メトリック計算をするプログラムが別途必要となります。
今回はAccuracy Checkerが対応していないHorse10データセットと精度メトリックを使用したため、精度を確認するためのプログラムを別途用意しました。
プログラム概要:
-
Horse10データセットの画像とKeypointのアノテーションデータを読み込んで、メトリックとしてPCK(Percentage of Correct Keypoints)*を計算。
-
推定されたKeypointの座標と正解の座標の差を、正解の座標の目と鼻の距離でノーマライズ。
*PCKは、推定座標と正解座標の距離が閾値(0.3)以下であるKeypointの割合として算出。
res50_horse10_256x256_split1 | 精度 | 精度維持率 |
---|---|---|
IR変換後 | 93.8% | 99.8% |
量子化後 | 93.6% |
res50のIR変換後と量子化後のモデルについて、プログラムを使用して精度確認した結果、IR変換後の精度は93.8%、量子化後の精度は93.6%となり、精度性能を99.8%維持しながら高速化できることを確認しました。
姿勢推定による異常検知の展望
行動検知とは動画中の対象(人、動物、etc.)の行動の分析や、異常行動の検知などを行う技術です。富士ソフトでは、独自の行動検知モデルを開発しました。
行動検知では動画から推定した対象の骨格、顔や視線の向き等の大量の高次元データ群を、ディープラーニングにより低次元に落とし込んだ行動特徴データとし、分析に有用な共通的な特徴、特異的な特徴などを抽出します。
抽出した行動特徴データを利用して、タスクの目的や性質に応じて行動分析や異常検知AIを構築し判定します。
現在は工場作業者を対象に開発しており、作業工程・作業時間を検出して、工程遅延や作業者間のバラつきなどの分析や、工程抜け・重複などの異常を検知しています。また、競走馬に対しては健康な状態の歩行動画をあらかじめ学習しておくことで、肢の不調などの異常を検知します。
この際、各学習は自己教師学習等の技術を使用することでアノテーション(正解値)付けの作業を回避し、導入コストを低減しています。
この技術は上記のような製造業の作業者や競走馬だけでなく、物流や運輸の現場でのドライバーモニタシステムや、各種畜産業での傷病検出、健康管理など様々な分野に適用可能だと考えており、幅広く新ビジネスの創出の可能性があるのではないかと考えています。
今後の展望
富士ソフトが「第3回AI・人工知能EXPO秋(2022/10/26~28)」で出展したデモンストレーションについて、目的・背景・技術について解説しました。
今回のコラムによってOpenVINO™ ツールキットを活用することで、汎用的なPCでも精度性能を維持したまま簡単に高速化できることがお判りいただけたかと思います。
「次世代検査技術であるAIプロテオミクス®とリアルタイムな異常判断を組み合わせることで未病のない世界を実現する」をテーマとして競走馬だけではなく、人、家畜、ペットなどへの応用も検討し社会実装を進めています。
それは生体内のタンパク質の状態を視覚的に観測することで健康状態を診ることができるAIプロテオミクス®の技術と、安価で高速な環境を提供するOpenVINO™ ツールキットにより実現可能な世界です。
関連ソリューション
個別相談も承っております。下記よりお申し込みください。